Download media
Download video or audio from ~1800 sites (YouTube, Vimeo, SoundCloud, Twitch, X…) with the `yt-dlp` CLI — full videos, mp3 audio, playlists, time-range clips, subtitles, capped resolutions. Use whenever the user wants to download, save, grab, or rip a video/audio/playlist from a URL, extract a song as mp3, clip a segment, or fetch subtitles — even when they just say "download this", "get the audio", or "save this playlist".From its SKILL.md
npx -y skills add coroboros/agent-skills --skill download-mediaAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 7 commands, including `bash "$SKILL_DIR"/scripts/download-media.sh $ARGUMENTS` and 6 more.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
8.4 KB, ~1.8k tokens by cl100k_base, as published. Nobody here has run it
Download Media
Download video or audio from any yt-dlp-supported site using the yt-dlp CLI. The skill validates the input, composes the right flags for the intent, downloads under ~/.agents/output/<project>/download-media/<slug>/ (or a -d destination), and reports the final file paths — fully expanded, no tilde, no magic.
The deterministic work — install checks, slug derivation, destination, flag composition, final-path capture — happens in scripts/download-media.sh. The skill parses $ARGUMENTS, hands them to the script, and turns the script's RESULT: lines into a human report.
Scope
Personal and authorized use: public content, the user's own uploads, Creative Commons and licensed material. yt-dlp cannot bypass DRM and this skill never attempts to; decline requests to rip paid streaming catalogs (Netflix, Disney+, Spotify…) or to evade a site's paywall. Downloading may still be restricted by a site's terms of service and local copyright law — when a request is plainly about piracy, say so and stop.
Install
brew install yt-dlp # macOS
pipx install yt-dlp # any platform
brew install ffmpeg # strongly recommended — merging, mp3 extraction, clipping
Binaries for other setups: yt-dlp releases. For full YouTube support yt-dlp also wants a JavaScript runtime (deno recommended) — see the EJS wiki. Extractors break when sites change; a failing download is often fixed by updating: brew upgrade yt-dlp or pipx upgrade yt-dlp.
Parameters
| Flag | Default | Effect |
|---|---|---|
-a | off | Audio only, mp3 (yt-dlp preset -t mp3; needs ffmpeg; rejects the video flags -r/-b) |
-b | off | Best native quality — skip the mp4 compatibility preset |
-p | off | Full playlist into a <playlist title>/ subfolder, files named NNN - title [id].ext (default: single video) |
-i | off | Inspect only — list available formats, no download; wins over the download flags |
-c A-B | — | Clip a time range, e.g. -c 10:15-12:30 (needs ffmpeg) |
-u <langs> | — | Subtitles as sidecar files, e.g. -u "en.*,fr" (includes auto-generated) |
-r <height> | — | Cap resolution, e.g. -r 1080 |
-d <dir> | convention path | Destination directory |
Everything after the URL passes to yt-dlp verbatim — the escape hatch to the full CLI (see Recipes).
Default download: -t mp4 preset — h264/aac preferred, remuxed to mp4, plays everywhere. -b keeps yt-dlp's native best (often webm/mkv, higher fidelity, less compatible).
Workflow
-
Empty
$ARGUMENTS→ propose the most recent media URL from session context and confirm. Ask only when none is detectable. -
Run the helper:
$SKILL_DIR= this skill's folder —${CLAUDE_SKILL_DIR}in Claude Code, the directory containing this SKILL.md elsewhere.bash "$SKILL_DIR"/scripts/download-media.sh $ARGUMENTSAlways single-quote the URL in the command — YouTube URLs routinely carry
&and?, which the shell otherwise interprets. -
The script emits
RESULT: key=valuelines — onepathper downloaded file, thenfiles,dest,slug(order not guaranteed; parse by key). With-iit prints yt-dlp's format table instead. -
Parse the
RESULT:lines and produce the report below. -
ERR: yt-dlp not installed(exit 127) orERR: -a and -c need ffmpeg(exit 3) → print the matching command from## Installand stop. Never auto-install on the user's behalf. -
Any other
ERR:(exit 2 — missing or non-URL input, unknown flag, missing flag value, invalid-r, conflicting flags) → relay the message verbatim and stop. A non-zero exit withRESULT:lines means a partial playlist success — report the downloaded files and the failure. A yt-dlp extraction failure → surface its stderr and suggest updating yt-dlp first (see Install).
Output
downloaded: <n> file(s) → <dest>
<path> # one line per file
Subtitle sidecars (-u) sit next to the media file but are not listed in RESULT: lines — mention they are in dest.
Examples
/download-media https://youtu.be/dQw4w9WgXcQ # video, mp4, best compatible
/download-media -a https://youtu.be/dQw4w9WgXcQ # mp3
/download-media -r 1080 <url> # cap at 1080p
/download-media -p <playlist-url> # whole playlist
/download-media -c 10:15-12:30 <url> # clip a segment
/download-media -u "en.*" <url> # video + English subtitles
/download-media -i <url> # list formats, download nothing
/download-media -d ~/Downloads <url> # custom destination
/download-media <url> --embed-thumbnail --embed-metadata # passthrough after the URL
Recipes — passthrough after the URL
| Intent | Append after the URL |
|---|---|
| Logged-in / member content | --cookies-from-browser firefox (or chrome, safari…) |
| Strip sponsor segments | --sponsorblock-remove sponsor (needs ffmpeg) |
| Incremental playlist sync | --download-archive <dir>/archive.txt |
| Split by chapters | --split-chapters |
| Embed thumbnail + metadata | --embed-thumbnail --embed-metadata |
| Only playlist items 3–7 | -I 3:7 (with -p) |
| Frame-accurate clip cuts | --force-keyframes-at-cuts (with -c; slow, re-encodes) |
| Gentle on rate limits | -t sleep (preset: spaced requests) |
| Site needs TLS impersonation | --extractor-args per site, or install curl_cffi |
Compose other yt-dlp flags the same way when an intent is not covered — the full option surface is yt-dlp --help.
Notes
- Final paths are captured, not guessed — the script uses
--print-to-file after_move:filepathso the reported paths are the real ones after merge/remux (--printwould silence download progress). - Playlist URLs holding a
v=too (watch-page URLs) download the single video by default;-pswitches to the whole playlist. - Unavailable playlist entries don't lose the run — yt-dlp skips them and exits non-zero; the script still reports every downloaded file, then propagates the exit code.
-ctakes a time range only (START-END,HH:MM:SSor seconds). Chapter-regex sections go through passthrough:--download-sections "intro".- Custom
-ooutput templates passed through work, but an absolute-omakes yt-dlp ignore the destination dir (-P) — prefer-dfor relocation. - No silent overwrites — yt-dlp skips already-downloaded files by default and the slug-namespaced destination keeps runs predictable.
Why the wrapper
yt-dlp is already a superb CLI; this skill exists to (a) put downloads under the repo's global output convention with the final paths reported deterministically, (b) translate "get me the audio" into the right preset without the user remembering -t mp3 vs -x --audio-format, and (c) keep the full flag surface reachable through verbatim passthrough instead of re-wrapping ~200 options.
What ships with it: 1 file
4.7 KB alongside SKILL.md, 1 of them executable
scripts/
- download-media.shruns4.7 KB
Gives 0 of the 12 instructions most video audio skills give in ~1.8k tokens
Counted across 619 of the 725 authors here whose files we hold, read 2026-09-06
- Read product marketing context firstin 13 of 619, across 7 files
- Define the core visual thesis in one sentencein 11 of 619, across 3 files
- Break the concept into 3 to 6 scenesin 11 of 619, across 3 files
- Render the smallest working version firstin 11 of 619, across 3 files
- Start with a low-quality smoke test renderin 11 of 619, across 3 files
- Add captions for accessibility and engagementin 11 of 619, across 5 files
- Write the scene outline before writing codein 11 of 619, across 3 files
- Specify subject, action, camera, style, and moodin 11 of 619, across 5 files
- Decide what each scene provesin 10 of 619, across 2 files
- Export one clean thumbnail framein 10 of 619, across 2 files
- Pick the right tool for the jobin 10 of 619, across 4 files
- Run the test suite before proposing a fixin 8 of 619, across 7 files
Said here and by no other author read
- compose the right flags
- parse the result lines
- produce the report
- single quote the url
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.