Diagnosis of a live run: caption tracks resolve fine (player + watch-page scrape), but the timedtext baseUrl fetch returns 429 under back-to-back volume — YouTube rate-limits the unauthenticated caption-download endpoint per IP. A per-video delay spaces the fetches. (Follow-up: treat 429 distinctly from genuine no-caption instead of silently degrading to SourceNone; consider Whisper if the endpoint stays hostile at any sustainable rate.)