[HN Gopher] YouTube Playlist Downloader
       ___________________________________________________________________
        
       YouTube Playlist Downloader
        
       Author : linuxmaster14
       Score  : 44 points
       Date   : 2026-01-04 12:34 UTC (10 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | xnx wrote:
       | yt-dlp is second only to ffmpeg in being a pillar of
       | functionality that gets frequently wrapped in convenience scripts
        
         | graynk wrote:
         | In this case I'm not sure why a convenience wrapper is even
         | needed, yt-dlp already works with playlists just fine
        
           | jasode wrote:
           | _> I'm not sure why a convenience wrapper is even needed,_
           | 
           | Author wanted yt-dlp to be fed with a custom text file:
           | "playlists.txt"
           | 
           | The script loops through that text file, parses it, and then
           | launches yt-dlp for each valid line with a channel name.
        
             | bramhaag wrote:
             | Which is essentially just this:                   yt-dlp -o
             | "%(channel)s/%(playlist_title)s/%(title)s.%(ext)s" -a
             | playlists.txt
             | 
             | I'm not sure if that warrants a HN post
        
               | taylorfinley wrote:
               | Right? Just add this to .bashrc:
               | 
               | alias yt-pl='yt-dlp -o
               | "%(channel)s/%(playlist_title)s/%(title)s.%(ext)s" -a
               | playlists.txt'
        
             | graynk wrote:
             | So -o "%(channel)s - %(title)s.%(ext)s", --batch-file and
             | optionally --download-archive?
             | 
             | https://github.com/yt-dlp/yt-
             | dlp#:~:text=channel%20%28string...
             | 
             | https://github.com/yt-dlp/yt-
             | dlp#:~:text=%2Da%2C%20%2D%2Dbat...
             | 
             | https://github.com/yt-dlp/yt-
             | dlp#:~:text=%2D%2Ddownload%2Dar...
             | 
             | Not to mention that the script is clearly LLM-generated
        
           | xnx wrote:
           | Agree. Now it's easier to ask you favorite command line AI
           | (e.g. Gemini CLI) something like "download this list of
           | playlists with yt-dlp" rather than learn someone else's code
           | or even check the manual.
        
             | dawnerd wrote:
             | The script linked was just vibe coded. Ai isn't that great
             | with the ytdl params, yet. It's obvious because if an LLM
             | really knew how to use ytdl it would have used the input
             | file option instead of looping through a file and invoking
             | for each one.
        
               | xnx wrote:
               | > Ai isn't that great with the ytdl params
               | 
               | Gemini nails it:
               | 
               | When downloading multiple playlists, it is usually better
               | to organize them into separate folders so the files don't
               | all end up in one giant mess. You can use an output
               | template to automatically create folders based on the
               | playlist title:
               | 
               | yt-dlp -a playlists.txt -o
               | "%(playlist_title)s/%(playlist_index)s -
               | %(title)s.%(ext)s"
        
               | dawnerd wrote:
               | Interesting, must be a new fix. A couple months ago I
               | tried to have it create a command and it hallucinated
               | params.
        
       | weli wrote:
       | Unrelated, but I want to move from a Google account youtube feed
       | to something a bit more client-side where I have the control but
       | my main problem is the YouTube recommendation algorithm.
       | 
       | I feel like after a decade and a half google knows pretty well
       | what I like and what I'm interested in. I built that homepage
       | brick by brick.
       | 
       | Whenever I tried other youtube clients or ungoogled alternatives
       | the recommendations were all really generic and not that good. Of
       | course I won't find something that matches the real deal, but at
       | least I want to:
       | 
       | 1. Steer away from viral content, aka Mr Beast videos or
       | whatever. 2. Have discoverability of youtube videos I would be
       | interested in but that I'm not subscribed to yet.
       | 
       | To this day I still find new channels or videos I'm really
       | interested in on my recommended feed.
        
         | cr125rider wrote:
         | You can get RSS feeds of channels still. I use that in my feed
         | reader
        
         | listic wrote:
         | I, on the other hand, turned off YouTube recomendations with
         | UnDistracted. Maybe I'm missing out; who knows.
        
         | kelvinjps10 wrote:
         | Revanced you can still have the same algo. Also smarttubr
        
       | jasode wrote:
       | The repo should mention a warning about usage. Be aware that
       | downloading large playlists with lots of videos from Youtube can
       | get your ip address throttled/banned. The ban could last a week
       | or a month.
       | 
       | It's also not a good idea to use _" --cookies"_ unless you
       | absolutely have to. Just leave out the cookies option and try to
       | dl anonymously. Only when Youtube forces your ip address to "sign
       | in" is it necessary to pass in cookies.
        
         | dawnerd wrote:
         | Exactly. There's been account ban reports from it too. Id be
         | very careful if it's your normal google account that's tied to
         | YouTube. Always use a burner account when using the cookies
         | param to be safe.
        
       | crazygringo wrote:
       | I don't understand. yt-dlp already downloads a whole playlist if
       | you pass it a playlist URL. What does this tool add?
       | 
       | It says "by channel name" but then it seems like you still have
       | to pass in each playlist URL separately.
       | 
       | This is just a "wrapper" for something yt-dlp already does?
        
         | chrismorgan wrote:
         | It's wrapping a somewhat opinionated and mildly bizarre yt-dlp
         | invocation, for each line of a file doing a mkdir/cd and then
         | invoking yt-dlp.
         | 
         | --***--
         | 
         | From the "Features" section of the README:
         | 
         | > _* Organized Structure: Creates separate directories for each
         | channel._
         | 
         | ... depending on you mentioning that name in your playlists.txt
         | file, so that if you were writing a script you'd just be doing
         | a mkdir/cd yourself, trivial.
         | 
         | > _* Smart Sync: Skips files that have already been downloaded
         | (--no-overwrites)._
         | 
         | That's not really what --no-overwrites does. The default of
         | --no-force-overwrites is probably actually what you want: "do
         | not overwrite the video, but overwrite related files". You
         | probably _do_ want metadata files to be updated on subsequent
         | runs.
         | 
         | > _* Clean Naming: Saves files as Playlist Title /Video
         | Title.mp4 (no numeric prefixes)._
         | 
         | This is an Opinion.
         | 
         | > _* Batch Processing: Reads multiple playlists from a
         | playlists.txt file._
         | 
         | Meh, you're invoking a script, putting the stuff in the script
         | would be at least as easy.
         | 
         | --***--
         | 
         | From the script itself, going through the arguments passed to
         | yt-dlp:                       --cookies "$COOKIES_FILE"
         | 
         | My impression is that this is discouraged unless _necessary_.
         | And if you need it, --cookies-from-browser will be more
         | convenient.                       -f "bv*+ba/b"
         | 
         | That's equivalent to the default.
         | --merge-output-format mp4
         | 
         | This is an Opinion.                       --no-overwrites
         | 
         | I'm not convinced this is desirable. Videos already won't be
         | overwritten by default, this just stops metadata from being
         | updated on subsequent runs, though I'm not sure what things
         | might be updated.                       -o
         | "%(playlist_title)s/%(title)s.%(ext)s"
         | 
         | This is an Opinion.
         | 
         | --***--
         | 
         | Instead of having a playlists.txt file containing `Channel
         | Name|https://www.youtube.com/playlist?list=x` and having a
         | separate 73-line file download_playlists.sh, you might as well
         | have just one download_playlists.sh file containing:
         | dl() {         mkdir -p "$1"         pushd "$1"         yt-dlp
         | -o "%(playlist_title)s/%(title)s.%(ext)s" "$2"         popd
         | }            dl 'Channel Name'
         | 'https://www.youtube.com/playlist?list=x'
         | 
         | By dint of its simplicity, easier to work with and tweak to
         | your own requirements (such as dropping `--merge-output-format
         | mp4` as I did here). Also more obvious how to invoke it just
         | once. (Aside: use pushd/popd instead of `cd "$channel_name"`
         | and `cd ..`, because then $channel_name containing a slash
         | won't bork it.)
        
       | tegiddrone wrote:
       | I've been glancing at ytdl-sub, which does the same thing but
       | with interesting options to rate limit.
       | 
       | https://ytdl-sub.readthedocs.io
        
       ___________________________________________________________________
       (page generated 2026-01-04 23:01 UTC)