202
submitted 3 months ago by RavenofDespair@lemmy.ml to c/linux@lemmy.ml

made it so i just click file and paste YouTube url

Linux is amazing

#! /usr/bin/bash
echo "Enter a url"
read a

yt-dlp -x $a
all 40 comments
sorted by: hot top controversial new old
[-] hoppolito@mander.xyz 65 points 3 months ago

Very happy you had fun making the little script! One thing that will become important pretty quick if you continue making these scripts is that it’s almost always better to wrap your variables in quotes - so it becomes yt-dlp -x “$a”. It’s okay here but if you ever paste something that has a space in it, this will keep it together ‘as one’.

If you want to expand your knowledge with this, some fruitful paths to go down are the following:

  • can you find a way to download multiple urls one after the other if you paste them all at once? (Multiple arguments)
  • can you find a way to ask the user for these multiple urls one after the other? (loops)
  • and can you find a way to have it ask until you hit enter without a url pasted and only then it starts? (conditionals and test)

The last one is already quite a bit advanced but if you can do that you have enough of the ‘programming’ basics of the shell down to a degree that you can create many little helpers like this with ease.

Of course don’t feel forced to do any of that - if you’re happy with the improvement as-is, that’s all you need to enjoy the fun of Linux!

[-] Ephera@lemmy.ml 8 points 3 months ago* (last edited 3 months ago)

One thing that will become important pretty quick if you continue making these scripts is that it’s almost always better to wrap your variables in quotes - so it becomes yt-dlp -x “$a”.

Oh man, this reminds me of the joke that any program that's more complex than Hello World has bugs – and folks still don't even agree how to spell "Hello, World!".

Of course, Bash is a particular minefield in this regard...

[-] 18107@aussie.zone 17 points 3 months ago

I once wrote a 2 line, 10 word script that had 9 bugs in it. I'm not overly proud of that one.

[-] draco_aeneus@mander.xyz 4 points 3 months ago

I think you might have a career as an accomplished entymologist ahead of you with so much success finding bugs!

[-] RavenofDespair@lemmy.ml 1 points 3 months ago

Thanks might make it bigger now. The "$a" very helpful as I might copy url from web pages which may cause a error.

[-] urhovaldeko@lemmy.world 51 points 3 months ago

Stop right now. This will all end in tears. You’ll become a developer and spend the rest of your life fixing bugs. You can still get out.

[-] RavenofDespair@lemmy.ml 11 points 3 months ago

I like fixing things but getting paid to do it is the hard part. I also want to give back to Linux community even if it is small.

[-] MagnificentSteiner@lemmy.zip 19 points 3 months ago
[-] JamonBear@sh.itjust.works 18 points 3 months ago

You all forgot to add the best yt-dlp option: --sponsorblock-remove all

[-] mactan@lemmy.ml 2 points 3 months ago
[-] myrmidex@belgae.social 13 points 3 months ago

One of us! One of us!

[-] matrixrunner@lemmy.world 9 points 3 months ago
[-] NorthWestWind@lemmy.world 8 points 3 months ago

Guess we're sharing scripts now. I have a script that downloads playlists as MP3s and keep an archive.

#!/usr/bin/env sh

browser_cookies="firefox:1cvnyph7.YouTube TV"

download() {
	url="https://www.youtube.com/playlist?list=%241"
	dir=$2
	archive_name=$3

	yt-dlp -x --audio-format mp3 --embed-thumbnail --embed-metadata --cookies-from-browser "$browser_cookies" --download-archive "archives/$archive_name.txt" -P "$dir" -o "%(title)s.%(ext)s" "$url"
}

download PLPzniwWWCSjVQteWPqVvyu8SQsrStVYwZ high-quality-rips/ rips
download PLPzniwWWCSjWZj3-DAOh8ZKrsVReP_Ksm good-playlist/ picks
[-] TechnoCat@piefed.social 8 points 3 months ago

Here is a script I wrote:

