TechEarl

Download a YouTube Playlist or Entire Channel with yt-dlp

Download a whole YouTube playlist or entire channel free with yt-dlp: point it at a playlist or @handle, use a download archive so re-runs skip what you already have, organize files with output templates, and rate-limit to dodge the bot wall.

Ishan Karunaratne⏱️ 9 min readUpdated
Share thisCopied
Download an entire YouTube playlist or channel free with yt-dlp: use a download archive for incremental re-runs, organize files with output templates, grab item ranges, and rate-limit big channels.

The free way to download a whole YouTube playlist or an entire channel in 2026 is yt-dlp: point it at a playlist URL or a channel's @handle and it walks the list for you. Paste a URL below to get the command for the basic case, then read on for the bulk-specific flags (an archive file so re-runs skip what you already have, output templates for sane folders, item ranges, and rate limiting):

Build your yt-dlp command

Paste a YouTube URL, choose what to grab, and copy the command. It updates as you change the options.

Resolution is a maximum, not a guarantee. yt-dlp grabs the best quality at or below your pick, capped by what was actually uploaded. Choose 8K on a 720p video and you get 720p, not an error and not an upscale.

Your command
bash
yt-dlp --merge-output-format mp4 "https://www.youtube.com/playlist?list=PLBCF2DAC6FFB574DE"

The builder covers the single-command case. The rest of this page is the part that actually matters for bulk grabs: making the job resumable so you can re-run it next week and only pull the new uploads, keeping the files organized, and not getting throttled halfway through a 500-video channel.

If you have used youtube-dl, yt-dlp is its actively maintained successor. youtube-dl (originally by Ricardo García, "rg3") still exists but is effectively unmaintained and breaks whenever YouTube changes its player; yt-dlp is the community fork that keeps up, with a faster release cadence and far more extractors. Every youtube-dl command here works as yt-dlp with better results.

Download only what you have the right to. Saving your own uploads, Creative Commons material, or content the rights holder permits is one thing; bulk-downloading and redistributing copyrighted video is another, and mass downloading explicitly violates YouTube's Terms of Service. Pulling an entire channel is exactly the kind of activity that gets noticed. This guide is for the legitimate cases. What you do with the files is on you.

Download a whole playlist

Point yt-dlp at the playlist URL and it downloads every video in it, in order:

bash
yt-dlp "https://www.youtube.com/playlist?list=PLAYLIST_ID"

Quote the URL. A playlist link often carries & characters that your shell will otherwise treat as "run this in the background," and you will end up downloading one video or nothing at all.

Download an entire channel

A channel is just a big implicit playlist. Give yt-dlp the channel's @handle URL and it grabs everything that channel has published:

bash
yt-dlp "https://www.youtube.com/@channelhandle"

That pulls the channel's full uploads list. If you want only one of a channel's tabs (just the regular videos, or just the Shorts, or just the live streams), append the tab to the URL: .../@channelhandle/videos, .../@channelhandle/shorts, .../@channelhandle/streams. The bare handle gives you the lot.

Two warnings before you run this on a large channel. First, it can be hundreds of gigabytes, so check the size of what you are about to pull. Second, hammering YouTube for hundreds of videos back to back is the fastest way to trip the bot wall, which is what the archive file and rate limiting below are for.

The download archive: make re-runs incremental

This is the real reason to read past the first command. A --download-archive file records the ID of every video yt-dlp successfully downloads. On the next run against the same playlist or channel, it reads that file and skips anything already in it, so you only pull the new uploads:

bash
yt-dlp --download-archive archive.txt "https://www.youtube.com/@channelhandle"

Run it today and it downloads everything. Run it again next month against the same channel and it downloads only the videos published since, in seconds, because everything else is already recorded in archive.txt. This is what turns "download a channel" into "keep a local mirror of a channel" with a single repeatable command (drop it in a cron job and you have an unattended subscription).

It also makes an interrupted job safe to resume. If a 300-video download dies at video 180, re-running the exact same command picks up where it left off instead of starting over, because the first 180 IDs are already in the archive. Keep one archive file per channel or per library; the file is just plain text, one extractor-and-ID line per video, and you can edit it by hand if you ever want to force a re-download.

