From 2f9e3272d94dfefba62222fcbb47a8f9b1e612d4 Mon Sep 17 00:00:00 2001 From: jlightner Date: Sat, 4 Apr 2026 11:40:59 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20Added=20source=5Fvideo=5Fid,=20start=5F?= =?UTF-8?q?time,=20end=5Ftime,=20and=20video=5Ffilename=20t=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - "backend/search_service.py" - "backend/chat_service.py" GSD-Task: S05/T01 --- backend/chat_service.py | 4 ++++ backend/search_service.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/backend/chat_service.py b/backend/chat_service.py index 8e8d144..e791d8e 100644 --- a/backend/chat_service.py +++ b/backend/chat_service.py @@ -258,6 +258,10 @@ def _build_sources(items: list[dict[str, Any]]) -> list[dict[str, str]]: "summary": (item.get("summary", "") or "")[:200], "section_anchor": item.get("section_anchor", ""), "section_heading": item.get("section_heading", ""), + "source_video_id": item.get("source_video_id", ""), + "start_time": item.get("start_time"), + "end_time": item.get("end_time"), + "video_filename": item.get("video_filename", ""), }) return sources diff --git a/backend/search_service.py b/backend/search_service.py index 6b1a000..fa2ec33 100644 --- a/backend/search_service.py +++ b/backend/search_service.py @@ -346,6 +346,10 @@ class SearchService: "creator_slug": cr.slug, "created_at": km.created_at.isoformat() if hasattr(km, "created_at") and km.created_at else "", "score": 0.0, + "source_video_id": str(km.source_video_id) if km.source_video_id else "", + "start_time": km.start_time, + "end_time": km.end_time, + "video_filename": (sv.filename or "") if sv else "", }) if scope in ("all", "creators"): @@ -1118,6 +1122,13 @@ class SearchService: if not payload.get("creator_name") and payload.get("creator_id"): needs_db_lookup.add(payload["creator_id"]) + # Collect source_video_ids for key_moment results to batch-fetch filenames + video_ids_needed: set[str] = set() + for r in qdrant_results: + payload = r.get("payload", {}) + if payload.get("type") == "key_moment" and payload.get("source_video_id"): + video_ids_needed.add(payload["source_video_id"]) + # Batch fetch creators from DB creator_map: dict[str, dict[str, str]] = {} if needs_db_lookup: @@ -1133,6 +1144,21 @@ class SearchService: for c in result.scalars().all(): creator_map[str(c.id)] = {"name": c.name, "slug": c.slug} + # Batch fetch video filenames for key_moment results + video_map: dict[str, str] = {} + if video_ids_needed: + valid_vids = [] + for vid in video_ids_needed: + try: + valid_vids.append(uuid_mod.UUID(vid)) + except (ValueError, AttributeError): + pass + if valid_vids: + v_stmt = select(SourceVideo).where(SourceVideo.id.in_(valid_vids)) + v_result = await db.execute(v_stmt) + for sv in v_result.scalars().all(): + video_map[str(sv.id)] = sv.filename or "" + for r in qdrant_results: payload = r.get("payload", {}) cid = payload.get("creator_id", "") @@ -1174,6 +1200,10 @@ class SearchService: "match_context": "", "section_anchor": payload.get("section_anchor", "") if result_type == "technique_section" else "", "section_heading": payload.get("section_heading", "") if result_type == "technique_section" else "", + "source_video_id": payload.get("source_video_id", "") if result_type == "key_moment" else "", + "start_time": payload.get("start_time") if result_type == "key_moment" else None, + "end_time": payload.get("end_time") if result_type == "key_moment" else None, + "video_filename": video_map.get(payload.get("source_video_id", ""), "") if result_type == "key_moment" else "", }) return enriched