youtube-dl is a most popular command line YouTube downloader application. It is not just to download videos from Youtube, but also from a lot of other websites. You can view the complete list of supported sites here. youtube-dl can be able to download a single track or entire playlist in one go. It is a free and open source program written in Python. It supports GNU/Linux, Mac OS X and Microsoft Windows. In this detailed youtube-dl tutorial, we will learn to use most commonly used commands with examples to download audio and video streams from online in Linux.

youtube-dl can be install in many ways.

The officially recommended way

The officially recommended way to install youtube-dl is just download it, save it in your PATH, make it executable and start using it right away.

				
					sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
				
			

If you don’t have curl, use wget instead:

				
					sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
				
			

Now fix the permissions for youtube-dl so it can run

				
					sudo chmod a+rx /usr/local/bin/youtube-dl
				
			

Install youtube-dl using Python Pip

You can also install youtube-dl using Pip with following command.

				
					sudo -H pip install --upgrade youtube-dl
				
			

Install youtube-dl using distro package manager

youtube-dl is also available in the official repositories of some Linux distributions. For example, you can install it in Arch Linux using command:

				
					sudo pacman -S youtube-dl
				
			

On Debian, Ubuntu, Linux mint:

				
					sudo apt install youtube-dl
				
			

On Red Hat, Fedora, CentOS:

				
					sudo dnf install youtube-dl
				
			

Install FFmpeg on Linux

youtube-dl depends on FFmpeg to download 720p videos from YouTube and convert videos to other formats. To install FFmpeg on Linux, refer the following guide.

Update youtube-dl

If you’ve manually installed youtube-dl using curl or wget, run the following command to update it:

				
					sudo youtube-dl -U
				
			

If you installed it using pip, then run following command in console:

				
					sudo pip install -U youtube-dl
				
			

Those who installed youtube-dl using the distribution’s package manager, just use the appropriate update command. For example, on Arch Linux, you can update youtube-dl by simply running the following command:

				
					sudo pacman -Syu
				
			

On Debian, Ubuntu, Linux mint:

				
					sudo apt update; sudo apt upgrade -y
				
			

Now, let us see some examples to learn to use youtube-dl.

youtube-dl Tutorial with Examples

Now, let’s see some examples to learn about youtube-dl usage.

Example usage of youtube-dl

Here, I have compiled most commonly used youtube-dl commands to download a video or playlist from YouTube.

1. Download video or playlist

				
					youtube-dl https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

If you want to download video or playlist with a custom name of your choice, the command would be:

				
					youtube-dl -o 'willy william ego' https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

Replace “willy william ego” with your own name.

Do you want to save the video in some other location? Here you go!

				
					youtube-dl -o '~/videos/willy william ego' https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

Here I am downloading the video to the videos directory.

				
					[youtube] iOxzG3jjFkY: Downloading webpage
[download] Destination: /root/videos/willy william ego.f248
[download] 100% of 30.66MiB in 00:00
[download] Destination: /root/videos/willy william ego.f251
[download] 100% of 3.45MiB in 00:00
[ffmpeg] Merging formats into "/root/videos/willy william ego.webm"
Deleting original file /root/videos/willy william ego.f248 (pass -k to keep)
Deleting original file /root/videos/willy william ego.f251 (pass -k to keep)
				
			

You can also include additional details,  such as the title, the uploader name (channel name) and upload date etc., in the file name by using the following command:

				
					youtube-dl -o '%(title)s by %(uploader)s on %(upload_date)s in %(playlist)s.%(ext)s' https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

2. Download multiple videos

Sometimes, you might want to download multiple videos from or any other site. If so, just mention the URL of the videos with space-separated like below:

				
					youtube-dl [url1] [url2] [url3]
				
			

Or alternatively, you can put them all in a text file and pass it to youtube-dl as an argument like below.

				
					youtube-dl -a url_list.txt
				
			

This command will download all videos mentioned in the url_list.txt file

3. Download audio-only from a video

youtube-dl allows us to download audio only from a YouTube video. If you ever been in a situation to download only the audio then run following command:

				
					youtube-dl -x https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

By default, youtube-dl will save the audio in Ogg (opus) format.

If you prefer to download any other formats, for example mp3, run:

				
					youtube-dl -x -audio-format mp3 https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

You can see following output on console screen

				
					[youtube] iOxzG3jjFkY: Downloading webpage
[download] Destination: Willy William - Ego (Clip Officiel)-iOxzG3jjFkY.webm
[download] 100% of 3.45MiB in 00:00
[ffmpeg] Destination: Willy William - Ego (Clip Officiel)-iOxzG3jjFkY.mp3
Deleting original file Willy William - Ego (Clip Officiel)-iOxzG3jjFkY.webm (pass -k to keep)
				
			

This command will download the audio from the given video/playlist, convert it to an MP3 and save it in the current directory. Please note that you should install either ffmpeg or avconv to convert the file to mp3 format.

4. Download video with description, metadata, annotations, subtitles and thumbnail

To download a video along with its other details such as description, metadata, annotations, subtitles, and thumbnail etc., use the following command:

				
					youtube-dl --write-description --write-info-json --write-annotations --write-sub --write-thumbnail https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

5. List all available formats of video or playlist

To list all available formats that a video or playlist is available in, use the following command:

				
					youtube-dl --list-formats https://www.youtube.com/watch?v=iOxzG3jjFkY

or

youtube-dl -F https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

Sample output will looks like this:

				
					[youtube] iOxzG3jjFkY: Downloading webpage
[info] Available formats for iOxzG3jjFkY:
format code  extension  resolution note
249          webm       audio only tiny   55k , webm_dash container, opus @ 55k (48000Hz), 1.36MiB
250          webm       audio only tiny   73k , webm_dash container, opus @ 73k (48000Hz), 1.78MiB
140          m4a        audio only tiny  129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 3.15MiB
251          webm       audio only tiny  141k , webm_dash container, opus @141k (48000Hz), 3.45MiB
160          mp4        256x144    144p   50k , mp4_dash container, avc1.4d400c@  50k, 25fps, video only, 1.23MiB
394          mp4        256x144    144p   62k , mp4_dash container, av01.0.00M.08@  62k, 25fps, video only, 1.53MiB
278          webm       256x144    144p   80k , webm_dash container, vp9@  80k, 25fps, video only, 1.95MiB
395          mp4        426x240    240p  101k , mp4_dash container, av01.0.00M.08@ 101k, 25fps, video only, 2.46MiB
133          mp4        426x240    240p  101k , mp4_dash container, avc1.4d4015@ 101k, 25fps, video only, 2.46MiB
242          webm       426x240    240p  110k , webm_dash container, vp9@ 110k, 25fps, video only, 2.69MiB
134          mp4        640x360    360p  170k , mp4_dash container, avc1.4d401e@ 170k, 25fps, video only, 4.16MiB
396          mp4        640x360    360p  186k , mp4_dash container, av01.0.01M.08@ 186k, 25fps, video only, 4.53MiB
243          webm       640x360    360p  187k , webm_dash container, vp9@ 187k, 25fps, video only, 4.55MiB
135          mp4        854x480    480p  225k , mp4_dash container, avc1.4d401e@ 225k, 25fps, video only, 5.48MiB
244          webm       854x480    480p  266k , webm_dash container, vp9@ 266k, 25fps, video only, 6.49MiB
397          mp4        854x480    480p  316k , mp4_dash container, av01.0.04M.08@ 316k, 25fps, video only, 7.69MiB
136          mp4        1280x720   720p  345k , mp4_dash container, avc1.4d401f@ 345k, 25fps, video only, 8.40MiB
247          webm       1280x720   720p  451k , webm_dash container, vp9@ 451k, 25fps, video only, 10.99MiB
398          mp4        1280x720   720p  593k , mp4_dash container, av01.0.05M.08@ 593k, 25fps, video only, 14.44MiB
399          mp4        1920x1080  1080p 1005k , mp4_dash container, av01.0.08M.08@1005k, 25fps, video only, 24.44MiB
137          mp4        1920x1080  1080p 1247k , mp4_dash container, avc1.640028@1247k, 25fps, video only, 30.32MiB
248          webm       1920x1080  1080p 1260k , webm_dash container, vp9@1260k, 25fps, video only, 30.66MiB
18           mp4        640x360    360p  394k , avc1.42001E, 25fps, mp4a.40.2 (44100Hz), 9.60MiB (best)
				
			
List all available formats of a YouTube video using youtube-dl
List all available formats of a YouTube video using youtube-dl

As you can see in the above screenshot, youtube-dl lists all available formats of the given video. From left to right, it displays the video format code, extension and resolution note of the respective video. This can be helpful when you want to download a video at a specific quality or format.

6. Display the size of Youtube videos

To retrieve the file size of a video, use -F flag.

				
					youtube-dl -F https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

You will see the file sizes at the end of each line

				
					[youtube] iOxzG3jjFkY: Downloading webpage
[info] Available formats for iOxzG3jjFkY:
format code  extension  resolution note
249          webm       audio only tiny   55k , webm_dash container, opus @ 55k (48000Hz), 1.36MiB
250          webm       audio only tiny   73k , webm_dash container, opus @ 73k (48000Hz), 1.78MiB
140          m4a        audio only tiny  129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 3.15MiB
251          webm       audio only tiny  141k , webm_dash container, opus @141k (48000Hz), 3.45MiB
160          mp4        256x144    144p   50k , mp4_dash container, avc1.4d400c@  50k, 25fps, video only, 1.23MiB
394          mp4        256x144    144p   62k , mp4_dash container, av01.0.00M.08@  62k, 25fps, video only, 1.53MiB
278          webm       256x144    144p   80k , webm_dash container, vp9@  80k, 25fps, video only, 1.95MiB
395          mp4        426x240    240p  101k , mp4_dash container, av01.0.00M.08@ 101k, 25fps, video only, 2.46MiB
133          mp4        426x240    240p  101k , mp4_dash container, avc1.4d4015@ 101k, 25fps, video only, 2.46MiB
242          webm       426x240    240p  110k , webm_dash container, vp9@ 110k, 25fps, video only, 2.69MiB
134          mp4        640x360    360p  170k , mp4_dash container, avc1.4d401e@ 170k, 25fps, video only, 4.16MiB
396          mp4        640x360    360p  186k , mp4_dash container, av01.0.01M.08@ 186k, 25fps, video only, 4.53MiB
243          webm       640x360    360p  187k , webm_dash container, vp9@ 187k, 25fps, video only, 4.55MiB
135          mp4        854x480    480p  225k , mp4_dash container, avc1.4d401e@ 225k, 25fps, video only, 5.48MiB
244          webm       854x480    480p  266k , webm_dash container, vp9@ 266k, 25fps, video only, 6.49MiB
397          mp4        854x480    480p  316k , mp4_dash container, av01.0.04M.08@ 316k, 25fps, video only, 7.69MiB
136          mp4        1280x720   720p  345k , mp4_dash container, avc1.4d401f@ 345k, 25fps, video only, 8.40MiB
247          webm       1280x720   720p  451k , webm_dash container, vp9@ 451k, 25fps, video only, 10.99MiB
398          mp4        1280x720   720p  593k , mp4_dash container, av01.0.05M.08@ 593k, 25fps, video only, 14.44MiB
399          mp4        1920x1080  1080p 1005k , mp4_dash container, av01.0.08M.08@1005k, 25fps, video only, 24.44MiB
137          mp4        1920x1080  1080p 1247k , mp4_dash container, avc1.640028@1247k, 25fps, video only, 30.32MiB
248          webm       1920x1080  1080p 1260k , webm_dash container, vp9@1260k, 25fps, video only, 30.66MiB
18           mp4        640x360    360p  394k , avc1.42001E, 25fps, mp4a.40.2 (44100Hz), 9.60MiB (best)
				
			

7. Download videos in certain quality and/or format

By default, youtube-dl will download the best available quality video. However, it is also possible to download a video or playlist at a specific quality or format.

YouTube is capable of downloading videos in the following qualities:

  • best – Select the best quality format of the given file with video and audio.
  • worst – Select the worst quality format (both video and audio).
  • bestvideo – Select the best quality video-only format (e.g. DASH video). Please note that it may not be available.
  • worstvideo – Select the worst quality video-only format. May not be available.
  • bestaudio – Select the best quality audio only-format. May not be available.
  • worstaudio – Select the worst quality audio only-format. May not be available.

For example, if you want to download best quality format (both audio and video), just use the following command:

				
					youtube-dl -f best https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

Similarly, to download audio-only with best quality:

				
					youtube-dl -f bestaudio https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

To download worst quality video-only format, use the following command:

				
					youtube-dl -f worstvideo https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

You also combine different format options like below.

				
					youtube-dl -f bestvideo+bestaudio https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

The above command will download best quality video-only and best quality audio-only formats and merge them together with ffmpeg or avconv. Make sure you have installed any one of these tools on your system.

If you don’t want to merge, replace +(plus) operator with ,(comma) like below:

				
					youtube-dl -f 'bestvideo,bestaudio' https://www.youtube.com/watch?v=iOxzG3jjFkY -o '%(title)s.f%(format_id)s.%(ext)s'
				
			

This command will download best quality video and best quality audio and will not mix them. In this case, you will get two files, one is audio and another is video. In this example, an output template (-o option) is recommended as bestvideo and bestaudio may have the same file name.

We can even download a video or playlist at a specific quality with specific resolution.

For instance, the following command will download the best quality video in 480 pixel resolution (less than or equal to 480p).

				
					youtube-dl -f "best[height<=480]" https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

Like already said, we can group the format selectors to get a specific quality video. The following command will download best format available(both audio and video) but no better than 480p.

				
					youtube-dl -f 'bestvideo[height<=480]+bestaudio/best[height<=480]' https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

8. Download videos using format code

All videos have format codes which we can use to download a video at specific quality. To find the format code, just list the available formats using any one of the following commands:

				
					youtube-dl --list-formats https://www.youtube.com/watch?v=iOxzG3jjFkY

Or

youtube-dl -F https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

As you can see in the above screenshot, all format codes of the given video are listed in the first column. The best quality format is given at the end (the format code is 22). So, the command to download best quality format is:

				
					youtube-dl -f 18 https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

Some videos may not have the same formats available while you download videos from playlist. In such cases, you can specify multiple format codes in any preferred order of your choice. Take a look at the following example:

				
					youtube-dl -f 28/19/18
				
			

As per the above example, youtube-dl will download the videos in format 28 if it is available. If the format 22 is not available, it will then download format 19 if it is available. If both 28 and 19 formats are not available, it will finally try to download format 18. If none of the specified formats are available, youtube-dl will complain that no suitable formats are available for download.

Please note that that slash is left-associative, i.e. formats on the left hand side are preferred.

9. Download videos by file extension

Download video(s) in your preferred format, say for example MP4, just run:

				
					youtube-dl --format mp4 https://www.youtube.com/watch?v=iOxzG3jjFkY

Or,

youtube-dl -f mp4 https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

Like I already mentioned in the previous section, some videos may not available in your preferred formats. In such cases, youtube-dl will download any other best available formats. For instance, this command will download best quality MP4 format file. If MP4 format is not available, then it will download any other best available format.

				
					youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

If you want to download them with custom filename, do:

				
					youtube-dl -f mp4 -o '%(title)s.f%(format_id)s.%(ext)s' https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

10. Set size limit for videos

When you download multiple videos from a playlist, you might want to download videos within a certain size only.

For example, this command will not download any videos smaller than the given size, say 100MB:

				
					youtube-dl --min-filesize 100M
				
			

If you don’t want to download videos larger than the given size, do:

				
					youtube-dl --max-filesize 100M
				
			

We can also combine format selection operators to download certain size videos.

The following command will download best video-only format but not bigger than 100 MB.

				
					youtube-dl -f 'best[filesize<100M]' https://www.youtube.com/watch?v=iOxzG3jjFkY
				
			

11. Download videos by date-wise

youtube-dl allows us to filter and download video or playlist by their upload date. This will be very helpful when you want to download videos from a playlist that contains 100s of videos.

For instance, to download videos uploaded at an exact date, for example October 01, 2018, the command would be:

				
					youtube-dl --date 20201001
				
			

Download videos uploaded on or before a specific date:

				
					youtube-dl --datebefore 20200101
				
			

Download videos uploaded on or after a specific date:

				
					youtube-dl --dateafter 20200101
				
			

Download only the videos uploaded in the last 6 months:

				
					youtube-dl --dateafter now-6months
				
			

To download videos between a specific date, for example January 01, 2020 to January 01, 2021, use the following command:

				
					youtube-dl --dateafter 20200101 --datebefore 20210101
				
			

12. Download specific videos from playlist

This is yet another useful feature of youtube-dl. It allows us to download a specific song(s) from a playlist that contains 100s of songs.

For example, to download the 10th file from a playlist, run:

				
					youtube-dl --playlist-items 10
				
			

Similarly, to download multiple random files, just specify indices of the videos in the playlist separated by commas like below:

				
					youtube-dl --playlist-items 2,3,7,10
				
			

You can also specify the range of songs. To download a video playlist starting from a certain video, say 10, to end:

				
					youtube-dl --playlist-start 10
				
			

To download only the files starting from 2nd to 5th in a playlist, use:

				
					youtube-dl --playlist-start 2 --playlist-end 5
				
			

13. Download only videos suitable for specific age

This is another notable feature of youtube-dl. It allows us to download only videos suitable for the given age.

Say for example, to download all “Let’s Play” videos that aren’t marked “NSFW” or age-restricted for 7 year-olds from a playlist, run:

				
					youtube-dl --match-title "let's play" --age-limit 7 --reject-title "nsfw"
				
			

14. Set download speed limit

You can use -r option to limit the speed. For example, the following command will limit the speed to 50K.

				
					youtube-dl -r 50K
				
			

15. Resume downloads

By default, youtube-dl will automatically resume the download where you left it off. If it is doesn’t resume the download for any reason, just force the resume of partially downloaded files with -c (–continue) flag:

				
					youtube-dl -c
				
			

Getting help

youtube-dl has a lot more options. I guess these 14 examples are just enough to use youtube-dl to download videos from online. For more details, refer youtube-dl help section.

				
					youtube-dl --help
				
			
				
					Usage: youtube-dl [OPTIONS] URL [URL...]

