""" Scene-level multimodal indexing for Search-UI. This package builds *scene descriptions* — short paragraphs that fuse visual content, dialogue, and (optionally) non-speech audio cues for a fixed window of a video. Descriptions are embedded with a text model and stored alongside existing subtitle embeddings so the search layer can answer narrative queries like "people who disagree and then forgive each other" that the literal subtitle text would miss. The VLM step itself runs via OpenRouter (scripts/openrouter_scene_processor.py); this package provides the local building blocks (frame sampling, windowing, embedding, DB) that the prepare/persist stages use. Submodules: frames - ffmpeg frame sampling + perceptual-hash dedup. scenes - VTT-aligned scene window construction. embed - bge-m3 text embedding wrapper. scene_db - scene_index.db schema + atomic upserts. index_filter / exclusions - which catalog videos are in scope. audio_tags - CLAP zero-shot audio event tagging. """