agentsclimarketplace

Youtube videos

Skill puntorigen/avatar-skills/youtube-videos

Download all public videos from a YouTube channel (or a playlist, single video, or Short) to a local folder, named with upload date-time (YYYY-MM-DD_HH-MM-SS.mp4), capped at 720p mp4. Uses yt-dlp + ffmpeg. Use when the user asks to download YouTube videos, a channel's videos, a playlist, Shorts, or batch-download videos with datetime filenames.From its SKILL.md

Install
npx -y skills add puntorigen/avatar-skills --skill youtube-videos

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 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.

SKILL.md

5.4 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it

YouTube Videos Downloader

Download every public video from a YouTube channel (or a playlist / single video / Short) into a user-specified folder, named by upload datetime.

YouTube is yt-dlp's strongest platform — this is the simplest of the three downloader skills. No browser mirror (unlike instagram-videos) and no third-party fallback engine (unlike tiktok-videos). It is single-engine: yt-dlp does both listing and download.

Inputs

ParameterRequiredExample
YouTube URL (channel, playlist, video, or short)yeshttps://www.youtube.com/@mkbhd
Output directoryyesout/youtube
Max heightno720 (default)
Timezone for filenamesnoAmerica/Santiago (default)

Accepted URL shapes (the script normalizes them):

  • Channel root: youtube.com/@handle, /channel/UC..., /c/name, /user/name → expands to BOTH the /videos and /shorts tabs
  • A specific tab/playlist: .../videos, .../shorts, ?list=... → used as-is
  • Single video: youtube.com/watch?v=..., youtu.be/...
  • Short: youtube.com/shorts/...

Prerequisites

yt-dlp AND ffmpeg must be installed (both present on this machine). ffmpeg is required because YouTube serves separate video and audio (DASH) streams that must be merged. Keep yt-dlp fresh — an outdated yt-dlp is the #1 cause of YouTube failures:

yt-dlp --version || python3 -m pip install -U yt-dlp
ffmpeg -version | head -1

Workflow checklist

- [ ] Step 1: Verify the channel/video is public
- [ ] Step 2: (optional) Pre-fetch listing to review before downloading
- [ ] Step 3: Run download script
- [ ] Step 4: Report results

Step 1: Verify it's public

Open the URL. If it's private, members-only, age-restricted, or unavailable in the region, stop — this skill is for public content. (For age/bot-gated public videos you own access to, see --cookies-from-browser below.)

Step 2 (optional): Pre-fetch the listing

The script lists internally, but you can inspect first:

yt-dlp --flat-playlist -J "https://www.youtube.com/@handle/videos" > listing.json

listing.json has an entries array of {id, url, title} (no dates — those are resolved during download). Pass it back with --listing-json to download exactly that set.

Step 3: Download and rename

python3 .cursor/skills/youtube-videos/scripts/download_channel_videos.py \
  --url "https://www.youtube.com/@handle" \
  --output-dir out/youtube \
  --max-height 720 \
  --timezone America/Santiago

The script:

  1. Normalizes the URL (a bare channel → /videos + /shorts), lists entries via yt-dlp --flat-playlist, merges and dedupes by video id
  2. Downloads each video at ≤720p, preferring H.264/AAC, merged to mp4 (clean for the downstream avatar pipeline)
  3. Reads the exact upload timestamp (or upload_date) from each video's info.json
  4. Renames to YYYY-MM-DD_HH-MM-SS.mp4 in the chosen timezone (date-only videos → ..._00-00-00)
  5. Maintains download-archive.txt in the output dir so re-runs resume instead of re-downloading
  6. Writes {output_dir}/videos_manifest.json (id, url, title, timestamp, uploadDate, height, file)

Useful flags: --max N (cap count — important for large channels), --max-height 1080, --cookies-from-browser chrome, --no-archive, --delay-ms.

Collisions: two videos at the same second get _2, _3 suffixes.

Step 4: Report to user

Summarize: channel/URL, output path, count downloaded / skipped / failed, and list filenames sorted newest-first.


Why no fallback engine

PlatformListingDownloadWhy
Instagrambrowser scrape (Picnob)Picnob/ImgInndirect tools 401
TikTokyt-dlp flat-playlistyt-dlp + tikwm fallbackyt-dlp signing breaks intermittently
YouTubeyt-dlpyt-dlpyt-dlp is the gold standard; no reliable second source needed

Resilience for YouTube is: (a) keep yt-dlp updated, and (b) --cookies-from-browser for the occasional "Sign in to confirm you're not a bot" / age-gate.

Anti-patterns

  1. Do not default to 4K/best — files get huge. Default cap is 720p; raise with --max-height only when needed.
  2. Do not run with a stale yt-dlp. Update it before blaming the site.
  3. Do not download an entire large channel blindly — use --max N or rely on the resume archive.
  4. Do not download private / members-only / age-restricted content you don't have access to.
  5. Do not forget ffmpeg — without it, merged mp4 output fails.
  6. Do not commit large out/ video folders — add the output dir to .gitignore.

Utility scripts

ScriptPurpose
scripts/download_channel_videos.pyList + download (yt-dlp, 720p mp4) + datetime rename + archive resume + manifest (main entry point)

Additional resources

  • Real run example: examples.md
  • For TikTok (yt-dlp + tikwm fallback), use the tiktok-videos skill.
  • For Instagram (needs a browser mirror), use the instagram-videos skill.

What ships with it: 2 files

15.2 KB alongside SKILL.md, 1 of them executable

scripts/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.