Download and watch YouTube videos from Linux shell prompt

by Vivek Gite · 24 comments

Joe Barr shows us how to enhance your YouTube viewing pleasure!

FTA, "Publishing your own video on YouTube, or watching other people's videos, is all the rage these days. Why are we talking about YouTube, in a column about the CLI? Because this week we're writing about youtube-dl, a clever little CLI tool that's easy to install and and use to fetch YouTube videos.

Youtube-dl is a Python script, licensed under the "non-copyleft" free software MIT/X11 license. It is not platform-specific; it can run under Linux, Mac OS X, or Windows platforms so long as a recent -- 2.4 or later -- version of Python is installed."

Read more at Linux.com

Update: Check out this bash script - it does same thing w/o using python.

Featured Articles:

Want to read Linux tips and tricks, but don't have time to check our blog everyday? Subscribe to our daily email newsletter to make sure you don't miss a single tip/tricks. Subscribe to our weekly newsletter here!

{ 24 comments… read them below or add one }

1 bash 08.14.06 at 3:15 pm

http://bashscripts.org/viewtopic.php?t=210


#!/bin/bash
bu="http://youtube.com/get_video.php?";mkdir -p ~/YouTube;cd ~/YouTube;read -p "YouTube url? " ur;read -p "Name? " nv
wget ${ur} -O /tmp/y1;uf=${bu}`grep player2.swf /tmp/y1 | cut -d? -f2 | cut -d\" -f1`;wget "${uf}" -O /tmp/y.flv
ffmpeg -i /tmp/y.flv -ab 56 -ar 22050 -b 500 -s 320x240 ${nv}.mpg;rm /tmp/y.flv; rm /tmp/y1;rm gmon.out; exit

BASH RULES :)

2 nixcraft 08.14.06 at 6:27 pm

Hee

Nice and dirty bash work

Appreciate your post.

3 Ivan 08.18.06 at 7:46 am

lol @ rm gmon.out

4 Ray 08.18.06 at 8:02 am

Great information, thanks very much!

You might try this for Zsh (maybe modern Bournes?):