Options:
  General Options:
    -h, --help                           Print this help text and exit
    --version                            Print program version and exit
    -U, --update                         Update this program to latest version. Make sure that you have sufficient permissions (run with sudo if needed)
    -i, --ignore-errors                  Continue on download errors, for example to skip unavailable videos in a playlist
    --abort-on-error                     Abort downloading of further videos (in the playlist or the command line) if an error occurs
    --dump-user-agent                    Display the current browser identification
    --list-extractors                    List all supported extractors
    --extractor-descriptions             Output descriptions of all supported extractors
    --force-generic-extractor            Force extraction to use the generic extractor
    --default-search PREFIX              Use this prefix for unqualified URLs. For example "gvsearch2:" downloads two videos from google videos for youtube-dl "large apple". Use the value "auto" to
                                         let youtube-dl guess ("auto_warning" to emit a warning when guessing). "error" just throws an error. The default value "fixup_error" repairs broken URLs,
                                         but emits an error if this is not possible instead of searching.
    --ignore-config                      Do not read configuration files. When given in the global configuration file /etc/youtube-dl.conf: Do not read the user configuration in ~/.config/youtube-
                                         dl/config (%APPDATA%/youtube-dl/config.txt on Windows)
    --config-location PATH               Location of the configuration file; either the path to the config or its containing directory.
    --flat-playlist                      Do not extract the videos of a playlist, only list them.
    --mark-watched                       Mark videos watched (YouTube only)
    --no-mark-watched                    Do not mark videos watched (YouTube only)
    --no-color                           Do not emit color codes in output

  Network Options:
    --proxy URL                          Use the specified HTTP/HTTPS/SOCKS proxy. To enable SOCKS proxy, specify a proper scheme. For example socks5://127.0.0.1:1080/. Pass in an empty string
                                         (--proxy "") for direct connection
    --socket-timeout SECONDS             Time to wait before giving up, in seconds
    --source-address IP                  Client-side IP address to bind to
    -4, --force-ipv4                     Make all connections via IPv4
    -6, --force-ipv6                     Make all connections via IPv6

  Geo Restriction:
    --geo-verification-proxy URL         Use this proxy to verify the IP address for some geo-restricted sites. The default proxy specified by --proxy (or none, if the option is not present) is
                                         used for the actual downloading.
    --geo-bypass                         Bypass geographic restriction via faking X-Forwarded-For HTTP header
    --no-geo-bypass                      Do not bypass geographic restriction via faking X-Forwarded-For HTTP header
    --geo-bypass-country CODE            Force bypass geographic restriction with explicitly provided two-letter ISO 3166-2 country code
    --geo-bypass-ip-block IP_BLOCK       Force bypass geographic restriction with explicitly provided IP block in CIDR notation

  Video Selection:
    --playlist-start NUMBER              Playlist video to start at (default is 1)
    --playlist-end NUMBER                Playlist video to end at (default is last)
    --playlist-items ITEM_SPEC           Playlist video items to download. Specify indices of the videos in the playlist separated by commas like: "--playlist-items 1,2,5,8" if you want to download
                                         videos indexed 1, 2, 5, 8 in the playlist. You can specify range: "--playlist-items 1-3,7,10-13", it will download the videos at index 1, 2, 3, 7, 10, 11,
                                         12 and 13.
    --match-title REGEX                  Download only matching titles (regex or caseless sub-string)
    --reject-title REGEX                 Skip download for matching titles (regex or caseless sub-string)
    --max-downloads NUMBER               Abort after downloading NUMBER files
    --min-filesize SIZE                  Do not download any videos smaller than SIZE (e.g. 50k or 44.6m)
    --max-filesize SIZE                  Do not download any videos larger than SIZE (e.g. 50k or 44.6m)
    --date DATE                          Download only videos uploaded in this date
    --datebefore DATE                    Download only videos uploaded on or before this date (i.e. inclusive)
    --dateafter DATE                     Download only videos uploaded on or after this date (i.e. inclusive)
    --min-views COUNT                    Do not download any videos with less than COUNT views
    --max-views COUNT                    Do not download any videos with more than COUNT views
    --match-filter FILTER                Generic video filter. Specify any key (see the "OUTPUT TEMPLATE" for a list of available keys) to match if the key is present, !key to check if the key is
                                         not present, key > NUMBER (like "comment_count > 12", also works with >=, <, <=, !=, =) to compare against a number, key = 'LITERAL' (like "uploader = 'Mike
                                         Smith'", also works with !=) to match against a string literal and & to require multiple matches. Values which are not known are excluded unless you put a
                                         question mark (?) after the operator. For example, to only match videos that have been liked more than 100 times and disliked less than 50 times (or the
                                         dislike functionality is not available at the given service), but who also have a description, use --match-filter "like_count > 100 & dislike_count <? 50 &
                                         description" .
    --no-playlist                        Download only the video, if the URL refers to a video and a playlist.
    --yes-playlist                       Download the playlist, if the URL refers to a video and a playlist.
    --age-limit YEARS                    Download only videos suitable for the given age
    --download-archive FILE              Download only videos not listed in the archive file. Record the IDs of all downloaded videos in it.
    --include-ads                        Download advertisements as well (experimental)

  Download Options:
    -r, --limit-rate RATE                Maximum download rate in bytes per second (e.g. 50K or 4.2M)
    -R, --retries RETRIES                Number of retries (default is 10), or "infinite".
    --fragment-retries RETRIES           Number of retries for a fragment (default is 10), or "infinite" (DASH, hlsnative and ISM)
    --skip-unavailable-fragments         Skip unavailable fragments (DASH, hlsnative and ISM)
    --abort-on-unavailable-fragment      Abort downloading when some fragment is not available
    --keep-fragments                     Keep downloaded fragments on disk after downloading is finished; fragments are erased by default
    --buffer-size SIZE                   Size of download buffer (e.g. 1024 or 16K) (default is 1024)
    --no-resize-buffer                   Do not automatically adjust the buffer size. By default, the buffer size is automatically resized from an initial value of SIZE.
    --http-chunk-size SIZE               Size of a chunk for chunk-based HTTP downloading (e.g. 10485760 or 10M) (default is disabled). May be useful for bypassing bandwidth throttling imposed by a
                                         webserver (experimental)
    --playlist-reverse                   Download playlist videos in reverse order
    --playlist-random                    Download playlist videos in random order
    --xattr-set-filesize                 Set file xattribute ytdl.filesize with expected file size
    --hls-prefer-native                  Use the native HLS downloader instead of ffmpeg
    --hls-prefer-ffmpeg                  Use ffmpeg instead of the native HLS downloader
    --hls-use-mpegts                     Use the mpegts container for HLS videos, allowing to play the video while downloading (some players may not be able to play it)
    --external-downloader COMMAND        Use the specified external downloader. Currently supports aria2c,avconv,axel,curl,ffmpeg,httpie,wget
    --external-downloader-args ARGS      Give these arguments to the external downloader

  Filesystem Options:
    -a, --batch-file FILE                File containing URLs to download ('-' for stdin), one URL per line. Lines starting with '#', ';' or ']' are considered as comments and ignored.
    --id                                 Use only video ID in file name
    -o, --output TEMPLATE                Output filename template, see the "OUTPUT TEMPLATE" for all the info
    --output-na-placeholder PLACEHOLDER  Placeholder value for unavailable meta fields in output filename template (default is "NA")
    --autonumber-start NUMBER            Specify the start value for %(autonumber)s (default is 1)
    --restrict-filenames                 Restrict filenames to only ASCII characters, and avoid "&" and spaces in filenames
    -w, --no-overwrites                  Do not overwrite files
    -c, --continue                       Force resume of partially downloaded files. By default, youtube-dl will resume downloads if possible.
    --no-continue                        Do not resume partially downloaded files (restart from beginning)
    --no-part                            Do not use .part files - write directly into output file
    --no-mtime                           Do not use the Last-modified header to set the file modification time
    --write-description                  Write video description to a .description file
    --write-info-json                    Write video metadata to a .info.json file
    --write-annotations                  Write video annotations to a .annotations.xml file
    --load-info-json FILE                JSON file containing the video information (created with the "--write-info-json" option)
    --cookies FILE                       File to read cookies from and dump cookie jar in
    --cache-dir DIR                      Location in the filesystem where youtube-dl can store some downloaded information permanently. By default $XDG_CACHE_HOME/youtube-dl or ~/.cache/youtube-dl
                                         . At the moment, only YouTube player files (for videos with obfuscated signatures) are cached, but that may change.
    --no-cache-dir                       Disable filesystem caching
    --rm-cache-dir                       Delete all filesystem cache files

  Thumbnail images:
    --write-thumbnail                    Write thumbnail image to disk
    --write-all-thumbnails               Write all thumbnail image formats to disk
    --list-thumbnails                    Simulate and list all available thumbnail formats

  Verbosity / Simulation Options:
    -q, --quiet                          Activate quiet mode
    --no-warnings                        Ignore warnings
    -s, --simulate                       Do not download the video and do not write anything to disk
    --skip-download                      Do not download the video
    -g, --get-url                        Simulate, quiet but print URL
    -e, --get-title                      Simulate, quiet but print title
    --get-id                             Simulate, quiet but print id
    --get-thumbnail                      Simulate, quiet but print thumbnail URL
    --get-description                    Simulate, quiet but print video description
    --get-duration                       Simulate, quiet but print video length
    --get-filename                       Simulate, quiet but print output filename
    --get-format                         Simulate, quiet but print output format
    -j, --dump-json                      Simulate, quiet but print JSON information. See the "OUTPUT TEMPLATE" for a description of available keys.
    -J, --dump-single-json               Simulate, quiet but print JSON information for each command-line argument. If the URL refers to a playlist, dump the whole playlist information in a single
                                         line.
    --print-json                         Be quiet and print the video information as JSON (video is still being downloaded).
    --newline                            Output progress bar as new lines
    --no-progress                        Do not print progress bar
    --console-title                      Display progress in console titlebar
    -v, --verbose                        Print various debugging information
    --dump-pages                         Print downloaded pages encoded using base64 to debug problems (very verbose)
    --write-pages                        Write downloaded intermediary pages to files in the current directory to debug problems
    --print-traffic                      Display sent and read HTTP traffic
    -C, --call-home                      Contact the youtube-dl server for debugging
    --no-call-home                       Do NOT contact the youtube-dl server for debugging

  Workarounds:
    --encoding ENCODING                  Force the specified encoding (experimental)
    --no-check-certificate               Suppress HTTPS certificate validation
    --prefer-insecure                    Use an unencrypted connection to retrieve information about the video. (Currently supported only for YouTube)
    --user-agent UA                      Specify a custom user agent
    --referer URL                        Specify a custom referer, use if the video access is restricted to one domain
    --add-header FIELD:VALUE             Specify a custom HTTP header and its value, separated by a colon ':'. You can use this option multiple times
    --bidi-workaround                    Work around terminals that lack bidirectional text support. Requires bidiv or fribidi executable in PATH
    --sleep-interval SECONDS             Number of seconds to sleep before each download when used alone or a lower bound of a range for randomized sleep before each download (minimum possible
                                         number of seconds to sleep) when used along with --max-sleep-interval.
    --max-sleep-interval SECONDS         Upper bound of a range for randomized sleep before each download (maximum possible number of seconds to sleep). Must only be used along with --min-sleep-
                                         interval.

  Video Format Options:
    -f, --format FORMAT                  Video format code, see the "FORMAT SELECTION" for all the info
    --all-formats                        Download all available video formats
    --prefer-free-formats                Prefer free video formats unless a specific one is requested
    -F, --list-formats                   List all available formats of requested videos
    --youtube-skip-dash-manifest         Do not download the DASH manifests and related data on YouTube videos
    --merge-output-format FORMAT         If a merge is required (e.g. bestvideo+bestaudio), output to given container format. One of mkv, mp4, ogg, webm, flv. Ignored if no merge is required

  Subtitle Options:
    --write-sub                          Write subtitle file
    --write-auto-sub                     Write automatically generated subtitle file (YouTube only)
    --all-subs                           Download all the available subtitles of the video
    --list-subs                          List all available subtitles for the video
    --sub-format FORMAT                  Subtitle format, accepts formats preference, for example: "srt" or "ass/srt/best"
    --sub-lang LANGS                     Languages of the subtitles to download (optional) separated by commas, use --list-subs for available language tags

  Authentication Options:
    -u, --username USERNAME              Login with this account ID
    -p, --password PASSWORD              Account password. If this option is left out, youtube-dl will ask interactively.
    -2, --twofactor TWOFACTOR            Two-factor authentication code
    -n, --netrc                          Use .netrc authentication data
    --video-password PASSWORD            Video password (vimeo, youku)

  Adobe Pass Options:
    --ap-mso MSO                         Adobe Pass multiple-system operator (TV provider) identifier, use --ap-list-mso for a list of available MSOs
    --ap-username USERNAME               Multiple-system operator account login
    --ap-password PASSWORD               Multiple-system operator account password. If this option is left out, youtube-dl will ask interactively.
    --ap-list-mso                        List all supported multiple-system operators

  Post-processing Options:
    -x, --extract-audio                  Convert video files to audio-only files (requires ffmpeg/avconv and ffprobe/avprobe)
    --audio-format FORMAT                Specify audio format: "best", "aac", "flac", "mp3", "m4a", "opus", "vorbis", or "wav"; "best" by default; No effect without -x
    --audio-quality QUALITY              Specify ffmpeg/avconv audio quality, insert a value between 0 (better) and 9 (worse) for VBR or a specific bitrate like 128K (default 5)
    --recode-video FORMAT                Encode the video to another format if necessary (currently supported: mp4|flv|ogg|webm|mkv|avi)
    --postprocessor-args ARGS            Give these arguments to the postprocessor
    -k, --keep-video                     Keep the video file on disk after the post-processing; the video is erased by default
    --no-post-overwrites                 Do not overwrite post-processed files; the post-processed files are overwritten by default
    --embed-subs                         Embed subtitles in the video (only for mp4, webm and mkv videos)
    --embed-thumbnail                    Embed thumbnail in the audio as cover art
    --add-metadata                       Write metadata to the video file
    --metadata-from-title FORMAT         Parse additional metadata like song title / artist from the video title. The format syntax is the same as --output. Regular expression with named capture
                                         groups may also be used. The parsed parameters replace existing values. Example: --metadata-from-title "%(artist)s - %(title)s" matches a title like
                                         "Coldplay - Paradise". Example (regex): --metadata-from-title "(?P<artist>.+?) - (?P<title>.+)"
    --xattrs                             Write metadata to the video file's xattrs (using dublin core and xdg standards)
    --fixup POLICY                       Automatically correct known faults of the file. One of never (do nothing), warn (only emit a warning), detect_or_warn (the default; fix file if we can, warn
                                         otherwise)
    --prefer-avconv                      Prefer avconv over ffmpeg for running the postprocessors
    --prefer-ffmpeg                      Prefer ffmpeg over avconv for running the postprocessors (default)
    --ffmpeg-location PATH               Location of the ffmpeg/avconv binary; either the path to the binary or its containing directory.
    --exec CMD                           Execute a command on the file after downloading and post-processing, similar to find's -exec syntax. Example: --exec 'adb push {} /sdcard/Music/ && rm {}'
    --convert-subs FORMAT                Convert the subtitles to other format (currently supported: srt|ass|vtt|lrc)
				
			

youtube-dl Troubleshooting

Here are some common errors that you might encounter from time to time. Most errors will get fixed themselves after updating the youtube-dl to its most recent version.

However, a few errors like below will not get fixed even if you have an updated youtube-dl version.

1. Fix “Unable to download video data: HTTP Error 403: Forbidden” Error

When downloading videos from YouTube, sometimes you will get an error like below.

				
					ERROR: unable to download video data: HTTP Error 403: Forbidden
				
			

To fix this error, run following command in console to update youtube-dl to latest version

				
					sudo youtube-dl -U
				
			

2. WARNING: Requested formats are incompatible for merge and will be merged into mkv.

This is another common error. When you download a video, you will get an error like below:

				
					[youtube] iOxzG3jjFkY: Downloading webpage
WARNING: Requested formats are incompatible for merge and will be merged into mkv.
ERROR: unable to open for writing: [Errno 36] File name too long: '\xe0\xae\xa8\xe0\xaf\x8b\xe0\xae\xaf\xe0\xaf\x8d \xe0\xae\x8e\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xb0\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x81 \xe0\xae\x9a\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xaf\x88 \xe0\xae\x85\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\x95\xe0\xae\xb0\xe0\xae\xbf\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x81\xe0\xae\xae\xe0\xaf\x8d \xe0\xae\x87\xe0\xae\xaf\xe0\xae\xb1\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88 \xe0\xae\xaa\xe0\xae\xbe\xe0\xae\xa9\xe0\xae\x95\xe0\xae\xae\xe0\xaf\x8d - \xe0\xae\xa8\xe0\xae\xbe\xe0\xae\xae\xe0\xaf\x87 \xe0\xae\xa4\xe0\xae\xaf\xe0\xae\xbe\xe0\xae\xb0\xe0\xae\xbf\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\xa4\xe0\xaf\x81 \xe0\xae\x8e\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\x9f\xe0\xae\xbf- \xe0\xae\xae\xe0\xae\xb0\xe0\xaf\x81\xe0\xae\xa4\xe0\xaf\x8d\xe0\xae\xa4\xe0\xaf\x81\xe0\xae\xb5\xe0\xae\xb0\xe0\xaf\x8d \xe0\xae\xa4\xe0\xaf\x80\xe0\xae\xaa\xe0\xae\xbe \xe0\xae\xb5\xe0\xae\xbf\xe0\xae\xb3\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xae\xe0\xaf\x8d-iOxzG3jjFkY.f136.mp4.part'
				
			

This is actually not a problem but an expected behavior for youtube-dl. By default, youtube-dl will download the highest quality audio and the highest quality video streams available and then join them into a compatible container like mkv, mp4 etc.  If these audio and video streams doesn’t fit well in an mp4 container, youtube-dl will then pack them in mkv container and display the above warning message. In such cases, you can ignore the mkv warning and download the best quality video and the best quality audio but only in an mp4 container by explicitly mentioning the desired best quality audio and video formats like below:

				
					youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]' https://youtu.be/iOxzG3jjFkY
				
			

