Jove youtube feed pipeline
Skill build-with-dhiraj/ai-workflow-framework-portability-kit/Skills/jove-youtube-feed-pipeline
End-to-end pipeline for feeding YouTube channels into the "Connecting Dots" second brain (Dhiraj's JoVE knowledge system): enumerate → pre-flight gate → Apify transcribe → connect_youtube (filter→NER→index→related→[[JoVE]]) → LanceDB queryable → Pinecone archive. Use when the user wants to ingest YouTube channels/playlists/videos into the vault, run a multi-channel "feed round," estimate Apify cost, or deepen existing channels. Covers the 8-voice JoVE stakeholder framework, the autonomous batch runner, and the hard-won reliability rules. Triggers: "feed the brain", "ingest these channels", "round N feed", "transcribe this channel/playlist", "how much will Apify cost".From its SKILL.md
npx -y skills add build-with-dhiraj/ai-workflow-framework-portability-kit --skill jove-youtube-feed-pipelineAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.4 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it
JoVE YouTube → Brain Feed Pipeline
The proven, repeatable process for turning YouTube content into queryable brain knowledge. Built + battle-tested across Rounds 1–3 (~8,500 transcripts).
The architecture (do NOT deviate)
Enumerate + gate for FREE; pay Apify only for transcripts.
yt-dlp --flat-playlistenumerates a channel/playlist (FREE, no API key). Resolves @handles → channel IDs. This also powers the gate + top-N selection.- Pre-flight gate (
workers/preflight_channel.py --source ytdlp, $0 — gpt-4.1 + metadata): identity check + junk filter + cost forecast → GO/NO-GO before any spend. - Apify (
workers/apify_youtube_ingest.py) transcribes GO channels via thesupreme_coder/youtube-transcript-scraperactor (~$0.0005/captioned video, pay-per-result). Modes:--channel,--playlist,--video,--watch;--top-n Ncaps giants; omit for full. Idempotent viadata/youtube_channels.jsonregistry. Token:APIFY_API_TOKENin.env(free tier $5/mo). workers/connect_youtube.py --allenriches: filter (8-voice relevance) → NER (gpt-4.1) → LanceDB index → related-linker → link-to-[[JoVE]]. Idempotent (skips connected).- LanceDB = the vector leg → queryable via
workers/ask_brain.py. - Pinecone archive (jove-memory / conversations namespace) — wrap-up summary of the round for future recall.
The 8 stakeholder voices (ranking lens)
Rank channels by voice fidelity (a real end-user speaks) × strategic weight to Dhiraj's mandate (author acquisition + editorial workflow + biopharma).
🎓 young researcher · 🔬 PI/author · 🖋 editor/reviewer · 🏭 biopharma/R&D · 📚 librarian/buyer · 👩🏫 instructor · 💰 grants · ⚔️ competitor.
Source of truth: vault/context/jove/youtube-import-runbook.md (v3).
Running a feed round (autonomous, batched)
- Build a scope file like
data/round3_scope.json: batches → channels{name, ref (channel_id|@handle|playlist_id|video_id), mode (channel|playlist|video), expect}. Group by voice/priority.expectis the gate's identity string — make it accurate (a too-narrow expect causes false NO-GO). - Use the batch runner pattern (
data/round3_runner.py): for each batch → ingest all channels →connect_youtube --all→ validate (errors=0, fragments<500 or HALT) → next. Idempotent + resumable. - Launch detached:
PYTHONPATH=. nohup .venv/bin/python data/round3_runner.py &. Supervise via ScheduleWakeup (resume-proof), NOT a background bash watcher (those die on session resume). - On completion: scorecard + ask_brain sanity query + Pinecone archive.
Cost math
videos × $0.0005 (pay-per-result; captionless = not charged). ~97% caption rate on academic channels, but podcast/conference channels are largely captionless (e.g. a 1,191-video podcast yielded 250). So landed ≈ scope × ~0.75 for podcast-heavy scopes. Free tier = $5/month.
Hard-won rules (violate these and it breaks)
- A YouTube @handle ≠ the brand. Always verify actual channel content/ID before ingesting. Traps caught:
@benchfly= a music band;@elife= kitchenware;@protocolsiodoesn't exist (real =@zappylab); two "Andy Stapleton"s (one's a motorcycle vlogger). The pre-flight gate exists because of this. - LanceDB: NEVER per-row
merge_insert. It fragments the table (Round-2 hit 7.5 GB / 31,997 fragments → stalls). The fixed indexer batches upserts +optimize()+ ANN + body-only content hash. The scale test (tests/workers/test_lancedb_scale.py) asserts fragments < 50 and fails on regression. Fragment count is the canary — watch it. - Body-only content hash for change detection (frontmatter stamps like
connected_at/related_atmust NOT trigger re-embeds). - Relevance filter = the 8 voices, not "lab/research only" (the old narrow filter wrongly quarantined instructors/grants/librarians).
- Idempotent + resumable everything — long runs span session resumes; re-launching must continue from registry state, never double-spend.
- Builds run via orchestrator-dispatched worktree subagents + inline review — NOT fresh-chat couriering (lossy handoffs cause wrong-file mistakes).
- Slugs must include video_id (else same-title videos overwrite each other).
Key files
- Workers:
apify_youtube_ingest.py,preflight_channel.py,connect_youtube.py,lancedb_indexer.py,related_linker.py,ask_brain.py - Scope/runner exemplars:
data/round{1,2,3}_voice_seed.json,data/round3_scope.json,data/round3_runner.py - Runbook:
vault/context/jove/youtube-import-runbook.md· Memory:memory/project_youtube_feed_status.md - Plans:
planning/APIFY-YOUTUBE-INGEST-DISPATCH.md,planning/LANCEDB-RELIABILITY-PLAN.md