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

{"nodes": [{"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "label": "jobs.py", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L1"}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "label": "JobManager", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L19", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_init", "label": ".__init__()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L22", "_callable": true}, {"id": "store", "label": "Store", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "D:\\yt-channel-scraper\\src\\yt_scraper\\webapp\\jobs.py"}, {"id": "config", "label": "Config", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "D:\\yt-channel-scraper\\src\\yt_scraper\\webapp\\jobs.py"}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_start", "label": ".start()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L32", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_enqueue", "label": ".enqueue()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L38", "_callable": true}, {"id": "any", "label": "Any", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "D:\\yt-channel-scraper\\src\\yt_scraper\\webapp\\jobs.py"}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_cancel", "label": ".cancel()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L47", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_events_since", "label": ".events_since()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L55", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_is_terminal", "label": ".is_terminal()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L60", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "label": "._emit()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L70", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "label": "._worker()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L74", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "label": "._run_job()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L87", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "label": "._resolve_channel_for_video()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L100", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "label": "._run_batch()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L110", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "label": "._run_audio()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L154", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "label": "._run_channel()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L194", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_clone_config", "label": "_clone_config()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L265", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "label": "_resolve_channel_url()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L270", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_handle", "label": "_handle()", "file_type": "code", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L282", "_callable": true}, {"id": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_rationale_20", "label": "Single-worker scrape job runner with an in-memory event log per job (SSE-polled)", "file_type": "rationale", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L20"}], "edges": [{"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "asyncio", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L3", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "json", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L4", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "threading", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L5", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "time", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L6", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "uuid", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L7", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "collections", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L8", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "typing", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L9", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_config_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L11", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_cookies_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L12", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_discover_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L13", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_pipeline_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L14", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_ratelimit_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L15", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_store_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L16", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L19", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_init", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L22", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_init", "target": "store", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L22", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_init", "target": "config", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L22", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_start", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L32", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_enqueue", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L38", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_enqueue", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L38", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_cancel", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L47", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_events_since", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L55", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_is_terminal", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L60", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L70", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L74", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L87", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L100", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L110", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L110", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L154", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L154", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "relation": "method", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L194", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "target": "any", "relation": "references", "context": "generic_arg", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L194", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_clone_config", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L265", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_clone_config", "target": "config", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L265", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_clone_config", "target": "config", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L265", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L270", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "target": "store", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L270", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "target": "config", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L270", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_py", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_handle", "relation": "contains", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L282", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_enqueue", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L43", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_cancel", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L52", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L82", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L85", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L93", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L96", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L98", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L117", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_clone_config", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L119", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L141", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L167", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_clone_config", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L199", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L200", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L203", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_handle", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L234", "weight": 1.0}, {"source": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_rationale_20", "target": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L20", "weight": 1.0}], "raw_calls": [{"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_init", "callee": "Lock", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L25", "receiver": "threading"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_init", "callee": "deque", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L28", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_init", "callee": "Thread", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L29", "receiver": "threading"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_enqueue", "callee": "uuid4", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L39", "receiver": "uuid"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_enqueue", "callee": "create_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L40", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_enqueue", "callee": "append", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L44", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_cancel", "callee": "get_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L48", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_cancel", "callee": "add", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L51", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_events_since", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L57", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_is_terminal", "callee": "get_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L61", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "callee": "append", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L72", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_emit", "callee": "setdefault", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L72", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "callee": "popleft", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L77", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "callee": "sleep", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L79", "receiver": "time"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L84", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "callee": "exc", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L84"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_worker", "callee": "exc", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L85"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "callee": "get_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L88", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "callee": "loads", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L91", "receiver": "json"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L92", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_job", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L95", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "callee": "get_video", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L101", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "callee": "get_channel", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L104", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L105", "receiver": "ch"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "callee": "lstrip", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L106", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_resolve_channel_for_video", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L106", "receiver": "ch"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L112", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L113", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "resolve_active_path", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L113", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "Path", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L114", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L116", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L120", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L125", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "get_video", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L128", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L132", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "Path", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L135", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "exists", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L136", "receiver": "md_path"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "cache_thumbnail", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L137", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "_process_video", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L142", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "m", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L145"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "cache_thumbnail", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L147", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L149", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_batch", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L151", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L156", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L157", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L158", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "resolve_active_path", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L158", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "get_video", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L160", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "get_video", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L160", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "get_all", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L162", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "Path", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L163", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "mkdir", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L164", "receiver": "out_dir"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L166", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "YoutubeDL", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L177", "receiver": "yt_dlp"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L180", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "download", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L184", "receiver": "ydl"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L189", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_audio", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L191", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L195", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L202", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L207", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "discover_channel", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L210", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L212", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "exc", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L212"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L216", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L217", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L218", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L219", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L220", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L221", "receiver": "opts"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "replace", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L226", "receiver": "since"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "startswith", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L230", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "upsert_channel", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L234", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "upsert_videos", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L235", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "get_pending", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L237", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L239", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "resolve_active_path", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L243", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L247", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "process_video", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L250", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "m", "is_member_call": false, "indirect": true, "context": "collection", "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L253"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L256", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "polite_sleep", "is_member_call": false, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L259", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_jobmanager_run_channel", "callee": "update_job", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L261", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_clone_config", "callee": "deepcopy", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L267", "receiver": "copy"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "callee": "get_channel", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L273", "receiver": "store"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "callee": "lstrip", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L276", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_resolve_channel_url", "callee": "get", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L276", "receiver": "ch"}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_handle", "callee": "split", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L284", "receiver": null}, {"caller_nid": "d_yt_channel_scraper_src_yt_scraper_webapp_jobs_handle", "callee": "split", "is_member_call": true, "source_file": "src/yt_scraper/webapp/jobs.py", "source_location": "L284", "receiver": "url"}]}