ytdl () {
video_id=${1#http://*youtube.com/watch?v=}
video_id=${video_id#http://*youtube.com/v/}
video_id=${video_id%&*}
player_line=`ftp -o - "http://www.youtube.com/watch?v=$video_id"|grep /player2.swf`
base_getter_url=http://youtube.com/get_video.php?
url=${player_line/*player2.swf\?/$base_getter_url}
url=${url%%\"*}
ftp -o $video_id.flv "$url"
ffmpeg -i $video_id.flv -ab 56 -ar 22050 -b 500 -s 320x240 $video_id.mpg
echo
echo mplayer $video_id.mpg
}

If you have an ftp with HTTP support.

5 nixcraft 08.19.06 at 6:17 pm

Nice to see you are using Zsh :)

Appreciate your script/post.

6 luke 09.19.06 at 7:39 am

great :D
thats real hacking lol

7 TjL 10.21.06 at 3:12 am

The ZSH code has a problem:

ffmpeg version 0.4.9-pre1, build 4718, Copyright (c) 2000-2004 Fabrice Bellard
built on Apr 4 2005 06:01:28, gcc: 3.4.2 [FreeBSD] 20040728
Input #0, flv, from ‘j0u_F8-oYQE.flv’:
Duration: N/A, bitrate: N/A
Stream #0.0: Audio: mp3, 22050 Hz, mono
Stream #0.1: Video: flv, 320×240, 15.00 fps
Output #0, mpeg, to ‘j0u_F8-oYQE.mpg’:
Stream #0.0: Video: mpeg1video, 320×240, 15.00 fps, q=2-31, 500 kb/s
Stream #0.1: Audio: mp2, 22050 Hz, mono, 56 kb/s
Stream mapping:
Stream #0.1 -> #0.0
Stream #0.0 -> #0.1
[mpeg1video @ 0x282f4010]MPEG1/2 doesnt support 15/1 fps
Error while opening codec for stream #0.0 – maybe incorrect parameters such as bit_rate, rate, width or height

8 James 02.14.07 at 4:32 am

Here’s the bash script, made more solid. I fixed the ffmpeg call (it doesn’t like making 15fps mpeg files), and kept the flv at the end.

If you want to use the flv from your own apache server you’ll need to add

video/x-flv flv

to /etc/mime.types and restart apache, then go and get flash_flv player from http://www.jeroenwijering.com/upload/flash_flv_player.zip

unpack it, put flvplayer.swf and flvplayer.html on your site with the .flv, and modify flvplayer.html appropriately

#!/bin/bash
bu=”http://youtube.com/get_video.php?”
tmp=`mktemp`
touch ${tmp}.flv
read -p “YouTube url? ” ur
wget ${ur} -O ${tmp}
uf=${bu}`grep player2.swf ${tmp} | cut -d? -f2 | cut -d\” -f1`
nv=`cat ${tmp} | grep ‘h1 id=”video_title”‘ | cut -d “>” -f 2 | cut -d “

9 James 02.14.07 at 4:35 am

#!/bin/bash
bu=”http://youtube.com/get_video.php?”
tmp=`mktemp`
touch ${tmp}.flv
read -p “YouTube url? ” ur
wget ${ur} -O ${tmp}
uf=${bu}`grep player2.swf ${tmp} | cut -d? -f2 | cut -d\” -f1`
nv=`cat ${tmp} | grep ‘h1 id=”video_title”‘ | cut -d “>” -f 2 | cut -d “

10 James 02.14.07 at 4:36 am

nv=`cat ${tmp} | grep ‘h1 id=”video_title”‘ | cut -d “>” -f 2 | cut -d “lt” -f 1`

*** i can’t post a less than symbol, so change the lt in that command to a less than symbol

echo “Title ${nv}”
wget “${uf}” -O ${tmp}.flv
ffmpeg -i ${tmp}.flv -r 30 -ab 56 -ar 22050 -b 1500k -s 320×240 “${nv}.mpg”
mv ${tmp}.flv “${nv}.flv”
rm ${tmp}
exit

11 nixcraft 02.15.07 at 4:39 am

James,

You can use
<pre>code</pre>

or
<code>code</code> tags :)

12 SaveTube 02.19.07 at 6:34 am

I use http://www.savetube.com to save any youtube videos. They also got a latest saved section.

13 Jen 02.28.07 at 10:14 pm

I recommend http://www.snatchvid.com it’s very easy and fast to use!

14 James Attard 06.19.07 at 2:22 pm

does anybody know how he arrived to the get_video.php ? i mean how did he know that that php file existed on youtube servers?

15 Coolclu3 08.28.07 at 4:55 pm

Uhm…youtube has changed their code. now this script doesn’t work any more, from something like 20th August – 20007. Anyone can help fix the code? savetube.com has done it

16 Roger 10.12.07 at 11:24 am

A good script is Mortube
Demo: http://www.morllaines.com/busca_youtube/?tag=brasil (Portuguese)
Download: http://www.morllaines.com/downloads/arquivo.php?file=54 (English)

The script require youtube apy key on config.php
And Curl installed on server

17 wearetherock 04.02.08 at 6:05 am

#!/bin/bash

### mr-paul
### paul@sci.ubu.ac.th

if [ "$1" = "" ]; then
echo -e “\nUsage: getyoutube http://www.youtube.com/watch?v=UHvAXLBMWGI\n”
else
url=$1
name=${url:(-11)} ### get the last 11 chars
#echo $name

fullscreenURL=$( wget -q -nv $url -O – | grep \&video_id= )
echo $fullscreenURL
title=${fullscreenURL##*=} ### delete to last occurance of ‘=’
title=${title/\’;/} ### replace ‘; with nothing ${title:(-2)} or #{title#(-2)} do not work’ :(
echo $title

videoID=${fullscreenURL:54} ### cut first 53 chars
videoID=${videoID/\’;/} ##
echo $videoID

wget -q -nv “http://www.youtube.com/get_video?$videoID” -O “$title.flv”
fi

18 clarjon1 05.20.08 at 2:20 pm

Hmm, anyone got a perl one liner for this job? ;)

19 Rob 05.29.08 at 9:47 pm

There’s now a software tool to allow linux users to download youtube videos to a preferred directory, in a variety of formats (mpeg, wmv, mp4, flv, avi), specifying the resolution… all in a GTK theme’d graphical tool.

Check it here:
http://yourtubedownloader.awardspace.com/

Feedback most appreciated, via the forums or by email.

20 macias 07.13.08 at 7:19 pm

Wearetherock, MANY THANKS! Simplicity is what I like, great script.

21 Webdesign 11.26.08 at 3:19 pm

Nice youtube script, thanks so much!

Mark

22 Jim Bowe 12.17.08 at 1:36 pm

Good script to do this in bash here:
http://blog.johnlawrence.net/2008/12/youtube-download-shell-script/

Works with the latest YouTube versions. (As of December 2008)

23 xijhing 08.18.09 at 5:16 am

usage: utube NAME youtubeurl

#!/bin/bash
if [ $# -ne 2 ]
then
echo “Usage : $0 ”
echo “e.g : $0 steve_jobs http://www.youtube.com/watch?v=D1R-jKKp3NA”
else
todnload=$(youtube-dl -g -b $2 | xargs wget –spider 2>&1 | grep Location: | awk '{print $2}')
#echo -e “Got the file…\n$todnload”
axel $todnload -q -o ~/$1.flv
echo “Download Completed…”
ffmpeg -i $1.flv -r 50 -ar 48000 -ab 196000 -b 300k -croptop 0 -cropbottom 0 -cropleft 0 -cropright 0 $1.mp4
echo "Cleaning up..."
rm ~/$1.flv
rm ~/videoplayback?ip*
echo "Done! Enjoy watching $1"
fi
24 phar0z 09.14.09 at 8:24 pm
#!/bin/bash
# checking whether you have youtube-dl
if [ ! -x `which youtube-dl`  ];then
echo “Error! youtube-dl isn’t installed.”
exit 0
fi

#checking whether you have vbrfix
if [ ! -x `which vbrfix`  ];then
echo “Error! vbrfix isn’t installed.”
exit 0
fi

#download video(s)
for URL in $*; do
youtube-dl -t “$1&fmt=18″
done

#process
for VIDEO in `ls *.flv`; do
OUTPUT=${VIDEO:0:${#VIDEO}-4}”.mp3″
ffmpeg -i $VIDEO -acodec copy $OUTPUT
#move video
mv $OUTPUT /home/$USER/music
vbrfix /home/$USER/music/$OUTPUT /home/$USER/music/$OUTPUT
rm -rf vbrfix.log vbrfix.tmp
#clean-up
rm -rf $VIDEO
done
echo “Done.”

Leave a Comment

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Previous post:

Next post: