154
submitted 15 hours 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
top 29 comments
sorted by: hot top controversial new old
[-] texture@lemmy.world 1 points 1 hour ago

this is neat, thanks!

[-] urhovaldeko@lemmy.world 23 points 4 hours 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.

[-] GarbadgeGoober@feddit.org 3 points 4 hours 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 1 points 2 hours ago

DJT, best Linux promoter of 2025 :P

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

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

[-] osanna@thebrainbin.org 1 points 5 hours ago

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

[-] Carl@hexbear.net 10 points 9 hours ago

It's a slippery slope. Soon you'll be using Vim and ordering thighsocks on the Internet.

[-] NewDawnOwl@lemmy.world 3 points 7 hours 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)

[-] hoppolito@mander.xyz 49 points 13 hours 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 6 points 10 hours ago* (last edited 10 hours 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 11 points 9 hours 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 3 points 4 hours ago

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

[-] TechnoCat@piefed.social 6 points 10 hours 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  
[-] NorthWestWind@lemmy.world 5 points 10 hours 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
[-] BananaTrifleViolin@lemmy.world 9 points 12 hours ago* (last edited 12 hours ago)

That's great! Here's a few tips to take it a bit further; the world is your oyster!

Open your .bashrc file (e.g. /home/yourusername/.bashrc) and add the following:

alias get="/path/to/your/bash/file"

Now open a terminal and type get, and it'll launch the script. No clicking needed, it'll run anytime from any terminal!

And if you do use the alias then you can use another refinement, you can drop the echo: instead of $a, you can use $1 and remove the echo & read as you no longer need them:

#! /usr/bin/bash yt-dlp -x $1

Now for example you can type in a terminal:

get http://url.to.video/

And yt-dlp will do it's stuff. $1 passes the first parameter after starting the script as a variable to it.

You can use the keyboard shortcut Control+shift+v to paste a URL into the terminal, no mouse needed; just remember to add a space after typing get

[-] db2@lemmy.world 1 points 7 hours ago

The op script is meant to be opened in the GUI in a terminal then the URL gets pasted in there. It took me a second to see it.

[-] 0t79JeIfK01RHyzo@lemmy.ml 1 points 11 hours ago* (last edited 11 hours ago)

What does your ~/.bashrc look like? My last change was modifying a playlist command

spoiler: I explain my last change to my ~/.bashrc file

playlist https://www.youtube.com/@YouTube/videos

or

playlist /home/username/Videos

or just from any directory with files

playlist

And then takes all the videos found at the url or at the path (including within folders), adds them to a playlist, shuffles them, and plays them from mpv.

playlist() {
        param=""

        # If the first parameter has a length more than 1 character
        if [ ${#1} -gt 1 ]; then
                param="${@}"
        else
                param="."
        fi

        screen mpv $param --shuffle --ytdl-raw-options-add=cookies-from-browser=firefox --loop-playlist=inf --no-keepaspect-window --no-auto-window-resize
}

other functions and aliases in my ~/.bashrc

alias code=codium
alias files=nautilus
alias explorer=nautilus
alias rust="/path/to/.cargo/bin/evcxr"
alias sniffnet="export ICED_BACKEND=tiny-skia; /path/to/.cargo/bin/sniffnet"
alias http-server='/path/to/.cargo/bin/miniserve'
alias iphone='uxplay'
alias airplay='uxplay'
alias watch='screen mpv --ytdl-raw-options-add=remote-components=ejs:github --ytdl-raw-options-add=cookies-from-browser=firefox --no-keepaspect-window '
alias twitch='watch'
alias timeshift-launcher="pkexec env WAYLAND_DISPLAY='$WAYLAND_DISPLAY' XDG_RUNTIME_DIR='$XDG_RUNTIME_DIR' /usr/bin/timeshift-launcher"
alias update="sudo apt update && sudo apt upgrade -y && sudo flatpak update -y && sudo snap refresh"
alias resize="path/to/resize/videos/resize.sh"

playlist() {
        param=""

        # If the first parameter has a length more than 1 character
        if [ ${#1} -gt 1 ]; then
                param="${@}"
        else
                param="."
        fi

        screen mpv $param --shuffle --ytdl-raw-options-add=cookies-from-browser=firefox --loop-playlist=inf --no-keepaspect-window --no-auto-window-resize
}

gif() { ffmpeg -i $1 -f yuv4mpegpipe - | gifski -o $2 ${@:3} -;}

[-] db2@lemmy.world 1 points 7 hours ago

I wonder if we have the same resize.sh

[-] 0t79JeIfK01RHyzo@lemmy.ml 1 points 6 hours ago

The version I have was copied from stackoverflow. It doesn't work very well, it makes a rough estimate to get the video file size under the set value. As an example

resize video.mp4 10

Which then resizes the video to 10 megabytes if possible.

resize.sh code

file=$1
target_size_mb=$2  # target size in MB
target_size=$(( $target_size_mb * 1000 * 1000 * 8 )) # target size in bits
length=`ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file"`
length_round_up=$(( ${length%.*} + 1 ))
total_bitrate=$(( $target_size / $length_round_up ))
audio_bitrate=$(( 128 * 1000 )) # 128k bit rate
video_bitrate=$(( $total_bitrate - $audio_bitrate ))
ffmpeg -i "$file" -b:v $video_bitrate -maxrate:v $video_bitrate -bufsize:v $(( $target_size / 20 )) -b:a $audio_bitrate "${file}-${target_size_mb}mb.mp4"

I'll probably replace it eventually.

[-] db2@lemmy.world 2 points 6 hours ago* (last edited 6 hours ago)

Definitely not the same lol

Mine uses ffmpeg to change the resolution, it doesn't so much care about file sizes.

It could be a one-liner if you only ever feed it a single file to manipulate..

[-] 0t79JeIfK01RHyzo@lemmy.ml 2 points 5 hours ago

I might add one for scaling. I just don't use it as frequently as trying to meet a file size limit. The scaling is also much easier to remember

ffmpeg -i  in.mp4 -vf "scale=600:-1" -an out.mp4

It does get complicated though, when scaling many videos and images, I've used something like the following in the past

find .  -exec ffmpeg -i {} -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:-1:-1:color=black" {}.mp4 \;

Those were the only two that showed up when I typed history | grep scale.

after commenting, I also added a new video file resizer.

It works significantly better than the one I previously posted. It's also copied from stackoverflow.

bitrate="$(awk "BEGIN {print int($2 * 1024 * 1024 * 8 / $(ffprobe \
    -v error \
    -show_entries format=duration \
    -of default=noprint_wrappers=1:nokey=1 \
    "$1" \
) / 1000)}")k"
ffmpeg \
    -y \
    -i "$1" \
    -c:v libx264 \
    -preset medium \
    -b:v $bitrate \
    -pass 1 \
    -an \
    -f mp4 \
    /dev/null \
&& \
ffmpeg \
    -i "$1" \
    -c:v libx264 \
    -preset medium \
    -b:v $bitrate \
    -pass 2 \
    -an \
    "${1%.*}-$2mB.mp4"

[-] MagnificentSteiner@lemmy.zip 14 points 14 hours ago
[-] myrmidex@belgae.social 14 points 14 hours ago

One of us! One of us!

[-] matrixrunner@lemmy.world 10 points 15 hours ago
[-] FEIN@lemmy.world 3 points 13 hours ago
[-] Liketearsinrain@lemmy.ml 2 points 12 hours ago

Well done, I never could use bash much but can't deny its useful

[-] EccTM@lemmy.ml 2 points 12 hours 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
this post was submitted on 22 Feb 2026
154 points (99.4% liked)

Linux

62524 readers
685 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 6 years ago
MODERATORS