[download_code]
安装
要立即为所有UNIX用户(Linux,macOS等)安装它,请键入:
sudo curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
如果没有curl,则可以使用wget:
sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
Windows用户可以下载.exe文件并将其放置在其PATH上的任何位置,除了%SYSTEMROOT%\System32
(例如,不要放入C:\Windows\System32
)。
您还可以使用pip:
sudo -H pip install --upgrade youtube-dl
如果您已经安装了此命令,它将更新youtube-dl。有关更多信息,请参见pypi页面。
macOS用户可以使用Homebrew安装youtube-dl :
brew install youtube-dl
或使用MacPorts:
sudo port install youtube-dl
或者,请参阅开发人员说明以了解如何检出并使用git存储库。有关其他选项(包括PGP签名)的信息,请参见youtube-dl下载页面。
描述
youtube-dl是一个命令行程序,可以从YouTube.com和其他一些网站下载视频。它需要2.6、2.7或3.2+版本的Python解释器,并且它不是特定于平台的。它应该可以在您的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 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
网络选项:
--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-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 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)
下载选项:
-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
文件系统选项:
-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
--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
缩略图:
--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
详细度/模拟选项:
-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
解决方法:
--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.
视频格式选项:
-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
字幕选项:
--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
身份验证选项:
-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选项:
--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
后处理选项:
-x, --extract-audio Convert video files to audio-only files
(requires ffmpeg or avconv and ffprobe or
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。在Linux和macOS上,系统范围的配置文件位于,/etc/youtube-dl.conf
用户范围的配置文件位于~/.config/youtube-dl/config
。在Windows上,用户范围的配置文件位置为%APPDATA%\youtube-dl\config.txt
或C:\Users\<user name>\youtube-dl.conf
。请注意,默认情况下配置文件可能不存在,因此您可能需要自己创建它。
例如,使用以下配置文件youtube-dl将始终提取音频,而不复制mtime,使用代理并将所有视频保存Movies
在主目录下的目录下:
# Lines starting with # are comments
# Always extract audio
-x
# Do not copy the mtime
--no-mtime
# Use this proxy
--proxy 127.0.0.1:3128
# Save all videos under Movies directory in your home directory
-o ~/Movies/%(title)s.%(ext)s
请注意,配置文件中的选项与常规命令行调用中使用的选项(也称为开关)相同,因此,在或之后必须没有空格,例如,但不能或。-
--
-o
--proxy
- o
-- proxy
--ignore-config
如果您要为特定的youtube-dl运行禁用配置文件,则可以使用。
--config-location
如果要针对特定的youtube-dl运行使用自定义配置文件,也可以使用。
.netrc
文件认证
您可能还希望为支持身份验证的提取程序配置自动凭据存储(通过使用--username
和提供登录名和密码--password
),以便在每次youtube-dl执行时都不将凭据作为命令行参数传递,并防止在shell命令历史记录中跟踪纯文本密码。您可以在每个提取器的基础上使用.netrc
文件来实现此目的。为此,您将需要.netrc
在自己的文件中创建一个文件,$HOME
并限制只有您自己才能读/写的权限:
touch $HOME/.netrc
chmod a-rwx,u+rw $HOME/.netrc
之后,您可以采用以下格式添加提取程序的凭据,其中extractor是提取程序的名称,小写形式:
machine <extractor> login <login> password <password>
例如:
machine youtube login myaccount@gmail.com password my_youtube_password
machine twitch login my_twitch_account_name password my_twitch_password
要使用该.netrc
文件激活身份验证,您应该传递--netrc
给youtube-dl或将其放置在配置文件中。
在Windows上,您可能还需要%HOME%
手动设置环境变量。例如:
set HOME=%USERPROFILE%
输出模板
该-o
选项允许用户指示输出文件名的模板。
tl; dr: 导航至示例。
基本用法是在下载单个文件时(例如中的)不设置任何模板参数youtube-dl -o funny_video.flv "https://some/video"
。但是,它可能包含特殊的序列,这些序列将在下载每个视频时被替换。可以根据python字符串格式化操作对特殊序列进行格式化。例如,%(NAME)s
或%(NAME)05d
。为了明确起见,这是一个百分号,后跟一个括号,然后是格式化操作。允许的名称以及序列类型为:
id
(字符串):视频标识符title
(字符串):视频标题url
(字符串):视频网址ext
(字符串):视频文件扩展名alt_title
(字符串):视频的辅助标题display_id
(字符串):视频的备用标识符uploader
(字符串):视频上传者的全名license
(字符串):视频所许可的许可名称creator
(字符串):视频的创建者release_date
(字符串):视频发布的日期(YYYYMMDD)timestamp
(数字):视频可用时的UNIX时间戳。upload_date
(字符串):视频上传日期(YYYYMMDD)uploader_id
(字符串):视频上传者的昵称或IDchannel
(字符串):上传视频的频道的全名channel_id
(字符串):频道的IDlocation
(字符串):录制视频的实际位置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
format_note
(字符串):有关格式的其他信息width
(数字):视频的宽度height
(数字):视频的高度resolution
(字符串):宽度和高度的文字描述tbr
(数字):音频和视频的平均比特率,单位为KBit / sabr
(数字):平均音频比特率,单位为KBit / sacodec
(字符串):使用中的音频编解码器的名称asr
(数字):音频采样率,以赫兹为单位vbr
(数字):平均视频比特率,单位为KBit / sfps
(数字):帧频vcodec
(字符串):正在使用的视频编解码器的名称container
(字符串):容器格式的名称filesize
(数字):字节数(如果事先知道)filesize_approx
(数字):估计的字节数protocol
(字符串):将用于实际下载的协议extractor
(字符串):提取器的名称extractor_key
(字符串):提取器的键名epoch
(数字):创建文件时的Unix纪元autonumber
(数字):每次下载都会增加的数字,起始于--autonumber-start
playlist
(字符串):包含视频的播放列表的名称或IDplaylist_index
(数字):播放列表中视频的索引,根据播放列表的总长度用前导零填充playlist_id
(字符串):播放列表标识符playlist_title
(字符串):播放列表标题playlist_uploader
(字符串):播放列表上传者的全名playlist_uploader_id
(字符串):播放列表上传者的昵称或ID
适用于属于某些逻辑章节的视频:
chapter
(字符串):视频所属章节的名称或标题chapter_number
(数字):视频所属章节的编号chapter_id
(字符串):视频所属章节的ID
可用于某些系列或节目的一集的视频:
series
(字符串):视频片段所属的系列或节目的标题season
(字符串):视频片段所属的季节的标题season_number
(数字):视频片段所属的季节数season_id
(字符串):视频片段所属的季节IDepisode
(字符串):视频片段的标题episode_number
(数字):一个季节中的视频片段数episode_id
(字符串):视频片段的ID
可用于作为曲目或音乐专辑一部分的媒体:
track
(字符串):曲目标题track_number
(数字):专辑或光盘中的曲目编号track_id
(字符串):曲目的IDartist
(字符串):曲目的艺术家genre
(字符串):曲目的流派album
(字符串):曲目所属专辑的标题album_type
(字符串):相册的类型album_artist
(字符串):专辑中出现的所有艺术家的列表disc_number
(数字):轨道所属的光盘或其他物理介质的编号release_year
(数字):专辑发行的年份(YYYY)
当在输出模板中引用每个上述序列时,将由对应于序列名称的实际值替换。注意,某些序列不保证存在,因为它们取决于特定提取器获得的元数据。此类序列将替换为NA
。
例如,对于-o %(title)s-%(id)s.%(ext)s
带有标题youtube-dl test video
和ID的mp4视频BaW_jenozKcj
,这将导致在youtube-dl test video-BaW_jenozKcj.mp4
当前目录中创建一个文件。
对于数字序列,您可以使用数字相关的格式,例如,%(view_count)05d
将导致视图计数的字符串填充零(最多5个字符),例如中的00042
。
输出模板还可以包含任意分层路径,例如-o '%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s'
,这将导致将每个视频下载到与此路径模板相对应的目录中。任何丢失的目录将自动为您创建。
要在输出模板中使用百分比文字,请使用%%
。要输出到stdout,请使用-o -
。
当前的默认模板为%(title)s-%(id)s.%(ext)s
。
在某些情况下,例如在将下载的文件名传输到Windows系统或通过8bit-unsafe通道将文件名传输到Windows系统时,您不需要特殊字符(如中,空格或&)。在这些情况下,请添加--restrict-filenames
标志以缩短标题:
输出模板和Windows批处理文件
如果您在Windows批处理文件中使用输出模板,则必须%
通过加倍转义普通百分号(),因此-o "%(title)s-%(id)s.%(ext)s"
应变为-o "%%(title)s-%%(id)s.%%(ext)s"
。但是,您请勿触摸%
非普通字符的,例如,用于扩展的环境变量应保持原样:-o "C:\%HOMEPATH%\Desktop\%%(title)s.%%(ext)s"
。
输出模板示例
请注意,在Windows上,您可能需要使用双引号而不是单引号。
$ 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' https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re
# 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' https://www.youtube.com/user/TheLinuxFoundation/playlists
# 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' https://www.udemy.com/java-tutorial/
# 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" https://videomore.ru/kino_v_detalayah/5_sezon/367617
# Stream the video being downloaded to stdout
$ youtube-dl -o - BaW_jenozKc
格式选择
默认情况下,youtube-dl尝试下载最佳质量,即,如果您希望获得最佳质量,则不需要通过任何特殊选项,那么youtube-dl将默认为您猜测。
但有时您可能想以其他格式下载,例如,在连接速度较慢或断断续续时。实现此目的的关键机制是所谓的格式选择,您可以基于该机制显式指定所需的格式,基于某个或多个条件选择格式,设置优先级等。
为格式选择的一般语法--format FORMAT
或短-f FORMAT
,其中FORMAT
的一个选择表达式,即描述了一种或多种格式,你想下载的表达式。
tl; dr: 导航至示例。
最简单的情况是请求特定格式,例如,-f 22
您可以下载格式代码等于22的格式。您可以使用--list-formats
或来获取特定视频的可用格式代码列表-F
。请注意,这些格式代码是提取器特定的。
你也可以使用一个文件扩展名(目前3gp
,aac
,flv
,m4a
,mp3
,mp4
,ogg
,wav
,webm
都支持),下载服务作为一个单一的文件中的特定文件扩展名,例如质量最好的格式,-f webm
将下载最优质的格式与webm
充当扩展单个文件。
您还可以使用特殊名称来选择特殊的边缘情况格式:
best
:选择带有视频和音频的单个文件代表的最佳质量格式。worst
:选择带有视频和音频的单个文件代表的质量最差的格式。bestvideo
:选择最佳质量的纯视频格式(例如DASH视频)。可能不可用。worstvideo
:选择质量最差的纯视频格式。可能不可用。bestaudio
:选择最佳质量的纯音频格式。可能不可用。worstaudio
:选择质量最差的纯音频格式。可能不可用。
例如,要下载质量最差的纯视频格式,可以使用-f worstvideo
。
如果要下载多个视频,而它们没有可用的相同格式,则可以使用斜杠指定首选项的顺序。请注意,斜杠是左关联的,即首选左侧的格式,例如,-f 22/17/18
如果可用,将下载格式22,否则,将下载格式17,如果可用,则将下载格式18,否则,将下载格式18。会抱怨没有合适的格式可供下载。
如果要下载同一视频的几种格式,请使用逗号作为分隔符,例如,-f 22,17,18
将下载所有这三种格式(当然,如果有的话)。或更高级的示例结合了优先功能:-f 136/137/mp4/bestvideo,140/m4a/bestaudio
。
您也可以通过将条件放在方括号中来过滤视频格式,如-f "best[height=720]"
(或-f "[filesize>10M]"
)。
下面的数值元字段可以用比较使用<
,<=
,>
,>=
,=
(等于), !=
(未等于):
filesize
:字节数(如果事先知道)width
:视频的宽度(如果知道)height
:视频的高度(如果知道)tbr
:音频和视频的平均比特率,单位为KBit / sabr
:平均音频比特率,单位为KBit / svbr
:平均视频比特率(千比特/秒)asr
:赫兹音频采样率fps
:帧频
还为比较=
(等于),^=
(以)开始,$=
(以)结束,*=
(包含)以及以下字符串元字段进行过滤工作:
ext
: 文件扩展名acodec
:正在使用的音频编解码器的名称vcodec
:正在使用的视频编解码器的名称container
:容器格式名称protocol
:将被用于实际下载协议,小写(http
,https
,rtsp
,rtmp
,rtmpe
,mms
,f4m
,ism
,http_dash_segments
,m3u8
,或m3u8_native
)format_id
:格式的简短说明
任何字符串比较都可以加上否定前缀,!
以便产生相反的比较,例如!*=
(不包含)。
注意,上述元字段都不保证存在,因为这仅取决于特定提取器获得的元数据,即视频托管者提供的元数据。
除非您?
在运算符后面加上问号(),否则将排除不知道其值的格式。您可以组合使用格式过滤器,因此-f "[height <=? 720][tbr>500]"
最多可以选择比特率至少为500 KBit / s的720p视频(或高度未知的视频)。
您可以使用-f <video-format>+<audio-format>
(将ffmpeg或avconv安装)-f bestvideo+bestaudio
将两种格式的视频和音频合并到一个文件中,例如,将下载最佳视频格式,最佳音频格式并将其与ffmpeg / avconv混合在一起。
格式选择器也可以使用括号进行分组,例如,如果您要下载高度低于480的最佳mp4和webm格式,则可以使用-f '(mp4,webm)[height<480]'
。
自2015年4月底和版本2015.04.26起,youtube-dl使用-f bestvideo+bestaudio/best
默认格式选择(请参阅#5447和#5456)。如果安装了ffmpeg或avconv,则将导致分别下载bestvideo
和混合bestaudio
并将它们混合到一个文件中,从而提供最佳的整体质量。否则,它会退回best
并导致以单个文件的形式下载最佳质量的文件。best
非YouTube的视频也需要它,因为它们没有以两个不同的文件提供音频和视频。如果您只想下载某些DASH格式(例如,如果您不希望获得分辨率高于1080p的视频),则可以添加-f bestvideo[height<=?1080]+bestaudio/best
到您的配置文件。请注意,如果您使用youtube-dl进行流式传输stdout
(并且很可能会将其通过管道传输到媒体播放器),即您将输出模板明确指定为-o -
,那么youtube-dl仍会使用-f best
格式选择以便立即开始向播放器传输内容而不是等到bestvideo
和bestaudio
下载和多路复用。
如果您要保留旧的格式选择行为(在youtube-dl 2015.04.26之前),即要下载质量最佳的媒体作为单个文件,则应使用明确指定选择-f best
。您可能需要将其添加到配置文件中,以免每次运行youtube-dl时都将其键入。
格式选择示例
请注意,在Windows上,您可能需要使用双引号而不是单引号。
# 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'
请注意,在最后一个示例中,建议使用输出模板,因为bestvideo和bestaudio可能具有相同的文件名。
视频选择
影片可以通过其上传日期使用选项进行过滤--date
,--datebefore
或--dateafter
。它们接受两种格式的日期:
- 绝对日期:日期格式
YYYYMMDD
。 - 相对日期:日期格式
(now|today)[+-][0-9](day|week|month|year)(s)?
例子:
# 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?
如果您按照我们的手动安装说明进行操作,则可以简单地运行youtube-dl -U
(或在Linux上sudo youtube-dl -U
)。
如果您使用过pip,则只需进行简单sudo pip install -U youtube-dl
更新即可。
如果您已使用apt-get或yum等软件包管理器安装了youtube-dl ,请使用标准系统更新机制进行更新。请注意,分发软件包通常已过时。根据经验,youtube-dl每月至少发布一次,并且通常每周发布一次,甚至每天发布一次。只需访问https://yt-dl.org即可找到当前版本。不幸的是,如果您的发行版提供的版本确实过时,那么youtube-dl开发人员将无能为力。您可以(并且应该)在他们的Bugtracker或支持论坛中投诉您的发行版。
作为最后的选择,您还可以卸载软件包管理器安装的版本,并按照我们的手动安装说明进行操作。为此,请删除发行版的程序包,并使用以下行
sudo apt-get remove -y youtube-dl
之后,只需遵循我们的手动安装说明:
sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
sudo chmod a+rx /usr/local/bin/youtube-dl
hash -r
同样,从那时起,您将能够使用进行更新sudo youtube-dl -U
。
youtube-dl在Windows上启动非常慢
youtube-dl.exe
在Windows Defender设置中添加文件排除项。
我Unable to extract OpenGraph title
在YouTube播放列表上遇到错误
YouTube在2014年3月及以后更改了播放列表格式,因此您至少需要youtube-dl 2014.07.25才能下载所有YouTube视频。
如果您使用包管理器,pip,setup.py或tarball安装了youtube-dl,请使用该包进行更新。请注意,Ubuntu软件包似乎不再更新。由于我们不隶属于Ubuntu,因此我们几乎无能为力。随意报告错误到Ubuntu的包装的人-他们所要做的就是更新包有点最新版本。请参阅上面的更新方法。
尝试使用输出模板时出现错误: error: using output template conflicts with using title, video ID or auto number
请确保您没有使用-o
任何的这些选项-t
,--title
,--id
,-A
或者--auto-number
在命令行或配置文件集。删除后者(如果有)。
我是否总是必须通过-citw
?
默认情况下,youtube-dl会提供最佳选择(顺便说一句,如果您有令人信服的理由认为它们应该有所不同,请提出问题并在其中说明)。因此,从网页复制长选项字符串是不必要的,有时是有害的。特别是,其中唯一-citw
经常有用的选项是-i
。
你能把-b
选项放回去吗?
大多数询问此问题的人都不知道youtube-dl现在默认情况下会下载YouTube报告的最高可用质量,在某些情况下为1080p或720p,因此您不再需要该-b
选项。对于某些特定的视频,也许YouTube不会报告您感兴趣的特定高质量格式的视频。在这种情况下,只需使用-f
选项进行请求,youtube-dl就会尝试下载。
尝试下载视频时出现HTTP错误402。这是什么?
如果下载过多,显然YouTube要求您通过CAPTCHA测试。我们正在考虑提供一种让您解决CAPTCHA的方法,但是目前,您的最佳做法是将网络浏览器指向youtube URL,解决CAPTCHA,然后重新启动youtube-dl。
我还需要其他程序吗?
youtube-dl在大多数网站上都能正常运行。但是,如果要转换视频/音频,则需要avconv或ffmpeg。在某些网站(最著名的是YouTube)上,可以以没有声音的更高质量格式检索视频。youtube-dl将检测是否存在avconv / ffmpeg并自动选择最佳选项。
通过RTMP协议流式传输的视频或视频格式只能在安装rtmpdump时下载。下载MMS和RTSP视频需要安装mplayer或mpv。
我已经下载了视频,但如何播放?
完全下载视频后,请使用任何视频播放器,例如mpv,vlc或mplayer。
我使用提取了一个视频网址-g
,但无法在其他计算机上/在我的网络浏览器中播放。
这很大程度上取决于服务。在许多情况下,对视频的请求(下载/播放)必须来自相同的IP地址,并具有相同的Cookie和/或HTTP标头。使用该--cookies
选项将所需的cookie写入文件,并建议您的下载者从该文件读取cookie。有些网站还要求使用通用用户代理,--dump-user-agent
以查看youtube-dl正在使用的代理。您还可以从通过获得的JSON输出中获取必要的Cookie和HTTP标头--dump-json
。
使用IPv6可能会有所帮助;在某些情况下,限制仅适用于IPv4。某些服务(有时仅针对视频的子集)并不通过IP地址,Cookie或用户代理来限制视频URL,但这是例外,而不是规则。
请记住,某些浏览器不支持某些URL协议,包括RTMP。如果您使用-g
,则您自己的下载器也必须支持它们。
如果要在未运行youtube-dl的计算机上播放视频,则可以中继来自运行youtube-dl的计算机的视频内容。您可以-o -
用来让youtube-dl将视频流式传输到stdout,或者简单地允许播放器依次下载youtube-dl编写的文件。
错误:在视频信息中找不到fmt_url_map或conn信息
YouTube已于2011年7月切换为新的视频信息格式,但旧版本的youtube-dl不支持该格式。有关如何更新youtube-dl的信息,请参见上文。
错误:无法下载视频
自2012年9月起,YouTube需要附加签名,而youtube-dl的旧版本不支持该签名。有关如何更新youtube-dl的信息,请参见上文。
视频网址包含&符,我得到一些奇怪的输出[1] 2839
或'v' is not recognized as an internal or external command
这实际上是您的Shell的输出。由于&符是特殊的Shell字符之一,因此Shell会解释它,从而阻止您将整个URL传递给youtube-dl。要使外壳程序无法解释“与”号(或任何其他特殊字符),您必须将整个URL放在引号中,或者用反斜杠对其进行转义(哪种方法有效取决于您的外壳程序)。
例如,如果您的网址是https://www.youtube.com/watch?t=4&v=BaW_jenozKc,则应该以以下命令结尾:
youtube-dl 'https://www.youtube.com/watch?t=4&v=BaW_jenozKc'
要么
youtube-dl https://www.youtube.com/watch?t=4\&v=BaW_jenozKc
对于Windows,您必须使用双引号:
youtube-dl "https://www.youtube.com/watch?t=4&v=BaW_jenozKc"
ExtractorError:找不到JS函数u’OF’
2015年2月,新版YouTube播放器的字符串中包含一个字符序列,但该字符串被旧版youtube-dl误解了。有关如何更新youtube-dl的信息,请参见上文。
HTTP错误429:请求过多或402:需要付款
这两个错误代码表明该服务由于滥用而阻止了您的IP地址。通常这是一个软块,这意味着您可以在解决验证码后再次获得访问权限。只需打开浏览器并解决验证码,该服务就会提示您,然后将cookie传递给youtube-dl。请注意,如果您的计算机具有多个外部IP,则还应传递用于解决CAPTCHA的IP --source-address
。另外,您可能需要通过传递User-Agent
浏览器的HTTP标头--user-agent
。
如果不是这种情况(服务建议不要提供验证码),则可以联系服务并要求他们取消阻止您的IP地址,或者-如果您已经获取了列入白名单的IP地址,请使用--proxy
或--source-address
选项来选择另一个IP地址。
语法错误:非ASCII字符
错误
File "youtube-dl", line 2
SyntaxError: Non-ASCII character '\x93' ...
表示您使用的是过时的Python版本。请更新至Python 2.6或2.7。
什么是二进制文件?代码哪里去了?
自2012年6月(#342)以来,youtube-dl被打包为可执行zip文件,只需将其解压缩(youtube-dl.zip
在某些系统上可能首先需要重命名)或克隆git存储库即可,如上所述。如果修改代码,则可以通过执行__main__.py
文件来运行它。要重新编译可执行文件,请运行make youtube-dl
。
exe由于丢失而引发错误 MSVCR100.dll
要运行exe,您需要先安装Microsoft Visual C ++ 2010可再发行组件包(x86)。
在Windows上,我应该如何设置ffmpeg和youtube-dl?我应该把exe文件放在哪里?
如果您将youtube-dl和ffmpeg放在要运行命令的目录中,则可以使用该命令,但这非常麻烦。
要使不同的目录(对于ffmpeg或youtube-dl,或同时对这两种目录)起作用,只需创建目录(例如C:\bin
,或C:\Users\<User name>\bin
),直接将所有可执行文件放在其中,然后设置PATH环境变量以包含该目录即可目录。
从那时起,重新启动外壳程序后,无论您位于哪个目录,您都可以通过简单地键入youtube-dl
或来访问youtube-dl和ffmpeg(并且youtube-dl可以找到ffmpeg)ffmpeg
。
如何将下载内容放入特定文件夹?
使用-o
指定的输出模板,例如-o "/home/user/videos/%(title)s-%(id)s.%(ext)s"
。如果您希望所有下载都使用此选项,请将选项放入配置文件中。
如何下载以开头的视频-
?
可以https://www.youtube.com/watch?v=
在ID前面加上ID或将ID与选项分开--
:
youtube-dl -- -wNyEUrxzFU
youtube-dl "https://www.youtube.com/watch?v=-wNyEUrxzFU"
如何将Cookie传递给youtube-dl?
使用--cookies
选项,例如--cookies /path/to/cookies/file.txt
。
为了从浏览器中提取Cookie,请使用任何符合要求的浏览器扩展程序来导出Cookie。例如,cookies.txt(对于Chrome)或cookies.txt(对于Firefox)。
请注意,cookies文件必须为Mozilla / Netscape格式,并且cookie文件的第一行必须为# HTTP Cookie File
或# Netscape HTTP Cookie File
。请确保您有正确的换行格式在饼干或转换新行,如果有必要,以对应你的操作系统,即CRLF
(\r\n
)用于Windows和LF
(\n
)为Unix和类Unix系统(Linux,MacOS的,等等)。HTTP Error 400: Bad Request
使用时,--cookies
表示换行格式无效。
当特定提取程序未明确实现Cookie时,将cookie传递给youtube-dl是解决登录问题的好方法。另一个用例正在解决CAPTCHA的问题,某些网站要求您在特定情况下进行解决才能获得访问权限(例如YouTube,CloudFlare)。
如何直接流媒体播放器?
您首先需要告诉youtube-dl使用来将媒体流式传输到stdout -o -
,还需要告诉媒体播放器从stdin中读取(它必须能够进行流式传输),然后将前者传递到后者。例如,流向vlc可以通过以下方式实现:
youtube-dl -o - "https://www.youtube.com/watch?v=BaW_jenozKcj" | vlc -
如何仅从播放列表下载新视频?
使用下载存档功能。使用此功能,您应该首先下载完整的播放列表,--download-archive /path/to/download/archive/file.txt
该列表会将所有视频的标识符记录在一个特殊文件中。随后的每次相同运行均--download-archive
只会下载新视频,并跳过之前已下载的所有视频。请注意,只有成功的下载记录在文件中。
例如,首先
youtube-dl --download-archive archive.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
将下载完整的PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re
播放列表并创建一个文件archive.txt
。随后的每次运行将仅下载新视频(如果有):
youtube-dl --download-archive archive.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
我应该添加--hls-prefer-native
到我的配置中吗?
youtube-dl检测到HLS视频时,可以使用内置下载器或ffmpeg下载。由于许多HLS流都略微无效,并且ffmpeg / youtube-dl分别处理某些无效情况要比其他情况更好,因此可以根据需要选择切换下载程序。
当youtube-dl知道某个特定的下载程序对于给定的网站效果更好时,就会选择该下载程序。否则,youtube-dl会选择最佳的下载器以实现一般兼容性,而目前恰好是ffmpeg。随着内置下载器和/或ffmpeg的改进,此选择可能会在youtube-dl的未来版本中更改。
特别是,通用提取器(当youtube-dl不在您的网站位于受支持的网站列表中时使用)无法强制使用一个特定的下载器。
如果您将其中一个--hls-prefer-native
或一个--hls-prefer-ffmpeg
放入配置中,则视频的其他子集将无法正确下载。相反,最好提出一个问题或拉取请求,其中详细说明了为什么本机或ffmpeg HLS下载程序是您使用案例的更好选择。
您可以添加对此动漫视频网站或免费显示当前电影的网站的支持吗?
就政策(以及合法性)而言,youtube-dl不包括对专门侵犯版权的服务的支持。根据经验,如果您无法轻易找到可以明显分发该服务的视频(即由创作者,创作者的发行人上传或以免费许可发布的视频),则该服务可能不适合包含在youtube-dl中。
在服务,他们不举办侵权内容,但只是链接到那些谁做的说明,证据表明,服务应该不会纳入YouTube的-DL。当服务的整个首页上都充斥着不允许分发的视频时,对于任何DMCA注释也是如此。如果该服务未经授权就完整显示受版权保护的视频,那么“合理使用”注释同样令人信服。
不过,对于确实购买了分发其内容的权利的服务的支持请求也可以。如有疑问,您可以仅添加提及合法购买内容的来源。
如何加快我的问题的处理速度?
(也称为:帮助,我的重要问题尚未解决!)youtube-dl核心开发人员团队非常小。尽管我们会尽力解决尽可能多的问题,但有时可能需要一段时间。要加快问题的处理速度,可以执行以下操作:
首先,请务必在我们的问题跟踪器中报告问题。这使我们能够协调用户和开发人员的所有努力,并成为一个统一的观点。不幸的是,youtube-dl项目规模太大,无法使用个人电子邮件作为有效的沟通渠道。
请阅读下面的错误报告说明。许多错误缺少所有必要的信息。如果可以,请向youtube-dl开发人员提供代理,VPN或Shell访问权限。如果可以,请在多个国家/地区的多台计算机上测试该问题,以排除本地检查或配置错误问题。
如果没有人对解决您的问题感兴趣,欢迎您自己解决问题并提交请求请求(或强制/支付其他人这样做)。
您随时可以通过写一条小评论(“问题仍然存在于youtube-dl版本中…来自法国,但来自比利时已解决”)来解决问题,但是每个月请不要超过一次。请不要将您的问题声明为important
或urgent
。
如何检测youtube-dl是否支持给定的URL?
首先,查看支持的站点列表。请注意,有时网站可能会更改其网址方案(例如,从https://example.com/video/1234567更改为https://example.com/v/1234567),而youtube-dl报告的网址为该列表中的服务不受支持。在这种情况下,只需报告一个错误。
这是不是可以检测URL是否支持与否。这是因为youtube-dl包含与所有网址匹配的通用提取器。您可能会尝试禁用,排除或删除通用提取器,但是通用提取器不仅允许用户从许多嵌入了其他服务视频的网站中提取视频,而且还可以用于从具有以下功能的服务中提取视频:它托管自己。因此,我们既不建议也不支持禁用,排除或删除通用提取器。
如果要查找是否支持给定的URL,只需使用它调用youtube-dl。如果没有视频返回,则可能是URL未指向视频或不受支持。您可以通过检查输出(如果您在控制台上运行youtube-dl)来发现哪个内容,或者通过UnsupportedError
从Python程序运行它来捕获异常。
为什么在提交错误时需要花那么多繁文red节?
在获得问题模板之前,尽管有大量的错误报告说明,但仍有大约80%的问题报告是无用的,例如,由于人们使用了数百个较旧版本的古老版本,原因是语法简单(不是youtube-dl,而是(通常在shell用法中),因为该问题之前已经多次报告过,因为人们实际上并没有阅读错误消息,即使它说“ please install ffmpeg”,因为人们没有提及他们试图下载的URL,并且许多更简单,易于避免的问题,其中许多问题与youtube-dl完全无关。
youtube-dl是一个开放源代码项目,由很少的志愿者参与,因此我们宁愿花一些时间来修正错误,以便确定那些简单的问题都不适用,并且可以有足够的信心重现该问题,而无需一再问记者。因此,youtube-dl -v YOUR_URL_HERE
提交问题实际上就是全部的输出。问题模板还指导您完成一些基本步骤,例如检查youtube-dl版本是否为最新。
开发人员说明
大多数用户不需要构建youtube-dl,就可以下载构建版本或从发行版本中获取它们。
要将youtube-dl作为开发人员运行,您也无需构建任何内容。只需执行
python -m youtube_dl
要运行测试,只需调用您喜欢的测试运行程序,或直接执行测试文件即可;以下任何一项工作:
python -m unittest discover
python test/test_download.py
nosetests
有关如何运行提取器特定测试用例的信息,请参见新的提取器教程的项目6 。
如果您想自己创建youtube-dl版本,则需要
- python
- make (only GNU make is supported)
- pandoc
- zip
- nosetests
添加对新站点的支持
如果要添加对新站点的支持,请首先确保该站点不是专门针对版权侵权的。youtube-dl不支持此类网站,因此添加对它们的支持的拉取请求将被拒绝。
确保此网站合法分发其内容后,您可以按照以下快速列表进行操作(假设您的服务称为yourextractor
):
- 分叉此存储库
- 使用以下代码检查源代码:
git clone git@github.com:YOUR_GITHUB_USERNAME/youtube-dl.git
- 使用以下命令启动一个新的git分支
cd youtube-dl git checkout -b yourextractor
- 从这个简单的模板开始,并将其保存到
youtube_dl/extractor/yourextractor.py
:# 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': 'https://yourextractor.com/watch/42', '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/common.py) }
- 在中添加导入
youtube_dl/extractor/extractors.py
。 - 运行
python test/test_download.py TestDownload.test_YourExtractor
。起初这应该失败,但是您可以继续重新运行它直到完成。如果您决定添加多个测试,则将其重命名_TEST
为_TESTS
字典列表。然后,测试将被命名为TestDownload.test_YourExtractor
,TestDownload.test_YourExtractor_1
,TestDownload.test_YourExtractor_2
,等注意与测试only_matching
关键测试的字典中没有计算在内。 - 看看
youtube_dl/extractor/common.py
可能的辅助方法,以及提取器应该返回的详细说明。添加任意数量的测试和代码。 - 确保您的代码遵循youtube-dl编码约定,并使用flake8检查代码:
$ flake8 youtube_dl/extractor/yourextractor.py
- 确保您的代码在youtube-dl支持的所有Python版本(即2.6、2.7和3.2+)下都能正常工作。
- 测试通过后,添加新文件并提交它们,并推送结果,如下所示:
$ git add youtube_dl/extractor/extractors.py $ git add youtube_dl/extractor/yourextractor.py $ git commit -m '[yourextractor] Add new extractor' $ git push origin yourextractor
- 最后,创建拉取请求。然后,我们将对其进行审核和合并。
无论如何,非常感谢您的贡献!
youtube-dl编码约定
本节介绍了用于编写惯用的,健壮的和面向未来的提取器代码的指南。
提取程序本质上非常脆弱,因为它们依赖于第三方媒体托管者提供的源数据的布局,而超出了您的控制范围,并且这种布局可能会发生变化。作为提取器实现者,您的任务不仅是编写可以正确提取媒体链接和元数据的代码,而且要最大程度地减少对源布局的依赖性,甚至使代码可以预见潜在的未来变化并为此做好准备。这很重要,因为它将允许提取程序在较小的布局更改时不会中断,从而保持旧的youtube-dl版本正常工作。即使通过发布包含修复程序的新版本youtube-dl可以轻松解决此破损问题,但所有存储库和发行版软件包中的所有先前版本都已损坏,可能无法及时从我们这里获取更新。不用说,
强制和可选元字段
为了使提取工作正常,youtube-dl依赖提取器提取的元数据,并提供给youtube-dl,该字典由信息字典或简单的info dict表示。youtube-dl仅将info dict中的以下元字段视为成功提取过程所必需的:
id
(媒体标识符)title
(媒体标题)url
(媒体下载网址)或formats
实际上,从技术上讲,只有最后一个选项是强制性的(即,如果您无法确定媒体的下载位置,则提取没有任何意义)。但是按照惯例,YouTube的-DL也把id
和title
强制性。因此,上述元字段是关键数据,如果没有,则提取将毫无意义,如果其中任何一个未能提取,则认为提取器已完全损坏。
除上述字段外,任何字段均视为可选字段。这意味着提取应该容忍这些字段的源可能不可用(即使目前始终可用)并且面向未来的情况,以免破坏通用必填字段的提取。
例
假设您有一些meta
通过HTTP请求以JSON格式获取的源字典,并且它具有一个密钥summary
:
meta = self._download_json(url, video_id)
假设此时meta
的布局为:
{
...
"summary": "some fancy summary text",
...
}
假设您要提取summary
并将其放入结果信息字典中description
。由于description
是可选的meta字段,因此您应该准备好该meta
字典中可能缺少此键,以便您可以像以下方式提取它:
description = meta.get('summary') # correct
而不像:
description = meta['summary'] # incorrect
KeyError
如果稍后summary
消失,则后者将中断提取过程,但如果meta
采用前一种方法,则提取将继续进行,并description
设置None
为完全正确(记住None
,等于没有数据)。
同样地,你应该通过fatal=False
从网页提取可选的数据时_search_regex
,_html_search_regex
或类似的方法,例如:
description = self._search_regex(
r'<span[^>]+id="title"[^>]*>([^<]+)<',
webpage, 'description', fatal=False)
随着fatal
设置False
,如果_search_regex
没有提取description
它会发出警告并继续提取。
您还可以通过default=<some fallback value>
,例如:
description = self._search_regex(
r'<span[^>]+id="title"[^>]*>([^<]+)<',
webpage, 'description', default=None)
失败时,此代码将默默地继续description
设置为的提取None
。这对于可能存在或可能不存在的元字段很有用。
提供后备
提取元数据时,请尝试从多个来源进行。例如,如果title
在多个地方都存在,请尝试从其中至少一些中提取。如果某些来源不可用,这将使它更具前瞻性。
例
meta
从上一个示例中说有一个title
,您将要提取它。由于title
是强制性的meta字段,因此您应该以如下形式结束:
title = meta['title']
如果由于托管方方面的某些更改而在将来title
消失,meta
则提取将失败,因为这title
是强制性的。那是意料之中的。
假设您还有其他来源可以提取title
,例如的og:title
HTML元数据webpage
。在这种情况下,您可以提供一个备用方案:
title = meta.get('title') or self._og_search_title(webpage)
此代码将首先尝试从中提取meta
,如果失败,则将尝试og:title
从中提取webpage
。
常用表达
不要捕获不使用的组
捕获组必须表明它已在代码中的某处使用。任何未使用的组都必须不可捕获。
例
不要在此处捕获id属性名称,因为无论如何您都不能使用它。
正确:
r'(?:id|ID)=(?P<id>\d+)'
不正确:
r'(id|ID)=(?P<id>\d+)'
使正则表达式轻松灵活
使用正则表达式时,请尝试将它们写成模糊,宽松和灵活的形式,并跳过那些更可能更改的无关紧要的部分,并允许在单引号和双引号中使用带引号的值,等等。
例
假设您需要title
从以下HTML代码中提取内容:
<span style="position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;" class="title">some fancy title</span>
该任务的代码应类似于:
title = self._search_regex(
r'<span[^>]+class="title"[^>]*>([^<]+)', webpage, 'title')
甚至更好:
title = self._search_regex(
r'<span[^>]+class=(["\'])title\1[^>]*>(?P<title>[^<]+)',
webpage, 'title', group='title')
请注意您如何容忍style
属性值的潜在变化,或者从属性的双引号切换为单引号class
:
该代码绝对不应如下所示:
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')
长线政策
将代码行的长度限制在80个字符以下是一个软限制。这意味着如果可能并且不使可读性和代码维护性更差时,应予以尊重。
例如,您切勿将长字符串文字(如URL或其他一些经常复制的实体)分割成多行以适应此限制:
正确:
'https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'
不正确:
'https://www.youtube.com/watch?v=FqZTN594JQw&list='
'PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'
内联值
提取变量对于减少代码重复和提高复杂表达式的可读性是可以接受的。但是,应避免提取仅使用一次的变量并将其移至提取器文件的相对部分,这将导致读取线性流变得困难。
例
正确:
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')
崩溃后备
多个后备值会很快变得难以处理。通过模式列表将多个后备值折叠为一个表达式。
例
好:
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))
方法支持的模式列表是:_search_regex
,_html_search_regex
,_og_search_property
,_html_search_meta
。
尾括号
始终在最后一个参数后面加上括号。
例
正确:
lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],
list)
不正确:
lambda x: x['ResultSet']['Result'][0]['VideoUrlSet']['VideoUrl'],
list,
)
使用便捷转换和解析功能
从包装所有抽取的数字数据转换成安全功能youtube_dl/utils.py
:int_or_none
,float_or_none
。也可以将它们用于字符串到数字的转换。
使用url_or_none
安全URL处理。
使用try_get
从解析的JSON安全的元数据提取。
使用unified_strdate
均匀upload_date
或任何YYYYMMDD
元现场提取,unified_timestamp
用于统一timestamp
提取,parse_filesize
用于filesize
提取,parse_count
用于计数元字段提取parse_resolution
,parse_duration
用于duration
提取,parse_age_limit
用于age_limit
提取。
探索youtube_dl/utils.py
更多有用的便利功能。
更多例子
从解析的JSON安全地提取可选描述
description = try_get(response, lambda x: x['result']['video'][0]['summary'], compat_str)
安全地提取更多可选的元数据
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
youtube-dl会尽最大努力成为一个好的命令行程序,因此应该可以从任何编程语言中调用。如果您在解析其输出时遇到任何问题,请随时创建报告。
通过Python程序,您可以以更强大的方式嵌入youtube-dl,如下所示:
from __future__ import unicode_literals
import youtube_dl
ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])
您最有可能要使用各种选项。有关可用选项的列表,请参阅youtube_dl/YoutubeDL.py
。首先,如果您想拦截youtube-dl的输出,请设置一个logger
对象。
这是一个更完整的程序示例,该程序仅输出错误(下载完成后会显示一条短消息),并将视频下载/转换为mp3文件:
from __future__ import unicode_literals
import youtube_dl
class MyLogger(object):
def debug(self, msg):
pass
def warning(self, msg):
pass
def error(self, msg):
print(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:
ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])
臭虫
错误和建议应在以下网址报告:https : //github.com/ytdl-org/youtube-dl/issues。除非系统提示您或有其他相关原因(例如GitHub无法接受错误报告),否则请勿通过个人电子邮件发送错误报告。如需讨论,请加入freenode(webchat)上的IRC频道#youtube-dl 。
使用时,请包括youtube-dl的完整输出-v
,即在命令行中添加 -v
标志,复制整个输出,并将其发布在用“`包裹的问题正文中,以获取更好的格式。它看起来应该类似于:
$ youtube-dl -v <your command line>
[debug] System config: []
[debug] User config: []
[debug] Command-line args: [u'-v', u'https://www.youtube.com/watch?v=BaW_jenozKcj']
[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: {}
...
不要发布详细日志的屏幕截图;只接受纯文本。
输出(包括第一行)包含重要的调试信息。没有完整输出的问题通常无法重现,因此即使有可能也无法在短期内得到解决。
请再次重新阅读您的问题,以避免几个常见的错误(您可以并且应该将其用作检查清单):
问题本身的描述是否足够?
我们经常收到我们无法真正破译的问题报告。虽然在大多数情况下,我们在多次询问后最终都能获得所需的信息,但这不必要地浪费了我们的资源。许多贡献者(包括我自己)也不是母语人士,因此我们可能会误读某些部分。
因此,请详细说明您要求的功能或要修复的错误。确保它是显而易见的
- 问题是什么
- 如何解决
- 您提出的解决方案将是什么样子
如果您的报告短于两行,则几乎肯定会漏掉其中的一些行,这使我们很难对此做出回应。我们通常太客气,无法彻底解决问题,但缺少的信息可能会造成误解。作为我自己的提交者,我经常对这些问题感到沮丧,因为我要在这些问题上前进的唯一可能方法就是一遍又一遍地要求澄清。
对于错误报告,这意味着您的报告在带有标记时应包含youtube-dl的完整输出-v
。您收到的(大多数)错误的错误消息甚至是这样,但您不相信我们有多少错误报告不包含此信息。
如果您的服务器具有多个IP,或者您怀疑存在审查制度,那么添加--call-home
诊断可能会是一个好主意。如果错误是ERROR: Unable to extract ...
并且您不能从多个国家/地区复制它,请添加--dump-pages
(警告:这将产生相当大的输出,log.txt
通过添加>log.txt 2>&1
到命令行将其重定向到文件)或在某处.dump
添加时上传得到的文件。--write-pages
网站支持请求必须包含示例URL。网址示例是您可能要下载的网址,例如https://www.youtube.com/watch?v=BaW_jenozKc
。应该有一个明显的视频。除非在非常特殊的情况下,否则视频服务的首页(例如https://www.youtube.com/
)不是示例URL。
您使用的是最新版本吗?
报告任何问题之前,请键入youtube-dl -U
。这应该报告您是最新的。我们收到的报告中约有20%已修复,但是人们使用的是过时的版本。这也适用于功能请求。
该问题是否已记录?
确保没有人打开您要打开的问题。在窗口顶部搜索或浏览此存储库的GitHub Issues。如果存在问题,请随时按照“这也会影响我,2015.01.01版。这里是有关此问题的更多信息:…”的方式编写内容。尽管某些问题可能已经过时,但新的问题通常会刺激快速的活动。
为什么现有的选择还不够?
在请求新功能之前,请快速浏览一下支持的选项列表。许多功能要求是针对实际上已经存在的功能!请,绝对炫耀你的问题报告,并详细已有类似的选项就如何工作不解决您的问题。
您的错误报告中是否有足够的上下文?
人们想解决问题,并常常认为他们通过将较大的问题(例如,希望跳过已下载的文件)分解为特定的请求(例如,要求我们在下载信息页面之前先查看文件是否存在),从而对我们有所帮助。但是,经常发生的情况是,他们将问题分解为两个步骤:一个简单,一个不可能(或极其复杂的一个)。
当原始问题可以更容易解决时,例如通过将下载的视频ID记录在一个单独的文件中,我们将面临一个非常复杂的请求。为避免这种情况,您必须在不明显的地方包含更大的上下文。特别是,每个不包含增加对新站点的支持的功能请求都应包含一个用例场景,该场景说明了在什么情况下缺少的功能将很有用。
问题只涉及一个问题,而仅涉及一个问题吗?
我们的一些用户似乎认为可以或应该解决的问题是有限的。他们可以或应该解决的问题没有限制。能够将您的所有问题转成一张票看起来很吸引人,但这意味着解决您的一个问题的人无法将问题标记为已结束。通常,报告一堆问题会导致故障单持续存在,因为没人想攻击该庞然大物,直到有人将问题分成多个问题为止。
特别是,每个站点支持请求问题仅应与一个站点上的服务有关(通常在一个公共域下,但始终使用相同的后端技术)。请勿在同一期中要求支持vimeo用户视频,白宫播客和Google Plus页面。另外,请确保不要在功能请求旁边发布错误报告。根据经验,功能请求不包括与当前功能不立即相关的youtube-dl输出。不要在请求新视频服务的同时发布网络错误报告。
有人需要此功能吗?
仅发布您(或您可以与自己丧失行为能力的朋友交谈)的功能。不要发布功能,因为它们似乎是个好主意。如果它们确实有用,则需要它们的人会要求它们。
您对youtube-dl有疑问吗?
听起来有些奇怪,但是我们收到的一些错误报告与youtube-dl完全无关,并且与其他甚至报告者自己的应用程序有关。请确保您实际上正在使用youtube-dl。如果您使用的是youtube-dl的用户界面,请将该错误报告给提供该用户界面的实际应用程序的维护者。另一方面,如果您认为youtube-dl的用户界面以某种方式失败,则您一定与youtube-dl有关,请继续并报告该错误。
版权
youtube-dl由版权所有者发布到公共领域。
该自述文件最初由Daniel Bolton编写,并且同样已发布到公共领域。