Download and Watch YouTube videos from Linux Shell Prompt

by on August 14, 2006 · 26 comments· LAST UPDATED October 21, 2013

in , ,

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. It is a small command-line program to download videos from and a few more sites. It requires the Python interpreter (2.6, 2.7, or 3.3+), and it is not platform specific. It should work in your Unix box, in Windows or in Mac OS X. It is released to the public domain, which means you can modify it, redistribute it or use it however you like.

Update: Check out this bash script - it does same thing without using python.

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 26 comments… read them below or add one }

1 bash August 14, 2006 at 3:15 pm

bu="";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



2 nixCraft August 14, 2006 at 6:27 pm


Nice and dirty bash work

Appreciate your post.


3 Ivan August 18, 2006 at 7:46 am

lol @ rm gmon.out


4 Ray August 18, 2006 at 8:02 am

Great information, thanks very much!

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

ytdl () {
player_line=`ftp -o - "$video_id"|grep /player2.swf`
ftp -o $video_id.flv "$url"
ffmpeg -i $video_id.flv -ab 56 -ar 22050 -b 500 -s 320x240 $video_id.mpg
echo mplayer $video_id.mpg

If you have an ftp with HTTP support.


5 nixCraft August 19, 2006 at 6:17 pm

Nice to see you are using Zsh :)

Appreciate your script/post.


6 luke September 19, 2006 at 7:39 am

great :D
thats real hacking lol


7 TjL October 21, 2006 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 February 14, 2007 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

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

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 February 14, 2007 at 4:35 am

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 February 14, 2007 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}


11 nixCraft February 15, 2007 at 4:39 am


You can use

<code>code</code> tags :)


12 SaveTube February 19, 2007 at 6:34 am

I use to save any youtube videos. They also got a latest saved section.


13 Jen February 28, 2007 at 10:14 pm

I recommend it’s very easy and fast to use!


14 James Attard June 19, 2007 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 August 28, 2007 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? has done it


16 Roger October 12, 2007 at 11:24 am

A good script is Mortube
Demo: (Portuguese)
Download: (English)

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


17 wearetherock April 2, 2008 at 6:05 am


### mr-paul

if [ “$1″ = “” ]; then
echo -e “\nUsage: getyoutube\n”
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 “$videoID” -O “$title.flv”


18 clarjon1 May 20, 2008 at 2:20 pm

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


19 Rob May 29, 2008 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:

Feedback most appreciated, via the forums or by email.


20 macias July 13, 2008 at 7:19 pm

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


21 Webdesign November 26, 2008 at 3:19 pm

Nice youtube script, thanks so much!



22 Jim Bowe December 17, 2008 at 1:36 pm

Good script to do this in bash here:

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


23 xijhing August 18, 2009 at 5:16 am

usage: utube NAME youtubeurl

if [ $# -ne 2 ]
echo “Usage : $0 ”
echo “e.g : $0 steve_jobs”
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"


24 phar0z September 14, 2009 at 8:24 pm
# checking whether you have youtube-dl
if [ ! -x `which youtube-dl`  ];then
echo “Error! youtube-dl isn’t installed.”
exit 0
#checking whether you have vbrfix
if [ ! -x `which vbrfix`  ];then
echo “Error! vbrfix isn’t installed.”
exit 0
#download video(s)
for URL in $*; do
youtube-dl -t “$1&fmt=18″
for VIDEO in `ls *.flv`; do
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
rm -rf $VIDEO
echo “Done.”


25 Rafael Soares April 8, 2011 at 5:53 pm

There’s a new script for linux to search and watch youtube’s video on linux shell, called YouShell.


26 Davide Mirtillo May 6, 2011 at 7:39 am

I think you should update the article, the project has apparently moved to github:


Leave a Comment

Previous post:

Next post: