Movement Leader Media Transcribe
Process primary video and podcast items from harvest-manifest.json into searchable transcript files. This skill closes the transcribe queue left by content-harvest step 07.
Invocation
/movement-leader-media-transcribe {leader-slug}
/movement-leader-media-transcribe danielle-strickland --types video,podcast-host
/movement-leader-media-transcribe deb-hirsch --max 10 --dry-run
/movement-leader-media-transcribe hugh-halter --refresh
Run from monorepo root (movement-leader-websites/).
CLI (preferred for batch)
pnpm harvest:transcribe -- --slug {leader-slug}
pnpm harvest:transcribe -- --slug danielle-strickland --types video,podcast-host --dry-run
pnpm harvest:transcribe -- --slug deb-hirsch --max 20 --refresh
pnpm harvest:transcribe -- --slug deb-hirsch --skip-whisper # YouTube only
| Flag | Effect |
|---|---|
--slug |
Required leader slug |
--types |
Filter: video, podcast-host, podcast, audio (comma-separated) |
--dry-run |
Report what would run; no files written |
--max N |
Limit items (cost control for Whisper) |
--refresh |
Re-transcribe even when a transcript file exists |
--skip-whisper |
YouTube yt-dlp only; skip podcast Whisper |
Prerequisites
harvest-manifest.jsonexists for the tenant (docs/movement_leader_research/content/)- YouTube:
yt-dlpinstalled (pip install yt-dlp) - Podcast Whisper:
OPENAI_API_KEYin tenant.env.localor environment - Large audio (>25MB):
ffmpegrecommended
What gets transcribed
Items where primary: true and type is media (video, podcast-host, podcast, audio, …) and:
dispositionisTRANSCRIBE,LINK, or FETCH video- No clean transcript file yet (unless
--refresh)
Skip: guest-only items marked primary: false, articles, SKIP disposition.
Pipeline
| Source | Method | Output |
|---|---|---|
| YouTube URL | yt-dlp EN subs → VTT parse | docs/harvest/transcripts/{id}.md |
Podcast mp3 in alt_urls |
curl download → Whisper | same |
| Already pending stub | Overwrite when successful | updates transcript_method in front-matter |
Each file uses harvest front-matter + verbatim transcript body (no summarization).
After transcribe
- Update
harvest-manifest.jsonharvested_path+transcript_status - Run
movement-leader-harvest-ingestto push transcripts into Supabasevideos.transcript/podcast_episodes.transcript
Related skills
movement-leader-content-harvest— discovery + manifest (upstream)movement-leader-harvest-ingest— manifest → Supabase (downstream)youtube-transcript— ad-hoc single-video extraction (not manifest-driven)
Session report
Print: slug, items attempted, transcribed / failed / skipped, word counts, Whisper cost note if applicable.