Yt-dlp is the best way to download videos and audio

corbin@infosec.pub to Open Source@lemmy.ml – 503 points –
How to use yt-dlp: The best video and audio downloader
spacebar.news
97

One of my favourite applications. I stopped paying for spotify and just use this to get music these days. Everything gets uploaded to youtube anyways.

Downloading music from YouTube will get you MP3s, but they will have gone through the YT compression algorithms.

Use Deemix instead. Downloads MP3s straight from the Deezer servers with all metadata and album art.

Lucida.to would also be a pretty good choice, you can choose to download from either Deezer, Qobuz, Tidal, Spotify, Deezer or Amazon Music.

Then seed it on Soulseek as a webrip

No you have to edit the file for CD metadata and convert it to flac so you can pretend it was ripped from a CD, as is P2P file sharing tradition. Bonus pts if you put it through some filter to introduce a bunch of noise into the audio. Then ask in chat how you can convert a 128kbps mp3 to flac to increase the quality. Priceless.

Does it automatically grab things like metadata (author, cover art, etc.) for you? And if it requires a flag, do you know it?

I don't bother personally for the most part but it seems like you can do it via --embed-metadata, --parse-metadata, and --embed-thumbnail.

It’s very automatic with just pointing it at the media’s URL, but also highly configurable if you want.

Unless the artist only posts on YouTube, try soulseek. Most files have metadata already included, and if they don't, you can just download from another user.

May I suggest SpotDL specifically for Spotify: https://github.com/spotDL/spotify-downloader

Maybe a little bit shameless plug from me, but I want point to my Bash script for Linux to make the daily yt-dlp life easier: https://github.com/thingsiplay/yt-dlp-lemon yt-dlp-lemon -h will show only a few options and yt-dlp-lemon -H shows everything the script supports.

I wrote my own web app in Python, using pytube-fix and its lightning fast. Great library. I found a recent screenshot that's a bit behind in commits but you get the idea.

Edit: I published the source code, please note there is a LOT of work left to do, but it works. https://codeberg.org/ArtisanByteCrafter/pytube-gui

I didn't see anything like this image in the pytube-fix repo. Do you have a repo of the web interface somewhere? That looks really handy.

Thanks! Would you happen to know how to install with pipx? I don't fully understand Python venv stuff, but I followed instructions on how to install yt-dlp using pipx. I'm not clear on whether I could do that with your app.

So, pipx only installs a single package into an isolated environment, and my app has a list of package dependencies that must all work together. If you run the instructions in my readme line by line, you should get it working, but I understand sometimes that's not the way everyone wants to do things in a one-off manner. I have been spending some time this week getting my Dockerfile finalized and my build scripts working, so I hope to have a docker image ready within a few weeks at least of the application in its current state.

It's not a big deal - I was just wondering. I will keep watching your repo. Thanks.

Please publish the source code

Happy to, I'll do it tonight. Just be aware this is only "good enough for myself doing some testing" level yet. I do plan on doing a lot more work. EDIT: here goes nothing: https://codeberg.org/ArtisanByteCrafter/pytube-gui

Props for choosing Codeberg over some corpo lock-in option

That's fine. Once it's out, other people can help. Or if you give up on it completely, anyone can fork it and resume development on it.

Thanks :)

It's the main way I watch youtube now. After Piped and Newpipe stopped working for me across all devices, I only use 2 methods of watching Youtube now. Open in mpv (which is configured to use yt-dlp in the backend to make things faster), and download using yt-dlp. So it's key to me keeping on watching Youtube. Recently, I've started getting ads showing up even on Mobile Vivaldi, so no more YT on my phone.

So my new workflow is to use Piped to find a video, then copy the end of the link and type "yt-dlp " in a terminal, wait for the video(s) to download, and open in mpv.

OR

In some cases, use Qutebrowser, with a custom keybind to open a video in mpv.

Newpipe works fine for me. They always fix it almost immediately.

Yeah, but I use a fork called Tubular so I can get SponsorBlock and ReturnYoutubeDislike.

Edit: Turns out I just missed that there was an update. Phone playback is back!

How often does that break?

Yt-dlp or mpv? Never.

Newpipe and piped? Newpipe takes about a week or two, to rebreak after a fix. Piped has been broken and not updated yet, for a while.

So my new workflow is to use Piped to find a video, then copy the end of the link and type “yt-dlp ” in a terminal, wait for the video(s) to download, and open in mpv.

Why not just pass the YouTube link to mpv so you don't have to wait for the video to download?

