youtube-dl - や他のビデオサイトからビデオをダウンロードするコマンドラインプログラム

(Command-line program to download videos from and other video sites)

Created at: 2010-10-31 22:35:07
Language: Python
License: Unlicense


YouTube-DL - または他のビデオプラットフォームからビデオをダウンロードする



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


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

Windowsユーザーは、.exeファイルをダウンロードし、PATH上の任意の場所に配置できます(たとえば、 入れないでください)。



sudo -H pip install --upgrade youtube-dl

このコマンドは、youtube-dlをすでにインストールしている場合、更新します。詳細については、pypi のページを参照してください。


brew install youtube-dl


sudo port install youtube-dl

または、git リポジトリをチェックアウトして操作する方法については、開発者向けの指示を参照してください。PGP 署名を含むその他のオプションについては、youtube-dl ダウンロードページを参照してください。


YouTube-DLは、 やいくつかのサイトからビデオをダウンロードするためのコマンドラインプログラムです。Python インタープリター、バージョン 2.6、2.7、または 3.2+ が必要であり、プラットフォーム固有ではありません。それはあなたのUnixボックス、Windows、またはmacOSで動作するはずです。パブリックドメインにリリースされているため、変更、再配布、または好きなように使用できます。

youtube-dl [OPTIONS] URL [URL...]


