Files
yt-channel-scraper/graphify-out/cache/ast/v0.9.22/bd9731c51b005a5cef7bd97a9555a9d5609eaa8c4da9f147a8708571c6440ff7.json
T
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
6.6 KiB
JSON

{"nodes": [{"id": "d_yt_channel_scraper_tests_test_parse_py", "label": "test_parse.py", "file_type": "code", "source_file": "tests/test_parse.py", "source_location": "L1"}, {"id": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_basic", "label": "test_parse_json3_basic()", "file_type": "code", "source_file": "tests/test_parse.py", "source_location": "L10", "_callable": true}, {"id": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_skips_empty_events", "label": "test_parse_json3_skips_empty_events()", "file_type": "code", "source_file": "tests/test_parse.py", "source_location": "L21", "_callable": true}, {"id": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_basic", "label": "test_parse_vtt_basic()", "file_type": "code", "source_file": "tests/test_parse.py", "source_location": "L28", "_callable": true}, {"id": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_strips_tags", "label": "test_parse_vtt_strips_tags()", "file_type": "code", "source_file": "tests/test_parse.py", "source_location": "L39", "_callable": true}, {"id": "d_yt_channel_scraper_tests_test_parse_test_merge_adjacent", "label": "test_merge_adjacent()", "file_type": "code", "source_file": "tests/test_parse.py", "source_location": "L45", "_callable": true}, {"id": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_invalid_json", "label": "test_parse_json3_invalid_json()", "file_type": "code", "source_file": "tests/test_parse.py", "source_location": "L57", "_callable": true}], "edges": [{"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "pathlib", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L3", "weight": 1.0}, {"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "yt_scraper_parse", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L5", "weight": 1.0}, {"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_basic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L10", "weight": 1.0}, {"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_skips_empty_events", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L21", "weight": 1.0}, {"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_basic", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L28", "weight": 1.0}, {"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_strips_tags", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L39", "weight": 1.0}, {"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "d_yt_channel_scraper_tests_test_parse_test_merge_adjacent", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L45", "weight": 1.0}, {"source": "d_yt_channel_scraper_tests_test_parse_py", "target": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_invalid_json", "relation": "contains", "confidence": "EXTRACTED", "source_file": "tests/test_parse.py", "source_location": "L57", "weight": 1.0}], "raw_calls": [{"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_basic", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_parse.py", "source_location": "L11", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_basic", "callee": "parse_json3", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L12", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_skips_empty_events", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_parse.py", "source_location": "L22", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_skips_empty_events", "callee": "parse_json3", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L23", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_skips_empty_events", "callee": "strip", "is_member_call": true, "source_file": "tests/test_parse.py", "source_location": "L25", "receiver": "t"}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_basic", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_parse.py", "source_location": "L29", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_basic", "callee": "parse_vtt", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L30", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_strips_tags", "callee": "read_text", "is_member_call": true, "source_file": "tests/test_parse.py", "source_location": "L40", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_vtt_strips_tags", "callee": "parse_vtt", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L41", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_merge_adjacent", "callee": "Segment", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L47", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_merge_adjacent", "callee": "Segment", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L48", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_merge_adjacent", "callee": "Segment", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L49", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_merge_adjacent", "callee": "merge_adjacent", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L51", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_invalid_json", "callee": "parse_json3", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L58", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_tests_test_parse_test_parse_json3_invalid_json", "callee": "parse_json3", "is_member_call": false, "source_file": "tests/test_parse.py", "source_location": "L59", "receiver": null}]}