I still have to wait a long time for the video to load in the Mpv cache, and sometimes I want a bunch of videos to watch later (or watch multiple times if they're educational). In which case, I either open up a bunch of videos in their own mpv windows and they all load while I'm watching the first one, or I download them while I'm doing something else.

But loading a bunch of mpv windows is heavier than a bunch of terminals running yt-dlp (and I could also just switch to using tmux.... which I probably should get around to at some point).

I still have to wait a long time for the video to load in the Mpv cache

In my experience the video loads in a few seconds compared to the minutes it'd take for it to download, but I get your second point.

Depends on the options mpv passes to yt-dlp—I personally have in my mpv config to grab 720p videos, so that it’s faster than downloading full quality.

Maybe just pay for YouTube Premium at at that point? It pays the video creators, and you don't have to have a janky playback setup.

No matter how hanky this setup is, the official YouTube app is jankier.

It pays the video creators

Then why are almost all of them on patreon and ask for a donation?

Because it’s an additional source of revenue, and they can provide rewards outside of YouTube.

1 more...
1 more...

Why would anyone want to support one of the most evil companies in the world alongside though?

If you don’t like Google keeping a cut, then sign up for all the Patreons for everyone you watch.

Now this is a much better answer but some people still just can't afford that.

Right, that’s why ads exist.

Ads exist because people want to make money. So these bad actors go out and look for places where people like to spend their time, and they poison these places with their money-hungry practices. In the process they destroy the innocence of all these manifestations of human creativity, and manipulate people into buying shit they don't actually need, effectively destroying the planet through overconsumption. That's not even mentioning that ad-companies put us on a path towards a mass-surveillance society, just because big-data leads to more effective ads. I can't help but see ads as a destructive force of evil in our world. I like human creativity in it's many forms, and I'm all in favor of rewarding creators to a certain extent, but using ads seems to be the worst possible method of doing so.

(not intending to criticize your comments, just spreading the anti-ad gospel ;-)

I don't like ads either, but they are the only functioning way of paying creators outside of direct payments, especially with economic inflation and competition from streaming services eating away at people's budget for media. No one else has a solution that works under capitalism.

But ads are not functioning, they are destructive. They are by no means cheap either, people are paying through being manipulated and we are paying collectively for the damage it's doing to our world. We'd be much better of if we had only direct payments. Direct artist payments will always be the more effective and efficient financing structure because then we pay just for the creative output, not all the unrelated economic parasitic activities.

The solution is very simple and there is nothing that inflation can do about it: we don't watch ads, we pay creators that we want to support, and if from these donations a creator doesn't earn enough money he has two options: 1. One has an intrinsic drive to create and publish so he does so through other means, for instance by working a part time job. If this sounds unreasonable then let us not forget that already most of all human creativity is financed exactly like this, it is only the exception that is financially lucrative. 2. One chooses not to create (or in a less costly manner). You could think of this as a sad outcome, but you'd be better off concluding that this creative output wasn't so important to anyone, not to the creator nor to the public. This means we'd be left with the better and more intrinsically motivated creative content.

So let's not justify ads, but let's reject them in the most radical ways we can.

Capitalism doesn't change the fact that giant companies fundamentally lack the right to hijack my attention and implant their bullshit in my head.

Good news, there is a subscription service to prevent that and also still pays the creators.

But they don't exist without terrible data collection with illegal elements. Dry capitalism never ends well, mister/miss.

The two options for compensating a creator for their work online are advertisements or direct payments. There are no other functional alternatives. In a better world, more countries would have grants or universal basic income, but that's not the world that exists right now.

What I'm saying is extremely poor people don't have to support anyone and nobody should ever force them or make them feel guilty like you're doing. The creator can also make their content completely or partially paywalled like what RCE is doing for example.

1 more...
1 more...

yt-dlp is great, but if you need to archive playlists automatically, want a repository, or otherwise prefer a gui I would recommend TubeArchivist.

I use parabolic on PC and Seal (on F-Driod) to download yt videos. Both are just YTDLP with a GUI because I'm not an arch user

I have been using Jdownloader2 for years.. I don’t know what the differences are, but might be an option for people who want something GUI based

If you need a gui or are trying to monitor playlists I would recommend TubeArchivist.

I tried a few times, but the video and audio are often out of sync. Anyone have this issue?

Strange. I downloaded thousands of videos with this tool (but just watched a handful of them) and never noticed an out of sync. Can you point me to a video I can download and test where you have this issue? Is it a new issue? Maybe Google is trolling us or you or your region.

I've downloaded it and replayed the video file in VLC Player. Just skipped parts and listened to it a few seconds, also towards and at the end when we see the person speaking. It looks fine to me, the lips are synced to what he is speaking. Besides that the uploader could have made a mistake (I've seen videos desynced online), this seems to be fine. It could be a problem with the video player or codec on your system? Or the ffmpeg version you have (yt-dlp uses ffmpeg to do stuff).

It's hard to say what's going on. I can only confirm that downloading this video with yt-dlp looks correctly synced to me. Edit: I remember in the past I had a video player that would out of sync for long video sessions. It was a problem with some codec not properly supported or like that and switching the video player worked. I have no more information, it was random on a Tuesday morning years ago.

