| from src.segmenter import detect_event_segments | |
| from src.transcriber import transcribe_video | |
| from src.event_card import parse_game_card | |
| from src.labeler import TogetherLLMLabeler | |
| from src.embedder import XCLIPEmbedder | |
| from src.pinecone_store import PineconeStore | |
| from src.utils import ( | |
| extract_key_frames, save_frames_locally, | |
| generate_frame_urls, match_transcript_to_events, | |
| clip_video_segment | |
| ) | |
| labeler = TogetherLLMLabeler() | |
| embedder = XCLIPEmbedder() | |
| pinecone = PineconeStore() | |
| def run_pipeline(video_path, game_card_str): | |
| game_card = parse_game_card(game_card_str) | |
| transcript = transcribe_video(video_path) | |
| events = detect_event_segments(video_path) | |
| matched_events = match_transcript_to_events(events, transcript) | |
| results = [] | |
| for idx, event in enumerate(matched_events): | |
| event_id = f"event-{idx}" | |
| frames = extract_key_frames(video_path, event['start_sec'], event['end_sec']) | |
| frame_paths = save_frames_locally(frames, event_id) | |
| frame_urls = generate_frame_urls(frame_paths) | |
| label = labeler.generate_label( | |
| game_card=game_card, | |
| transcript=event['transcript'], | |
| spatial_context=event['frames'], | |
| frame_urls=frame_urls | |
| ) | |
| clip_path = clip_video_segment(video_path, event['start_sec'], event['end_sec'], event_id) | |
| video_vector = embedder.embed_video(clip_path) | |
| metadata = { | |
| "start_sec": event['start_sec'], | |
| "end_sec": event['end_sec'], | |
| "label": label | |
| } | |
| pinecone.upsert(f"{event_id}-video", video_vector, metadata) | |
| results.append(metadata) | |
| return {"events": results} | |
| def search_highlights(query, top_k=5): | |
| query_vector = embedder.embed_text(query) | |
| results = pinecone.query(query_vector, filter_key="video", top_k=top_k) | |
| return [ | |
| f"{r['label']} ({r['start_sec']}s - {r['end_sec']}s)" for r in results | |
| ] | |