DASH/HLS formats require n-challenge solving (needs JS runtime).
Skipping them falls back to progressive streams which carry audio
and don't need challenge solving.
- ios player client doesn't support cookies, switch to web
- Node.js is required for yt-dlp to solve YouTube's n-challenge;
without it only image formats are served
YouTube restricts available formats for bot-like requests. Specifying
player_client=ios,web makes yt-dlp impersonate the iOS app which has
broader format access without requiring cookies.
--extract-audio + --audio-format mp3 handles conversion regardless of
source format, so the explicit --format bestaudio/best was unnecessarily
restrictive.
YouTube regularly breaks older yt-dlp versions. Bumped the minimum version
and added a separate Docker layer for yt-dlp so it can be upgraded without
busting the main pip cache.
Cache-first was preventing updates from reaching users. Network-first
always fetches fresh content and only falls back to cache when offline.
Also bumps cache version to evict stale cache-first entries.
Adds a Settings panel to upload a cookies.txt file directly from the
browser, persisted in a named Docker volume. yt-dlp uses the file
when present to bypass YouTube bot detection.