Wow, thanks for the reply! I guess it must be a problem on my end. I was playing with kodi on a raspberry pi,, so I'm not surprised, but really helpful to know that it's not the downloader.

I've had audio sync issues on kodi myself-- specifically osmc on Vero V which is optimized for playback. I tried checking my notes, because it was some time ago. Nothing definitive, but it may have been related to a random crashing issue that turned out to be a bad hdmi port-- which was the last thing I considered checking after triple checking everything else. Anyway, good luck with the troubleshooting. Audio sync issues are a pain but I can also attest yt-dlp has been solid.

I'll take anything with a GUI instead.

All of the good video downloaders are just a wrapper for using this, so it's not really "instead".

If you use it frequently, I suggest getting a GUI that have profiles or remember options so you don't have to mess with commands all the time. I wrote my own little command line wrspper which is Windows only since I don't have Linux to test on. Though it shouldn't take much effort to add support.

Makes it much more convenient when you don't have to specify things like archive (ignore duplicates), filename to be "artist - title" (where possible), download destination, etc. Just alt-tab, Ctrl-v, Enter. And the download is running. And mine also has parallel downloads and queue for when you got many slow downloads.

This is wonderful, I've been struggling with piped for some time now, it's always asking me to sign in to confirm that I'm not a bot. Also it's showing me videos in very low quality and often it stops loading halfway through the video. With this I get to see good quality videos once more, without unwanted pauses and without financing yt in any way. Great!

If you like this article, please consider following the site on Mastodon/Fedi, email, or RSS. It helps me get information like this out to a wider audience :)

Your email link doesn't work. Try it in Tor Browser with js disabled.

The email signup and user management panel needs JavaScript, yeah.

I tried to download some videos from Reddit using YT-DLP and it didn't work, I think maybe because Reddit limited access

I made a script for grabbing reddit videos that's been working pretty well for me, needs Babashka to run https://babashka.org/

#!/usr/bin/env bb
(require '[clojure.java.shell :refer [sh]]
         '[clojure.string :as string]
         '[cheshire.core :as cheshire]
         '[org.httpkit.client :as http]
         '[clojure.walk :as walk])

(defn http-get [url]
  (-> @(http/get url {})
      :body))

(defn find-base-url [data]
  (let [results (atom [])]
    (walk/postwalk
     (fn [node]
       (when (and (string? node) (.contains node "DASH"))
         (swap! results conj node))
       node)
     data)
    (some-> @results first (string/replace #"DASH_[0-9]+\.mp4" ""))))

(defn find-best-quality [names audio?]
  (->> ((if audio? filter remove) #(.contains (.toLowerCase %) "audio") names)
       (sort-by
        (fn [n]
          (-> n
              (string/replace #"\.mp4" "")
              (string/replace #"[a-zA-Z_]" "")
              (Integer/parseInt))))
       (last)))

(defn find-parts [base-url data]
  (let [url (atom nil)
        _ (walk/prewalk
           (fn [node]
             (when (and (map? node)
                        (contains? node :dash_url))
               (reset! url (:dash_url node)))
             node)
           data)
        xml (http-get @url)
        parts (->> (re-seq #"(.*?)" xml) (map second))
        best-video (find-best-quality parts false)
        best-audio (find-best-quality parts true)]
    [(str base-url best-video) (str base-url best-audio)]))

(defn filename [url]
  (let [idx (inc (.lastIndexOf url "/"))]
    (subs url idx)))

(defn tsname []
  (str "video-" (System/currentTimeMillis) ".mp4"))

(let [data (-> (first *command-line-args*) (str ".json") http-get (cheshire/decode true)) 
      base-url (find-base-url data)
      [video-url audio-url] (find-parts base-url data)
      video-file (filename video-url)
      audio-file (filename audio-url)]
  (sh "wget" video-url)
  (sh "wget" audio-url)
  (sh "ffmpeg" "-i" video-file "-stream_loop" "-1" "-i" audio-file "-shortest" "-map" "0:v:0" "-map" "1:a:0" "-y" (tsname))
  (sh "rm" audio-file video-file))

https://github.com/yt-dlp/yt-dlp/blob/master/supportedsites.md

Reddit is listed in the list of supported sites. I just tested it with a random post video post on Reddit, and it downloaded the file perfectly fine (played in local player). My theory you either did a user error and gave a link that is not a video post, I'm not sure if posts that link to a video would work, I think the post itself must be a video post. Or you tested it when Reddit blocked yt-dlp. The yt-dlp team needs to update it first, then it functions again. YouTube does the same.

I don't think I've had issues with reddit, as long as you use the link to the reddit comment thread, not one of the shortlinks or the video link or something else.

Make sure yt-dlp is up to date. I’ve been able to download reddit, YouTube shorts, TikTok, videos etc just fine

Used to DL a bunch of Peloton videos during a free trial then self-host on Plex.