-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
--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
--list-extractors                    List all supported extractors
--extractor-descriptions             Output descriptions of all supported
--force-generic-extractor            Force extraction to use the generic
--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
                                     (%APPDATA%/youtube-dl/config.txt on
--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
--no-color                           Do not emit color codes in output


--proxy URL                          Use the specified HTTP/HTTPS/SOCKS
                                     proxy. To enable SOCKS proxy, specify a
                                     proper scheme. For example
                                     socks5:// Pass in an
                                     empty string (--proxy "") for direct
--socket-timeout SECONDS             Time to wait before giving up, in
--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-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


--playlist-start NUMBER              Playlist video to start at (default is
--playlist-end NUMBER                Playlist video to end at (default is
--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
--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


-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
--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
--playlist-random                    Download playlist videos in random
--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
--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,c
--external-downloader-args ARGS      Give these arguments to the external


-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
-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
--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


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


-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
--get-duration                       Simulate, quiet but print video length
--get-filename                       Simulate, quiet but print output
--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
--print-traffic                      Display sent and read HTTP traffic
-C, --call-home                      Contact the youtube-dl server for
--no-call-home                       Do NOT contact the youtube-dl server
                                     for debugging


--encoding ENCODING                  Force the specified encoding
--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
--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-


-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
--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


--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
--sub-format FORMAT                  Subtitle format, accepts formats
                                     preference, for example: "srt" or
--sub-lang LANGS                     Languages of the subtitles to download
                                     (optional) separated by commas, use
                                     --list-subs for available language tags


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


--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


-x, --extract-audio                  Convert video files to audio-only files
                                     (requires ffmpeg/avconv and
--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:
--postprocessor-args ARGS            Give these arguments to the
-k, --keep-video                     Keep the video file on disk after the
                                     post-processing; the video is erased by
--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
--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
--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 を設定するには、サポートされているコマンドラインオプションを設定ファイルに配置します。Linux および macOS では、システム全体の設定ファイルは にあり、ユーザ全体の構成ファイルは にあります。Windows では、ユーザー全体の構成ファイルの場所は または です。デフォルトでは設定ファイルが存在しない可能性があるため、自分で作成する必要があることに注意してください。

C:\Users\<user name>\youtube-dl.conf



# Lines starting with # are comments

# Always extract audio

# Do not copy the mtime

# Use this proxy

# Save all videos under Movies directory in your home directory
-o ~/Movies/%(title)s.%(ext)s

構成ファイルのオプションは、通常のコマンドライン呼び出しで使用されるスイッチと同じオプションであるため、 または の後に空白があってはなりません。 またはではなく、または.

- o
-- proxy






また、すべてのyoutube-dl実行でコマンドライン引数として資格情報を渡さないようにし、シェルコマンド履歴でプレーンテキストのパスワードを追跡しないように、認証をサポートするエクストラクタの自動資格情報ストレージを構成することもできます(ログインとパスワードを指定することにより)。これは、抽出器ごとに .netrc ファイルを使用して実現できます。そのためには、ファイルにファイルを作成し、あなただけが読み取り/書き込みのアクセス許可を制限する必要があります。


touch $HOME/.netrc
chmod a-rwx,u+rw $HOME/.netrc

その後、エクストラクターの資格情報を次の形式で追加できます (extractor は小文字のエクストラクターの名前です)。

machine <extractor> login <login> password <password>


machine youtube login password my_youtube_password
machine twitch login my_twitch_account_name password my_twitch_password










基本的な使用法は、のように単一のファイルをダウンロードするときにテンプレート引数を設定しないことです。ただし、各ビデオをダウンロードするときに置き換えられる特別なシーケンスが含まれている場合があります。特別なシーケンスは、Pythonの文字列フォーマット操作に従ってフォーマットできます。たとえば、または .明確にするために、これはパーセント記号の後に括弧内の名前が続き、その後にフォーマット操作が続きます。使用できる名前とシーケンスの種類は次のとおりです。

youtube-dl -o funny_video.flv "https://some/video"

  • id
    (文字列): 動画識別子
  • title
    (文字列): 動画タイトル
  • url
    (文字列): 動画の URL
  • ext
    (文字列): Video ファイル名拡張子
  • alt_title
    (文字列): 動画の副次的なタイトル
  • display_id
    (文字列): 動画の代替識別子
  • uploader
    (文字列): 動画をアップロードしたユーザーのフルネーム
  • license
    (文字列): 動画のライセンス名: 動画のライセンス名
  • creator
    (文字列): 動画の作成者
  • release_date
    (文字列): ビデオがリリースされた日付 (YYYYMMDD)
  • timestamp
    (数値): ビデオが利用可能になった瞬間のUNIXタイムスタンプ
  • upload_date
    (文字列): 動画のアップロード日 (YYYYMMDD)
  • uploader_id
    (文字列): 動画アップローダーのニックネームまたは ID
  • channel
    (文字列): 動画がアップロードされたチャンネルのフルネーム
  • channel_id
    (文字列): チャネルの ID
  • location
    (文字列): ビデオが撮影された物理的な場所
  • duration
    (数値): 動画の長さ(秒単位)
  • view_count
    (数値): プラットフォームで動画を視聴したユーザーの数
  • like_count
    (数値): 動画の肯定的な評価の数
  • dislike_count
    (数値): 動画の否定的な評価の数
  • repost_count
    (数値): 動画の再投稿数
  • average_rating
  • comment_count
    (数値): 動画へのコメント数
  • age_limit
    (数値): 動画の年齢制限(年)
  • is_live
    (ブール値): この動画がライブ配信か固定長動画か
  • start_time
    (数値): URL で指定された複製を開始する時間 (秒単位)
  • end_time
    (数値): URL で指定された複製が終了する時間 (秒単位)
  • format
    (文字列): 人間が判読できる形式の説明
  • format_id
    (文字列): によって指定されるフォーマットコード
  • format_note
    (文字列): 形式に関する追加情報
  • width
    (数値): 動画の幅
  • height
    (数値): 動画の高さ
  • resolution
    (文字列): 幅と高さのテキストによる説明
  • tbr
    (数値): オーディオとビデオの平均ビットレート (KBit/秒)
  • abr
    (数値): 平均オーディオ ビットレート (KBit/秒)
  • acodec
    (文字列): 使用中のオーディオコーデックの名前
  • asr
    (数値): オーディオ サンプリング レート (Hertz)
  • vbr
    (数値): 平均ビデオ ビットレート (キロビット/秒)
  • fps
    (数値): フレームレート
  • vcodec
    (文字列): 使用中のビデオコーデックの名前
  • container
    (文字列): コンテナー形式の名前
  • filesize
    (数値): バイト数 (事前にわかっている場合)
  • filesize_approx
    (数値): バイト数の推定値
  • protocol
    (文字列): 実際のダウンロードに使用されるプロトコル
  • extractor
    (文字列): エクストラクターの名前
  • extractor_key
    (文字列): エクストラクターのキー名
  • epoch
    (数値): ファイル作成時の Unix エポック
  • autonumber
    (数値): ダウンロードごとに増加する数 (から始まる)
  • playlist
    (文字列): 動画を含む再生リストの名前または ID
  • playlist_index
    (数値): 再生リスト内の動画のインデックスで、再生リストの全長に応じて先行ゼロが埋め込まれます。
  • playlist_id
    (文字列): プレイリスト識別子
  • playlist_title
    (文字列): プレイリストのタイトル
  • playlist_uploader
    (文字列): プレイリストアップローダーのフルネーム
  • playlist_uploader_id
    (文字列): プレイリストアップローダーのニックネームまたはID


  • chapter
    (文字列): 動画が属するチャプターの名前またはタイトル
  • chapter_number
    (数値): 動画が属するチャプターの番号
  • chapter_id
    (文字列): 動画が属するチャプターの ID


  • series
    (文字列): ビデオ エピソードが属するシリーズまたはプログラムのタイトル
  • season
    (文字列): ビデオエピソードが属するシーズンのタイトル
  • season_number
    (数値): 動画エピソードが属するシーズン番号
  • season_id
    (文字列): ビデオ エピソードが属するシーズンの ID
  • episode
    (文字列): ビデオ エピソードのタイトル
  • episode_number
    (数値): シーズン内のビデオエピソードの数
  • episode_id
    (文字列): ビデオ エピソードの ID


  • track
    (文字列): トラックのタイトル
  • track_number
    (数値): アルバムまたはディスク内のトラック番号
  • track_id
    (文字列): トラックの ID
  • artist
    (文字列): トラックのアーティスト
  • genre
    (文字列): トラックのジャンル
  • album
    (文字列): トラックが属するアルバムのタイトル
  • album_type
    (文字列): アルバムの種類
  • album_artist
    (文字列): アルバムに登場したすべてのアーティストのリスト
  • disc_number
  • release_year
    (数値): アルバムがリリースされた年 (YYYY)




-o %(title)s-%(id)s.%(ext)s
youtube-dl test video
youtube-dl test video-BaW_jenozKcj.mp4

数値シーケンスの場合、数値関連の書式設定を使用できます。たとえば、 のように、ビューカウントに最大5文字のゼロが埋め込まれた文字列になります。


出力テンプレートには、任意の階層パスを含めることもできます。 これにより、このパステンプレートに対応するディレクトリに各ビデオがダウンロードされます。不足しているディレクトリは自動的に作成されます。

-o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s'


-o -

現在のデフォルト・テンプレートは です。




出力テンプレートと Windows バッチ ファイル


-o "%(title)s-%(id)s.%(ext)s"
-o "%%(title)s-%%(id)s.%%(ext)s"
-o "C:\%HOMEPATH%\Desktop\%%(title)s.%%(ext)s"



$ youtube-dl --get-filename -o '%(title)s.%(ext)s' BaW_jenozKc
youtube-dl test video ''_ä↭𝕐.mp4    # All kinds of weird characters

$ youtube-dl --get-filename -o '%(title)s.%(ext)s' BaW_jenozKc --restrict-filenames
youtube-dl_test_video_.mp4          # A simple file name

# Download YouTube playlist videos in separate directory indexed by video order in a playlist
$ youtube-dl -o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s'

# Download all playlists of YouTube channel/user keeping each playlist in separate directory:
$ youtube-dl -o '%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s'

# Download Udemy course keeping each chapter in separate directory under MyVideos directory in your home
$ youtube-dl -u user -p password -o '~/MyVideos/%(playlist)s/%(chapter_number)s - %(chapter)s/%(title)s.%(ext)s'

# Download entire series season keeping each series and each season in separate directory under C:/MyVideos
$ youtube-dl -o "C:/MyVideos/%(series)s/%(season_number)s - %(season)s/%(episode_number)s - %(episode)s.%(ext)s"

# Stream the video being downloaded to stdout
$ youtube-dl -o - BaW_jenozKc





--format FORMAT


最も単純なケースは、特定のフォーマットを要求することです, たとえば、フォーマットコードが22に等しいフォーマットをダウンロードできます.特定のビデオで使用可能なフォーマットコードのリストを取得するには、またはを使用します。これらの形式コードは抽出器固有であることに注意してください。

-f 22

また、ファイル拡張子(現在、がサポートされています)を使用して、単一のファイルとして提供される特定のファイル拡張子の最高品質の形式をダウンロードすることもできます。 拡張子が単一のファイルとして提供される最高品質の形式をダウンロードします。

-f webm


  • best
  • worst
  • bestvideo
  • worstvideo
  • bestaudio
  • worstaudio

たとえば、最低品質のビデオのみの形式をダウンロードするには、 を使用できます。

-f worstvideo


-f 22/17/18

同じビデオの複数の形式をダウンロードする場合は、区切り文字としてコンマを使用します。 もちろん、これら3つの形式がすべて利用可能な場合はダウンロードします。または、優先順位機能と組み合わせたより洗練された例: .

-f 22,17,18
-f 136/137/mp4/bestvideo,140/m4a/bestaudio


-f "best[height=720]"
-f "[filesize>10M]"



  • filesize
    : バイト数 (事前にわかっている場合)
  • width
    : 動画の幅(わかっている場合)
  • height
    : 動画の高さ(わかっている場合)
  • tbr
    :オーディオとビデオの平均ビットレート(KBit / s)
  • abr
    : 平均オーディオ ビットレート (KBit/秒)
  • vbr
    : 平均ビデオ ビットレート (KBit/秒)
  • asr
  • fps



  • ext
    : ファイル拡張子
  • acodec
    : 使用中のオーディオコーデックの名前
  • vcodec
  • container
    : コンテナ形式の名前
  • protocol
    : 実際のダウンロードに使用されるプロトコル (小文字 (、、または
  • format_id
    : フォーマットの簡単な説明
  • language
    : 言語コード

文字列比較には、反対の比較を生成するために否定を付けることができます。 (含まれていません)。



値が不明な形式は、演算子の後に疑問符 () を付けない限り除外されます。フォーマットフィルターを組み合わせることができるため、ビットレートが500 KBit / s以上の最大720pのビデオ(または高さが不明なビデオ)を選択します。

-f "[height <=? 720][tbr>500]"

たとえば、最高のビデオのみの形式、最高のオーディオのみの形式をダウンロードし、ffmpeg / avconvと一緒に多重化するために、2つの形式のビデオとオーディオを1つのファイルにマージできます(ffmpegまたはavconvがインストールされている必要があります)。

-f <video-format>+<audio-format>
-f bestvideo+bestaudio


-f '(mp4,webm)[height<480]'

2015年4月末およびバージョン2015.04.26以降、youtube-dlはデフォルトのフォーマット選択として使用されます(#5447、#5456を参照)。ffmpegまたはavconvがインストールされている場合、ダウンロードされ、個別に、それらを1つのファイルにまとめてマルチプレクサし、利用可能な最高の全体的な品質を提供します。それ以外の場合は、フォールバックし、単一のファイルとして提供される利用可能な最高の品質をダウンロードします。 は、2つの異なるファイルでオーディオとビデオを提供しないため、YouTubeから来ていないビデオにも必要です。一部のDASH形式のみをダウンロードする場合(たとえば、1080pを超える解像度のビデオを取得する必要がない場合)、構成ファイルに追加できます。youtube-dlを使用してストリーミングする場合(そしてメディアプレーヤーにパイプする可能性が最も高い場合)、つまり出力テンプレートを明示的に次のように指定した場合、youtube-dlは引き続きフォーマット選択を使用して、プレーヤーへのコンテンツ配信をすぐに開始し、ダウンロードされて多重化されるまで待たないようにします。

-f bestvideo+bestaudio/best
-f bestvideo[height<=?1080]+bestaudio/best
-o -
-f best

古いフォーマット選択動作(youtube-dl 2015.04.26より前)を保持する場合、つまり、単一のファイルとして提供される利用可能な最高品質のメディアをダウンロードする場合は、で選択を明示的に指定する必要があります。youtube-dlを実行するたびに入力しないように、構成ファイルに追加することをお勧めします。

-f best



# Download best mp4 format available or any other best if no mp4 available
$ youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best'

# Download best format available but no better than 480p
$ youtube-dl -f 'bestvideo[height<=480]+bestaudio/best[height<=480]'

# Download best video only format but no bigger than 50 MB
$ youtube-dl -f 'best[filesize<50M]'

# Download best format available via direct link over HTTP/HTTPS protocol
$ youtube-dl -f '(bestvideo+bestaudio/best)[protocol^=http]'

# Download the best video format and the best audio format without merging them
$ youtube-dl -f 'bestvideo,bestaudio' -o '%(title)s.f%(format_id)s.%(ext)s'



ビデオは、オプション、またはを使用してアップロード日でフィルタリングできます。日付は 2 つの形式で受け付けます。


  • 絶対日付: 形式の日付。
  • 相対日付: 形式の日付


# Download only the videos uploaded in the last 6 months
$ youtube-dl --dateafter now-6months

# Download only the videos uploaded on January 1, 1970
$ youtube-dl --date 19700101

$ # Download only the videos uploaded in the 200x decade
$ youtube-dl --dateafter 20000101 --datebefore 20091231




youtube-dl -U
sudo youtube-dl -U


sudo pip install -U youtube-dl

apt-getyumなどのパッケージマネージャーを使用してyoutube-dlをインストールした場合は、標準のシステム更新メカニズムを使用して更新します。配布パッケージは古くなっていることが多いことに注意してください。経験則として、youtube-dlは少なくとも月に1回、多くの場合毎週または毎日リリースします。 にアクセスして、現在のバージョンを確認してください。残念ながら、あなたのディストリビューションが本当に古いバージョンを提供している場合、私たちyoutube-dl開発者は何もできません。あなたは彼らのバグトラッカーまたはサポートフォーラムであなたのディストリビューションに文句を言うことができます(そしてそうすべきです)。


sudo apt-get remove -y youtube-dl


sudo wget -O /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
hash -r


sudo youtube-dl -U


Windows ディフェンダーの設定でファイルの除外を追加します。


YouTube の再生リストでエラーが発生する
Unable to extract OpenGraph title

YouTubeは2014年3月以降にプレイリスト形式を変更したため、すべてのYouTube動画をダウンロードするには、少なくともyoutube-dl 2014.07.25が必要です。


error: using output template conflicts with using title, video ID or auto number




デフォルトでは、youtube-dlは最良のオプションを用意する予定です(ちなみに、これらが異なるはずだという説得力のあるケースがある場合は、それを説明して問題を提出してください)。したがって、Web ページから長いオプション文字列をコピーすることは不要であり、場合によっては有害です。特に、そのうちの唯一のオプションは定期的に役立ちます。








YouTube-DLは、ほとんどのサイトで単独で正常に動作します。ただし、ビデオ/オーディオを変換する場合は、avconvまたはffmpegが必要です。一部のサイト(特にYouTube)では、音声なしで高品質の形式でビデオを取得できます。YouTube-DLはAVCONV / FFMPEGが存在するかどうかを検出し、最適なオプションを自動的に選択します。

RTMP プロトコルを介してストリーミングされるビデオまたはビデオ形式は、rtmpdump がインストールされている場合にのみダウンロードできます。MMS および RTSP ビデオをダウンロードするには、mplayer または mpv のいずれかをインストールする必要があります。




それはサービスに大きく依存します。多くの場合、ビデオのリクエスト(ダウンロード/再生)は、同じIPアドレスから、同じCookieやHTTPヘッダーを使用して送信する必要があります。このオプションを使用して、必要な Cookie をファイルに書き込み、ダウンローダーにそのファイルから Cookie を読み取るように指示します。一部のサイトでは、共通のユーザーエージェントを使用する必要があり、youtube-dlで使用されているものを確認するために使用します。また、で取得したJSON出力から必要なクッキーとHTTPヘッダーを取得することもできます。


IPv6 を使用すると便利な場合があります。場合によっては、制限は IPv4 にのみ適用されます。一部のサービス(場合によっては動画のサブセットのみ)では、IPアドレス、Cookie、またはユーザーエージェントによって動画のURLを制限しませんが、これらはルールではなく例外です。



youtube-dl を実行していないマシンでビデオを再生する場合は、youtube-dl を実行しているマシンからビデオ コンテンツを中継できます。を使用して、youtube-dl にビデオを stdout にストリーミングさせたり、単に youtube-dl によって書き込まれたファイルをプレーヤーが順番にダウンロードできるようにしたりできます。

-o -


YouTubeは2011年7月に、古いバージョンのyoutube-dlでサポートされていない新しいビデオ情報形式に切り替えました。YouTube-dl を更新する方法については、上記を参照してください。


YouTube では、2012 年 9 月以降、古いバージョンの youtube-dl でサポートされていない追加の署名が必要です。YouTube-dl を更新する方法については、上記を参照してください。

[1] 2839
'v' is not recognized as an internal or external command


たとえば、URLが の場合次のコマンドで終わるはずです。

youtube-dl ''




youtube-dl ""

抽出エラー: JS 関数 u'OF' が見つかりませんでした

2015年2月、新しいYouTubeプレーヤーには、古いバージョンのyoutube-dlによって誤って解釈された文字列に文字シーケンスが含まれていました。YouTube-dl を更新する方法については、上記を参照してください。

HTTP エラー 429: 要求が多すぎます または 402: 支払いが必要です




構文エラー: 非 ASCII 文字


File "youtube-dl", line 2
SyntaxError: Non-ASCII character '\x93' ...

は、古いバージョンのPythonを使用していることを意味します。Python 2.6 または 2.7 に更新してください。


make youtube-dl


exeを実行するには、まずMicrosoft Visual C ++ 2010 Service Pack 1再頒布可能パッケージ(x86)をインストールする必要があります。




C:\Users\<User name>\bin




出力テンプレートを指定するには、 などを使用します。すべてのダウンロードでこれが必要な場合は、設定ファイルにオプションを入れてください。

-o "/home/user/videos/%(title)s-%(id)s.%(ext)s"


ID を先頭に追加するか、オプションから :

youtube-dl -- -wNyEUrxzFU
youtube-dl ""


たとえば、 オプションを使用します。

--cookies /path/to/cookies/file.txt

ブラウザからクッキーを抽出するには、クッキーをエクスポートするための準拠ブラウザ拡張機能を使用してください。たとえば、Get cookies.txt(Chrome の場合)や cookies.txt(Firefox の場合)などです。

クッキーファイルは Mozilla/Netscape フォーマットでなければならず、クッキーファイルの最初の行は または .クッキーファイルに正しい改行形式があることを確認し、必要に応じてOSに対応するように改行を変換します(つまり、Windowsの場合は()、UnixおよびUnixライクなシステム(Linux、macOSなど)の場合は()です。 使用する場合は、無効な改行形式の良い兆候です。

# HTTP Cookie File
# Netscape HTTP Cookie File
HTTP Error 400: Bad Request



最初にyoutube-dlにメディアをstdoutにストリーミングするように指示し、メディアプレーヤーにstdinから読み取るように指示し(ストリーミングにはこれが可能である必要があります)、前者を後者にパイプする必要があります。たとえば、vlc へのストリーミングは、次の方法で実現できます。

-o -

youtube-dl -o - "" | vlc -



--download-archive /path/to/download/archive/file.txt


youtube-dl --download-archive archive.txt ""



youtube-dl --download-archive archive.txt ""

Should I add into my config?

When youtube-dl detects an HLS video, it can download it either with the built-in downloader or ffmpeg. Since many HLS streams are slightly invalid and ffmpeg/youtube-dl each handle some invalid cases better than the other, there is an option to switch the downloader if needed.

When youtube-dl knows that one particular downloader works better for a given website, that downloader will be picked. Otherwise, youtube-dl will pick the best downloader for general compatibility, which at the moment happens to be ffmpeg. This choice may change in future versions of youtube-dl, with improvements of the built-in downloader and/or ffmpeg.

In particular, the generic extractor (used when your website is not in the list of supported sites by youtube-dl cannot mandate one specific downloader.

If you put either or into your configuration, a different subset of videos will fail to download correctly. Instead, it is much better to file an issue or a pull request which details why the native or the ffmpeg HLS downloader is a better choice for your use case.


Can you add support for this anime video site, or site which shows current movies for free?

As a matter of policy (as well as legality), youtube-dl does not include support for services that specialize in infringing copyright. As a rule of thumb, if you cannot easily find a video that the service is quite obviously allowed to distribute (i.e. that has been uploaded by the creator, the creator's distributor, or is published under a free license), the service is probably unfit for inclusion to youtube-dl.

A note on the service that they don't host the infringing content, but just link to those who do, is evidence that the service should not be included into youtube-dl. The same goes for any DMCA note when the whole front page of the service is filled with videos they are not allowed to distribute. A "fair use" note is equally unconvincing if the service shows copyright-protected videos in full without authorization.

Support requests for services that do purchase the rights to distribute their content are perfectly fine though. If in doubt, you can simply include a source that mentions the legitimate purchase of content.

How can I speed up work on my issue?

(Also known as: Help, my important issue not being solved!) The youtube-dl core developer team is quite small. While we do our best to solve as many issues as possible, sometimes that can take quite a while. To speed up your issue, here's what you can do:

First of all, please do report the issue at our issue tracker. That allows us to coordinate all efforts by users and developers, and serves as a unified point. Unfortunately, the youtube-dl project has grown too large to use personal email as an effective communication channel.

Please read the bug reporting instructions below. A lot of bugs lack all the necessary information. If you can, offer proxy, VPN, or shell access to the youtube-dl developers. If you are able to, test the issue from multiple computers in multiple countries to exclude local censorship or misconfiguration issues.

If nobody is interested in solving your issue, you are welcome to take matters into your own hands and submit a pull request (or coerce/pay somebody else to do so).

Feel free to bump the issue from time to time by writing a small comment ("Issue is still present in youtube-dl version ...from France, but fixed from Belgium"), but please not more than once a month. Please do not declare your issue as or .


How can I detect whether a given URL is supported by youtube-dl?

For one, have a look at the list of supported sites. Note that it can sometimes happen that the site changes its URL scheme (say, from to ) and youtube-dl reports an URL of a service in that list as unsupported. In that case, simply report a bug.

It is not possible to detect whether a URL is supported or not. That's because youtube-dl contains a generic extractor which matches all URLs. You may be tempted to disable, exclude, or remove the generic extractor, but the generic extractor not only allows users to extract videos from lots of websites that embed a video from another service, but may also be used to extract video from a service that it's hosting itself. Therefore, we neither recommend nor support disabling, excluding, or removing the generic extractor.

If you want to find out whether a given URL is supported, simply call youtube-dl with it. If you get no videos back, chances are the URL is either not referring to a video or unsupported. You can find out which by examining the output (if you run youtube-dl on the console) or catching an exception if you run it from a Python program.


Why do I need to go through that much red tape when filing bugs?

Before we had the issue template, despite our extensive bug reporting instructions, about 80% of the issue reports we got were useless, for instance because people used ancient versions hundreds of releases old, because of simple syntactic errors (not in youtube-dl but in general shell usage), because the problem was already reported multiple times before, because people did not actually read an error message, even if it said "please install ffmpeg", because people did not mention the URL they were trying to download and many more simple, easy-to-avoid problems, many of whom were totally unrelated to youtube-dl.

youtube-dl is an open-source project manned by too few volunteers, so we'd rather spend time fixing bugs where we are certain none of those simple problems apply, and where we can be reasonably confident to be able to reproduce the issue without asking the reporter repeatedly. As such, the output of is really all that's required to file an issue. The issue template also guides you through some basic steps you can do, such as checking that your version of youtube-dl is current.

youtube-dl -v YOUR_URL_HERE


Most users do not need to build youtube-dl and can download the builds or get them from their distribution.

To run youtube-dl as a developer, you don't need to build anything either. Simply execute

python -m youtube_dl

To run the test, simply invoke your favorite test runner, or execute a test file directly; any of the following work:

python -m unittest discover
python test/

See item 6 of new extractor tutorial for how to run extractor specific test cases.

If you want to create a build of youtube-dl yourself, you'll need

  • python
  • make (only GNU make is supported)
  • pandoc
  • zip
  • nosetests

Adding support for a new site

If you want to add support for a new site, first of all make sure this site is not dedicated to copyright infringement. youtube-dl does not support such sites thus pull requests adding support for them will be rejected.

After you have ensured this site is distributing its content legally, you can follow this quick list (assuming your service is called ):


  1. Fork this repository

  2. Check out the source code with:

     git clone
  3. Start a new git branch with

     cd youtube-dl
     git checkout -b yourextractor
  4. Start with this simple template and save it to :


    # coding: utf-8
    from __future__ import unicode_literals
    from .common import InfoExtractor
    class YourExtractorIE(InfoExtractor):
        _VALID_URL = r'https?://(?:www\.)?yourextractor\.com/watch/(?P<id>[0-9]+)'
        _TEST = {
            'url': '',
            'md5': 'TODO: md5 sum of the first 10241 bytes of the video file (use --test)',
            'info_dict': {
                'id': '42',
                'ext': 'mp4',
                'title': 'Video title goes here',
                'thumbnail': r're:^https?://.*\.jpg$',
                # TODO more properties, either as:
                # * A value
                # * MD5 checksum; start the string with md5:
                # * A regular expression; start the string with re:
                # * Any Python type (for example int or float)
        def _real_extract(self, url):
            video_id = self._match_id(url)
            webpage = self._download_webpage(url, video_id)
            # TODO more code goes here, for example ...
            title = self._html_search_regex(r'<h1>(.+?)</h1>', webpage, 'title')
            return {
                'id': video_id,
                'title': title,
                'description': self._og_search_description(webpage),
                'uploader': self._search_regex(r'<div[^>]+id="uploader"[^>]*>([^<]+)<', webpage, 'uploader', fatal=False),
                # TODO more properties (see youtube_dl/extractor/
  5. Add an import in


  6. Run . This should fail at first, but you can continually re-run it until you're done. If you decide to add more than one test (actually, test case) then rename to and make it into a list of dictionaries. The tests will then be named , , , etc. Note:

    python test/ TestDownload.test_YourExtractor

    • the test names use the extractor class name without the trailing
    • tests with key in test's dict are not counted.
  7. Have a look at

    for possible helper methods and a detailed description of what your extractor should and may return. Add tests and code for as many as you want.

  8. Make sure your code follows youtube-dl coding conventions and check the code with flake8:

     $ flake8 youtube_dl/extractor/
  9. Make sure your code works under all Python versions claimed supported by youtube-dl, namely 2.6, 2.7, and 3.2+.

  10. When the tests pass, add the new files and commit them and push the result, like this:

    $ git add youtube_dl/extractor/
    $ git add youtube_dl/extractor/
    $ git commit -m '[yourextractor] Add new extractor'
    $ git push origin yourextractor
  11. Finally, create a pull request. We'll then review and merge it.

In any case, thank you very much for your contributions!

youtube-dl coding conventions

This section introduces a guide lines for writing idiomatic, robust and future-proof extractor code.

Extractors are very fragile by nature since they depend on the layout of the source data provided by 3rd party media hosters out of your control and this layout tends to change. As an extractor implementer your task is not only to write code that will extract media links and metadata correctly but also to minimize dependency on the source's layout and even to make the code foresee potential future changes and be ready for that. This is important because it will allow the extractor not to break on minor layout changes thus keeping old youtube-dl versions working. Even though this breakage issue is easily fixed by emitting a new version of youtube-dl with a fix incorporated, all the previous versions become broken in all repositories and distros' packages that may not be so prompt in fetching the update from us. Needless to say, some non rolling release distros may never receive an update at all.

Mandatory and optional metafields

For extraction to work youtube-dl relies on metadata your extractor extracts and provides to youtube-dl expressed by an information dictionary or simply info dict. Only the following meta fields in the info dict are considered mandatory for a successful extraction process by youtube-dl:

  • id
    (media identifier)
  • title
    (media title)
  • url
    (media download URL) or

In fact only the last option is technically mandatory (i.e. if you can't figure out the download location of the media the extraction does not make any sense). But by convention youtube-dl also treats and as mandatory. Thus the aforementioned metafields are the critical data that the extraction does not make any sense without and if any of them fail to be extracted then the extractor is considered completely broken.


Any field apart from the aforementioned ones are considered optional. That means that extraction should be tolerant to situations when sources for these fields can potentially be unavailable (even if they are always available at the moment) and future-proof in order not to break the extraction of general purpose mandatory fields.


Say you have some source dictionary that you've fetched as JSON with HTTP request and it has a key :


meta = self._download_json(url, video_id)

Assume at this point 's layout is:


    "summary": "some fancy summary text",

Assume you want to extract and put it into the resulting info dict as . Since is an optional meta field you should be ready that this key may be missing from the dict, so that you should extract it like:


description = meta.get('summary')  # correct

and not like:

description = meta['summary']  # incorrect

The latter will break extraction process with if disappears from at some later time but with the former approach extraction will just go ahead with set to which is perfectly fine (remember is equivalent to the absence of data).


Similarly, you should pass when extracting optional data from a webpage with , or similar methods, for instance:


description = self._search_regex(
    webpage, 'description', fatal=False)

With set to if fails to extract it will emit a warning and continue extraction.


You can also pass , for example:

default=<some fallback value>

description = self._search_regex(
    webpage, 'description', default=None)

On failure this code will silently continue the extraction with set to . That is useful for metafields that may or may not be present.


Provide fallbacks

When extracting metadata try to do so from multiple sources. For example if is present in several places, try extracting from at least some of them. This makes it more future-proof in case some of the sources become unavailable.



Say from the previous example has a and you are about to extract it. Since is a mandatory meta field you should end up with something like:


title = meta['title']

If disappears from in future due to some changes on the hoster's side the extraction would fail since is mandatory. That's expected.


Assume that you have some another source you can extract from, for example HTML meta of a . In this case you can provide a fallback scenario:


title = meta.get('title') or self._og_search_title(webpage)

This code will try to extract from first and if it fails it will try extracting from a .


Regular expressions

Don't capture groups you don't use

Capturing group must be an indication that it's used somewhere in the code. Any group that is not used must be non capturing.


Don't capture id attribute name here since you can't use it for anything anyway.





Make regular expressions relaxed and flexible

When using regular expressions try to write them fuzzy, relaxed and flexible, skipping insignificant parts that are more likely to change, allowing both single and double quotes for quoted values and so on.


Say you need to extract from the following HTML code:


<span style="position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;" class="title">some fancy title</span>

The code for that task should look similar to:

title = self._search_regex(
    r'<span[^>]+class="title"[^>]*>([^<]+)', webpage, 'title')

Or even better:

title = self._search_regex(
    webpage, 'title', group='title')

Note how you tolerate potential changes in the attribute's value or switch from using double quotes to single for attribute:


The code definitely should not look like:

title = self._search_regex(
    r'<span style="position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;" class="title">(.*?)</span>',
    webpage, 'title', group='title')

Long lines policy

There is a soft limit to keep lines of code under 80 characters long. This means it should be respected if possible and if it does not make readability and code maintenance worse.

For example, you should never split long string literals like URLs or some other often copied entities over multiple lines to fit this limit:





Inline values

Extracting variables is acceptable for reducing code duplication and improving readability of complex expressions. However, you should avoid extracting variables used only once and moving them to opposite parts of the extractor file, which makes reading the linear flow difficult.



title = self._html_search_regex(r'<title>([^<]+)</title>', webpage, 'title')


TITLE_RE = r'<title>([^<]+)</title>'
# ...some lines of code...
title = self._html_search_regex(TITLE_RE, webpage, 'title')

Collapse fallbacks

Multiple fallback values can quickly become unwieldy. Collapse multiple fallback values into a single expression via a list of patterns.



description = self._html_search_meta(
    ['og:description', 'description', 'twitter:description'],
    webpage, 'description', default=None)


description = (
    self._og_search_description(webpage, default=None)
    or self._html_search_meta('description', webpage, default=None)
    or self._html_search_meta('twitter:description', webpage, default=None))

Methods supporting list of patterns are: , , , .


Trailing parentheses

Always move trailing parentheses after the last argument.



    lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],


    lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],

Use convenience conversion and parsing functions

Wrap all extracted numeric data into safe functions from

: , . Use them for string to number conversions as well.

Use for safe URL processing.


Use for safe metadata extraction from parsed JSON.


Use for uniform or any meta field extraction, for uniform extraction, for extraction, for count meta fields extraction, , for extraction, for extraction.



for more useful convenience functions.

More examples

Safely extract optional description from parsed JSON
description = try_get(response, lambda x: x['result']['video'][0]['summary'], compat_str)
Safely extract more optional metadata
video = try_get(response, lambda x: x['result']['video'][0], dict) or {}
description = video.get('summary')
duration = float_or_none(video.get('durationMs'), scale=1000)
view_count = int_or_none(video.get('views'))


youtube-dl makes the best effort to be a good command-line program, and thus should be callable from any programming language. If you encounter any problems parsing its output, feel free to create a report.

From a Python program, you can embed youtube-dl in a more powerful fashion, like this:

from __future__ import unicode_literals
import youtube_dl

ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:[''])

Most likely, you'll want to use various options. For a list of options available, have a look at

. For a start, if you want to intercept youtube-dl's output, set a object.

Here's a more complete example of a program that outputs only errors (and a short message after the download is finished), and downloads/converts the video to an mp3 file:

from __future__ import unicode_literals
import youtube_dl

class MyLogger(object):
    def debug(self, msg):

    def warning(self, msg):

    def error(self, msg):

def my_hook(d):
    if d['status'] == 'finished':
        print('Done downloading, now converting ...')

ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
        'preferredquality': '192',
    'logger': MyLogger(),
    'progress_hooks': [my_hook],
with youtube_dl.YoutubeDL(ydl_opts) as ydl:[''])


Bugs and suggestions should be reported at: Unless you were prompted to or there is another pertinent reason (e.g. GitHub fails to accept the bug report), please do not send bug reports via personal email. For discussions, join us in the IRC channel #youtube-dl on freenode (webchat).

Please include the full output of youtube-dl when run with

, i.e. add flag to your command line, copy the whole output and post it in the issue body wrapped in ``` for better formatting. It should look similar to this:

$ youtube-dl -v <your command line>
[debug] System config: []
[debug] User config: []
[debug] Command-line args: [u'-v', u'']
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
[debug] youtube-dl version 2015.12.06
[debug] Git HEAD: 135392e
[debug] Python version 2.6.6 - Windows-2003Server-5.2.3790-SP2
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
[debug] Proxy map: {}

Do not post screenshots of verbose logs; only plain text is acceptable.

The output (including the first lines) contains important debugging information. Issues without the full output are often not reproducible and therefore do not get solved in short order, if ever.

Please re-read your issue once again to avoid a couple of common mistakes (you can and should use this as a checklist):

Is the description of the issue itself sufficient?

We often get issue reports that we cannot really decipher. While in most cases we eventually get the required information after asking back multiple times, this poses an unnecessary drain on our resources. Many contributors, including myself, are also not native speakers, so we may misread some parts.

So please elaborate on what feature you are requesting, or what bug you want to be fixed. Make sure that it's obvious

  • What the problem is
  • How it could be fixed
  • How your proposed solution would look like

If your report is shorter than two lines, it is almost certainly missing some of these, which makes it hard for us to respond to it. We're often too polite to close the issue outright, but the missing info makes misinterpretation likely. As a committer myself, I often get frustrated by these issues, since the only possible way for me to move forward on them is to ask for clarification over and over.

For bug reports, this means that your report should contain the complete output of youtube-dl when called with the flag. The error message you get for (most) bugs even says so, but you would not believe how many of our bug reports do not contain this information.


If your server has multiple IPs or you suspect censorship, adding may be a good idea to get more diagnostics. If the error is and you cannot reproduce it from multiple countries, add (warning: this will yield a rather large output, redirect it to the file by adding to your command-line) or upload the files you get when you add somewhere.

ERROR: Unable to extract ...
>log.txt 2>&1

Site support requests must contain an example URL. An example URL is a URL you might want to download, like . There should be an obvious video present. Except under very special circumstances, the main page of a video service (e.g. ) is not an example URL.

Are you using the latest version?

Before reporting any issue, type . This should report that you're up-to-date. About 20% of the reports we receive are already fixed, but people are using outdated versions. This goes for feature requests as well.

youtube-dl -U

Is the issue already documented?

Make sure that someone has not already opened the issue you're trying to open. Search at the top of the window or browse the GitHub Issues of this repository. If there is an issue, feel free to write something along the lines of "This affects me as well, with version 2015.01.01. Here is some more information on the issue: ...". While some issues may be old, a new post into them often spurs rapid activity.

Why are existing options not enough?

Before requesting a new feature, please have a quick peek at the list of supported options. Many feature requests are for features that actually exist already! Please, absolutely do show off your work in the issue report and detail how the existing similar options do not solve your problem.

Is there enough context in your bug report?

People want to solve problems, and often think they do us a favor by breaking down their larger problems (e.g. wanting to skip already downloaded files) to a specific request (e.g. requesting us to look whether the file exists before downloading the info page). However, what often happens is that they break down the problem into two steps: One simple, and one impossible (or extremely complicated one).

We are then presented with a very complicated request when the original problem could be solved far easier, e.g. by recording the downloaded video IDs in a separate file. To avoid this, you must include the greater context where it is non-obvious. In particular, every feature request that does not consist of adding support for a new site should contain a use case scenario that explains in what situation the missing feature would be useful.

Does the issue involve one problem, and one problem only?


特に、すべてのサイト サポート リクエストの問題は、1 つのサイトのサービスにのみ関係する必要があります (通常は共通のドメインで、常に同じバックエンド テクノロジを使用します)。同じ号のvimeoユーザービデオ、ホワイトハウスポッドキャスト、およびGoogle Plusページのサポートをリクエストしないでください。また、機能リクエストと一緒にバグレポートを投稿しないようにしてください。経験則として、機能リクエストには、目前の機能に直接関連しないyoutube-dlの出力は含まれません。新しいビデオ サービスの要求と一緒にネットワーク エラーのレポートを投稿しないでください。




奇妙に聞こえるかもしれませんが、私たちが受け取るバグレポートの中には、youtube-dlとはまったく関係がなく、別の、またはレポーター自身のアプリケーションに関連しているものがあります。実際にyoutube-dlを使用していることを確認してください。youtube-dl の UI を使用している場合は、UI を提供している実際のアプリケーションのメンテナにバグを報告してください。一方、youtube-dlのUIがyoutube-dlに関連していると思われる方法で失敗した場合は、必ず先に進んでバグを報告してください。