~/bin 0s  
> cat vget  
#!/usr/bin/env fish  
yt-dlp --embed-metadata --write-subs --embed-subs --write-thumbnail --prefer-free-formats -f "[height<=1080]" $argv  
[-] cupcakezealot@piefed.blahaj.zone 2 points 3 months ago

does --write-thumbnail save a jpg with the video? or is it something else?

[-] TechnoCat@piefed.social 1 points 3 months ago* (last edited 3 months ago)

You're correct!

       --write-thumbnail  
              Write thumbnail image to disk  

There is also this option:

       --embed-thumbnail  
              Embed thumbnail in the video as cover art  
[-] cupcakezealot@piefed.blahaj.zone 2 points 3 months ago

makes note of this since it will make tagging a lot easier and also cataloging for jellyfin

[-] GarbadgeGoober@feddit.org 5 points 3 months ago

Amazing.

Injust switched a year ago and now I finally discovered bash scripts.

It is so mich easier, I also automated some manual tasks with Python scripts to name my PDFs, never would have done that with windows.

And the best part of it, it's actually fun and I want to even do more.

As always I have to thank DJT, for make me switch. 🤣

[-] MousePotatoDoesStuff@lemmy.world 2 points 3 months ago

DJT, best Linux promoter of 2025 :P

[-] chunes@lemmy.world 4 points 3 months ago* (last edited 3 months ago)

You've got me beat. I just have a text file with some common usage examples in it.

[-] RavenofDespair@lemmy.ml 2 points 3 months ago

I do the same, for the commands I forget. Joplin is also handy for making longer notes.

[-] aqua@lemmy.world 2 points 3 months ago

Check out atuin, when you press arrow up in the terminal it shows a history list that is also searchable.

[-] cupcakezealot@piefed.blahaj.zone 4 points 3 months ago

this isn't perfect but i made one when i wanted to fetch a video for a specific resolution (because i prefer 480)

ytgrab() {  
  local id="$1"  
  local res="${2:-480}" # default to 480  
  local url="https://www.youtube.com/watch?v=%24id"  

  # fetch formats  
  local fmt  
  fmt=$(yt-dlp -F --cookies-from-browser vivaldi "$url")  

  # printing the format output  
  echo "$fmt"  

  # pick video format matching the requested resolution  
  local vfmt  
  vfmt=$(echo "$fmt" | awk -v r="${res}p" '$0 ~ r && /video/ {print $1}' | head -n1)  

  # pick best m4a audio  
  local afmt  
  afmt=$(echo "$fmt" | awk '/m4a/ && /audio/ {print $1}' | head -n1)  

  # safety check  
  if [ -z "$vfmt" ] || [ -z "$afmt" ]; then  
    echo "Could not find matching formats (video ${res}p or m4a audio)."  
    return 1  
  fi  

  echo fetching: yt-dlp -f ${vfmt}+${afmt} --cookies-from-browser vivaldi --write-subs --no-write-auto-subs --sub-lang "en.*" $url  
  yt-dlp -f "${vfmt}+${afmt}" --write-subs --cookies-from-browser vivaldi --no-write-auto-subs --sub-lang "en.*" "$url"  
}  
[-] ExperimentalGuy@programming.dev 2 points 3 months ago

Just curious, but why 480?

[-] cupcakezealot@piefed.blahaj.zone 1 points 3 months ago

usually i just like older videos but in this case i was saving a bunch of wcw vault videos to my jellyfin library and i prefer 480 since it was as close to tv as can be (also i've never been a fan of hd and tv after 2000 because i felt that's when it went downhill)

[-] JTskulk@lemmy.world 3 points 3 months ago

No offense, but I'm seeing a lot of useless scripts here. You can simply put these option in yt-dlp.conf and then just run yt-dlp "url".

[-] RavenofDespair@lemmy.ml 1 points 3 months ago

I made this for easy use so no typing or terminal. some people like to do thing differently and that's ok

