✅ Successfully implemented:
- User-wide configuration system with
platformdirs - Cookie support via
cookies_fileandcookies_from_browser - Configuration passed to both yt-dlp Python API and git-annex CLI
- Network settings (proxy, rate limiting)
- Extractor args support for advanced yt-dlp options
When using cookies with YouTube, yt-dlp encounters YouTube's "n-challenge" - a JavaScript obfuscation that requires a JavaScript runtime to solve.
Pros: Works with age-restricted, members-only, liked videos Cons: Requires deno runtime
Setup:
# Install deno (or use your miniconda environment)
curl -fsSL https://deno.land/install.sh | sh
# Create user config
annextube init-user-config
# Edit ~/.config/annextube/config.toml
cookies_file = "/path/to/cookies.txt"
# Run backup (deno must be in PATH)
annextube backupPros: No deno required Cons: No authentication, public videos only
Setup:
# Create user config
annextube init-user-config
# Edit ~/.config/annextube/config.toml
# Android client bypasses n-challenge but doesn't support cookies
ytdlp_extra_opts = ["--extractor-args", "youtube:player_client=android"]
# Run backup (works without deno, public videos only)
annextube backupFrom yt-dlp output:
WARNING: [youtube] Skipping client "android" since it does not support cookies
This is a yt-dlp limitation, not an annextube bug. The Android client API endpoint doesn't accept authentication.
See demo-public-no-auth.sh for a complete working demo without authentication.
For a demo with full cookie support:
# In your miniconda environment with deno
source ~/miniconda3.sh
conda activate deno
# Create user config with cookies
annextube init-user-config
cat >> ~/.config/annextube/config.toml << 'EOF'
# Cookies for authenticated content
cookies_file = "/home/yoh/proj/annextube/.git/yt-cookies.txt"
EOF
# Run backup - now with full authentication support
export YOUTUBE_API_KEY="your-key"
annextube init /tmp/demo "@apopyk" --videos --limit 2
annextube backup --output-dir /tmp/demo$ annextube init-user-config
✓ Created user config templatefrom annextube.lib.config import load_config
config = load_config(repo_path="/path/to/archive")
print(config.user.cookies_file) # Shows cookie path$ cd /path/to/archive
$ git config annex.youtube-dl-options
--cookies "/path/to/cookies.txt"YouTubeService properly receives:
cookiefileoptionextractor_argsoption- All network settings
annextube/lib/config.py- UserConfig, platformdirs integrationannextube/services/youtube.py- Cookie and extractor args supportannextube/services/git_annex.py- git-annex configurationannextube/services/archiver.py- Extractor args parsingannextube/cli/init_user_config.py- CLI command
Environment Variables (ANNEXTUBE_COOKIES_FILE, etc.)
↓
Archive Config (.annextube/config.toml)
↓
User Config (~/.config/annextube/config.toml)
↓
Built-in Defaults
- Linux:
~/.config/annextube/config.toml - macOS:
~/Library/Application Support/annextube/config.toml - Windows:
%APPDATA%\annextube\config.toml
# Authentication
cookies_file = "~/.config/annextube/cookies/youtube.txt"
# OR
cookies_from_browser = "firefox"
# API key (or use YOUTUBE_API_KEY env var)
# api_key = "your-key-here"
# Network
proxy = "socks5://127.0.0.1:9050"
limit_rate = "1M"
sleep_interval = 3
max_sleep_interval = 5
# Advanced (Android client - public videos only, no cookies!)
# ytdlp_extra_opts = ["--extractor-args", "youtube:player_client=android"]- For authenticated content: Set up deno and use cookies
- For public content: Use without cookies or with Android client
- For Containerfile: Use deno-enabled base image (e.g., miniforge with deno)