demand_videos.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """Resolve demand_belong_category.video_list → multi_demand_video_detail."""
  2. from __future__ import annotations
  3. import json
  4. from typing import Any
  5. from supply_infra.db.repositories.demand_belong_category_repo import (
  6. DemandBelongCategoryRepository,
  7. )
  8. from supply_infra.db.repositories.multi_demand_video_detail_repo import (
  9. MultiDemandVideoDetailRepository,
  10. )
  11. from supply_infra.db.session import get_session
  12. def _parse_video_ids(raw: str | None) -> list[str]:
  13. if not raw:
  14. return []
  15. try:
  16. parsed = json.loads(raw)
  17. except json.JSONDecodeError:
  18. return []
  19. if not isinstance(parsed, list):
  20. return []
  21. return [str(v).strip() for v in parsed if v is not None and str(v).strip()]
  22. def list_videos_for_demand_belong(belong_id: int) -> dict[str, Any] | None:
  23. """
  24. 按 demand_belong_category.id 返回关联视频详情。
  25. 顺序与 video_list 一致;详情表缺失的 vid 仍返回,title/final_topic_json 为空。
  26. """
  27. with get_session() as session:
  28. belong = DemandBelongCategoryRepository(session).get_by_id(belong_id)
  29. if belong is None or belong.is_delete:
  30. return None
  31. vids = _parse_video_ids(belong.video_list)
  32. details = MultiDemandVideoDetailRepository(session).list_by_vids(vids)
  33. videos: list[dict[str, Any]] = []
  34. for vid in vids:
  35. row = details.get(vid)
  36. videos.append(
  37. {
  38. "vid": vid,
  39. "title": row.title if row else None,
  40. "final_topic_json": row.final_topic_json if row else None,
  41. }
  42. )
  43. return {
  44. "demand_belong_id": belong.id,
  45. "name": belong.name,
  46. "category_id": belong.category_id,
  47. "videos": videos,
  48. }