3. ERROR: unable to open for writing: [Errno 36] File name too long

When you try to download a youtube video that has long name, you will probably get this error:

				
					[youtube] iOxzG3jjFkY: Downloading webpage
ERROR: unable to open for writing: [Errno 36] File name too long: '\xe0\xae\xa8\xe0\xaf\x8b\xe0\xae\xaf\xe0\xaf\x8d \xe0\xae\x8e\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xb0\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xaf\x81 \xe0\xae\x9a\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xaf\x88 \xe0\xae\x85\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\x95\xe0\xae\xb0\xe0\xae\xbf\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x81\xe0\xae\xae\xe0\xaf\x8d \xe0\xae\x87\xe0\xae\xaf\xe0\xae\xb1\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88 \xe0\xae\xaa\xe0\xae\xbe\xe0\xae\xa9\xe0\xae\x95\xe0\xae\xae\xe0\xaf\x8d - \xe0\xae\xa8\xe0\xae\xbe\xe0\xae\xae\xe0\xaf\x87 \xe0\xae\xa4\xe0\xae\xaf\xe0\xae\xbe\xe0\xae\xb0\xe0\xae\xbf\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\xa4\xe0\xaf\x81 \xe0\xae\x8e\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\x9f\xe0\xae\xbf- \xe0\xae\xae\xe0\xae\xb0\xe0\xaf\x81\xe0\xae\xa4\xe0\xaf\x8d\xe0\xae\xa4\xe0\xaf\x81\xe0\xae\xb5\xe0\xae\xb0\xe0\xaf\x8d \xe0\xae\xa4\xe0\xaf\x80\xe0\xae\xaa\xe0\xae\xbe \xe0\xae\xb5\xe0\xae\xbf\xe0\xae\xb3\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xae\xe0\xaf\x8d-iOxzG3jjFkY.f136.mp4.part
				
			

