demand_videos.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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.repositories.multi_demand_video_point_repo import (
  12. MultiDemandVideoPointRepository,
  13. )
  14. from supply_infra.db.session import get_session
  15. def _parse_video_ids(raw: str | None) -> list[str]:
  16. if not raw:
  17. return []
  18. try:
  19. parsed = json.loads(raw)
  20. except json.JSONDecodeError:
  21. return []
  22. if not isinstance(parsed, list):
  23. return []
  24. return [str(v).strip() for v in parsed if v is not None and str(v).strip()]
  25. def list_videos_for_demand_belong(belong_id: int) -> dict[str, Any] | None:
  26. """
  27. 按 demand_belong_category.id 返回关联视频详情。
  28. 顺序与 video_list 一致;详情表缺失的 vid 仍返回,title/三点 JSON 为空。
  29. """
  30. with get_session() as session:
  31. belong = DemandBelongCategoryRepository(session).get_by_id(belong_id)
  32. if belong is None or belong.is_delete:
  33. return None
  34. vids = _parse_video_ids(belong.video_list)
  35. details = MultiDemandVideoDetailRepository(session).list_by_vids(vids)
  36. points_by_vid = MultiDemandVideoPointRepository(session).json_fields_by_video_ids(
  37. vids
  38. )
  39. videos: list[dict[str, Any]] = []
  40. for vid in vids:
  41. row = details.get(vid)
  42. point_fields = points_by_vid.get(vid, {})
  43. videos.append(
  44. {
  45. "vid": vid,
  46. "title": row.title if row else None,
  47. "inspiration_points_json": point_fields.get(
  48. "inspiration_points_json"
  49. ),
  50. "purpose_points_json": point_fields.get("purpose_points_json"),
  51. "key_points_json": point_fields.get("key_points_json"),
  52. }
  53. )
  54. return {
  55. "demand_belong_id": belong.id,
  56. "name": belong.name,
  57. "category_id": belong.category_id,
  58. "videos": videos,
  59. }