Media download
There are two scripts in scripts/ next to this file. Each prints only the paths of the files it saved on stdout. Messages and errors go to stderr. Neither shows a progress bar, so the output stays short. Run long downloads with a generous timeout or in the background.
Video and audio by link: scripts/video.sh
It uses yt-dlp from PATH, or downloads a standalone build into ~/.cache/video-download the first time. It picks an mp4 (h264 + aac) that plays everywhere.
S=<this skill dir>/scripts/video.sh
bash $S "<url>" # best quality → ./downloads/<Site>/<title> [<id>].mp4
bash $S -q 720 "<url>" # cap at 720p (smaller side, so vertical videos stay 720×1280)
bash $S -a "<url>" # audio only → mp3
bash $S -p "<playlist or carousel>" # every item
bash $S -o ~/Downloads "<url1>" "<url2>"
bash $S -c chrome "<url>" # use the user's logged-in browser session (chrome|safari|firefox|edge|brave)
Metadata without downloading: yt-dlp -J --no-playlist "<url>". Available qualities: yt-dlp -F "<url>".
Pinterest images: scripts/pinterest.sh
It uses gallery-dl. The input can be a search query or any Pinterest link: pin, board, profile, section or pin.it. By default it saves images only.
P=<this skill dir>/scripts/pinterest.sh
bash $P "cinematic portrait moody" # top 20 search results → ./downloads/pinterest/Search/<query>/
bash $P -n 50 "https://www.pinterest.com/<user>/<board>/"
bash $P -n 1 "https://pin.it/abc123"
bash $P -n 8 -o refs "query one" "query two" # several at once
bash $P -k cookies.txt "<private board>" # private boards need a cookies.txt export
bash $P -v "<pin url>" # also keep video files
To build a moodboard for a style, use the query sets in references/pinterest-presets.md, or write 3–5 queries of your own.
After a download
Tell the user where the files are. For video, add resolution and duration when that helps: ffprobe -v error -show_entries format=duration:stream=width,height -of csv=p=0 "<file>".
When it fails
- Login / "authentication required" / "Cannot parse data" on Facebook, Instagram, Threads, Reddit, Vimeo or LinkedIn: these sites often block anonymous downloads. Ask the user which browser they are logged in with, then retry
video.sh with -c <browser>. Do not read browser cookies without asking. yt-dlp reads them locally and they never leave the machine.
- "Unsupported URL" or extractor errors: sites change often, so update the tool and retry once. Use
brew upgrade yt-dlp gallery-dl, yt-dlp -U for the standalone build, or pip install -U yt-dlp gallery-dl.
- YouTube is low quality or warns about a JS runtime: install ffmpeg (
brew install ffmpeg). For the full YouTube format list also install deno.
- Pinterest returns nothing: the query is too narrow or Pinterest is rate-limiting. Retry with a broader query, a smaller
-n, or -k cookies.txt.
- Private, deleted or geo-blocked: say so plainly and don't try to work around it.
Download only content the user has the right to save and use. Decline requests to mass-scrape someone's account or to get around paywalls or DRM.