To fix this error, simply download the video with shorter name of your choice with “-o” flag like below:

				
					youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]' -o video.mp4 https://youtu.be/iOxzG3jjFkY
				
			

Couple of youtube-dl command line references

				
					// To download a video or playlist:
youtube-dl '<https://www.youtube.com/watch?v=oHg5SJYRHA0>'

// To list all formats that a video or playlist is available in:
youtube-dl --list-formats '<https://www.youtube.com/watch?v=Mwa0_nE9H7A>'
 
// To download a video or playlist at a specific quality:
youtube-dl --format "<best[height<=480]>" '<https://www.youtube.com/watch?v=oHg5SJYRHA0>'
 
// To download the audio from a video and convert it to an MP3:
youtube-dl -x --audio-format <mp3> '<url>'
 
// To download the best quality audio and video and merge them:
youtube-dl -f bestvideo+bestaudio '<url>'
 
// To download video(s) as MP4 files with custom filenames:
youtube-dl --format <mp4> -o "<%(title)s by %(uploader)s on %(upload_date)s in %(playlist)s.%(ext)s>" '<url>'
 
// To download a particular language's subtitles along with the video:
youtube-dl --sub-lang <en> --write-sub '<https://www.youtube.com/watch?v=Mwa0_nE9H7A>'
 
// To download a playlist and extract mp3 from it:
youtube-dl -f "bestaudio" --continue --no-overwrites --ignore-errors --extract-audio --audio-format mp3 -o "%(title)s.%(ext)s" <url_to_playlist>
 
// ---
 
// To download a video in 720p MP4:
youtube-dl -f 22 example.com/watch?v=id
 
// To download a video in 720p MP4 or WebM or FLV:
youtube-dl -f 22/45/120
 
// To list all available formats of a video:
youtube-dl -F example.com/watch?v=id
 
// To download a video to /$uploader/$date/$title.$ext:
youtube-dl -o '%(uploader)s/%(date)s/%(title)s.%(ext)s' example.com/watch?v=id
 
// To download a video playlist starting from a certain video:
youtube-dl --playlist-start 5 example.com/watch?v=id&list=listid
 
// To simulate a download with youtube-dl:
youtube-dl -s example.com/watch?v=id
 
// For all video formats see
// http://en.wikipedia.org/wiki/YouTube//Quality_and_codecs
				
			

About the author

Hassan Latif

A Microsoft Certified Trainer, a hobby blogger and geek

Leave a Comment