Files
yt-channel-scraper/graphify-out/cache/ast/v0.9.22/bc8259cf378616dd8bcb0d0d75ba8b67e3355f918fcc614fe61389ba3795097c.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
13 KiB
JSON

{"nodes": [{"id": "d_yt_channel_scraper_src_yt_scraper_parse_py", "label": "parse.py", "file_type": "code", "source_file": "src/yt_scraper/parse.py", "source_location": "L1"}, {"id": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "label": "Segment", "file_type": "code", "source_file": "src/yt_scraper/parse.py", "source_location": "L9", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "label": "parse_json3()", "file_type": "code", "source_file": "src/yt_scraper/parse.py", "source_location": "L21", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "label": "parse_vtt()", "file_type": "code", "source_file": "src/yt_scraper/parse.py", "source_location": "L51", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "label": "merge_adjacent()", "file_type": "code", "source_file": "src/yt_scraper/parse.py", "source_location": "L74", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_parse_parse_auto_dump", "label": "parse_auto_dump()", "file_type": "code", "source_file": "src/yt_scraper/parse.py", "source_location": "L88", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_parse_vtt_ts_to_seconds", "label": "_vtt_ts_to_seconds()", "file_type": "code", "source_file": "src/yt_scraper/parse.py", "source_location": "L94", "_callable": true}], "edges": [{"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L3", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "re", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L4", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "dataclasses", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L5", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L9", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L21", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L21", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L51", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L51", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L74", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L74", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L74", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "d_yt_channel_scraper_src_yt_scraper_parse_parse_auto_dump", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L88", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_auto_dump", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L88", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_py", "target": "d_yt_channel_scraper_src_yt_scraper_parse_vtt_ts_to_seconds", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L94", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L42", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "target": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L48", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "target": "d_yt_channel_scraper_src_yt_scraper_parse_vtt_ts_to_seconds", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L59", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "target": "d_yt_channel_scraper_src_yt_scraper_parse_segment", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L69", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "target": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L71", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_auto_dump", "target": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L90", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_parse_parse_auto_dump", "target": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/parse.py", "source_location": "L91", "weight": 1.0}], "raw_calls": [{"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "loads", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L23", "receiver": "json"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L26", "receiver": "data"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L31", "receiver": "ev"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L32", "receiver": "ev"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L35", "receiver": "seg"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "append", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L37", "receiver": "parts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L38", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "join", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L38", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_json3", "callee": "append", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L41", "receiver": "segments"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "splitlines", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L53", "receiver": "text"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L56", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "search", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L57", "receiver": "_VTT_TIMESTAMP"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L59", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L59", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L59", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L59", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L60", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L60", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L60", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "group", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L60", "receiver": "match"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L63", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "append", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L64", "receiver": "cue_lines"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L64", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "join", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L66", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L67", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "sub", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L67", "receiver": "_VTT_TAG"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_vtt", "callee": "append", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L69", "receiver": "segments"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "callee": "strip", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L82", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_merge_adjacent", "callee": "append", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L84", "receiver": "merged"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_auto_dump", "callee": "startswith", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L89", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_parse_parse_auto_dump", "callee": "lstrip", "is_member_call": true, "source_file": "src/yt_scraper/parse.py", "source_location": "L89", "receiver": "raw"}]}