video-lens
Quick reference
Step 4 is the authoritative spec. This block is a compaction-safety net — if it diverges from Step 4, trust Step 4.
Render payload must include all of: VIDEO_ID, VIDEO_TITLE, VIDEO_URL, SUMMARY, KEY_POINTS, TAKEAWAY, OUTLINE, DESCRIPTION_SECTION. GENERATION_DATE (YYYY-MM-DD) and META_LINE are optional — omit GENERATION_DATE and the renderer defaults to today. Build via Write to the PAYLOAD_PATH from Step 1, then render_report.py --payload-file <path> --output-dir <dir> — never heredoc.
Run python3 .../render_report.py --schema to print the live schema.
Script invocations (the -- guards video IDs that start with - — keep it):
python3 .../preflight.py -- "<url-or-id> [lang]"python3 .../fetch_transcript.py -- <VIDEO_ID> [LANG_CODE]python3 .../fetch_metadata.py -- <VIDEO_ID>python3 .../transcribe_local.py [--language L] [--model M] -- <VIDEO_ID>(fallback only — see Step 2a fallback)python3 .../render_report.py --payload-file <path> --output-dir <dir>bash .../serve_report.sh <html-path>(bash script — never invoke withpython3)
Bundled scripts
Six local scripts ship in ./scripts/: preflight.py, fetch_transcript.py, fetch_metadata.py, transcribe_local.py, render_report.py, serve_report.sh. No remote code is fetched at runtime. Network calls during a run: YouTube transcript and metadata fetches. When the local-transcription fallback runs: audio download from YouTube via yt-dlp, and a one-time Whisper model download (~1.5 GB for medium) from Hugging Face. Network calls when the user views the report in their browser: the YouTube iframe API and Google Fonts CSS.