Files
yt-channel-scraper/graphify-out/cache/ast/v0.9.22/7b6c9aede202fa24c4070eff2a45987f38369a6d73121e2cc8bbaafdaaed6ec3.json
urieljareth 06497299ab feat: integrated audio player + animated transcript follower
- Video detail (done videos): added 'Download audio' button; removed the
  manual 'Thumbnail' button (thumbnails auto-download now, so it was redundant).
- New 'GET /api/videos/{id}/audio' endpoint (also serves HEAD for probing),
  serving data/audio/<video_id>.mp3. Audio job outtmpl switched to %(id)s so
  files are addressable per video.
- Integrated <audio> player appears in the detail view once the MP3 is present
  (probed via HEAD on openVideo; polled after a download job until ready).
- Synced transcript follower: as audio plays, the matching segment is
  highlighted (seg-active) and auto-scrolled into view like a karaoke/lyrics
  tracker. Clicking any segment timestamp or chapter seeks the audio to that
  point (falls back to scroll when no audio). Playback indicator pulses while
  playing.
2026-07-27 00:00:28 -06:00

1 line
10 KiB
JSON

{"nodes": [{"id": "d_yt_channel_scraper_src_yt_scraper_render_py", "label": "render.py", "file_type": "code", "source_file": "src/yt_scraper/render.py", "source_location": "L1"}, {"id": "d_yt_channel_scraper_src_yt_scraper_render_format_timestamp", "label": "format_timestamp()", "file_type": "code", "source_file": "src/yt_scraper/render.py", "source_location": "L11", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_render_quote_yaml", "label": "quote_yaml()", "file_type": "code", "source_file": "src/yt_scraper/render.py", "source_location": "L20", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_render_to_json", "label": "to_json()", "file_type": "code", "source_file": "src/yt_scraper/render.py", "source_location": "L30", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "label": "_make_env()", "file_type": "code", "source_file": "src/yt_scraper/render.py", "source_location": "L35", "_callable": true}, {"id": "path", "label": "Path", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "D:\\yt-channel-scraper\\src\\yt_scraper\\render.py"}, {"id": "environment", "label": "Environment", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "D:\\yt-channel-scraper\\src\\yt_scraper\\render.py"}, {"id": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "label": "render_markdown()", "file_type": "code", "source_file": "src/yt_scraper/render.py", "source_location": "L48", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_render_build_filename_stem", "label": "build_filename_stem()", "file_type": "code", "source_file": "src/yt_scraper/render.py", "source_location": "L66", "_callable": true}], "edges": [{"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "datetime", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L3", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L4", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "jinja2", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L6", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "d_yt_channel_scraper_src_yt_scraper_chapters_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L8", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "d_yt_channel_scraper_src_yt_scraper_render_format_timestamp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L11", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "d_yt_channel_scraper_src_yt_scraper_render_quote_yaml", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L20", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "d_yt_channel_scraper_src_yt_scraper_render_to_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L30", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L35", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "target": "path", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L35", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "target": "environment", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L35", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L48", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "target": "path", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L48", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "target": "path", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L48", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "target": "path", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L48", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_py", "target": "d_yt_channel_scraper_src_yt_scraper_render_build_filename_stem", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L66", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "target": "environment", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L36", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "target": "d_yt_channel_scraper_src_yt_scraper_render_format_timestamp", "relation": "indirect_call", "context": "assignment", "confidence": "INFERRED", "source_file": "src/yt_scraper/render.py", "source_location": "L42", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "target": "d_yt_channel_scraper_src_yt_scraper_render_quote_yaml", "relation": "indirect_call", "context": "assignment", "confidence": "INFERRED", "source_file": "src/yt_scraper/render.py", "source_location": "L43", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "target": "d_yt_channel_scraper_src_yt_scraper_render_to_json", "relation": "indirect_call", "context": "assignment", "confidence": "INFERRED", "source_file": "src/yt_scraper/render.py", "source_location": "L44", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "target": "path", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L54", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "target": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/render.py", "source_location": "L55", "weight": 1.0}], "raw_calls": [{"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_format_timestamp", "callee": "divmod", "is_member_call": false, "source_file": "src/yt_scraper/render.py", "source_location": "L13", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_format_timestamp", "callee": "divmod", "is_member_call": false, "source_file": "src/yt_scraper/render.py", "source_location": "L14", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_quote_yaml", "callee": "replace", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L25", "receiver": "value"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_to_json", "callee": "dumps", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L32", "receiver": "json"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "callee": "FileSystemLoader", "is_member_call": false, "source_file": "src/yt_scraper/render.py", "source_location": "L37", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_make_env", "callee": "select_autoescape", "is_member_call": false, "source_file": "src/yt_scraper/render.py", "source_location": "L38", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "callee": "resolve", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L54", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "callee": "get_template", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L56", "receiver": "env"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "callee": "render", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L57", "receiver": "template"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "callee": "mkdir", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L60", "receiver": "out_dir"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_render_markdown", "callee": "write_text", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L62", "receiver": "out_file"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_build_filename_stem", "callee": "slugify", "is_member_call": false, "source_file": "src/yt_scraper/render.py", "source_location": "L69", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_build_filename_stem", "callee": "format", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L70", "receiver": "template"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_build_filename_stem", "callee": "join", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L71", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_build_filename_stem", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L72", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_render_build_filename_stem", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/render.py", "source_location": "L72", "receiver": "safe"}]}