[-] JTskulk@lemmy.world 1 points 3 months ago

When you read a, you're typing in terminal. I made a clipboard action so I just copy an URL to the clipboard, execute actions, and then choose whether to play it or download it on my other machine.

[-] NewDawnOwl@lemmy.world 3 points 3 months ago

I love things like this, makes it so easy to learn when it's a really simple to understand and explicit implementation of a high level feature (read input, pass to command)

[-] DarkSpectrum@lemmy.world 3 points 3 months ago

I self host Pinchflat and have set it up to monitor one of my own yt playlists. Then if I want to download anything on mobile or desktop I just save it to that playlist and it's done.

[-] EccTM@lemmy.ml 3 points 3 months ago

I have a similar scriptlet that I use to open YouTube URLs in mpv, using just and wl-clipboard... I just copy the URL and press my G1 key (it has a keybind of just yt-paste attached) which launches the yt-paste snippet below, reads the url from the clipboard, parses it and passes it to mpv.

# Parse the clipboard for YouTube URLs and open them in mpv
yt-paste:
  #!/usr/bin/env bash
  YOUTUBE_URL_REGEX="^https:\/\/(www\.youtube\.com\/watch\?v=|youtu\.be\/)[a-zA-Z0-9_-]{11}"
  YOUTUBE_PLAYLIST_URL_REGEX="^https:\/\/(www\.youtube\.com\/playlist\?list=)[a-zA-Z0-9_-]+"
  YOUTUBE_SHORTS_URL_REGEX="^https:\/\/(www\.youtube\.com\/shorts\/)[a-zA-Z0-9_-]{11}"
  # Youtube URL
  if [[ "$(wl-paste)" =~ $YOUTUBE_URL_REGEX ]]; then
    echo "Opening valid YouTube URL" >&2
    notify-send --app-name="YT-Paste" --icon=mpv --transient "Opening YouTube URL"
    mpv "$(wl-paste)"
  # Youtube Playlist URL
  elif [[ "$(wl-paste)" =~ $YOUTUBE_PLAYLIST_URL_REGEX ]]; then
    echo "Opening valid YouTube Playlist URL" >&2
    notify-send --app-name="YT-Paste" --icon=mpv --transient "Opening YouTube Playlist URL"
    mpv "$(wl-paste)"
  # Youtube Short URL
  elif [[ "$(wl-paste)" =~ $YOUTUBE_SHORTS_URL_REGEX ]]; then
    echo "Opening valid YouTube Shorts URL" >&2
    notify-send --app-name="YT-Paste" --icon=mpv --transient "Opening YouTube Shorts URL"
    mpv "$(wl-paste)"
  # No Match
  else
    echo "Clipboard does not contain a valid YouTube URL" >&2
    notify-send --app-name="YT-Paste" --icon=mpv --transient "Whoops!" "Clipboard does not contain a valid YouTube URL"
    exit 1
  fi
[-] CrabAndBroom@lemmy.ml 2 points 3 months ago* (last edited 3 months ago)

Nice! I did mine as an alias:

alias yt='yt-dlp --remote-components ejs:github -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/mp4"'

And then just yt [URL] downloads the thing.

[-] FEIN@lemmy.world 2 points 3 months ago
[-] kittenroar@beehaw.org 1 points 3 months ago* (last edited 3 months ago)

You could make it an alias and shorten the number of keystrokes

I prefer keeping my aliases in ~/.bash_aliases, which is sourced in my ~/.bashrc, ie

. ~/.bash_aliases

Then you would just need to source your bashrc to load it the first time.

[-] osanna@thebrainbin.org 1 points 3 months ago

awesome! I never would have thought to make something like that.

[-] texture@lemmy.world 1 points 3 months ago

this is neat, thanks!

[-] HuePony@lemmy.ml 1 points 3 months ago

I simply using local LLM for it

this post was submitted on 22 Feb 2026
202 points (100.0% liked)

Linux

65665 readers
38 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 7 years ago
MODERATORS