Organize the output into clean folders

By default yt-dlp dumps everything into the current directory with the video ID in the filename. An output template (-o) gives you a readable structure. This one creates a folder per playlist and prefixes each file with its position in the list, so the videos sort in playlist order:

bash
yt-dlp -o "%(playlist_title)s/%(playlist_index)s - %(title)s.%(ext)s" "URL"

The %(...)s tokens are output-template fields. %(playlist_title)s becomes the folder name, %(playlist_index)s is the zero-padded position, %(title)s is the video title. There are dozens more (%(uploader)s, %(upload_date)s, %(channel)s), so you can build whatever hierarchy suits your library, for example %(channel)s/%(upload_date)s - %(title)s.%(ext)s to file a channel's videos by date. yt-dlp sanitizes titles into safe filenames automatically.

Download a range of a playlist, not all of it

You do not have to take the whole list. --playlist-items selects exactly which entries to pull. The common case is "just the first ten":

bash
yt-dlp --playlist-items 1-10 "PLAYLIST_URL"

The selector is flexible: 1-10 is a range, 1,3,5 is a set, 5: is "from item 5 to the end," :20 is "the first 20," and you can combine them (1-3,7,10-12). Negative indices count from the end, so -5: grabs the last five videos. Pair this with the archive file when you are topping up a partially-downloaded list.

The 720p trap applies here too

If your downloads come back at 720p, that is the same -f best problem covered in detail on the single-video guide, and it bites just as hard in bulk. -f best only matches a single already-combined stream, and YouTube caps those at around 720p; you need a bestvideo+bestaudio selector and ffmpeg installed so it can merge the higher-resolution halves. The builder above uses the right selector by default. For the full explanation of why this happens and how the format selector works, see how to download a YouTube video in any quality, which is the flagship for format selection.

Be polite on big channels (rate limiting)

Pull a few hundred videos as fast as your connection allows and YouTube will start returning Sign in to confirm you're not a bot or throttling you to a crawl. Two flags fix this: -r (--limit-rate) caps your download speed, and --sleep-requests adds a pause between metadata requests so the access pattern looks less like a script:

bash
yt-dlp -r 3M --sleep-requests 1 --download-archive archive.txt "URL"

-r 3M limits to 3 MB/s; --sleep-requests 1 waits one second between requests. For a genuinely large job you can also add --sleep-interval 5 --max-sleep-interval 15 to randomize the gap between downloads (not just metadata requests), which looks more human still. It is slower, but a slow job that finishes beats a fast one that gets your IP rate-limited at video 60. If you do hit the bot wall, the cookies trick below also helps, because a logged-in session is treated more leniently than an anonymous one.

Members-only or restricted content

For members-only videos, age-restricted uploads, or anything you have legitimate access to behind a login, hand yt-dlp your browser's cookies so the request carries your session:

bash
yt-dlp --cookies-from-browser firefox "URL"

Use Firefox, not Chrome. Since around July 2024, Chrome encrypts its cookie store with app-bound encryption, and external tools (yt-dlp included) can no longer read Chrome cookies from a running profile. Firefox's cookie store is still readable, so --cookies-from-browser firefox is the one that reliably works in 2026. This is the same flag that gets you past the bot wall on a large anonymous job.

FAQ

See also

Sources

Authoritative references this article was fact-checked against.

Tagsyt-dlpYouTubeyoutube-dlplaylistchannelCLIbulk downloaddownload-archive

Found this useful? Pass it on.

Copied

Ishan Karunaratne

Tech Architect · Software Engineer · AI/DevOps

Tech architect and software engineer with 20+ years building software, Linux systems, and DevOps infrastructure, and lately working AI into the stack. Currently Chief Technology Officer at a healthcare tech startup, which is where most of these field notes come from.

Keep reading

Related posts

How to Download a TikTok Video with yt-dlp

Download a TikTok video free from the command line with yt-dlp: no app, no sketchy site. yt-dlp pulls the source MP4 TikTok serves, follows short links, extracts audio, and uses your cookies for gated clips.