[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C37PMMXRJ1SPWDT70QD7TH":3,"skill-same:01M6C37PMMXRJ1SPWDT70QD7TH":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":47,"commitSha":48,"skillDirectory":49,"forksCount":50,"repositoryHtmlUrl":51,"repositoryHomepageUrl":52,"ownerHtmlUrl":53,"ownerBlogUrl":54,"ownerDescription":55,"updatedAt":56,"install":57,"resources":70},"01M6C37PMMXRJ1SPWDT70QD7TH","youtube-acquisition",null,"yt-dlp patterns for acquiring content from YouTube and video platforms","jmagly\u002Faiwg","jmagly","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1159087?v=4","01M6C10AK8N2WCSQN11FYGTJWN","Joseph Magly","01M6C10AQ8A2RMED1Y1BSVY7NF",229,"MIT","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fmedia-curator\u002Fskills\u002Fyoutube-acquisition\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37],"acquisition","youtube acquisition","youtube","content","dlp","Video","Media","patterns","yt-dlp","yt","for","2026-11-10 10:12:30",false,"---\nnamespace: aiwg\nplatforms: [all]\nname: youtube-acquisition\ndescription: yt-dlp patterns for acquiring content from YouTube and video platforms\ncategory: media-curator\n---\n\n# YouTube Acquisition\n\nComprehensive yt-dlp command patterns for downloading video and audio content from YouTube, Vimeo, SoundCloud, and other supported platforms. Includes quality selection strategies, format filtering, the SABR 403 workaround, metadata extraction, and batch operations.\n\n## Overview\n\n**yt-dlp** is the primary tool for media acquisition from YouTube and 1000+ other sites. This skill documents proven patterns from production use, including workarounds for the n-challenge \u002F EJS gate, PO-token requirements, and the older SABR 403 issue.\n\n**Key Capabilities**:\n- Download best available quality (video + audio)\n- Extract audio-only in multiple formats\n- Handle playlists and channels\n- Embed metadata and thumbnails\n- Download subtitles and auto-captions\n- Work around platform restrictions\n\n## Prerequisites (#1229)\n\nAs of 2026, basic format selectors return only image storyboards on most YouTube videos until two relatively new gates are satisfied. **Read this section before any acquisition attempt** — running yt-dlp without these prerequisites produces \"Only images are available for download\" failures that look like format-selector bugs but aren't.\n\n### 1. n-challenge \u002F EJS solver\n\nYouTube returns ciphered streaming URLs whose `n` parameter must be transformed by JavaScript extracted from the player. yt-dlp delegates this to the `yt-dlp-ejs` plugin plus a JS runtime. Without both, all real formats are filtered out and only `sb*` storyboard formats remain.\n\n```bash\n# Install the EJS plugin\npip install --user yt-dlp-ejs\n\n# JS runtime — deno preferred, node accepted\nwhich deno || sudo apt install -y deno   # Debian\u002FUbuntu\n# OR: yt-dlp --js-runtimes node:\u002Fusr\u002Fbin\u002Fnode ...\n```\n\nReference: \u003Chttps:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp\u002Fwiki\u002FEJS>\n\n### 2. PO Token (Proof of Origin)\n\nMany client variants (`mweb`, `ios`, `web`) demand a Proof-of-Origin token tied to a logged-in \u002F browser-attested session. Without a PO token provider those clients are skipped, narrowing the available format list. Standard provider:\n\n```bash\npip install --user bgutil-ytdlp-pot-provider\n```\n\nReference: \u003Chttps:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp\u002Fwiki\u002FPO-Token-Guide>\n\n### 3. Plugin discovery — install yt-dlp via pip, NOT the standalone zipapp\n\nThis is the gotcha that bites operators most often. The standalone yt-dlp **zipapp** (the form distributed at `\u002Fusr\u002Flocal\u002Fbin\u002Fyt-dlp` from the official static download) does not expose user site-packages to its plugin-discovery path. Even after `pip install --user yt-dlp-ejs`, a zipapp invocation will silently fail to find the EJS solver. Symptoms: `n challenge solving failed` warnings even after installing the plugin.\n\nThe fix is to install yt-dlp itself via pip so it shares `site-packages` with the EJS plugin, then ensure `~\u002F.local\u002Fbin` precedes `\u002Fusr\u002Flocal\u002Fbin` on PATH:\n\n```bash\npip install --user --break-system-packages yt-dlp-ejs   # plugin\npip install --user --break-system-packages -U yt-dlp    # 2026.03.17+ — same site-packages\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"\n\n# Verify the EJS solver is discovered\n~\u002F.local\u002Fbin\u002Fyt-dlp -F \"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=VIDEO_ID\"\n# Should now list real formats, not just sb*\n```\n\nAfter this, downloads typically succeed automatically — yt-dlp's EJS solver may even fall back to the `android_vr` client without needing the JS runtime.\n\n## Basic Download Patterns\n\n### Best Quality Video + Audio\n\nDownload highest quality video and audio, merge into single file.\n\n```bash\n# Recommended: Let yt-dlp choose best combination\nyt-dlp \"VIDEO_URL\"\n\n# Explicit best video+audio merge\nyt-dlp -f \"bestvideo+bestaudio\" \"VIDEO_URL\"\n\n# Prefer MP4 container\nyt-dlp -f \"bestvideo[ext=mp4]+bestaudio[ext=m4a]\" --merge-output-format mp4 \"VIDEO_URL\"\n\n# With metadata and thumbnail embedding\nyt-dlp -f \"bestvideo+bestaudio\" \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  --embed-subs \\\n  \"VIDEO_URL\"\n```\n\n### Failure-Mode Triage (#1229)\n\nMatch the symptom to the right gate before changing format selectors. Three distinct failures look similar but require different fixes:\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `-F` lists only `sb0..sb3` storyboard formats; warning `n challenge solving failed`, `Only images are available` | n-challenge \u002F EJS missing | Install `yt-dlp-ejs` and a JS runtime (see Prerequisites). Most failures resolve here. |\n| Client-specific 403s; warning `mweb formats require a GVS PO Token` or similar | PO token required | Install `bgutil-ytdlp-pot-provider` (see Prerequisites). |\n| Explicit-format 403 on `bestvideo[ext=mp4]+bestaudio[ext=m4a]` selectors against newer videos | SABR | Simplify to `best[ext=mp4]\u002Fbest` (below). |\n\n#### SABR 403 (legacy fix — keep for explicit-selector failures)\n\n```bash\n# BROKEN (SABR 403 on explicit selectors):\nyt-dlp -f \"bestvideo[ext=mp4]+bestaudio[ext=m4a]\" \"VIDEO_URL\"\n\n# WORKS (SABR-compatible):\nyt-dlp -f \"best[ext=mp4]\u002Fbest\" \"VIDEO_URL\"\n\n# Audio-only SABR-safe:\nyt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"VIDEO_URL\"\n```\n\n**Why this still helps even with EJS in place**: `best[ext=mp4]\u002Fbest` lets yt-dlp pick a single combined stream rather than negotiating separate video\u002Faudio tracks, which sidesteps both SABR 403s and several PO-token edge cases.\n\n### Audio-Only Extraction\n\nExtract audio track without video.\n\n```bash\n# Best audio quality, convert to MP3\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \"VIDEO_URL\"\n\n# FLAC (lossless)\nyt-dlp -f \"bestaudio\" -x --audio-format flac \"VIDEO_URL\"\n\n# Opus (high quality, small size)\nyt-dlp -f \"bestaudio\" -x --audio-format opus \"VIDEO_URL\"\n\n# M4A (AAC, good compatibility)\nyt-dlp -f \"bestaudio\" -x --audio-format m4a \"VIDEO_URL\"\n\n# MP3 with bitrate specification\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 --audio-quality 320K \"VIDEO_URL\"\n\n# SABR-safe audio extraction\nyt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"VIDEO_URL\"\n```\n\n**Audio Quality Ladder**:\n1. **FLAC** - Lossless, large files, archival quality\n2. **Opus** - Best quality\u002Fsize ratio, not universally supported\n3. **M4A\u002FAAC 256kbps** - Excellent quality, wide compatibility\n4. **MP3 320kbps** - Good quality, universal compatibility\n5. **MP3 192kbps** - Acceptable quality, smaller files\n\n### Specific Resolution\n\nDownload specific video resolution.\n\n```bash\n# 1080p MP4\nyt-dlp -f \"bestvideo[height\u003C=1080][ext=mp4]+bestaudio[ext=m4a]\" \"VIDEO_URL\"\n\n# 720p (standard HD)\nyt-dlp -f \"bestvideo[height\u003C=720]+bestaudio\" \"VIDEO_URL\"\n\n# 4K (2160p)\nyt-dlp -f \"bestvideo[height\u003C=2160]+bestaudio\" \"VIDEO_URL\"\n\n# SABR-safe resolution preference\nyt-dlp -f \"best[height\u003C=1080]\u002Fbest\" \"VIDEO_URL\"\n```\n\n### Specific Format Codes\n\nUse YouTube format codes directly (use `yt-dlp -F URL` to list available formats).\n\n```bash\n# List all available formats\nyt-dlp -F \"VIDEO_URL\"\n\n# Download specific format code\nyt-dlp -f 137+140 \"VIDEO_URL\"  # 1080p video (137) + M4A audio (140)\n\n# Fallback chain\nyt-dlp -f \"137+140\u002F136+140\u002Fbest\" \"VIDEO_URL\"  # Try 1080p, then 720p, then best\n```\n\n**Common YouTube Format Codes**:\n- **137**: 1080p MP4 video\n- **136**: 720p MP4 video\n- **140**: M4A 128kbps audio\n- **251**: Opus 160kbps audio\n- **bestaudio**: Highest quality audio available\n\n## Playlist Operations\n\n### Download Entire Playlist\n\n```bash\n# All videos in playlist\nyt-dlp \"PLAYLIST_URL\"\n\n# Playlist with numbering\nyt-dlp -o \"%(playlist_index)s - %(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Playlist to specific directory\nyt-dlp -o \"~\u002FMusic\u002F%(playlist)s\u002F%(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Audio-only playlist\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \"PLAYLIST_URL\"\n```\n\n### Playlist Range Selection\n\n```bash\n# Download items 1-10\nyt-dlp --playlist-start 1 --playlist-end 10 \"PLAYLIST_URL\"\n\n# Download every other video\nyt-dlp --playlist-items \"1,3,5,7,9\" \"PLAYLIST_URL\"\n\n# Skip first 5 videos\nyt-dlp --playlist-start 6 \"PLAYLIST_URL\"\n\n# Download only specific item numbers\nyt-dlp --playlist-items \"1,5,10,15\" \"PLAYLIST_URL\"\n```\n\n### Reverse Playlist Order\n\n```bash\n# Download oldest-first instead of newest-first\nyt-dlp --playlist-reverse \"PLAYLIST_URL\"\n```\n\n## Channel Downloads\n\n### Entire Channel\n\n```bash\n# All videos from channel\nyt-dlp \"https:\u002F\u002Fwww.youtube.com\u002F@CHANNEL_HANDLE\u002Fvideos\"\n\n# Channel with custom output template\nyt-dlp -o \"%(uploader)s\u002F%(upload_date)s - %(title)s.%(ext)s\" \\\n  \"https:\u002F\u002Fwww.youtube.com\u002F@CHANNEL_HANDLE\u002Fvideos\"\n\n# Audio-only from entire channel\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  \"https:\u002F\u002Fwww.youtube.com\u002F@CHANNEL_HANDLE\u002Fvideos\"\n```\n\n### Channel Filtered by Date\n\n```bash\n# Videos uploaded after specific date\nyt-dlp --dateafter 20230101 \"CHANNEL_URL\"\n\n# Videos from specific date range\nyt-dlp --dateafter 20230101 --datebefore 20231231 \"CHANNEL_URL\"\n\n# Only today's uploads\nyt-dlp --dateafter today \"CHANNEL_URL\"\n\n# Last 7 days\nyt-dlp --dateafter now-7days \"CHANNEL_URL\"\n```\n\n### Channel Filtered by View Count\n\n```bash\n# Videos with at least 100K views\nyt-dlp --min-views 100000 \"CHANNEL_URL\"\n\n# Videos with less than 1M views\nyt-dlp --max-views 1000000 \"CHANNEL_URL\"\n```\n\n## Search and Discovery\n\n### YouTube Search\n\n```bash\n# Search for videos\nyt-dlp \"ytsearch10:artist name song\"\n\n# Search and download best match\nyt-dlp \"ytsearch1:artist official video\"\n\n# Search, audio-only\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \"ytsearch5:artist live\"\n\n# Search specific channel\nyt-dlp \"ytsearch:artist name intitle:official\"\n```\n\n### Search Options\n\n```bash\n# Sort by view count\nyt-dlp \"ytsearchsortorder:view_count:artist name\"\n\n# Sort by upload date\nyt-dlp \"ytsearchsortorder:upload_date:artist name\"\n\n# Sort by rating\nyt-dlp \"ytsearchsortorder:rating:artist name\"\n\n# Filter HD only in search\nyt-dlp -f \"bestvideo[height>=720]+bestaudio\" \"ytsearch5:artist HD\"\n```\n\n## Metadata and Thumbnails\n\n### Embed Metadata\n\n```bash\n# Embed all metadata\nyt-dlp --embed-metadata \"VIDEO_URL\"\n\n# Add metadata to MP3\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  --embed-metadata \\\n  --add-metadata \\\n  \"VIDEO_URL\"\n\n# Custom metadata\nyt-dlp --parse-metadata \"title:%(artist)s - %(track)s\" \\\n  --embed-metadata \\\n  \"VIDEO_URL\"\n```\n\n### Thumbnail Handling\n\n```bash\n# Download thumbnail separately\nyt-dlp --write-thumbnail \"VIDEO_URL\"\n\n# Embed thumbnail in video\nyt-dlp --embed-thumbnail \"VIDEO_URL\"\n\n# Embed thumbnail in MP3 (requires ffmpeg with MP3 support)\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  --embed-thumbnail \\\n  --embed-metadata \\\n  \"VIDEO_URL\"\n\n# Thumbnail format preference\nyt-dlp --write-thumbnail --convert-thumbnails jpg \"VIDEO_URL\"\n```\n\n### Write Metadata Files\n\n```bash\n# Write JSON metadata\nyt-dlp --write-info-json \"VIDEO_URL\"\n\n# Write description to .txt file\nyt-dlp --write-description \"VIDEO_URL\"\n\n# Write all metadata artifacts\nyt-dlp --write-info-json \\\n  --write-description \\\n  --write-thumbnail \\\n  --write-annotations \\\n  \"VIDEO_URL\"\n```\n\n## Subtitle Downloads\n\n### Basic Subtitle Download\n\n```bash\n# Download all available subtitles\nyt-dlp --write-subs --all-subs \"VIDEO_URL\"\n\n# Download auto-generated captions\nyt-dlp --write-auto-subs \"VIDEO_URL\"\n\n# Specific language\nyt-dlp --write-subs --sub-langs \"en,es,fr\" \"VIDEO_URL\"\n\n# Embed subtitles in video\nyt-dlp --embed-subs \"VIDEO_URL\"\n```\n\n### Subtitle Format Conversion\n\n```bash\n# Convert subtitles to SRT\nyt-dlp --write-subs --sub-format srt \"VIDEO_URL\"\n\n# Convert to VTT\nyt-dlp --write-subs --sub-format vtt \"VIDEO_URL\"\n\n# Multiple formats\nyt-dlp --write-subs --sub-format \"srt\u002Fvtt\u002Fbest\" \"VIDEO_URL\"\n```\n\n## Output Templates\n\n### File Naming Patterns\n\n```bash\n# Default: video title + extension\nyt-dlp -o \"%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Include upload date\nyt-dlp -o \"%(upload_date)s - %(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Include uploader\nyt-dlp -o \"%(uploader)s\u002F%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Playlist numbering\nyt-dlp -o \"%(playlist_index)02d - %(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Full metadata filename\nyt-dlp -o \"%(uploader)s - %(upload_date)s - %(title)s [%(id)s].%(ext)s\" \"VIDEO_URL\"\n```\n\n### Directory Organization\n\n```bash\n# Organize by uploader\nyt-dlp -o \"~\u002FDownloads\u002F%(uploader)s\u002F%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Organize by date (year\u002Fmonth)\nyt-dlp -o \"~\u002FArchive\u002F%(upload_date>%Y)s\u002F%(upload_date>%m)s\u002F%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Organize playlists\nyt-dlp -o \"~\u002FMusic\u002F%(playlist)s\u002F%(playlist_index)02d - %(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Organize by channel and upload date\nyt-dlp -o \"%(uploader)s\u002F%(upload_date)s\u002F%(title)s.%(ext)s\" \"CHANNEL_URL\"\n```\n\n### Sanitization and Safety\n\n```bash\n# Restrict filenames (no special characters)\nyt-dlp --restrict-filenames -o \"%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Replace spaces with underscores\nyt-dlp -o \"%(title)s.%(ext)s\" --replace-in-metadata \"title\" \" \" \"_\" \"VIDEO_URL\"\n\n# Trim long titles\nyt-dlp -o \"%(title).50s.%(ext)s\" \"VIDEO_URL\"  # Max 50 characters\n```\n\n## Quality Selection Strategies\n\n### Balanced Quality\u002FSize\n\n```bash\n# 1080p max, good balance\nyt-dlp -f \"bestvideo[height\u003C=1080]+bestaudio\u002Fbest[height\u003C=1080]\" \"VIDEO_URL\"\n\n# Prefer MP4, VP9 fallback\nyt-dlp -f \"bestvideo[ext=mp4]+bestaudio[ext=m4a]\u002Fbestvideo+bestaudio\" \\\n  --merge-output-format mp4 \\\n  \"VIDEO_URL\"\n\n# Audio: 192kbps MP3 (good balance)\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 --audio-quality 192K \"VIDEO_URL\"\n```\n\n### Maximum Quality\n\n```bash\n# Best everything\nyt-dlp -f \"bestvideo+bestaudio\" \"VIDEO_URL\"\n\n# 4K with best audio\nyt-dlp -f \"bestvideo[height\u003C=2160]+bestaudio\" \"VIDEO_URL\"\n\n# Audio: FLAC lossless\nyt-dlp -f \"bestaudio\" -x --audio-format flac \"VIDEO_URL\"\n```\n\n### Minimum File Size\n\n```bash\n# Smallest reasonable quality\nyt-dlp -f \"worst[height>=360]\" \"VIDEO_URL\"\n\n# Audio: 128kbps MP3\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 --audio-quality 128K \"VIDEO_URL\"\n\n# Prefer smaller codecs\nyt-dlp -f \"bestvideo[ext=webm][height\u003C=720]+bestaudio[ext=webm]\" \"VIDEO_URL\"\n```\n\n## Archive and Resumption\n\n### Download Archive\n\nPrevent re-downloading already acquired content.\n\n```bash\n# Create\u002Fuse download archive\nyt-dlp --download-archive downloaded.txt \"PLAYLIST_URL\"\n\n# Update playlist without re-downloading\nyt-dlp --download-archive archive.txt \"PLAYLIST_URL\"\n\n# Separate archive per playlist\nyt-dlp --download-archive \"%(playlist_id)s.txt\" \"PLAYLIST_URL\"\n```\n\n### Resume Interrupted Downloads\n\n```bash\n# Continue incomplete downloads (default behavior)\nyt-dlp -c \"VIDEO_URL\"\n\n# Force re-download even if file exists\nyt-dlp --no-continue \"VIDEO_URL\"\n```\n\n## Advanced Filtering\n\n### File Size Limits\n\n```bash\n# Skip files larger than 500MB\nyt-dlp --max-filesize 500M \"VIDEO_URL\"\n\n# Skip files smaller than 10MB\nyt-dlp --min-filesize 10M \"VIDEO_URL\"\n\n# Combination\nyt-dlp --min-filesize 10M --max-filesize 500M \"PLAYLIST_URL\"\n```\n\n### Duration Filters\n\n```bash\n# Only videos longer than 5 minutes\nyt-dlp --match-filter \"duration > 300\" \"CHANNEL_URL\"\n\n# Only videos shorter than 10 minutes\nyt-dlp --match-filter \"duration \u003C 600\" \"PLAYLIST_URL\"\n\n# Between 3-10 minutes\nyt-dlp --match-filter \"duration > 180 & duration \u003C 600\" \"CHANNEL_URL\"\n```\n\n### Content Filters\n\n```bash\n# Skip live streams\nyt-dlp --match-filter \"!is_live\" \"CHANNEL_URL\"\n\n# Only live streams\nyt-dlp --match-filter \"is_live\" \"CHANNEL_URL\"\n\n# Skip age-restricted content\nyt-dlp --match-filter \"!age_limit\" \"CHANNEL_URL\"\n\n# Minimum view count\nyt-dlp --match-filter \"view_count > 10000\" \"CHANNEL_URL\"\n```\n\n## Rate Limiting and Throttling\n\n### Speed Limits\n\n```bash\n# Limit download speed to 5MB\u002Fs\nyt-dlp -r 5M \"VIDEO_URL\"\n\n# Limit to 1MB\u002Fs\nyt-dlp -r 1M \"PLAYLIST_URL\"\n\n# No speed limit (default)\nyt-dlp -r 0 \"VIDEO_URL\"\n```\n\n### Request Throttling\n\n```bash\n# Sleep between downloads\nyt-dlp --sleep-interval 5 \"PLAYLIST_URL\"\n\n# Random sleep (3-8 seconds)\nyt-dlp --min-sleep-interval 3 --max-sleep-interval 8 \"PLAYLIST_URL\"\n\n# Sleep before each download\nyt-dlp --sleep-requests 2 \"CHANNEL_URL\"\n```\n\n## Authentication and Cookies\n\n### Login with Credentials\n\n```bash\n# Login with username\u002Fpassword\nyt-dlp -u USERNAME -p PASSWORD \"VIDEO_URL\"\n\n# Login with netrc file\nyt-dlp -n \"VIDEO_URL\"\n```\n\n### Cookie Files\n\n```bash\n# Use browser cookies (for member-only content)\nyt-dlp --cookies-from-browser firefox \"VIDEO_URL\"\n\n# Use cookie file\nyt-dlp --cookies cookies.txt \"VIDEO_URL\"\n\n# Export cookies from browser for reuse\nyt-dlp --cookies-from-browser chrome --cookies cookies.txt \"VIDEO_URL\"\n```\n\n#### Flatpak browser profiles (#1229)\n\n`--cookies-from-browser chromium` does NOT find Flatpak Chromium installs (or any other Flatpak browser) — the binary's default profile path doesn't match the Flatpak sandbox layout. Pass an explicit profile path:\n\n```bash\n# Flatpak Chromium\nyt-dlp --cookies-from-browser \"chromium:$HOME\u002F.var\u002Fapp\u002Forg.chromium.Chromium\u002Fconfig\u002Fchromium\" \"VIDEO_URL\"\n\n# Flatpak Ungoogled Chromium\nyt-dlp --cookies-from-browser \"chromium:$HOME\u002F.var\u002Fapp\u002Fio.github.ungoogled_software.ungoogled_chromium\u002Fconfig\u002Fchromium\" \"VIDEO_URL\"\n\n# Flatpak Firefox\nyt-dlp --cookies-from-browser \"firefox:$HOME\u002F.var\u002Fapp\u002Forg.mozilla.firefox\u002F.mozilla\u002Ffirefox\" \"VIDEO_URL\"\n```\n\nThe same pattern (`\u003Cbrowser>:\u003Cprofile-path>`) applies to any Flatpak browser. Native (non-Flatpak) installs are auto-discovered without the explicit path.\n\n## Post-Processing\n\n### FFmpeg Operations\n\n```bash\n# Re-encode video\nyt-dlp --recode-video mp4 \"VIDEO_URL\"\n\n# Re-encode audio\nyt-dlp -x --audio-format mp3 --audio-quality 320K \"VIDEO_URL\"\n\n# Add custom ffmpeg args\nyt-dlp --postprocessor-args \"ffmpeg:-c:v libx264 -crf 23\" \"VIDEO_URL\"\n```\n\n### Thumbnail to Video\n\n```bash\n# Extract thumbnail from video\nyt-dlp --write-thumbnail --skip-download \"VIDEO_URL\"\n\n# Embed thumbnail in audio file\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  --embed-thumbnail \\\n  \"VIDEO_URL\"\n```\n\n## Batch Downloads\n\n### File-Based Batch\n\n```bash\n# Download all URLs in file\nyt-dlp -a urls.txt\n\n# URLs file format (one URL per line)\ncat > urls.txt \u003C\u003CEOF\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO1\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO2\nhttps:\u002F\u002Fyoutube.com\u002Fplaylist?list=PLAYLIST_ID\nEOF\n\nyt-dlp -a urls.txt\n\n# Batch with custom options\nyt-dlp -a urls.txt -f \"bestaudio\" -x --audio-format mp3\n```\n\n### Scripted Batch\n\n```bash\n# Loop through list\nfor url in $(cat urls.txt); do\n  yt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"$url\"\n  sleep 5  # Rate limiting\ndone\n\n# Parallel downloads (use with caution)\ncat urls.txt | xargs -P 3 -I {} yt-dlp {}\n```\n\n## Platform-Specific Patterns\n\n### SoundCloud\n\n```bash\n# SoundCloud track\nyt-dlp \"https:\u002F\u002Fsoundcloud.com\u002Fartist\u002Ftrack\"\n\n# SoundCloud playlist\nyt-dlp \"https:\u002F\u002Fsoundcloud.com\u002Fartist\u002Fsets\u002Fplaylist\"\n\n# SoundCloud user (all tracks)\nyt-dlp \"https:\u002F\u002Fsoundcloud.com\u002Fartist\u002Ftracks\"\n\n# Extract metadata\nyt-dlp --embed-metadata \\\n  -f \"bestaudio\" -x --audio-format mp3 \\\n  \"SOUNDCLOUD_URL\"\n```\n\n### Vimeo\n\n```bash\n# Vimeo video\nyt-dlp \"https:\u002F\u002Fvimeo.com\u002FVIDEO_ID\"\n\n# Vimeo with password\nyt-dlp --video-password PASSWORD \"VIMEO_URL\"\n\n# Best quality Vimeo\nyt-dlp -f \"bestvideo+bestaudio\" \"VIMEO_URL\"\n```\n\n### Bandcamp\n\n```bash\n# Bandcamp album\nyt-dlp \"https:\u002F\u002Fartist.bandcamp.com\u002Falbum\u002Falbum-name\"\n\n# Bandcamp track\nyt-dlp \"https:\u002F\u002Fartist.bandcamp.com\u002Ftrack\u002Ftrack-name\"\n\n# Extract FLAC from Bandcamp (if available)\nyt-dlp -f \"best\" \"BANDCAMP_URL\"\n```\n\n### Internet Archive\n\n```bash\n# Archive.org item\nyt-dlp \"https:\u002F\u002Farchive.org\u002Fdetails\u002FIDENTIFIER\"\n\n# Specific format from archive\nyt-dlp -f \"FLAC\u002FMP3\u002Fbest\" \"ARCHIVE_URL\"\n\n# All files from item\nyt-dlp \"https:\u002F\u002Farchive.org\u002Fdownload\u002FIDENTIFIER\u002F\"\n```\n\n## Troubleshooting Patterns\n\n### Only storyboards available \u002F \"n challenge solving failed\"\n\nMost common 2026 failure. The EJS solver is missing or invisible to a zipapp install. See **Prerequisites** above for the full fix.\n\n```bash\n# Quick fix path:\npip install --user --break-system-packages yt-dlp-ejs yt-dlp\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"\n~\u002F.local\u002Fbin\u002Fyt-dlp -F \"VIDEO_URL\"   # confirm real formats appear\n```\n\n### \"mweb formats require a GVS PO Token\" \u002F client-specific 403s\n\nPO token provider missing. See **Prerequisites** above.\n\n```bash\npip install --user bgutil-ytdlp-pot-provider\n```\n\n### 403 Forbidden on explicit format selectors (legacy SABR)\n\n```bash\n# Use simplified format selector\nyt-dlp -f \"best[ext=mp4]\u002Fbest\" \"VIDEO_URL\"\n\n# Audio-only fallback\nyt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"VIDEO_URL\"\n\n# Update yt-dlp (and EJS plugin)\npip install --user --break-system-packages -U yt-dlp yt-dlp-ejs\n```\n\n### Slow Download Speed\n\n```bash\n# Try different server\nyt-dlp --geo-bypass \"VIDEO_URL\"\n\n# Fragment-based download\nyt-dlp --concurrent-fragments 4 \"VIDEO_URL\"\n\n# External downloader (aria2c)\nyt-dlp --external-downloader aria2c \"VIDEO_URL\"\n```\n\n### Geo-Blocking\n\n```bash\n# Bypass geo-restrictions\nyt-dlp --geo-bypass \"VIDEO_URL\"\n\n# Specify country code\nyt-dlp --geo-bypass-country US \"VIDEO_URL\"\n```\n\n### Age-Restricted Content\n\n```bash\n# Use cookies from logged-in browser\nyt-dlp --cookies-from-browser firefox \"VIDEO_URL\"\n\n# Or use credentials\nyt-dlp -u USERNAME -p PASSWORD \"VIDEO_URL\"\n```\n\n## Performance Optimization\n\n### Parallel Downloads\n\n```bash\n# Use external downloader with multiple connections\nyt-dlp --external-downloader aria2c \\\n  --external-downloader-args \"-x 16 -s 16 -k 1M\" \\\n  \"VIDEO_URL\"\n```\n\n### Fragment Optimization\n\n```bash\n# Download fragments concurrently\nyt-dlp --concurrent-fragments 8 \"VIDEO_URL\"\n\n# Useful for large videos and playlists\nyt-dlp --concurrent-fragments 4 \"PLAYLIST_URL\"\n```\n\n## Complete Examples\n\n### Example 1: Music Video Collection\n\nDownload entire artist channel as 1080p MP4 with metadata.\n\n```bash\nyt-dlp -f \"best[height\u003C=1080][ext=mp4]\u002Fbest[height\u003C=1080]\u002Fbest\" \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  --embed-subs \\\n  -o \"%(uploader)s\u002F%(upload_date)s - %(title)s.%(ext)s\" \\\n  --download-archive downloaded.txt \\\n  \"https:\u002F\u002Fwww.youtube.com\u002F@ArtistOfficial\u002Fvideos\"\n```\n\n### Example 2: Audio-Only Discography\n\nExtract audio from all videos in playlist as 320kbps MP3.\n\n```bash\nyt-dlp -f \"bestaudio\u002Fbest\" \\\n  -x --audio-format mp3 --audio-quality 320K \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  -o \"%(playlist)s\u002F%(playlist_index)02d - %(title)s.%(ext)s\" \\\n  \"PLAYLIST_URL\"\n```\n\n### Example 3: Live Concert Archive\n\nDownload concert with subtitles, thumbnail, and JSON metadata.\n\n```bash\nyt-dlp -f \"bestvideo+bestaudio\" \\\n  --write-subs --embed-subs --all-subs \\\n  --write-thumbnail --embed-thumbnail \\\n  --write-info-json \\\n  --write-description \\\n  -o \"Concerts\u002F%(upload_date)s - %(title)s.%(ext)s\" \\\n  \"VIDEO_URL\"\n```\n\n### Example 4: SABR-Safe Batch Download\n\nDownload multiple videos using SABR-compatible format selection.\n\n```bash\ncat > urls.txt \u003C\u003CEOF\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO1\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO2\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO3\nEOF\n\nyt-dlp -f \"best[ext=mp4]\u002Fbest\" \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  -o \"%(title)s.%(ext)s\" \\\n  -a urls.txt\n```\n\n## Best Practices\n\n1. **Verify Prerequisites first** — Install `yt-dlp-ejs` + a JS runtime, and confirm `yt-dlp` itself was installed via `pip` (not the standalone zipapp) so plugins resolve. See the Prerequisites section above.\n2. **Always use `--embed-metadata`** - Preserves video metadata in file\n3. **Use download archive** - Prevents re-downloading with `--download-archive`\n4. **Apply SABR workaround** - Use `best[ext=mp4]\u002Fbest` for explicit-selector failures on newer videos\n5. **Rate limit large downloads** - Use `--sleep-interval` for playlists\u002Fchannels\n6. **Organize with output templates** - Use `-o` for consistent file organization\n7. **Install yt-dlp via pip, not the zipapp** — `pip install --user --break-system-packages -U yt-dlp` shares site-packages with `yt-dlp-ejs`; distros \u002F package managers shipping the zipapp form will silently break plugin discovery.\n8. **Test format selection** - Use `-F` to list formats before downloading; if you only see `sb*` storyboard formats, an EJS prerequisite is missing.\n9. **Use cookies for member content** - `--cookies-from-browser` for restricted content; pass an explicit profile path for Flatpak browsers (see Authentication and Cookies > Flatpak browser profiles).\n\n## See Also\n\n- Source Discoverer Agent: `@$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fagents\u002Fsource-discoverer.md`\n- find-sources Command: `@$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fcommands\u002Ffind-sources.md`\n- Queue Manager Agent: `@$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fagents\u002Fqueue-manager.md`\n\n## References\n\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Frules\u002Fhuman-authorization.md — Seek explicit authorization before bulk channel downloads or overwriting existing files\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Ffind-sources\u002FSKILL.md — Source discovery skill that identifies YouTube URLs for this skill to download\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Facquire\u002FSKILL.md — General acquisition skill that delegates YouTube downloads to this skill\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Faudio-extraction\u002FSKILL.md — Audio extraction patterns used after YouTube video downloads\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fquality-filtering\u002FSKILL.md — Quality filtering applied to select best available YouTube format\n","# YouTube Acquisition\n\nComprehensive yt-dlp command patterns for downloading video and audio content from YouTube, Vimeo, SoundCloud, and other supported platforms. Includes quality selection strategies, format filtering, the SABR 403 workaround, metadata extraction, and batch operations.\n\n## Overview\n\n**yt-dlp** is the primary tool for media acquisition from YouTube and 1000+ other sites. This skill documents proven patterns from production use, including workarounds for the n-challenge \u002F EJS gate, PO-token requirements, and the older SABR 403 issue.\n\n**Key Capabilities**:\n- Download best available quality (video + audio)\n- Extract audio-only in multiple formats\n- Handle playlists and channels\n- Embed metadata and thumbnails\n- Download subtitles and auto-captions\n- Work around platform restrictions\n\n## Prerequisites (#1229)\n\nAs of 2026, basic format selectors return only image storyboards on most YouTube videos until two relatively new gates are satisfied. **Read this section before any acquisition attempt** — running yt-dlp without these prerequisites produces \"Only images are available for download\" failures that look like format-selector bugs but aren't.\n\n### 1. n-challenge \u002F EJS solver\n\nYouTube returns ciphered streaming URLs whose `n` parameter must be transformed by JavaScript extracted from the player. yt-dlp delegates this to the `yt-dlp-ejs` plugin plus a JS runtime. Without both, all real formats are filtered out and only `sb*` storyboard formats remain.\n\n```bash\n# Install the EJS plugin\npip install --user yt-dlp-ejs\n\n# JS runtime — deno preferred, node accepted\nwhich deno || sudo apt install -y deno   # Debian\u002FUbuntu\n# OR: yt-dlp --js-runtimes node:\u002Fusr\u002Fbin\u002Fnode ...\n```\n\nReference: \u003Chttps:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp\u002Fwiki\u002FEJS>\n\n### 2. PO Token (Proof of Origin)\n\nMany client variants (`mweb`, `ios`, `web`) demand a Proof-of-Origin token tied to a logged-in \u002F browser-attested session. Without a PO token provider those clients are skipped, narrowing the available format list. Standard provider:\n\n```bash\npip install --user bgutil-ytdlp-pot-provider\n```\n\nReference: \u003Chttps:\u002F\u002Fgithub.com\u002Fyt-dlp\u002Fyt-dlp\u002Fwiki\u002FPO-Token-Guide>\n\n### 3. Plugin discovery — install yt-dlp via pip, NOT the standalone zipapp\n\nThis is the gotcha that bites operators most often. The standalone yt-dlp **zipapp** (the form distributed at `\u002Fusr\u002Flocal\u002Fbin\u002Fyt-dlp` from the official static download) does not expose user site-packages to its plugin-discovery path. Even after `pip install --user yt-dlp-ejs`, a zipapp invocation will silently fail to find the EJS solver. Symptoms: `n challenge solving failed` warnings even after installing the plugin.\n\nThe fix is to install yt-dlp itself via pip so it shares `site-packages` with the EJS plugin, then ensure `~\u002F.local\u002Fbin` precedes `\u002Fusr\u002Flocal\u002Fbin` on PATH:\n\n```bash\npip install --user --break-system-packages yt-dlp-ejs   # plugin\npip install --user --break-system-packages -U yt-dlp    # 2026.03.17+ — same site-packages\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"\n\n# Verify the EJS solver is discovered\n~\u002F.local\u002Fbin\u002Fyt-dlp -F \"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=VIDEO_ID\"\n# Should now list real formats, not just sb*\n```\n\nAfter this, downloads typically succeed automatically — yt-dlp's EJS solver may even fall back to the `android_vr` client without needing the JS runtime.\n\n## Basic Download Patterns\n\n### Best Quality Video + Audio\n\nDownload highest quality video and audio, merge into single file.\n\n```bash\n# Recommended: Let yt-dlp choose best combination\nyt-dlp \"VIDEO_URL\"\n\n# Explicit best video+audio merge\nyt-dlp -f \"bestvideo+bestaudio\" \"VIDEO_URL\"\n\n# Prefer MP4 container\nyt-dlp -f \"bestvideo[ext=mp4]+bestaudio[ext=m4a]\" --merge-output-format mp4 \"VIDEO_URL\"\n\n# With metadata and thumbnail embedding\nyt-dlp -f \"bestvideo+bestaudio\" \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  --embed-subs \\\n  \"VIDEO_URL\"\n```\n\n### Failure-Mode Triage (#1229)\n\nMatch the symptom to the right gate before changing format selectors. Three distinct failures look similar but require different fixes:\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `-F` lists only `sb0..sb3` storyboard formats; warning `n challenge solving failed`, `Only images are available` | n-challenge \u002F EJS missing | Install `yt-dlp-ejs` and a JS runtime (see Prerequisites). Most failures resolve here. |\n| Client-specific 403s; warning `mweb formats require a GVS PO Token` or similar | PO token required | Install `bgutil-ytdlp-pot-provider` (see Prerequisites). |\n| Explicit-format 403 on `bestvideo[ext=mp4]+bestaudio[ext=m4a]` selectors against newer videos | SABR | Simplify to `best[ext=mp4]\u002Fbest` (below). |\n\n#### SABR 403 (legacy fix — keep for explicit-selector failures)\n\n```bash\n# BROKEN (SABR 403 on explicit selectors):\nyt-dlp -f \"bestvideo[ext=mp4]+bestaudio[ext=m4a]\" \"VIDEO_URL\"\n\n# WORKS (SABR-compatible):\nyt-dlp -f \"best[ext=mp4]\u002Fbest\" \"VIDEO_URL\"\n\n# Audio-only SABR-safe:\nyt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"VIDEO_URL\"\n```\n\n**Why this still helps even with EJS in place**: `best[ext=mp4]\u002Fbest` lets yt-dlp pick a single combined stream rather than negotiating separate video\u002Faudio tracks, which sidesteps both SABR 403s and several PO-token edge cases.\n\n### Audio-Only Extraction\n\nExtract audio track without video.\n\n```bash\n# Best audio quality, convert to MP3\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \"VIDEO_URL\"\n\n# FLAC (lossless)\nyt-dlp -f \"bestaudio\" -x --audio-format flac \"VIDEO_URL\"\n\n# Opus (high quality, small size)\nyt-dlp -f \"bestaudio\" -x --audio-format opus \"VIDEO_URL\"\n\n# M4A (AAC, good compatibility)\nyt-dlp -f \"bestaudio\" -x --audio-format m4a \"VIDEO_URL\"\n\n# MP3 with bitrate specification\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 --audio-quality 320K \"VIDEO_URL\"\n\n# SABR-safe audio extraction\nyt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"VIDEO_URL\"\n```\n\n**Audio Quality Ladder**:\n1. **FLAC** - Lossless, large files, archival quality\n2. **Opus** - Best quality\u002Fsize ratio, not universally supported\n3. **M4A\u002FAAC 256kbps** - Excellent quality, wide compatibility\n4. **MP3 320kbps** - Good quality, universal compatibility\n5. **MP3 192kbps** - Acceptable quality, smaller files\n\n### Specific Resolution\n\nDownload specific video resolution.\n\n```bash\n# 1080p MP4\nyt-dlp -f \"bestvideo[height\u003C=1080][ext=mp4]+bestaudio[ext=m4a]\" \"VIDEO_URL\"\n\n# 720p (standard HD)\nyt-dlp -f \"bestvideo[height\u003C=720]+bestaudio\" \"VIDEO_URL\"\n\n# 4K (2160p)\nyt-dlp -f \"bestvideo[height\u003C=2160]+bestaudio\" \"VIDEO_URL\"\n\n# SABR-safe resolution preference\nyt-dlp -f \"best[height\u003C=1080]\u002Fbest\" \"VIDEO_URL\"\n```\n\n### Specific Format Codes\n\nUse YouTube format codes directly (use `yt-dlp -F URL` to list available formats).\n\n```bash\n# List all available formats\nyt-dlp -F \"VIDEO_URL\"\n\n# Download specific format code\nyt-dlp -f 137+140 \"VIDEO_URL\"  # 1080p video (137) + M4A audio (140)\n\n# Fallback chain\nyt-dlp -f \"137+140\u002F136+140\u002Fbest\" \"VIDEO_URL\"  # Try 1080p, then 720p, then best\n```\n\n**Common YouTube Format Codes**:\n- **137**: 1080p MP4 video\n- **136**: 720p MP4 video\n- **140**: M4A 128kbps audio\n- **251**: Opus 160kbps audio\n- **bestaudio**: Highest quality audio available\n\n## Playlist Operations\n\n### Download Entire Playlist\n\n```bash\n# All videos in playlist\nyt-dlp \"PLAYLIST_URL\"\n\n# Playlist with numbering\nyt-dlp -o \"%(playlist_index)s - %(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Playlist to specific directory\nyt-dlp -o \"~\u002FMusic\u002F%(playlist)s\u002F%(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Audio-only playlist\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \"PLAYLIST_URL\"\n```\n\n### Playlist Range Selection\n\n```bash\n# Download items 1-10\nyt-dlp --playlist-start 1 --playlist-end 10 \"PLAYLIST_URL\"\n\n# Download every other video\nyt-dlp --playlist-items \"1,3,5,7,9\" \"PLAYLIST_URL\"\n\n# Skip first 5 videos\nyt-dlp --playlist-start 6 \"PLAYLIST_URL\"\n\n# Download only specific item numbers\nyt-dlp --playlist-items \"1,5,10,15\" \"PLAYLIST_URL\"\n```\n\n### Reverse Playlist Order\n\n```bash\n# Download oldest-first instead of newest-first\nyt-dlp --playlist-reverse \"PLAYLIST_URL\"\n```\n\n## Channel Downloads\n\n### Entire Channel\n\n```bash\n# All videos from channel\nyt-dlp \"https:\u002F\u002Fwww.youtube.com\u002F@CHANNEL_HANDLE\u002Fvideos\"\n\n# Channel with custom output template\nyt-dlp -o \"%(uploader)s\u002F%(upload_date)s - %(title)s.%(ext)s\" \\\n  \"https:\u002F\u002Fwww.youtube.com\u002F@CHANNEL_HANDLE\u002Fvideos\"\n\n# Audio-only from entire channel\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  \"https:\u002F\u002Fwww.youtube.com\u002F@CHANNEL_HANDLE\u002Fvideos\"\n```\n\n### Channel Filtered by Date\n\n```bash\n# Videos uploaded after specific date\nyt-dlp --dateafter 20230101 \"CHANNEL_URL\"\n\n# Videos from specific date range\nyt-dlp --dateafter 20230101 --datebefore 20231231 \"CHANNEL_URL\"\n\n# Only today's uploads\nyt-dlp --dateafter today \"CHANNEL_URL\"\n\n# Last 7 days\nyt-dlp --dateafter now-7days \"CHANNEL_URL\"\n```\n\n### Channel Filtered by View Count\n\n```bash\n# Videos with at least 100K views\nyt-dlp --min-views 100000 \"CHANNEL_URL\"\n\n# Videos with less than 1M views\nyt-dlp --max-views 1000000 \"CHANNEL_URL\"\n```\n\n## Search and Discovery\n\n### YouTube Search\n\n```bash\n# Search for videos\nyt-dlp \"ytsearch10:artist name song\"\n\n# Search and download best match\nyt-dlp \"ytsearch1:artist official video\"\n\n# Search, audio-only\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \"ytsearch5:artist live\"\n\n# Search specific channel\nyt-dlp \"ytsearch:artist name intitle:official\"\n```\n\n### Search Options\n\n```bash\n# Sort by view count\nyt-dlp \"ytsearchsortorder:view_count:artist name\"\n\n# Sort by upload date\nyt-dlp \"ytsearchsortorder:upload_date:artist name\"\n\n# Sort by rating\nyt-dlp \"ytsearchsortorder:rating:artist name\"\n\n# Filter HD only in search\nyt-dlp -f \"bestvideo[height>=720]+bestaudio\" \"ytsearch5:artist HD\"\n```\n\n## Metadata and Thumbnails\n\n### Embed Metadata\n\n```bash\n# Embed all metadata\nyt-dlp --embed-metadata \"VIDEO_URL\"\n\n# Add metadata to MP3\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  --embed-metadata \\\n  --add-metadata \\\n  \"VIDEO_URL\"\n\n# Custom metadata\nyt-dlp --parse-metadata \"title:%(artist)s - %(track)s\" \\\n  --embed-metadata \\\n  \"VIDEO_URL\"\n```\n\n### Thumbnail Handling\n\n```bash\n# Download thumbnail separately\nyt-dlp --write-thumbnail \"VIDEO_URL\"\n\n# Embed thumbnail in video\nyt-dlp --embed-thumbnail \"VIDEO_URL\"\n\n# Embed thumbnail in MP3 (requires ffmpeg with MP3 support)\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  --embed-thumbnail \\\n  --embed-metadata \\\n  \"VIDEO_URL\"\n\n# Thumbnail format preference\nyt-dlp --write-thumbnail --convert-thumbnails jpg \"VIDEO_URL\"\n```\n\n### Write Metadata Files\n\n```bash\n# Write JSON metadata\nyt-dlp --write-info-json \"VIDEO_URL\"\n\n# Write description to .txt file\nyt-dlp --write-description \"VIDEO_URL\"\n\n# Write all metadata artifacts\nyt-dlp --write-info-json \\\n  --write-description \\\n  --write-thumbnail \\\n  --write-annotations \\\n  \"VIDEO_URL\"\n```\n\n## Subtitle Downloads\n\n### Basic Subtitle Download\n\n```bash\n# Download all available subtitles\nyt-dlp --write-subs --all-subs \"VIDEO_URL\"\n\n# Download auto-generated captions\nyt-dlp --write-auto-subs \"VIDEO_URL\"\n\n# Specific language\nyt-dlp --write-subs --sub-langs \"en,es,fr\" \"VIDEO_URL\"\n\n# Embed subtitles in video\nyt-dlp --embed-subs \"VIDEO_URL\"\n```\n\n### Subtitle Format Conversion\n\n```bash\n# Convert subtitles to SRT\nyt-dlp --write-subs --sub-format srt \"VIDEO_URL\"\n\n# Convert to VTT\nyt-dlp --write-subs --sub-format vtt \"VIDEO_URL\"\n\n# Multiple formats\nyt-dlp --write-subs --sub-format \"srt\u002Fvtt\u002Fbest\" \"VIDEO_URL\"\n```\n\n## Output Templates\n\n### File Naming Patterns\n\n```bash\n# Default: video title + extension\nyt-dlp -o \"%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Include upload date\nyt-dlp -o \"%(upload_date)s - %(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Include uploader\nyt-dlp -o \"%(uploader)s\u002F%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Playlist numbering\nyt-dlp -o \"%(playlist_index)02d - %(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Full metadata filename\nyt-dlp -o \"%(uploader)s - %(upload_date)s - %(title)s [%(id)s].%(ext)s\" \"VIDEO_URL\"\n```\n\n### Directory Organization\n\n```bash\n# Organize by uploader\nyt-dlp -o \"~\u002FDownloads\u002F%(uploader)s\u002F%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Organize by date (year\u002Fmonth)\nyt-dlp -o \"~\u002FArchive\u002F%(upload_date>%Y)s\u002F%(upload_date>%m)s\u002F%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Organize playlists\nyt-dlp -o \"~\u002FMusic\u002F%(playlist)s\u002F%(playlist_index)02d - %(title)s.%(ext)s\" \"PLAYLIST_URL\"\n\n# Organize by channel and upload date\nyt-dlp -o \"%(uploader)s\u002F%(upload_date)s\u002F%(title)s.%(ext)s\" \"CHANNEL_URL\"\n```\n\n### Sanitization and Safety\n\n```bash\n# Restrict filenames (no special characters)\nyt-dlp --restrict-filenames -o \"%(title)s.%(ext)s\" \"VIDEO_URL\"\n\n# Replace spaces with underscores\nyt-dlp -o \"%(title)s.%(ext)s\" --replace-in-metadata \"title\" \" \" \"_\" \"VIDEO_URL\"\n\n# Trim long titles\nyt-dlp -o \"%(title).50s.%(ext)s\" \"VIDEO_URL\"  # Max 50 characters\n```\n\n## Quality Selection Strategies\n\n### Balanced Quality\u002FSize\n\n```bash\n# 1080p max, good balance\nyt-dlp -f \"bestvideo[height\u003C=1080]+bestaudio\u002Fbest[height\u003C=1080]\" \"VIDEO_URL\"\n\n# Prefer MP4, VP9 fallback\nyt-dlp -f \"bestvideo[ext=mp4]+bestaudio[ext=m4a]\u002Fbestvideo+bestaudio\" \\\n  --merge-output-format mp4 \\\n  \"VIDEO_URL\"\n\n# Audio: 192kbps MP3 (good balance)\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 --audio-quality 192K \"VIDEO_URL\"\n```\n\n### Maximum Quality\n\n```bash\n# Best everything\nyt-dlp -f \"bestvideo+bestaudio\" \"VIDEO_URL\"\n\n# 4K with best audio\nyt-dlp -f \"bestvideo[height\u003C=2160]+bestaudio\" \"VIDEO_URL\"\n\n# Audio: FLAC lossless\nyt-dlp -f \"bestaudio\" -x --audio-format flac \"VIDEO_URL\"\n```\n\n### Minimum File Size\n\n```bash\n# Smallest reasonable quality\nyt-dlp -f \"worst[height>=360]\" \"VIDEO_URL\"\n\n# Audio: 128kbps MP3\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 --audio-quality 128K \"VIDEO_URL\"\n\n# Prefer smaller codecs\nyt-dlp -f \"bestvideo[ext=webm][height\u003C=720]+bestaudio[ext=webm]\" \"VIDEO_URL\"\n```\n\n## Archive and Resumption\n\n### Download Archive\n\nPrevent re-downloading already acquired content.\n\n```bash\n# Create\u002Fuse download archive\nyt-dlp --download-archive downloaded.txt \"PLAYLIST_URL\"\n\n# Update playlist without re-downloading\nyt-dlp --download-archive archive.txt \"PLAYLIST_URL\"\n\n# Separate archive per playlist\nyt-dlp --download-archive \"%(playlist_id)s.txt\" \"PLAYLIST_URL\"\n```\n\n### Resume Interrupted Downloads\n\n```bash\n# Continue incomplete downloads (default behavior)\nyt-dlp -c \"VIDEO_URL\"\n\n# Force re-download even if file exists\nyt-dlp --no-continue \"VIDEO_URL\"\n```\n\n## Advanced Filtering\n\n### File Size Limits\n\n```bash\n# Skip files larger than 500MB\nyt-dlp --max-filesize 500M \"VIDEO_URL\"\n\n# Skip files smaller than 10MB\nyt-dlp --min-filesize 10M \"VIDEO_URL\"\n\n# Combination\nyt-dlp --min-filesize 10M --max-filesize 500M \"PLAYLIST_URL\"\n```\n\n### Duration Filters\n\n```bash\n# Only videos longer than 5 minutes\nyt-dlp --match-filter \"duration > 300\" \"CHANNEL_URL\"\n\n# Only videos shorter than 10 minutes\nyt-dlp --match-filter \"duration \u003C 600\" \"PLAYLIST_URL\"\n\n# Between 3-10 minutes\nyt-dlp --match-filter \"duration > 180 & duration \u003C 600\" \"CHANNEL_URL\"\n```\n\n### Content Filters\n\n```bash\n# Skip live streams\nyt-dlp --match-filter \"!is_live\" \"CHANNEL_URL\"\n\n# Only live streams\nyt-dlp --match-filter \"is_live\" \"CHANNEL_URL\"\n\n# Skip age-restricted content\nyt-dlp --match-filter \"!age_limit\" \"CHANNEL_URL\"\n\n# Minimum view count\nyt-dlp --match-filter \"view_count > 10000\" \"CHANNEL_URL\"\n```\n\n## Rate Limiting and Throttling\n\n### Speed Limits\n\n```bash\n# Limit download speed to 5MB\u002Fs\nyt-dlp -r 5M \"VIDEO_URL\"\n\n# Limit to 1MB\u002Fs\nyt-dlp -r 1M \"PLAYLIST_URL\"\n\n# No speed limit (default)\nyt-dlp -r 0 \"VIDEO_URL\"\n```\n\n### Request Throttling\n\n```bash\n# Sleep between downloads\nyt-dlp --sleep-interval 5 \"PLAYLIST_URL\"\n\n# Random sleep (3-8 seconds)\nyt-dlp --min-sleep-interval 3 --max-sleep-interval 8 \"PLAYLIST_URL\"\n\n# Sleep before each download\nyt-dlp --sleep-requests 2 \"CHANNEL_URL\"\n```\n\n## Authentication and Cookies\n\n### Login with Credentials\n\n```bash\n# Login with username\u002Fpassword\nyt-dlp -u USERNAME -p PASSWORD \"VIDEO_URL\"\n\n# Login with netrc file\nyt-dlp -n \"VIDEO_URL\"\n```\n\n### Cookie Files\n\n```bash\n# Use browser cookies (for member-only content)\nyt-dlp --cookies-from-browser firefox \"VIDEO_URL\"\n\n# Use cookie file\nyt-dlp --cookies cookies.txt \"VIDEO_URL\"\n\n# Export cookies from browser for reuse\nyt-dlp --cookies-from-browser chrome --cookies cookies.txt \"VIDEO_URL\"\n```\n\n#### Flatpak browser profiles (#1229)\n\n`--cookies-from-browser chromium` does NOT find Flatpak Chromium installs (or any other Flatpak browser) — the binary's default profile path doesn't match the Flatpak sandbox layout. Pass an explicit profile path:\n\n```bash\n# Flatpak Chromium\nyt-dlp --cookies-from-browser \"chromium:$HOME\u002F.var\u002Fapp\u002Forg.chromium.Chromium\u002Fconfig\u002Fchromium\" \"VIDEO_URL\"\n\n# Flatpak Ungoogled Chromium\nyt-dlp --cookies-from-browser \"chromium:$HOME\u002F.var\u002Fapp\u002Fio.github.ungoogled_software.ungoogled_chromium\u002Fconfig\u002Fchromium\" \"VIDEO_URL\"\n\n# Flatpak Firefox\nyt-dlp --cookies-from-browser \"firefox:$HOME\u002F.var\u002Fapp\u002Forg.mozilla.firefox\u002F.mozilla\u002Ffirefox\" \"VIDEO_URL\"\n```\n\nThe same pattern (`\u003Cbrowser>:\u003Cprofile-path>`) applies to any Flatpak browser. Native (non-Flatpak) installs are auto-discovered without the explicit path.\n\n## Post-Processing\n\n### FFmpeg Operations\n\n```bash\n# Re-encode video\nyt-dlp --recode-video mp4 \"VIDEO_URL\"\n\n# Re-encode audio\nyt-dlp -x --audio-format mp3 --audio-quality 320K \"VIDEO_URL\"\n\n# Add custom ffmpeg args\nyt-dlp --postprocessor-args \"ffmpeg:-c:v libx264 -crf 23\" \"VIDEO_URL\"\n```\n\n### Thumbnail to Video\n\n```bash\n# Extract thumbnail from video\nyt-dlp --write-thumbnail --skip-download \"VIDEO_URL\"\n\n# Embed thumbnail in audio file\nyt-dlp -f \"bestaudio\" -x --audio-format mp3 \\\n  --embed-thumbnail \\\n  \"VIDEO_URL\"\n```\n\n## Batch Downloads\n\n### File-Based Batch\n\n```bash\n# Download all URLs in file\nyt-dlp -a urls.txt\n\n# URLs file format (one URL per line)\ncat > urls.txt \u003C\u003CEOF\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO1\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO2\nhttps:\u002F\u002Fyoutube.com\u002Fplaylist?list=PLAYLIST_ID\nEOF\n\nyt-dlp -a urls.txt\n\n# Batch with custom options\nyt-dlp -a urls.txt -f \"bestaudio\" -x --audio-format mp3\n```\n\n### Scripted Batch\n\n```bash\n# Loop through list\nfor url in $(cat urls.txt); do\n  yt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"$url\"\n  sleep 5  # Rate limiting\ndone\n\n# Parallel downloads (use with caution)\ncat urls.txt | xargs -P 3 -I {} yt-dlp {}\n```\n\n## Platform-Specific Patterns\n\n### SoundCloud\n\n```bash\n# SoundCloud track\nyt-dlp \"https:\u002F\u002Fsoundcloud.com\u002Fartist\u002Ftrack\"\n\n# SoundCloud playlist\nyt-dlp \"https:\u002F\u002Fsoundcloud.com\u002Fartist\u002Fsets\u002Fplaylist\"\n\n# SoundCloud user (all tracks)\nyt-dlp \"https:\u002F\u002Fsoundcloud.com\u002Fartist\u002Ftracks\"\n\n# Extract metadata\nyt-dlp --embed-metadata \\\n  -f \"bestaudio\" -x --audio-format mp3 \\\n  \"SOUNDCLOUD_URL\"\n```\n\n### Vimeo\n\n```bash\n# Vimeo video\nyt-dlp \"https:\u002F\u002Fvimeo.com\u002FVIDEO_ID\"\n\n# Vimeo with password\nyt-dlp --video-password PASSWORD \"VIMEO_URL\"\n\n# Best quality Vimeo\nyt-dlp -f \"bestvideo+bestaudio\" \"VIMEO_URL\"\n```\n\n### Bandcamp\n\n```bash\n# Bandcamp album\nyt-dlp \"https:\u002F\u002Fartist.bandcamp.com\u002Falbum\u002Falbum-name\"\n\n# Bandcamp track\nyt-dlp \"https:\u002F\u002Fartist.bandcamp.com\u002Ftrack\u002Ftrack-name\"\n\n# Extract FLAC from Bandcamp (if available)\nyt-dlp -f \"best\" \"BANDCAMP_URL\"\n```\n\n### Internet Archive\n\n```bash\n# Archive.org item\nyt-dlp \"https:\u002F\u002Farchive.org\u002Fdetails\u002FIDENTIFIER\"\n\n# Specific format from archive\nyt-dlp -f \"FLAC\u002FMP3\u002Fbest\" \"ARCHIVE_URL\"\n\n# All files from item\nyt-dlp \"https:\u002F\u002Farchive.org\u002Fdownload\u002FIDENTIFIER\u002F\"\n```\n\n## Troubleshooting Patterns\n\n### Only storyboards available \u002F \"n challenge solving failed\"\n\nMost common 2026 failure. The EJS solver is missing or invisible to a zipapp install. See **Prerequisites** above for the full fix.\n\n```bash\n# Quick fix path:\npip install --user --break-system-packages yt-dlp-ejs yt-dlp\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"\n~\u002F.local\u002Fbin\u002Fyt-dlp -F \"VIDEO_URL\"   # confirm real formats appear\n```\n\n### \"mweb formats require a GVS PO Token\" \u002F client-specific 403s\n\nPO token provider missing. See **Prerequisites** above.\n\n```bash\npip install --user bgutil-ytdlp-pot-provider\n```\n\n### 403 Forbidden on explicit format selectors (legacy SABR)\n\n```bash\n# Use simplified format selector\nyt-dlp -f \"best[ext=mp4]\u002Fbest\" \"VIDEO_URL\"\n\n# Audio-only fallback\nyt-dlp -f \"bestaudio\u002Fbest\" -x --audio-format mp3 \"VIDEO_URL\"\n\n# Update yt-dlp (and EJS plugin)\npip install --user --break-system-packages -U yt-dlp yt-dlp-ejs\n```\n\n### Slow Download Speed\n\n```bash\n# Try different server\nyt-dlp --geo-bypass \"VIDEO_URL\"\n\n# Fragment-based download\nyt-dlp --concurrent-fragments 4 \"VIDEO_URL\"\n\n# External downloader (aria2c)\nyt-dlp --external-downloader aria2c \"VIDEO_URL\"\n```\n\n### Geo-Blocking\n\n```bash\n# Bypass geo-restrictions\nyt-dlp --geo-bypass \"VIDEO_URL\"\n\n# Specify country code\nyt-dlp --geo-bypass-country US \"VIDEO_URL\"\n```\n\n### Age-Restricted Content\n\n```bash\n# Use cookies from logged-in browser\nyt-dlp --cookies-from-browser firefox \"VIDEO_URL\"\n\n# Or use credentials\nyt-dlp -u USERNAME -p PASSWORD \"VIDEO_URL\"\n```\n\n## Performance Optimization\n\n### Parallel Downloads\n\n```bash\n# Use external downloader with multiple connections\nyt-dlp --external-downloader aria2c \\\n  --external-downloader-args \"-x 16 -s 16 -k 1M\" \\\n  \"VIDEO_URL\"\n```\n\n### Fragment Optimization\n\n```bash\n# Download fragments concurrently\nyt-dlp --concurrent-fragments 8 \"VIDEO_URL\"\n\n# Useful for large videos and playlists\nyt-dlp --concurrent-fragments 4 \"PLAYLIST_URL\"\n```\n\n## Complete Examples\n\n### Example 1: Music Video Collection\n\nDownload entire artist channel as 1080p MP4 with metadata.\n\n```bash\nyt-dlp -f \"best[height\u003C=1080][ext=mp4]\u002Fbest[height\u003C=1080]\u002Fbest\" \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  --embed-subs \\\n  -o \"%(uploader)s\u002F%(upload_date)s - %(title)s.%(ext)s\" \\\n  --download-archive downloaded.txt \\\n  \"https:\u002F\u002Fwww.youtube.com\u002F@ArtistOfficial\u002Fvideos\"\n```\n\n### Example 2: Audio-Only Discography\n\nExtract audio from all videos in playlist as 320kbps MP3.\n\n```bash\nyt-dlp -f \"bestaudio\u002Fbest\" \\\n  -x --audio-format mp3 --audio-quality 320K \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  -o \"%(playlist)s\u002F%(playlist_index)02d - %(title)s.%(ext)s\" \\\n  \"PLAYLIST_URL\"\n```\n\n### Example 3: Live Concert Archive\n\nDownload concert with subtitles, thumbnail, and JSON metadata.\n\n```bash\nyt-dlp -f \"bestvideo+bestaudio\" \\\n  --write-subs --embed-subs --all-subs \\\n  --write-thumbnail --embed-thumbnail \\\n  --write-info-json \\\n  --write-description \\\n  -o \"Concerts\u002F%(upload_date)s - %(title)s.%(ext)s\" \\\n  \"VIDEO_URL\"\n```\n\n### Example 4: SABR-Safe Batch Download\n\nDownload multiple videos using SABR-compatible format selection.\n\n```bash\ncat > urls.txt \u003C\u003CEOF\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO1\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO2\nhttps:\u002F\u002Fyoutube.com\u002Fwatch?v=VIDEO3\nEOF\n\nyt-dlp -f \"best[ext=mp4]\u002Fbest\" \\\n  --embed-metadata \\\n  --embed-thumbnail \\\n  -o \"%(title)s.%(ext)s\" \\\n  -a urls.txt\n```\n\n## Best Practices\n\n1. **Verify Prerequisites first** — Install `yt-dlp-ejs` + a JS runtime, and confirm `yt-dlp` itself was installed via `pip` (not the standalone zipapp) so plugins resolve. See the Prerequisites section above.\n2. **Always use `--embed-metadata`** - Preserves video metadata in file\n3. **Use download archive** - Prevents re-downloading with `--download-archive`\n4. **Apply SABR workaround** - Use `best[ext=mp4]\u002Fbest` for explicit-selector failures on newer videos\n5. **Rate limit large downloads** - Use `--sleep-interval` for playlists\u002Fchannels\n6. **Organize with output templates** - Use `-o` for consistent file organization\n7. **Install yt-dlp via pip, not the zipapp** — `pip install --user --break-system-packages -U yt-dlp` shares site-packages with `yt-dlp-ejs`; distros \u002F package managers shipping the zipapp form will silently break plugin discovery.\n8. **Test format selection** - Use `-F` to list formats before downloading; if you only see `sb*` storyboard formats, an EJS prerequisite is missing.\n9. **Use cookies for member content** - `--cookies-from-browser` for restricted content; pass an explicit profile path for Flatpak browsers (see Authentication and Cookies > Flatpak browser profiles).\n\n## See Also\n\n- Source Discoverer Agent: `@$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fagents\u002Fsource-discoverer.md`\n- find-sources Command: `@$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fcommands\u002Ffind-sources.md`\n- Queue Manager Agent: `@$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fagents\u002Fqueue-manager.md`\n\n## References\n\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Faddons\u002Faiwg-utils\u002Frules\u002Fhuman-authorization.md — Seek explicit authorization before bulk channel downloads or overwriting existing files\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Ffind-sources\u002FSKILL.md — Source discovery skill that identifies YouTube URLs for this skill to download\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Facquire\u002FSKILL.md — General acquisition skill that delegates YouTube downloads to this skill\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Faudio-extraction\u002FSKILL.md — Audio extraction patterns used after YouTube video downloads\n- @$AIWG_ROOT\u002Fagentic\u002Fcode\u002Fframeworks\u002Fmedia-curator\u002Fskills\u002Fquality-filtering\u002FSKILL.md — Quality filtering applied to select best available YouTube format\n",{"name":5,"category":43,"namespace":44,"platforms":45,"description":7},"media-curator","aiwg",[46],"all","main","6754967c344ccb087a8de06972f55a41067b291b","agentic\u002Fcode\u002Fplugins\u002Fmedia-curator\u002Fskills\u002Fyoutube-acquisition",36,"https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg","https:\u002F\u002Faiwg.io","https:\u002F\u002Fgithub.com\u002Fjmagly","https:\u002F\u002Fintegrolabs.io","ml\u002Fai, industrial automation, safety\u002Fsecurity, ssi\r\n\r\nmagly.net\r\nintegrolabs.io\r\naiwg.io\r\nfortemi.com\r\npagenary.com\r\nbytecask.com","2026-11-14 02:10:01",{"source":8,"skillName":5,"commands":58,"prompt":68,"zipAvailable":69},[59,62,65],{"tool":60,"command":61},"npx","npx skills add jmagly\u002Faiwg --skill youtube-acquisition",{"tool":63,"command":64},"bunx","bunx skills add jmagly\u002Faiwg --skill youtube-acquisition",{"tool":66,"command":67},"pnpm","pnpm dlx skills add jmagly\u002Faiwg --skill youtube-acquisition","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fmedia-curator\u002Fskills\u002Fyoutube-acquisition\u002FSKILL.md",true,[],[72,100,124,130,137,151],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":79,"publishedAt":38},"01M70QA0BSYJ49EES9V4RE8QH1","host-hardening","Read-only system hardening baseline and plan-first host hardening recommendations for SSH, Docker bind addresses, firewall persistence, datastores, exporters and audit retention.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[78],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99],"host","host hardening","hardening","read","re","recommendations","remediation","plan","port","verification","Bash","access","only","retention","audit","never","firewall","bind","secrets","request",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":110,"publishedAt":38},"01M70PNT2Z4HMZPRBTAF6073NN","exposure-analysis","Read-only firewall analysis and effective host exposure reconstruction for Docker published ports, UFW bypass, stale rules, CDN scope, IPv6 asymmetry and external probe allowlists.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fplugins\u002Fforensics\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[106,109],{"categoryNo":107,"categoryName":108,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[111,112,113,83,114,88,115,116,90,117,80,118,92,119,120,95,96,121,122,123],"exposure analysis","analysis","unknown","credentials","collection","ufw","ports","internet","local","scope","reconstruction","operator","write",{"skillNo":125,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":129,"publishedAt":38},"01M70P8QATMPKA78E4FT5D2TNA","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fsecurity-engineering\u002Fskills\u002Fhost-hardening\u002FSKILL.md",[128],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[82,80,81,91,83,99,86,85,94,87,88,89,90,98,92,93,84,95,96,97],{"skillNo":131,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":136,"publishedAt":38},"01M70NMPVJ5H0JH131P60FW4R8","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Fagentic\u002Fcode\u002Fframeworks\u002Fforensics-complete\u002Fskills\u002Fexposure-analysis\u002FSKILL.md",[134,135],{"categoryNo":107,"categoryName":108,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[112,111,95,114,88,115,90,113,80,118,92,119,120,83,96,117,116,121,122,123],{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":38},"01M6CB4DDR0B4NNCFK7ZK7449H","fixture-skill","Exercise rule delivery.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Frule-delivery\u002Fskills\u002Ffixture-skill\u002FSKILL.md",[143],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[145,146,147,148,149,150],"fixture skill","fixture","rule","delivery","true","exercise",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":158,"publishedAt":38},"01M6CB4AVK1W76MFMPP0JP32CJ","pi-local","Pi-local duplicate-precedence fixture.","https:\u002F\u002Fgithub.com\u002Fjmagly\u002Faiwg\u002Fblob\u002Fmain\u002Ftest\u002Ffixtures\u002Fproviders\u002Fpi\u002Fproject\u002F.pi\u002Fskills\u002Fpi-local\u002FSKILL.md",[157],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[159,160,119,161,146],"pi","pi local","duplicate"]