Three code paths could fire yt-dlp immediately (polite=False) while a
download was already running, causing YouTube to see two simultaneous
authenticated sessions and invalidate the cookie:
- search.py: live yt-dlp fallback now skipped while any download is active
- downloads.py: _ensure_video uses polite=True so it waits for active
downloads to finish before fetching metadata for an unknown video
- channels.py: follow_by_url uses polite=True when fetching metadata
for a brand-new channel
Added is_download_active() helper to ytdlp.py to expose the active
download state without importing private globals.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>