aboutsummaryrefslogtreecommitdiff
path: root/network
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2023-06-27 00:30:35 -0400
committerWilly Sudiarto Raharjo <willysr@slackbuilds.org>2023-07-08 16:41:57 +0700
commit7c380bcbd85fcf61f3859819964fe016b76ab8ef (patch)
treec46a951101de17c7d1e9c133bc8ad4a659394d95 /network
parent50d1b63bd395ba251e7c49d6f8fb27b293d4a804 (diff)
network/youtube-dl: Install man page and shell completions.
Signed-off-by: B. Watson <urchlay@slackware.uk> Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
Diffstat (limited to 'network')
-rw-r--r--network/youtube-dl/doinst.sh3
-rw-r--r--network/youtube-dl/youtube-dl.12522
-rw-r--r--network/youtube-dl/youtube-dl.SlackBuild30
3 files changed, 2543 insertions, 12 deletions
diff --git a/network/youtube-dl/doinst.sh b/network/youtube-dl/doinst.sh
deleted file mode 100644
index 5fb28930db0b..000000000000
--- a/network/youtube-dl/doinst.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-if [ -x /usr/bin/update-desktop-database ]; then
- /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
-fi
diff --git a/network/youtube-dl/youtube-dl.1 b/network/youtube-dl/youtube-dl.1
new file mode 100644
index 000000000000..9161f3b727dd
--- /dev/null
+++ b/network/youtube-dl/youtube-dl.1
@@ -0,0 +1,2522 @@
+.\" Automatically generated by Pandoc 3.1.3
+.\"
+.\" Define V font for inline verbatim, using C font in formats
+.\" that render this, and otherwise B font.
+.ie "\f[CB]x\f[]"x" \{\
+. ftr V B
+. ftr VI BI
+. ftr VB B
+. ftr VBI BI
+.\}
+.el \{\
+. ftr V CR
+. ftr VI CI
+. ftr VB CB
+. ftr VBI CBI
+.\}
+.TH "YOUTUBE-DL" "1" "" "" ""
+.hy
+.SH NAME
+.PP
+youtube-dl - download videos from youtube.com or other video platforms
+.SH SYNOPSIS
+.PP
+\f[B]youtube-dl\f[R] [OPTIONS] URL [URL\&...]
+.SH DESCRIPTION
+.PP
+\f[B]youtube-dl\f[R] is a command-line program to download videos from
+YouTube.com and a few more sites.
+It requires the Python interpreter, version 2.6, 2.7, or 3.2+, and it is
+not platform specific.
+It should work on your Unix box, on Windows or on macOS.
+It is released to the public domain, which means you can modify it,
+redistribute it or use it however you like.
+.SH OPTIONS
+.TP
+-h, \[en]help
+Print this help text and exit
+.TP
+\[en]version
+Print program version and exit
+.TP
+-U, \[en]update
+Update this program to latest version.
+Make sure that you have sufficient permissions (run with sudo if needed)
+.TP
+-i, \[en]ignore-errors
+Continue on download errors, for example to skip unavailable videos in a
+playlist
+.TP
+\[en]abort-on-error
+Abort downloading of further videos (in the playlist or the command
+line) if an error occurs
+.TP
+\[en]dump-user-agent
+Display the current browser identification
+.TP
+\[en]list-extractors
+List all supported extractors
+.TP
+\[en]extractor-descriptions
+Output descriptions of all supported extractors
+.TP
+\[en]force-generic-extractor
+Force extraction to use the generic extractor
+.TP
+\[en]default-search \f[I]PREFIX\f[R]
+Use this prefix for unqualified URLs.
+For example \[lq]gvsearch2:\[rq] downloads two videos from google videos
+for youtube- dl \[lq]large apple\[rq].
+Use the value \[lq]auto\[rq] to let youtube-dl guess
+(\[lq]auto_warning\[rq] to emit a warning when guessing).
+\[lq]error\[rq] just throws an error.
+The default value \[lq]fixup_error\[rq] repairs broken URLs, but emits
+an error if this is not possible instead of searching.
+.TP
+\[en]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 \[ti]/.config/youtube-dl/config
+(%APPDATA%/youtube-dl/config.txt on Windows)
+.TP
+\[en]config-location \f[I]PATH\f[R]
+Location of the configuration file; either the path to the config or its
+containing directory.
+.TP
+\[en]flat-playlist
+Do not extract the videos of a playlist, only list them.
+.TP
+\[en]mark-watched
+Mark videos watched (YouTube only)
+.TP
+\[en]no-mark-watched
+Do not mark videos watched (YouTube only)
+.TP
+\[en]no-color
+Do not emit color codes in output
+.SS Network Options:
+.TP
+\[en]proxy \f[I]URL\f[R]
+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 (\[en]proxy \[lq]\[lq]) for direct connection
+.TP
+\[en]socket-timeout \f[I]SECONDS\f[R]
+Time to wait before giving up, in seconds
+.TP
+\[en]source-address \f[I]IP\f[R]
+Client-side IP address to bind to
+.TP
+-4, \[en]force-ipv4
+Make all connections via IPv4
+.TP
+-6, \[en]force-ipv6
+Make all connections via IPv6
+.SS Geo Restriction:
+.TP
+\[en]geo-verification-proxy \f[I]URL\f[R]
+Use this proxy to verify the IP address for some geo-restricted sites.
+The default proxy specified by \[en]proxy (or none, if the option is not
+present) is used for the actual downloading.
+.TP
+\[en]geo-bypass
+Bypass geographic restriction via faking X-Forwarded-For HTTP header
+.TP
+\[en]no-geo-bypass
+Do not bypass geographic restriction via faking X-Forwarded-For HTTP
+header
+.TP
+\[en]geo-bypass-country \f[I]CODE\f[R]
+Force bypass geographic restriction with explicitly provided two-letter
+ISO 3166-2 country code
+.TP
+\[en]geo-bypass-ip-block \f[I]IP_BLOCK\f[R]
+Force bypass geographic restriction with explicitly provided IP block in
+CIDR notation
+.SS Video Selection:
+.TP
+\[en]playlist-start \f[I]NUMBER\f[R]
+Playlist video to start at (default is 1)
+.TP
+\[en]playlist-end \f[I]NUMBER\f[R]
+Playlist video to end at (default is last)
+.TP
+\[en]playlist-items \f[I]ITEM_SPEC\f[R]
+Playlist video items to download.
+Specify indices of the videos in the playlist separated by commas like:
+\[lq]\[en] playlist-items 1,2,5,8\[rq] if you want to download videos
+indexed 1, 2, 5, 8 in the playlist.
+You can specify range: \[rq] \[en]playlist-items 1-3,7,10-13\[rq], it
+will download the videos at index 1, 2, 3, 7, 10, 11, 12 and 13.
+.TP
+\[en]match-title \f[I]REGEX\f[R]
+Download only matching titles (regex or caseless sub-string)
+.TP
+\[en]reject-title \f[I]REGEX\f[R]
+Skip download for matching titles (regex or caseless sub-string)
+.TP
+\[en]max-downloads \f[I]NUMBER\f[R]
+Abort after downloading NUMBER files
+.TP
+\[en]min-filesize \f[I]SIZE\f[R]
+Do not download any videos smaller than SIZE (e.g.\ 50k or 44.6m)
+.TP
+\[en]max-filesize \f[I]SIZE\f[R]
+Do not download any videos larger than SIZE (e.g.\ 50k or 44.6m)
+.TP
+\[en]date \f[I]DATE\f[R]
+Download only videos uploaded in this date
+.TP
+\[en]datebefore \f[I]DATE\f[R]
+Download only videos uploaded on or before this date (i.e.\ inclusive)
+.TP
+\[en]dateafter \f[I]DATE\f[R]
+Download only videos uploaded on or after this date (i.e.\ inclusive)
+.TP
+\[en]min-views \f[I]COUNT\f[R]
+Do not download any videos with less than COUNT views
+.TP
+\[en]max-views \f[I]COUNT\f[R]
+Do not download any videos with more than COUNT views
+.TP
+\[en]match-filter \f[I]FILTER\f[R]
+Generic video filter.
+Specify any key (see the \[lq]OUTPUT TEMPLATE\[rq] 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 \[lq]comment_count > 12\[rq], also
+works with >=, <, <=, !=, =) to compare against a number, key =
+`LITERAL' (like \[lq]uploader = `Mike Smith'\[rq], 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 \[en]match-filter \[lq]like_count > 100 & dislike_count <?
+50 & description\[rq] .
+.TP
+\[en]no-playlist
+Download only the video, if the URL refers to a video and a playlist.
+.TP
+\[en]yes-playlist
+Download the playlist, if the URL refers to a video and a playlist.
+.TP
+\[en]age-limit \f[I]YEARS\f[R]
+Download only videos suitable for the given age
+.TP
+\[en]download-archive \f[I]FILE\f[R]
+Download only videos not listed in the archive file.
+Record the IDs of all downloaded videos in it.
+.TP
+\[en]include-ads
+Download advertisements as well (experimental)
+.SS Download Options:
+.TP
+-r, \[en]limit-rate \f[I]RATE\f[R]
+Maximum download rate in bytes per second (e.g.\ 50K or 4.2M)
+.TP
+-R, \[en]retries \f[I]RETRIES\f[R]
+Number of retries (default is 10), or \[lq]infinite\[rq].
+.TP
+\[en]fragment-retries \f[I]RETRIES\f[R]
+Number of retries for a fragment (default is 10), or \[lq]infinite\[rq]
+(DASH, hlsnative and ISM)
+.TP
+\[en]skip-unavailable-fragments
+Skip unavailable fragments (DASH, hlsnative and ISM)
+.TP
+\[en]abort-on-unavailable-fragment
+Abort downloading when some fragment is not available
+.TP
+\[en]keep-fragments
+Keep downloaded fragments on disk after downloading is finished;
+fragments are erased by default
+.TP
+\[en]buffer-size \f[I]SIZE\f[R]
+Size of download buffer (e.g.\ 1024 or 16K) (default is 1024)
+.TP
+\[en]no-resize-buffer
+Do not automatically adjust the buffer size.
+By default, the buffer size is automatically resized from an initial
+value of SIZE.
+.TP
+\[en]http-chunk-size \f[I]SIZE\f[R]
+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)
+.TP
+\[en]playlist-reverse
+Download playlist videos in reverse order
+.TP
+\[en]playlist-random
+Download playlist videos in random order
+.TP
+\[en]xattr-set-filesize
+Set file xattribute ytdl.filesize with expected file size
+.TP
+\[en]hls-prefer-native
+Use the native HLS downloader instead of ffmpeg
+.TP
+\[en]hls-prefer-ffmpeg
+Use ffmpeg instead of the native HLS downloader
+.TP
+\[en]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)
+.TP
+\[en]external-downloader \f[I]COMMAND\f[R]
+Use the specified external downloader.
+Currently supports aria2c,avconv,axel,c url,ffmpeg,httpie,wget
+.TP
+\[en]external-downloader-args \f[I]ARGS\f[R]
+Give these arguments to the external downloader
+.SS Filesystem Options:
+.TP
+-a, \[en]batch-file \f[I]FILE\f[R]
+File containing URLs to download (`-' for stdin), one URL per line.
+Lines starting with `#', `;' or `]' are considered as comments and
+ignored.
+.TP
+\[en]id
+Use only video ID in file name
+.TP
+-o, \[en]output \f[I]TEMPLATE\f[R]
+Output filename template, see the \[lq]OUTPUT TEMPLATE\[rq] for all the
+info
+.TP
+\[en]output-na-placeholder \f[I]PLACEHOLDER\f[R]
+Placeholder value for unavailable meta fields in output filename
+template (default is \[lq]NA\[rq])
+.TP
+\[en]autonumber-start \f[I]NUMBER\f[R]
+Specify the start value for %(autonumber)s (default is 1)
+.TP
+\[en]restrict-filenames
+Restrict filenames to only ASCII characters, and avoid \[lq]&\[rq] and
+spaces in filenames
+.TP
+-w, \[en]no-overwrites
+Do not overwrite files
+.TP
+-c, \[en]continue
+Force resume of partially downloaded files.
+By default, youtube-dl will resume downloads if possible.
+.TP
+\[en]no-continue
+Do not resume partially downloaded files (restart from beginning)
+.TP
+\[en]no-part
+Do not use .part files - write directly into output file
+.TP
+\[en]no-mtime
+Do not use the Last-modified header to set the file modification time
+.TP
+\[en]write-description
+Write video description to a .description file
+.TP
+\[en]write-info-json
+Write video metadata to a .info.json file
+.TP
+\[en]write-annotations
+Write video annotations to a .annotations.xml file
+.TP
+\[en]load-info-json \f[I]FILE\f[R]
+JSON file containing the video information (created with the
+\[lq]\[en]write- info-json\[rq] option)
+.TP
+\[en]cookies \f[I]FILE\f[R]
+File to read cookies from and dump cookie jar in
+.TP
+\[en]cache-dir \f[I]DIR\f[R]
+Location in the filesystem where youtube-dl can store some downloaded
+information permanently.
+By default $XDG_CACHE_HOME/youtube-dl or \[ti]/.cache/youtube-dl .
+At the moment, only YouTube player files (for videos with obfuscated
+signatures) are cached, but that may change.
+.TP
+\[en]no-cache-dir
+Disable filesystem caching
+.TP
+\[en]rm-cache-dir
+Delete all filesystem cache files
+.SS Thumbnail Options:
+.TP
+\[en]write-thumbnail
+Write thumbnail image to disk
+.TP
+\[en]write-all-thumbnails
+Write all thumbnail image formats to disk
+.TP
+\[en]list-thumbnails
+Simulate and list all available thumbnail formats
+.SS Verbosity / Simulation Options:
+.TP
+-q, \[en]quiet
+Activate quiet mode
+.TP
+\[en]no-warnings
+Ignore warnings
+.TP
+-s, \[en]simulate
+Do not download the video and do not write anything to disk
+.TP
+\[en]skip-download
+Do not download the video
+.TP
+-g, \[en]get-url
+Simulate, quiet but print URL
+.TP
+-e, \[en]get-title
+Simulate, quiet but print title
+.TP
+\[en]get-id
+Simulate, quiet but print id
+.TP
+\[en]get-thumbnail
+Simulate, quiet but print thumbnail URL
+.TP
+\[en]get-description
+Simulate, quiet but print video description
+.TP
+\[en]get-duration
+Simulate, quiet but print video length
+.TP
+\[en]get-filename
+Simulate, quiet but print output filename
+.TP
+\[en]get-format
+Simulate, quiet but print output format
+.TP
+-j, \[en]dump-json
+Simulate, quiet but print JSON information.
+See the \[lq]OUTPUT TEMPLATE\[rq] for a description of available keys.
+.TP
+-J, \[en]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.
+.TP
+\[en]print-json
+Be quiet and print the video information as JSON (video is still being
+downloaded).
+.TP
+\[en]newline
+Output progress bar as new lines
+.TP
+\[en]no-progress
+Do not print progress bar
+.TP
+\[en]console-title
+Display progress in console titlebar
+.TP
+-v, \[en]verbose
+Print various debugging information
+.TP
+\[en]dump-pages
+Print downloaded pages encoded using base64 to debug problems (very
+verbose)
+.TP
+\[en]write-pages
+Write downloaded intermediary pages to files in the current directory to
+debug problems
+.TP
+\[en]print-traffic
+Display sent and read HTTP traffic
+.TP
+-C, \[en]call-home
+Contact the youtube-dl server for debugging
+.TP
+\[en]no-call-home
+Do NOT contact the youtube-dl server for debugging
+.SS Workarounds:
+.TP
+\[en]encoding \f[I]ENCODING\f[R]
+Force the specified encoding (experimental)
+.TP
+\[en]no-check-certificate
+Suppress HTTPS certificate validation
+.TP
+\[en]prefer-insecure
+Use an unencrypted connection to retrieve information about the video.
+(Currently supported only for YouTube)
+.TP
+\[en]user-agent \f[I]UA\f[R]
+Specify a custom user agent
+.TP
+\[en]referer \f[I]URL\f[R]
+Specify a custom referer, use if the video access is restricted to one
+domain
+.TP
+\[en]add-header \f[I]FIELD:VALUE\f[R]
+Specify a custom HTTP header and its value, separated by a colon `:'.
+You can use this option multiple times
+.TP
+\[en]bidi-workaround
+Work around terminals that lack bidirectional text support.
+Requires bidiv or fribidi executable in PATH
+.TP
+\[en]sleep-interval \f[I]SECONDS\f[R]
+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
+\[en]max-sleep-interval.
+.TP
+\[en]max-sleep-interval \f[I]SECONDS\f[R]
+Upper bound of a range for randomized sleep before each download
+(maximum possible number of seconds to sleep).
+Must only be used along with \[en]min- sleep-interval.
+.SS Video Format Options:
+.TP
+-f, \[en]format \f[I]FORMAT\f[R]
+Video format code, see the \[lq]FORMAT SELECTION\[rq] for all the info
+.TP
+\[en]all-formats
+Download all available video formats
+.TP
+\[en]prefer-free-formats
+Prefer free video formats unless a specific one is requested
+.TP
+-F, \[en]list-formats
+List all available formats of requested videos
+.TP
+\[en]youtube-skip-dash-manifest
+Do not download the DASH manifests and related data on YouTube videos
+.TP
+\[en]merge-output-format \f[I]FORMAT\f[R]
+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
+.SS Subtitle Options:
+.TP
+\[en]write-sub
+Write subtitle file
+.TP
+\[en]write-auto-sub
+Write automatically generated subtitle file (YouTube only)
+.TP
+\[en]all-subs
+Download all the available subtitles of the video
+.TP
+\[en]list-subs
+List all available subtitles for the video
+.TP
+\[en]sub-format \f[I]FORMAT\f[R]
+Subtitle format, accepts formats preference, for example: \[lq]srt\[rq]
+or \[lq]ass/srt/best\[rq]
+.TP
+\[en]sub-lang \f[I]LANGS\f[R]
+Languages of the subtitles to download (optional) separated by commas,
+use \[en]list-subs for available language tags
+.SS Authentication Options:
+.TP
+-u, \[en]username \f[I]USERNAME\f[R]
+Login with this account ID
+.TP
+-p, \[en]password \f[I]PASSWORD\f[R]
+Account password.
+If this option is left out, youtube-dl will ask interactively.
+.TP
+-2, \[en]twofactor \f[I]TWOFACTOR\f[R]
+Two-factor authentication code
+.TP
+-n, \[en]netrc
+Use .netrc authentication data
+.TP
+\[en]video-password \f[I]PASSWORD\f[R]
+Video password (vimeo, youku)
+.SS Adobe Pass Options:
+.TP
+\[en]ap-mso \f[I]MSO\f[R]
+Adobe Pass multiple-system operator (TV provider) identifier, use
+\[en]ap-list-mso for a list of available MSOs
+.TP
+\[en]ap-username \f[I]USERNAME\f[R]
+Multiple-system operator account login
+.TP
+\[en]ap-password \f[I]PASSWORD\f[R]
+Multiple-system operator account password.
+If this option is left out, youtube-dl will ask interactively.
+.TP
+\[en]ap-list-mso
+List all supported multiple-system operators
+.SS Post-processing Options:
+.TP
+-x, \[en]extract-audio
+Convert video files to audio-only files (requires ffmpeg/avconv and
+ffprobe/avprobe)
+.TP
+\[en]audio-format \f[I]FORMAT\f[R]
+Specify audio format: \[lq]best\[rq], \[lq]aac\[rq], \[lq]flac\[rq],
+\[lq]mp3\[rq], \[lq]m4a\[rq], \[lq]opus\[rq], \[lq]vorbis\[rq], or
+\[lq]wav\[rq]; \[lq]best\[rq] by default; No effect without -x
+.TP
+\[en]audio-quality \f[I]QUALITY\f[R]
+Specify ffmpeg/avconv audio quality, insert a value between 0 (better)
+and 9 (worse) for VBR or a specific bitrate like 128K (default 5)
+.TP
+\[en]recode-video \f[I]FORMAT\f[R]
+Encode the video to another format if necessary (currently supported:
+mp4|flv|ogg|webm|mkv|avi)
+.TP
+\[en]postprocessor-args \f[I]ARGS\f[R]
+Give these arguments to the postprocessor
+.TP
+-k, \[en]keep-video
+Keep the video file on disk after the post-processing; the video is
+erased by default
+.TP
+\[en]no-post-overwrites
+Do not overwrite post-processed files; the post-processed files are
+overwritten by default
+.TP
+\[en]embed-subs
+Embed subtitles in the video (only for mp4, webm and mkv videos)
+.TP
+\[en]embed-thumbnail
+Embed thumbnail in the audio as cover art
+.TP
+\[en]add-metadata
+Write metadata to the video file
+.TP
+\[en]metadata-from-title \f[I]FORMAT\f[R]
+Parse additional metadata like song title / artist from the video title.
+The format syntax is the same as \[en]output.
+Regular expression with named capture groups may also be used.
+The parsed parameters replace existing values.
+Example: \[en]metadata-from-title \[lq]%(artist)s - %(title)s\[rq]
+matches a title like \[lq]Coldplay - Paradise\[rq].
+Example (regex): \[en]metadata-from-title \[lq](?P.+?)
+- (?P
+.RS
+\&.+)\[rq]
+.RE
+.TP
+\[en]xattrs
+Write metadata to the video file\[cq]s xattrs (using dublin core and xdg
+standards)
+.TP
+\[en]fixup \f[I]POLICY\f[R]
+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)
+.TP
+\[en]prefer-avconv
+Prefer avconv over ffmpeg for running the postprocessors
+.TP
+\[en]prefer-ffmpeg
+Prefer ffmpeg over avconv for running the postprocessors (default)
+.TP
+\[en]ffmpeg-location \f[I]PATH\f[R]
+Location of the ffmpeg/avconv binary; either the path to the binary or
+its containing directory.
+.TP
+\[en]exec \f[I]CMD\f[R]
+Execute a command on the file after downloading and post-processing,
+similar to find\[cq]s -exec syntax.
+Example: \[en]exec `adb push {} /sdcard/Music/ && rm {}'
+.TP
+\[en]convert-subs \f[I]FORMAT\f[R]
+Convert the subtitles to other format (currently supported:
+srt|ass|vtt|lrc)
+.SH CONFIGURATION
+.PP
+You can configure youtube-dl by placing any supported command line
+option to a configuration file.
+On Linux and macOS, the system wide configuration file is located at
+\f[V]/etc/youtube-dl.conf\f[R] and the user wide configuration file at
+\f[V]\[ti]/.config/youtube-dl/config\f[R].
+On Windows, the user wide configuration file locations are
+\f[V]%APPDATA%\[rs]youtube-dl\[rs]config.txt\f[R] or
+\f[V]C:\[rs]Users\[rs]<user name>\[rs]youtube-dl.conf\f[R].
+Note that by default configuration file may not exist so you may need to
+create it yourself.
+.PP
+For example, with the following configuration file youtube-dl will
+always extract the audio, not copy the mtime, use a proxy and save all
+videos under \f[V]Movies\f[R] directory in your home directory:
+.IP
+.nf
+\f[C]
+# 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 \[ti]/Movies/%(title)s.%(ext)s
+\f[R]
+.fi
+.PP
+Note that options in configuration file are just the same options aka
+switches used in regular command line calls thus there \f[B]must be no
+whitespace\f[R] after \f[V]-\f[R] or \f[V]--\f[R], e.g.\ \f[V]-o\f[R] or
+\f[V]--proxy\f[R] but not \f[V]- o\f[R] or \f[V]-- proxy\f[R].
+.PP
+You can use \f[V]--ignore-config\f[R] if you want to disable the
+configuration file for a particular youtube-dl run.
+.PP
+You can also use \f[V]--config-location\f[R] if you want to use custom
+configuration file for a particular youtube-dl run.
+.SS Authentication with \f[V].netrc\f[R] file
+.PP
+You may also want to configure automatic credentials storage for
+extractors that support authentication (by providing login and password
+with \f[V]--username\f[R] and \f[V]--password\f[R]) in order not to pass
+credentials as command line arguments on every youtube-dl execution and
+prevent tracking plain text passwords in the shell command history.
+You can achieve this using a \f[V].netrc\f[R]
+file (https://stackoverflow.com/tags/.netrc/info) on a per extractor
+basis.
+For that you will need to create a \f[V].netrc\f[R] file in your
+\f[V]$HOME\f[R] and restrict permissions to read/write by only you:
+.IP
+.nf
+\f[C]
+touch $HOME/.netrc
+chmod a-rwx,u+rw $HOME/.netrc
+\f[R]
+.fi
+.PP
+After that you can add credentials for an extractor in the following
+format, where \f[I]extractor\f[R] is the name of the extractor in
+lowercase:
+.IP
+.nf
+\f[C]
+machine <extractor> login <login> password <password>
+\f[R]
+.fi
+.PP
+For example:
+.IP
+.nf
+\f[C]
+machine youtube login myaccount\[at]gmail.com password my_youtube_password
+machine twitch login my_twitch_account_name password my_twitch_password
+\f[R]
+.fi
+.PP
+To activate authentication with the \f[V].netrc\f[R] file you should
+pass \f[V]--netrc\f[R] to youtube-dl or place it in the configuration
+file.
+.PP
+On Windows you may also need to setup the \f[V]%HOME%\f[R] environment
+variable manually.
+For example:
+.IP
+.nf
+\f[C]
+set HOME=%USERPROFILE%
+\f[R]
+.fi
+.SH OUTPUT TEMPLATE
+.PP
+The \f[V]-o\f[R] option allows users to indicate a template for the
+output file names.
+.PP
+\f[B]tl;dr:\f[R] navigate me to examples.
+.PP
+The basic usage is not to set any template arguments when downloading a
+single file, like in
+\f[V]youtube-dl -o funny_video.flv \[dq]https://some/video\[dq]\f[R].
+However, it may contain special sequences that will be replaced when
+downloading each video.
+The special sequences may be formatted according to python string
+formatting
+operations (https://docs.python.org/2/library/stdtypes.html#string-formatting).
+For example, \f[V]%(NAME)s\f[R] or \f[V]%(NAME)05d\f[R].
+To clarify, that is a percent symbol followed by a name in parentheses,
+followed by formatting operations.
+Allowed names along with sequence type are:
+.IP \[bu] 2
+\f[V]id\f[R] (string): Video identifier
+.IP \[bu] 2
+\f[V]title\f[R] (string): Video title
+.IP \[bu] 2
+\f[V]url\f[R] (string): Video URL
+.IP \[bu] 2
+\f[V]ext\f[R] (string): Video filename extension
+.IP \[bu] 2
+\f[V]alt_title\f[R] (string): A secondary title of the video
+.IP \[bu] 2
+\f[V]display_id\f[R] (string): An alternative identifier for the video
+.IP \[bu] 2
+\f[V]uploader\f[R] (string): Full name of the video uploader
+.IP \[bu] 2
+\f[V]license\f[R] (string): License name the video is licensed under
+.IP \[bu] 2
+\f[V]creator\f[R] (string): The creator of the video
+.IP \[bu] 2
+\f[V]release_date\f[R] (string): The date (YYYYMMDD) when the video was
+released
+.IP \[bu] 2
+\f[V]timestamp\f[R] (numeric): UNIX timestamp of the moment the video
+became available
+.IP \[bu] 2
+\f[V]upload_date\f[R] (string): Video upload date (YYYYMMDD)
+.IP \[bu] 2
+\f[V]uploader_id\f[R] (string): Nickname or id of the video uploader
+.IP \[bu] 2
+\f[V]channel\f[R] (string): Full name of the channel the video is
+uploaded on
+.IP \[bu] 2
+\f[V]channel_id\f[R] (string): Id of the channel
+.IP \[bu] 2
+\f[V]location\f[R] (string): Physical location where the video was
+filmed
+.IP \[bu] 2
+\f[V]duration\f[R] (numeric): Length of the video in seconds
+.IP \[bu] 2
+\f[V]view_count\f[R] (numeric): How many users have watched the video on
+the platform
+.IP \[bu] 2
+\f[V]like_count\f[R] (numeric): Number of positive ratings of the video
+.IP \[bu] 2
+\f[V]dislike_count\f[R] (numeric): Number of negative ratings of the
+video
+.IP \[bu] 2
+\f[V]repost_count\f[R] (numeric): Number of reposts of the video
+.IP \[bu] 2
+\f[V]average_rating\f[R] (numeric): Average rating give by users, the
+scale used depends on the webpage
+.IP \[bu] 2
+\f[V]comment_count\f[R] (numeric): Number of comments on the video
+.IP \[bu] 2
+\f[V]age_limit\f[R] (numeric): Age restriction for the video (years)
+.IP \[bu] 2
+\f[V]is_live\f[R] (boolean): Whether this video is a live stream or a
+fixed-length video
+.IP \[bu] 2
+\f[V]start_time\f[R] (numeric): Time in seconds where the reproduction
+should start, as specified in the URL
+.IP \[bu] 2
+\f[V]end_time\f[R] (numeric): Time in seconds where the reproduction
+should end, as specified in the URL
+.IP \[bu] 2
+\f[V]format\f[R] (string): A human-readable description of the format
+.IP \[bu] 2
+\f[V]format_id\f[R] (string): Format code specified by
+\f[V]--format\f[R]
+.IP \[bu] 2
+\f[V]format_note\f[R] (string): Additional info about the format
+.IP \[bu] 2
+\f[V]width\f[R] (numeric): Width of the video
+.IP \[bu] 2
+\f[V]height\f[R] (numeric): Height of the video
+.IP \[bu] 2
+\f[V]resolution\f[R] (string): Textual description of width and height
+.IP \[bu] 2
+\f[V]tbr\f[R] (numeric): Average bitrate of audio and video in KBit/s
+.IP \[bu] 2
+\f[V]abr\f[R] (numeric): Average audio bitrate in KBit/s
+.IP \[bu] 2
+\f[V]acodec\f[R] (string): Name of the audio codec in use
+.IP \[bu] 2
+\f[V]asr\f[R] (numeric): Audio sampling rate in Hertz
+.IP \[bu] 2
+\f[V]vbr\f[R] (numeric): Average video bitrate in KBit/s
+.IP \[bu] 2
+\f[V]fps\f[R] (numeric): Frame rate
+.IP \[bu] 2
+\f[V]vcodec\f[R] (string): Name of the video codec in use
+.IP \[bu] 2
+\f[V]container\f[R] (string): Name of the container format
+.IP \[bu] 2
+\f[V]filesize\f[R] (numeric): The number of bytes, if known in advance
+.IP \[bu] 2
+\f[V]filesize_approx\f[R] (numeric): An estimate for the number of bytes
+.IP \[bu] 2
+\f[V]protocol\f[R] (string): The protocol that will be used for the
+actual download
+.IP \[bu] 2
+\f[V]extractor\f[R] (string): Name of the extractor
+.IP \[bu] 2
+\f[V]extractor_key\f[R] (string): Key name of the extractor
+.IP \[bu] 2
+\f[V]epoch\f[R] (numeric): Unix epoch when creating the file
+.IP \[bu] 2
+\f[V]autonumber\f[R] (numeric): Number that will be increased with each
+download, starting at \f[V]--autonumber-start\f[R]
+.IP \[bu] 2
+\f[V]playlist\f[R] (string): Name or id of the playlist that contains
+the video
+.IP \[bu] 2
+\f[V]playlist_index\f[R] (numeric): Index of the video in the playlist
+padded with leading zeros according to the total length of the playlist
+.IP \[bu] 2
+\f[V]playlist_id\f[R] (string): Playlist identifier
+.IP \[bu] 2
+\f[V]playlist_title\f[R] (string): Playlist title
+.IP \[bu] 2
+\f[V]playlist_uploader\f[R] (string): Full name of the playlist uploader
+.IP \[bu] 2
+\f[V]playlist_uploader_id\f[R] (string): Nickname or id of the playlist
+uploader
+.PP
+Available for the video that belongs to some logical chapter or section:
+.IP \[bu] 2
+\f[V]chapter\f[R] (string): Name or title of the chapter the video
+belongs to
+.IP \[bu] 2
+\f[V]chapter_number\f[R] (numeric): Number of the chapter the video
+belongs to
+.IP \[bu] 2
+\f[V]chapter_id\f[R] (string): Id of the chapter the video belongs to
+.PP
+Available for the video that is an episode of some series or programme:
+.IP \[bu] 2
+\f[V]series\f[R] (string): Title of the series or programme the video
+episode belongs to
+.IP \[bu] 2
+\f[V]season\f[R] (string): Title of the season the video episode belongs
+to
+.IP \[bu] 2
+\f[V]season_number\f[R] (numeric): Number of the season the video
+episode belongs to
+.IP \[bu] 2
+\f[V]season_id\f[R] (string): Id of the season the video episode belongs
+to
+.IP \[bu] 2
+\f[V]episode\f[R] (string): Title of the video episode
+.IP \[bu] 2
+\f[V]episode_number\f[R] (numeric): Number of the video episode within a
+season
+.IP \[bu] 2
+\f[V]episode_id\f[R] (string): Id of the video episode
+.PP
+Available for the media that is a track or a part of a music album:
+.IP \[bu] 2
+\f[V]track\f[R] (string): Title of the track
+.IP \[bu] 2
+\f[V]track_number\f[R] (numeric): Number of the track within an album or
+a disc
+.IP \[bu] 2
+\f[V]track_id\f[R] (string): Id of the track
+.IP \[bu] 2
+\f[V]artist\f[R] (string): Artist(s) of the track
+.IP \[bu] 2
+\f[V]genre\f[R] (string): Genre(s) of the track
+.IP \[bu] 2
+\f[V]album\f[R] (string): Title of the album the track belongs to
+.IP \[bu] 2
+\f[V]album_type\f[R] (string): Type of the album
+.IP \[bu] 2
+\f[V]album_artist\f[R] (string): List of all artists appeared on the
+album
+.IP \[bu] 2
+\f[V]disc_number\f[R] (numeric): Number of the disc or other physical
+medium the track belongs to
+.IP \[bu] 2
+\f[V]release_year\f[R] (numeric): Year (YYYY) when the album was
+released
+.PP
+Each aforementioned sequence when referenced in an output template will
+be replaced by the actual value corresponding to the sequence name.
+Note that some of the sequences are not guaranteed to be present since
+they depend on the metadata obtained by a particular extractor.
+Such sequences will be replaced with placeholder value provided with
+\f[V]--output-na-placeholder\f[R] (\f[V]NA\f[R] by default).
+.PP
+For example for \f[V]-o %(title)s-%(id)s.%(ext)s\f[R] and an mp4 video
+with title \f[V]youtube-dl test video\f[R] and id
+\f[V]BaW_jenozKcj\f[R], this will result in a
+\f[V]youtube-dl test video-BaW_jenozKcj.mp4\f[R] file created in the
+current directory.
+.PP
+For numeric sequences you can use numeric related formatting, for
+example, \f[V]%(view_count)05d\f[R] will result in a string with view
+count padded with zeros up to 5 characters, like in \f[V]00042\f[R].
+.PP
+Output templates can also contain arbitrary hierarchical path,
+e.g.\ \f[V]-o \[aq]%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s\[aq]\f[R]
+which will result in downloading each video in a directory corresponding
+to this path template.
+Any missing directory will be automatically created for you.
+.PP
+To use percent literals in an output template use \f[V]%%\f[R].
+To output to stdout use \f[V]-o -\f[R].
+.PP
+The current default template is \f[V]%(title)s-%(id)s.%(ext)s\f[R].
+.PP
+In some cases, you don\[cq]t want special characters such as 中, spaces,
+or &, such as when transferring the downloaded filename to a Windows
+system or the filename through an 8bit-unsafe channel.
+In these cases, add the \f[V]--restrict-filenames\f[R] flag to get a
+shorter title.
+.SS Output template and Windows batch files
+.PP
+If you are using an output template inside a Windows batch file then you
+must escape plain percent characters (\f[V]%\f[R]) by doubling, so that
+\f[V]-o \[dq]%(title)s-%(id)s.%(ext)s\[dq]\f[R] should become
+\f[V]-o \[dq]%%(title)s-%%(id)s.%%(ext)s\[dq]\f[R].
+However you should not touch \f[V]%\f[R]\[cq]s that are not plain
+characters, e.g.\ environment variables for expansion should stay
+intact:
+\f[V]-o \[dq]C:\[rs]%HOMEPATH%\[rs]Desktop\[rs]%%(title)s.%%(ext)s\[dq]\f[R].
+.SS Output template examples
+.PP
+Note that on Windows you may need to use double quotes instead of
+single.
+.IP
+.nf
+\f[C]
+$ youtube-dl --get-filename -o \[aq]%(title)s.%(ext)s\[aq] BaW_jenozKc
+youtube-dl test video \[aq]\[aq]_ä↭𝕐.mp4 # All kinds of weird characters
+
+$ youtube-dl --get-filename -o \[aq]%(title)s.%(ext)s\[aq] 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 \[aq]%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s\[aq] https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re
+
+# Download all playlists of YouTube channel/user keeping each playlist in separate directory:
+$ youtube-dl -o \[aq]%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s\[aq] 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 \[aq]\[ti]/MyVideos/%(playlist)s/%(chapter_number)s - %(chapter)s/%(title)s.%(ext)s\[aq] 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 \[dq]C:/MyVideos/%(series)s/%(season_number)s - %(season)s/%(episode_number)s - %(episode)s.%(ext)s\[dq] https://videomore.ru/kino_v_detalayah/5_sezon/367617
+
+# Stream the video being downloaded to stdout
+$ youtube-dl -o - BaW_jenozKc
+\f[R]
+.fi
+.SH FORMAT SELECTION
+.PP
+By default youtube-dl tries to download the best available quality,
+i.e.\ if you want the best quality you \f[B]don\[cq]t need\f[R] to pass
+any special options, youtube-dl will guess it for you by
+\f[B]default\f[R].
+.PP
+But sometimes you may want to download in a different format, for
+example when you are on a slow or intermittent connection.
+The key mechanism for achieving this is so-called \f[I]format
+selection\f[R] based on which you can explicitly specify desired format,
+select formats based on some criterion or criteria, setup precedence and
+much more.
+.PP
+The general syntax for format selection is \f[V]--format FORMAT\f[R] or
+shorter \f[V]-f FORMAT\f[R] where \f[V]FORMAT\f[R] is a \f[I]selector
+expression\f[R], i.e.\ an expression that describes format or formats
+you would like to download.
+.PP
+\f[B]tl;dr:\f[R] navigate me to examples.
+.PP
+The simplest case is requesting a specific format, for example with
+\f[V]-f 22\f[R] you can download the format with format code equal to
+22.
+You can get the list of available format codes for particular video
+using \f[V]--list-formats\f[R] or \f[V]-F\f[R].
+Note that these format codes are extractor specific.
+.PP
+You can also use a file extension (currently \f[V]3gp\f[R],
+\f[V]aac\f[R], \f[V]flv\f[R], \f[V]m4a\f[R], \f[V]mp3\f[R],
+\f[V]mp4\f[R], \f[V]ogg\f[R], \f[V]wav\f[R], \f[V]webm\f[R] are
+supported) to download the best quality format of a particular file
+extension served as a single file, e.g.\ \f[V]-f webm\f[R] will download
+the best quality format with the \f[V]webm\f[R] extension served as a
+single file.
+.PP
+You can also use special names to select particular edge case formats:
+.IP \[bu] 2
+\f[V]best\f[R]: Select the best quality format represented by a single
+file with video and audio.
+.IP \[bu] 2
+\f[V]worst\f[R]: Select the worst quality format represented by a single
+file with video and audio.
+.IP \[bu] 2
+\f[V]bestvideo\f[R]: Select the best quality video-only format
+(e.g.\ DASH video).
+May not be available.
+.IP \[bu] 2
+\f[V]worstvideo\f[R]: Select the worst quality video-only format.
+May not be available.
+.IP \[bu] 2
+\f[V]bestaudio\f[R]: Select the best quality audio only-format.
+May not be available.
+.IP \[bu] 2
+\f[V]worstaudio\f[R]: Select the worst quality audio only-format.
+May not be available.
+.PP
+For example, to download the worst quality video-only format you can use
+\f[V]-f worstvideo\f[R].
+.PP
+If you want to download multiple videos and they don\[cq]t have the same
+formats available, you can specify the order of preference using
+slashes.
+Note that slash is left-associative, i.e.\ formats on the left hand side
+are preferred, for example \f[V]-f 22/17/18\f[R] will download format 22
+if it\[cq]s available, otherwise it will download format 17 if it\[cq]s
+available, otherwise it will download format 18 if it\[cq]s available,
+otherwise it will complain that no suitable formats are available for
+download.
+.PP
+If you want to download several formats of the same video use a comma as
+a separator, e.g.\ \f[V]-f 22,17,18\f[R] will download all these three
+formats, of course if they are available.
+Or a more sophisticated example combined with the precedence feature:
+\f[V]-f 136/137/mp4/bestvideo,140/m4a/bestaudio\f[R].
+.PP
+You can also filter the video formats by putting a condition in
+brackets, as in \f[V]-f \[dq]best[height=720]\[dq]\f[R] (or
+\f[V]-f \[dq][filesize>10M]\[dq]\f[R]).
+.PP
+The following numeric meta fields can be used with comparisons
+\f[V]<\f[R], \f[V]<=\f[R], \f[V]>\f[R], \f[V]>=\f[R], \f[V]=\f[R]
+(equals), \f[V]!=\f[R] (not equals):
+.IP \[bu] 2
+\f[V]filesize\f[R]: The number of bytes, if known in advance
+.IP \[bu] 2
+\f[V]width\f[R]: Width of the video, if known
+.IP \[bu] 2
+\f[V]height\f[R]: Height of the video, if known
+.IP \[bu] 2
+\f[V]tbr\f[R]: Average bitrate of audio and video in KBit/s
+.IP \[bu] 2
+\f[V]abr\f[R]: Average audio bitrate in KBit/s
+.IP \[bu] 2
+\f[V]vbr\f[R]: Average video bitrate in KBit/s
+.IP \[bu] 2
+\f[V]asr\f[R]: Audio sampling rate in Hertz
+.IP \[bu] 2
+\f[V]fps\f[R]: Frame rate
+.PP
+Also filtering work for comparisons \f[V]=\f[R] (equals),
+\f[V]\[ha]=\f[R] (starts with), \f[V]$=\f[R] (ends with), \f[V]*=\f[R]
+(contains) and following string meta fields:
+.IP \[bu] 2
+\f[V]ext\f[R]: File extension
+.IP \[bu] 2
+\f[V]acodec\f[R]: Name of the audio codec in use
+.IP \[bu] 2
+\f[V]vcodec\f[R]: Name of the video codec in use
+.IP \[bu] 2
+\f[V]container\f[R]: Name of the container format
+.IP \[bu] 2
+\f[V]protocol\f[R]: The protocol that will be used for the actual
+download, lower-case (\f[V]http\f[R], \f[V]https\f[R], \f[V]rtsp\f[R],
+\f[V]rtmp\f[R], \f[V]rtmpe\f[R], \f[V]mms\f[R], \f[V]f4m\f[R],
+\f[V]ism\f[R], \f[V]http_dash_segments\f[R], \f[V]m3u8\f[R], or
+\f[V]m3u8_native\f[R])
+.IP \[bu] 2
+\f[V]format_id\f[R]: A short description of the format
+.IP \[bu] 2
+\f[V]language\f[R]: Language code
+.PP
+Any string comparison may be prefixed with negation \f[V]!\f[R] in order
+to produce an opposite comparison, e.g.\ \f[V]!*=\f[R] (does not
+contain).
+.PP
+Note that none of the aforementioned meta fields are guaranteed to be
+present since this solely depends on the metadata obtained by particular
+extractor, i.e.\ the metadata offered by the video hoster.
+.PP
+Formats for which the value is not known are excluded unless you put a
+question mark (\f[V]?\f[R]) after the operator.
+You can combine format filters, so
+\f[V]-f \[dq][height <=? 720][tbr>500]\[dq]\f[R] selects up to 720p
+videos (or videos where the height is not known) with a bitrate of at
+least 500 KBit/s.
+.PP
+You can merge the video and audio of two formats into a single file
+using \f[V]-f <video-format>+<audio-format>\f[R] (requires ffmpeg or
+avconv installed), for example \f[V]-f bestvideo+bestaudio\f[R] will
+download the best video-only format, the best audio-only format and mux
+them together with ffmpeg/avconv.
+.PP
+Format selectors can also be grouped using parentheses, for example if
+you want to download the best mp4 and webm formats with a height lower
+than 480 you can use \f[V]-f \[aq](mp4,webm)[height<480]\[aq]\f[R].
+.PP
+Since the end of April 2015 and version 2015.04.26, youtube-dl uses
+\f[V]-f bestvideo+bestaudio/best\f[R] as the default format selection
+(see #5447 (https://github.com/ytdl-org/youtube-dl/issues/5447),
+#5456 (https://github.com/ytdl-org/youtube-dl/issues/5456)).
+If ffmpeg or avconv are installed this results in downloading
+\f[V]bestvideo\f[R] and \f[V]bestaudio\f[R] separately and muxing them
+together into a single file giving the best overall quality available.
+Otherwise it falls back to \f[V]best\f[R] and results in downloading the
+best available quality served as a single file.
+\f[V]best\f[R] is also needed for videos that don\[cq]t come from
+YouTube because they don\[cq]t provide the audio and video in two
+different files.
+If you want to only download some DASH formats (for example if you are
+not interested in getting videos with a resolution higher than 1080p),
+you can add \f[V]-f bestvideo[height<=?1080]+bestaudio/best\f[R] to your
+configuration file.
+Note that if you use youtube-dl to stream to \f[V]stdout\f[R] (and most
+likely to pipe it to your media player then), i.e.\ you explicitly
+specify output template as \f[V]-o -\f[R], youtube-dl still uses
+\f[V]-f best\f[R] format selection in order to start content delivery
+immediately to your player and not to wait until \f[V]bestvideo\f[R] and
+\f[V]bestaudio\f[R] are downloaded and muxed.
+.PP
+If you want to preserve the old format selection behavior (prior to
+youtube-dl 2015.04.26), i.e.\ you want to download the best available
+quality media served as a single file, you should explicitly specify
+your choice with \f[V]-f best\f[R].
+You may want to add it to the configuration file in order not to type it
+every time you run youtube-dl.
+.SS Format selection examples
+.PP
+Note that on Windows you may need to use double quotes instead of
+single.
+.IP
+.nf
+\f[C]
+# Download best mp4 format available or any other best if no mp4 available
+$ youtube-dl -f \[aq]bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best\[aq]
+
+# Download best format available but no better than 480p
+$ youtube-dl -f \[aq]bestvideo[height<=480]+bestaudio/best[height<=480]\[aq]
+
+# Download best video only format but no bigger than 50 MB
+$ youtube-dl -f \[aq]best[filesize<50M]\[aq]
+
+# Download best format available via direct link over HTTP/HTTPS protocol
+$ youtube-dl -f \[aq](bestvideo+bestaudio/best)[protocol\[ha]=http]\[aq]
+
+# Download the best video format and the best audio format without merging them
+$ youtube-dl -f \[aq]bestvideo,bestaudio\[aq] -o \[aq]%(title)s.f%(format_id)s.%(ext)s\[aq]
+\f[R]
+.fi
+.PP
+Note that in the last example, an output template is recommended as
+bestvideo and bestaudio may have the same file name.
+.SH VIDEO SELECTION
+.PP
+Videos can be filtered by their upload date using the options
+\f[V]--date\f[R], \f[V]--datebefore\f[R] or \f[V]--dateafter\f[R].
+They accept dates in two formats:
+.IP \[bu] 2
+Absolute dates: Dates in the format \f[V]YYYYMMDD\f[R].
+.IP \[bu] 2
+Relative dates: Dates in the format
+\f[V](now|today)[+-][0-9](day|week|month|year)(s)?\f[R]
+.PP
+Examples:
+.IP
+.nf
+\f[C]
+# 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
+\f[R]
+.fi
+.SH FAQ
+.SS How do I update youtube-dl?
+.PP
+If you\[cq]ve followed our manual installation
+instructions (https://ytdl-org.github.io/youtube-dl/download.html), you
+can simply run \f[V]youtube-dl -U\f[R] (or, on Linux,
+\f[V]sudo youtube-dl -U\f[R]).
+.PP
+If you have used pip, a simple \f[V]sudo pip install -U youtube-dl\f[R]
+is sufficient to update.
+.PP
+If you have installed youtube-dl using a package manager like
+\f[I]apt-get\f[R] or \f[I]yum\f[R], use the standard system update
+mechanism to update.
+Note that distribution packages are often outdated.
+As a rule of thumb, youtube-dl releases at least once a month, and often
+weekly or even daily.
+Simply go to https://yt-dl.org to find out the current version.
+Unfortunately, there is nothing we youtube-dl developers can do if your
+distribution serves a really outdated version.
+You can (and should) complain to your distribution in their bugtracker
+or support forum.
+.PP
+As a last resort, you can also uninstall the version installed by your
+package manager and follow our manual installation instructions.
+For that, remove the distribution\[cq]s package, with a line like
+.IP
+.nf
+\f[C]
+sudo apt-get remove -y youtube-dl
+\f[R]
+.fi
+.PP
+Afterwards, simply follow our manual installation
+instructions (https://ytdl-org.github.io/youtube-dl/download.html):
+.IP
+.nf
+\f[C]
+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
+\f[R]
+.fi
+.PP
+Again, from then on you\[cq]ll be able to update with
+\f[V]sudo youtube-dl -U\f[R].
+.SS youtube-dl is extremely slow to start on Windows
+.PP
+Add a file exclusion for \f[V]youtube-dl.exe\f[R] in Windows Defender
+settings.
+.SS I\[cq]m getting an error \f[V]Unable to extract OpenGraph title\f[R] on YouTube playlists
+.PP
+YouTube changed their playlist format in March 2014 and later on, so
+you\[cq]ll need at least youtube-dl 2014.07.25 to download all YouTube
+videos.
+.PP
+If you have installed youtube-dl with a package manager, pip, setup.py
+or a tarball, please use that to update.
+Note that Ubuntu packages do not seem to get updated anymore.
+Since we are not affiliated with Ubuntu, there is little we can do.
+Feel free to report
+bugs (https://bugs.launchpad.net/ubuntu/+source/youtube-dl/+filebug) to
+the Ubuntu packaging
+people (mailto:ubuntu-motu@lists.ubuntu.com?subject=outdated%20version%20of%20youtube-dl)
+- all they have to do is update the package to a somewhat recent
+version.
+See above for a way to update.
+.SS I\[cq]m getting an error when trying to use output template: \f[V]error: using output template conflicts with using title, video ID or auto number\f[R]
+.PP
+Make sure you are not using \f[V]-o\f[R] with any of these options
+\f[V]-t\f[R], \f[V]--title\f[R], \f[V]--id\f[R], \f[V]-A\f[R] or
+\f[V]--auto-number\f[R] set in command line or in a configuration file.
+Remove the latter if any.
+.SS Do I always have to pass \f[V]-citw\f[R]?
+.PP
+By default, youtube-dl intends to have the best options (incidentally,
+if you have a convincing case that these should be different, please
+file an issue where you explain that (https://yt-dl.org/bug)).
+Therefore, it is unnecessary and sometimes harmful to copy long option
+strings from webpages.
+In particular, the only option out of \f[V]-citw\f[R] that is regularly
+useful is \f[V]-i\f[R].
+.SS Can you please put the \f[V]-b\f[R] option back?
+.PP
+Most people asking this question are not aware that youtube-dl now
+defaults to downloading the highest available quality as reported by
+YouTube, which will be 1080p or 720p in some cases, so you no longer
+need the \f[V]-b\f[R] option.
+For some specific videos, maybe YouTube does not report them to be
+available in a specific high quality format you\[cq]re interested in.
+In that case, simply request it with the \f[V]-f\f[R] option and
+youtube-dl will try to download it.
+.SS I get HTTP error 402 when trying to download a video. What\[cq]s this?
+.PP
+Apparently YouTube requires you to pass a CAPTCHA test if you download
+too much.
+We\[cq]re considering to provide a way to let you solve the
+CAPTCHA (https://github.com/ytdl-org/youtube-dl/issues/154), but at the
+moment, your best course of action is pointing a web browser to the
+youtube URL, solving the CAPTCHA, and restart youtube-dl.
+.SS Do I need any other programs?
+.PP
+youtube-dl works fine on its own on most sites.
+However, if you want to convert video/audio, you\[cq]ll need
+avconv (https://libav.org/) or ffmpeg (https://www.ffmpeg.org/).
+On some sites - most notably YouTube - videos can be retrieved in a
+higher quality format without sound.
+youtube-dl will detect whether avconv/ffmpeg is present and
+automatically pick the best option.
+.PP
+Videos or video formats streamed via RTMP protocol can only be
+downloaded when rtmpdump (https://rtmpdump.mplayerhq.hu/) is installed.
+Downloading MMS and RTSP videos requires either
+mplayer (https://mplayerhq.hu/) or mpv (https://mpv.io/) to be
+installed.
+.SS I have downloaded a video but how can I play it?
+.PP
+Once the video is fully downloaded, use any video player, such as
+mpv (https://mpv.io/), vlc (https://www.videolan.org/) or
+mplayer (https://www.mplayerhq.hu/).
+.SS I extracted a video URL with \f[V]-g\f[R], but it does not play on another machine / in my web browser.
+.PP
+It depends a lot on the service.
+In many cases, requests for the video (to download/play it) must come
+from the same IP address and with the same cookies and/or HTTP headers.
+Use the \f[V]--cookies\f[R] option to write the required cookies into a
+file, and advise your downloader to read cookies from that file.
+Some sites also require a common user agent to be used, use
+\f[V]--dump-user-agent\f[R] to see the one in use by youtube-dl.
+You can also get necessary cookies and HTTP headers from JSON output
+obtained with \f[V]--dump-json\f[R].
+.PP
+It may be beneficial to use IPv6; in some cases, the restrictions are
+only applied to IPv4.
+Some services (sometimes only for a subset of videos) do not restrict
+the video URL by IP address, cookie, or user-agent, but these are the
+exception rather than the rule.
+.PP
+Please bear in mind that some URL protocols are \f[B]not\f[R] supported
+by browsers out of the box, including RTMP.
+If you are using \f[V]-g\f[R], your own downloader must support these as
+well.
+.PP
+If you want to play the video on a machine that is not running
+youtube-dl, you can relay the video content from the machine that runs
+youtube-dl.
+You can use \f[V]-o -\f[R] to let youtube-dl stream a video to stdout,
+or simply allow the player to download the files written by youtube-dl
+in turn.
+.SS ERROR: no fmt_url_map or conn information found in video info
+.PP
+YouTube has switched to a new video info format in July 2011 which is
+not supported by old versions of youtube-dl.
+See above for how to update youtube-dl.
+.SS ERROR: unable to download video
+.PP
+YouTube requires an additional signature since September 2012 which is
+not supported by old versions of youtube-dl.
+See above for how to update youtube-dl.
+.SS Video URL contains an ampersand and I\[cq]m getting some strange output \f[V][1] 2839\f[R] or \f[V]\[aq]v\[aq] is not recognized as an internal or external command\f[R]
+.PP
+That\[cq]s actually the output from your shell.
+Since ampersand is one of the special shell characters it\[cq]s
+interpreted by the shell preventing you from passing the whole URL to
+youtube-dl.
+To disable your shell from interpreting the ampersands (or any other
+special characters) you have to either put the whole URL in quotes or
+escape them with a backslash (which approach will work depends on your
+shell).
+.PP
+For example if your URL is
+https://www.youtube.com/watch?t=4&v=BaW_jenozKc you should end up with
+following command:
+.PP
+\f[V]youtube-dl \[aq]https://www.youtube.com/watch?t=4&v=BaW_jenozKc\[aq]\f[R]
+.PP
+or
+.PP
+\f[V]youtube-dl https://www.youtube.com/watch?t=4\[rs]&v=BaW_jenozKc\f[R]
+.PP
+For Windows you have to use the double quotes:
+.PP
+\f[V]youtube-dl \[dq]https://www.youtube.com/watch?t=4&v=BaW_jenozKc\[dq]\f[R]
+.SS ExtractorError: Could not find JS function u\[cq]OF\[cq]
+.PP
+In February 2015, the new YouTube player contained a character sequence
+in a string that was misinterpreted by old versions of youtube-dl.
+See above for how to update youtube-dl.
+.SS HTTP Error 429: Too Many Requests or 402: Payment Required
+.PP
+These two error codes indicate that the service is blocking your IP
+address because of overuse.
+Usually this is a soft block meaning that you can gain access again
+after solving CAPTCHA.
+Just open a browser and solve a CAPTCHA the service suggests you and
+after that pass cookies to youtube-dl.
+Note that if your machine has multiple external IPs then you should also
+pass exactly the same IP you\[cq]ve used for solving CAPTCHA with
+\f[V]--source-address\f[R].
+Also you may need to pass a \f[V]User-Agent\f[R] HTTP header of your
+browser with \f[V]--user-agent\f[R].
+.PP
+If this is not the case (no CAPTCHA suggested to solve by the service)
+then you can contact the service and ask them to unblock your IP
+address, or - if you have acquired a whitelisted IP address already -
+use the \f[V]--proxy\f[R] or \f[V]--source-address\f[R] options to
+select another IP address.
+.SS SyntaxError: Non-ASCII character
+.PP
+The error
+.IP
+.nf
+\f[C]
+File \[dq]youtube-dl\[dq], line 2
+SyntaxError: Non-ASCII character \[aq]\[rs]x93\[aq] ...
+\f[R]
+.fi
+.PP
+means you\[cq]re using an outdated version of Python.
+Please update to Python 2.6 or 2.7.
+.SS What is this binary file? Where has the code gone?
+.PP
+Since June 2012
+(#342 (https://github.com/ytdl-org/youtube-dl/issues/342)) youtube-dl is
+packed as an executable zipfile, simply unzip it (might need renaming to
+\f[V]youtube-dl.zip\f[R] first on some systems) or clone the git
+repository, as laid out above.
+If you modify the code, you can run it by executing the
+\f[V]__main__.py\f[R] file.
+To recompile the executable, run \f[V]make youtube-dl\f[R].
+.SS The exe throws an error due to missing \f[V]MSVCR100.dll\f[R]
+.PP
+To run the exe you need to install first the Microsoft Visual C++ 2010
+Service Pack 1 Redistributable Package
+(x86) (https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe).
+.SS On Windows, how should I set up ffmpeg and youtube-dl? Where should I put the exe files?
+.PP
+If you put youtube-dl and ffmpeg in the same directory that you\[cq]re
+running the command from, it will work, but that\[cq]s rather
+cumbersome.
+.PP
+To make a different directory work - either for ffmpeg, or for
+youtube-dl, or for both - simply create the directory (say,
+\f[V]C:\[rs]bin\f[R], or
+\f[V]C:\[rs]Users\[rs]<User name>\[rs]bin\f[R]), put all the executables
+directly in there, and then set your PATH environment
+variable (https://www.java.com/en/download/help/path.xml) to include
+that directory.
+.PP
+From then on, after restarting your shell, you will be able to access
+both youtube-dl and ffmpeg (and youtube-dl will be able to find ffmpeg)
+by simply typing \f[V]youtube-dl\f[R] or \f[V]ffmpeg\f[R], no matter
+what directory you\[cq]re in.
+.SS How do I put downloads into a specific folder?
+.PP
+Use the \f[V]-o\f[R] to specify an output template, for example
+\f[V]-o \[dq]/home/user/videos/%(title)s-%(id)s.%(ext)s\[dq]\f[R].
+If you want this for all of your downloads, put the option into your
+configuration file.
+.SS How do I download a video starting with a \f[V]-\f[R]?
+.PP
+Either prepend \f[V]https://www.youtube.com/watch?v=\f[R] or separate
+the ID from the options with \f[V]--\f[R]:
+.IP
+.nf
+\f[C]
+youtube-dl -- -wNyEUrxzFU
+youtube-dl \[dq]https://www.youtube.com/watch?v=-wNyEUrxzFU\[dq]
+\f[R]
+.fi
+.SS How do I pass cookies to youtube-dl?
+.PP
+Use the \f[V]--cookies\f[R] option, for example
+\f[V]--cookies /path/to/cookies/file.txt\f[R].
+.PP
+In order to extract cookies from browser use any conforming browser
+extension for exporting cookies.
+For example, Get cookies.txt
+LOCALLY (https://chrome.google.com/webstore/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc)
+(for Chrome) or
+cookies.txt (https://addons.mozilla.org/en-US/firefox/addon/cookies-txt/)
+(for Firefox).
+.PP
+Note that the cookies file must be in Mozilla/Netscape format and the
+first line of the cookies file must be either
+\f[V]# HTTP Cookie File\f[R] or \f[V]# Netscape HTTP Cookie File\f[R].
+Make sure you have correct newline
+format (https://en.wikipedia.org/wiki/Newline) in the cookies file and
+convert newlines if necessary to correspond with your OS, namely
+\f[V]CRLF\f[R] (\f[V]\[rs]r\[rs]n\f[R]) for Windows and \f[V]LF\f[R]
+(\f[V]\[rs]n\f[R]) for Unix and Unix-like systems (Linux, macOS, etc.).
+\f[V]HTTP Error 400: Bad Request\f[R] when using \f[V]--cookies\f[R] is
+a good sign of invalid newline format.
+.PP
+Passing cookies to youtube-dl is a good way to workaround login when a
+particular extractor does not implement it explicitly.
+Another use case is working around
+CAPTCHA (https://en.wikipedia.org/wiki/CAPTCHA) some websites require
+you to solve in particular cases in order to get access (e.g.\ YouTube,
+CloudFlare).
+.SS How do I stream directly to media player?
+.PP
+You will first need to tell youtube-dl to stream media to stdout with
+\f[V]-o -\f[R], and also tell your media player to read from stdin (it
+must be capable of this for streaming) and then pipe former to latter.
+For example, streaming to vlc (https://www.videolan.org/) can be
+achieved with:
+.IP
+.nf
+\f[C]
+youtube-dl -o - \[dq]https://www.youtube.com/watch?v=BaW_jenozKcj\[dq] | vlc -
+\f[R]
+.fi
+.SS How do I download only new videos from a playlist?
+.PP
+Use download-archive feature.
+With this feature you should initially download the complete playlist
+with \f[V]--download-archive /path/to/download/archive/file.txt\f[R]
+that will record identifiers of all the videos in a special file.
+Each subsequent run with the same \f[V]--download-archive\f[R] will
+download only new videos and skip all videos that have been downloaded
+before.
+Note that only successful downloads are recorded in the file.
+.PP
+For example, at first,
+.IP
+.nf
+\f[C]
+youtube-dl --download-archive archive.txt \[dq]https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re\[dq]
+\f[R]
+.fi
+.PP
+will download the complete \f[V]PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re\f[R]
+playlist and create a file \f[V]archive.txt\f[R].
+Each subsequent run will only download new videos if any:
+.IP
+.nf
+\f[C]
+youtube-dl --download-archive archive.txt \[dq]https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re\[dq]
+\f[R]
+.fi
+.SS Should I add \f[V]--hls-prefer-native\f[R] into my config?
+.PP
+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.
+.PP
+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.
+.PP
+In particular, the generic extractor (used when your website is not in
+the list of supported sites by
+youtube-dl (https://ytdl-org.github.io/youtube-dl/supportedsites.html)
+cannot mandate one specific downloader.
+.PP
+If you put either \f[V]--hls-prefer-native\f[R] or
+\f[V]--hls-prefer-ffmpeg\f[R] into your configuration, a different
+subset of videos will fail to download correctly.
+Instead, it is much better to file an issue (https://yt-dl.org/bug) or a
+pull request which details why the native or the ffmpeg HLS downloader
+is a better choice for your use case.
+.SS Can you add support for this anime video site, or site which shows current movies for free?
+.PP
+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\[cq]s distributor, or is published under a
+free license), the service is probably unfit for inclusion to
+youtube-dl.
+.PP
+A note on the service that they don\[cq]t host the infringing content,
+but just link to those who do, is evidence that the service should
+\f[B]not\f[R] 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 \[lq]fair use\[rq] note is equally unconvincing if the service shows
+copyright-protected videos in full without authorization.
+.PP
+Support requests for services that \f[B]do\f[R] 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.
+.SS How can I speed up work on my issue?
+.PP
+(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\[cq]s what you can do:
+.PP
+First of all, please do report the issue at our issue
+tracker (https://yt-dl.org/bugs).
+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.
+.PP
+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.
+.PP
+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).
+.PP
+Feel free to bump the issue from time to time by writing a small comment
+(\[lq]Issue is still present in youtube-dl version \&...from France, but
+fixed from Belgium\[rq]), but please not more than once a month.
+Please do not declare your issue as \f[V]important\f[R] or
+\f[V]urgent\f[R].
+.SS How can I detect whether a given URL is supported by youtube-dl?
+.PP
+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 https://example.com/video/1234567 to
+https://example.com/v/1234567 ) and youtube-dl reports an URL of a
+service in that list as unsupported.
+In that case, simply report a bug.
+.PP
+It is \f[I]not\f[R] possible to detect whether a URL is supported or
+not.
+That\[cq]s because youtube-dl contains a generic extractor which matches
+\f[B]all\f[R] 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\[cq]s hosting itself.
+Therefore, we neither recommend nor support disabling, excluding, or
+removing the generic extractor.
+.PP
+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 \f[V]UnsupportedError\f[R] exception if you
+run it from a Python program.
+.SH Why do I need to go through that much red tape when filing bugs?
+.PP
+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 \[lq]please install ffmpeg\[rq], 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.
+.PP
+youtube-dl is an open-source project manned by too few volunteers, so
+we\[cq]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 \f[V]youtube-dl -v YOUR_URL_HERE\f[R] is really
+all that\[cq]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.
+.SH DEVELOPER INSTRUCTIONS
+.PP
+Most users do not need to build youtube-dl and can download the
+builds (https://ytdl-org.github.io/youtube-dl/download.html) or get them
+from their distribution.
+.PP
+To run youtube-dl as a developer, you don\[cq]t need to build anything
+either.
+Simply execute
+.IP
+.nf
+\f[C]
+python -m youtube_dl
+\f[R]
+.fi
+.PP
+To run the test, simply invoke your favorite test runner, or execute a
+test file directly; any of the following work:
+.IP
+.nf
+\f[C]
+python -m unittest discover
+python test/test_download.py
+nosetests
+\f[R]
+.fi
+.PP
+See item 6 of new extractor tutorial for how to run extractor specific
+test cases.
+.PP
+If you want to create a build of youtube-dl yourself, you\[cq]ll need
+.IP \[bu] 2
+python
+.IP \[bu] 2
+make (only GNU make is supported)
+.IP \[bu] 2
+pandoc
+.IP \[bu] 2
+zip
+.IP \[bu] 2
+nosetests
+.SS Adding support for a new site
+.PP
+If you want to add support for a new site, first of all \f[B]make
+sure\f[R] this site is \f[B]not dedicated to copyright
+infringement\f[R].
+youtube-dl does \f[B]not support\f[R] such sites thus pull requests
+adding support for them \f[B]will be rejected\f[R].
+.PP
+After you have ensured this site is distributing its content legally,
+you can follow this quick list (assuming your service is called
+\f[V]yourextractor\f[R]):
+.IP " 1." 4
+Fork this repository (https://github.com/ytdl-org/youtube-dl/fork)
+.IP " 2." 4
+Check out the source code with:
+.RS 4
+.IP
+.nf
+\f[C]
+ git clone git\[at]github.com:YOUR_GITHUB_USERNAME/youtube-dl.git
+\f[R]
+.fi
+.RE
+.IP " 3." 4
+Start a new git branch with
+.RS 4
+.IP
+.nf
+\f[C]
+ cd youtube-dl
+ git checkout -b yourextractor
+\f[R]
+.fi
+.RE
+.IP " 4." 4
+Start with this simple template and save it to
+\f[V]youtube_dl/extractor/yourextractor.py\f[R]:
+.RS 4
+.IP
+.nf
+\f[C]
+# coding: utf-8
+from __future__ import unicode_literals
+
+from .common import InfoExtractor
+
+
+class YourExtractorIE(InfoExtractor):
+ _VALID_URL = r\[aq]https?://(?:www\[rs].)?yourextractor\[rs].com/watch/(?P<id>[0-9]+)\[aq]
+ _TEST = {
+ \[aq]url\[aq]: \[aq]https://yourextractor.com/watch/42\[aq],
+ \[aq]md5\[aq]: \[aq]TODO: md5 sum of the first 10241 bytes of the video file (use --test)\[aq],
+ \[aq]info_dict\[aq]: {
+ \[aq]id\[aq]: \[aq]42\[aq],
+ \[aq]ext\[aq]: \[aq]mp4\[aq],
+ \[aq]title\[aq]: \[aq]Video title goes here\[aq],
+ \[aq]thumbnail\[aq]: r\[aq]re:\[ha]https?://.*\[rs].jpg$\[aq],
+ # 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\[aq]<h1>(.+?)</h1>\[aq], webpage, \[aq]title\[aq])
+
+ return {
+ \[aq]id\[aq]: video_id,
+ \[aq]title\[aq]: title,
+ \[aq]description\[aq]: self._og_search_description(webpage),
+ \[aq]uploader\[aq]: self._search_regex(r\[aq]<div[\[ha]>]+id=\[dq]uploader\[dq][\[ha]>]*>([\[ha]<]+)<\[aq], webpage, \[aq]uploader\[aq], fatal=False),
+ # TODO more properties (see youtube_dl/extractor/common.py)
+ }
+\f[R]
+.fi
+.RE
+.IP " 5." 4
+Add an import in
+\f[V]youtube_dl/extractor/extractors.py\f[R] (https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/extractors.py).
+.IP " 6." 4
+Run
+\f[V]python test/test_download.py TestDownload.test_YourExtractor\f[R].
+This \f[I]should fail\f[R] at first, but you can continually re-run it
+until you\[cq]re done.
+If you decide to add more than one test (actually, test case) then
+rename \f[V]_TEST\f[R] to \f[V]_TESTS\f[R] and make it into a list of
+dictionaries.
+The tests will then be named \f[V]TestDownload.test_YourExtractor\f[R],
+\f[V]TestDownload.test_YourExtractor_1\f[R],
+\f[V]TestDownload.test_YourExtractor_2\f[R], etc.
+Note:
+.RS 4
+.IP \[bu] 2
+the test names use the extractor class name \f[B]without the trailing
+\f[VB]IE\f[B]\f[R]
+.IP \[bu] 2
+tests with \f[V]only_matching\f[R] key in test\[cq]s dict are not
+counted.
+.RE
+.IP " 7." 4
+Have a look at
+\f[V]youtube_dl/extractor/common.py\f[R] (https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/extractor/common.py)
+for possible helper methods and a detailed description of what your
+extractor should and may
+return (https://github.com/ytdl-org/youtube-dl/blob/7f41a598b3fba1bcab2817de64a08941200aa3c8/youtube_dl/extractor/common.py#L94-L303).
+Add tests and code for as many as you want.
+.IP " 8." 4
+Make sure your code follows youtube-dl coding conventions and check the
+code with
+flake8 (https://flake8.pycqa.org/en/latest/index.html#quickstart):
+.RS 4
+.IP
+.nf
+\f[C]
+ $ flake8 youtube_dl/extractor/yourextractor.py
+\f[R]
+.fi
+.RE
+.IP " 9." 4
+Make sure your code works under all Python (https://www.python.org/)
+versions claimed supported by youtube-dl, namely 2.6, 2.7, and 3.2+.
+.IP "10." 4
+When the tests pass, add (https://git-scm.com/docs/git-add) the new
+files and commit (https://git-scm.com/docs/git-commit) them and
+push (https://git-scm.com/docs/git-push) the result, like this:
+.RS 4
+.IP
+.nf
+\f[C]
+$ git add youtube_dl/extractor/extractors.py
+$ git add youtube_dl/extractor/yourextractor.py
+$ git commit -m \[aq][yourextractor] Add new extractor\[aq]
+$ git push origin yourextractor
+\f[R]
+.fi
+.RE
+.IP "11." 4
+Finally, create a pull
+request (https://help.github.com/articles/creating-a-pull-request).
+We\[cq]ll then review and merge it.
+.PP
+In any case, thank you very much for your contributions!
+.SS youtube-dl coding conventions
+.PP
+This section introduces a guide lines for writing idiomatic, robust and
+future-proof extractor code.
+.PP
+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\[cq]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\[cq] 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.
+.SS Mandatory and optional metafields
+.PP
+For extraction to work youtube-dl relies on metadata your extractor
+extracts and provides to youtube-dl expressed by an information
+dictionary (https://github.com/ytdl-org/youtube-dl/blob/7f41a598b3fba1bcab2817de64a08941200aa3c8/youtube_dl/extractor/common.py#L94-L303)
+or simply \f[I]info dict\f[R].
+Only the following meta fields in the \f[I]info dict\f[R] are considered
+mandatory for a successful extraction process by youtube-dl:
+.IP \[bu] 2
+\f[V]id\f[R] (media identifier)
+.IP \[bu] 2
+\f[V]title\f[R] (media title)
+.IP \[bu] 2
+\f[V]url\f[R] (media download URL) or \f[V]formats\f[R]
+.PP
+In fact only the last option is technically mandatory (i.e.\ if you
+can\[cq]t figure out the download location of the media the extraction
+does not make any sense).
+But by convention youtube-dl also treats \f[V]id\f[R] and
+\f[V]title\f[R] 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.
+.PP
+Any
+field (https://github.com/ytdl-org/youtube-dl/blob/7f41a598b3fba1bcab2817de64a08941200aa3c8/youtube_dl/extractor/common.py#L188-L303)
+apart from the aforementioned ones are considered \f[B]optional\f[R].
+That means that extraction should be \f[B]tolerant\f[R] to situations
+when sources for these fields can potentially be unavailable (even if
+they are always available at the moment) and \f[B]future-proof\f[R] in
+order not to break the extraction of general purpose mandatory fields.
+.SS Example
+.PP
+Say you have some source dictionary \f[V]meta\f[R] that you\[cq]ve
+fetched as JSON with HTTP request and it has a key \f[V]summary\f[R]:
+.IP
+.nf
+\f[C]
+meta = self._download_json(url, video_id)
+\f[R]
+.fi
+.PP
+Assume at this point \f[V]meta\f[R]\[cq]s layout is:
+.IP
+.nf
+\f[C]
+{
+ ...
+ \[dq]summary\[dq]: \[dq]some fancy summary text\[dq],
+ ...
+}
+\f[R]
+.fi
+.PP
+Assume you want to extract \f[V]summary\f[R] and put it into the
+resulting info dict as \f[V]description\f[R].
+Since \f[V]description\f[R] is an optional meta field you should be
+ready that this key may be missing from the \f[V]meta\f[R] dict, so that
+you should extract it like:
+.IP
+.nf
+\f[C]
+description = meta.get(\[aq]summary\[aq]) # correct
+\f[R]
+.fi
+.PP
+and not like:
+.IP
+.nf
+\f[C]
+description = meta[\[aq]summary\[aq]] # incorrect
+\f[R]
+.fi
+.PP
+The latter will break extraction process with \f[V]KeyError\f[R] if
+\f[V]summary\f[R] disappears from \f[V]meta\f[R] at some later time but
+with the former approach extraction will just go ahead with
+\f[V]description\f[R] set to \f[V]None\f[R] which is perfectly fine
+(remember \f[V]None\f[R] is equivalent to the absence of data).
+.PP
+Similarly, you should pass \f[V]fatal=False\f[R] when extracting
+optional data from a webpage with \f[V]_search_regex\f[R],
+\f[V]_html_search_regex\f[R] or similar methods, for instance:
+.IP
+.nf
+\f[C]
+description = self._search_regex(
+ r\[aq]<span[\[ha]>]+id=\[dq]title\[dq][\[ha]>]*>([\[ha]<]+)<\[aq],
+ webpage, \[aq]description\[aq], fatal=False)
+\f[R]
+.fi
+.PP
+With \f[V]fatal\f[R] set to \f[V]False\f[R] if \f[V]_search_regex\f[R]
+fails to extract \f[V]description\f[R] it will emit a warning and
+continue extraction.
+.PP
+You can also pass \f[V]default=<some fallback value>\f[R], for example:
+.IP
+.nf
+\f[C]
+description = self._search_regex(
+ r\[aq]<span[\[ha]>]+id=\[dq]title\[dq][\[ha]>]*>([\[ha]<]+)<\[aq],
+ webpage, \[aq]description\[aq], default=None)
+\f[R]
+.fi
+.PP
+On failure this code will silently continue the extraction with
+\f[V]description\f[R] set to \f[V]None\f[R].
+That is useful for metafields that may or may not be present.
+.SS Provide fallbacks
+.PP
+When extracting metadata try to do so from multiple sources.
+For example if \f[V]title\f[R] 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.
+.SS Example
+.PP
+Say \f[V]meta\f[R] from the previous example has a \f[V]title\f[R] and
+you are about to extract it.
+Since \f[V]title\f[R] is a mandatory meta field you should end up with
+something like:
+.IP
+.nf
+\f[C]
+title = meta[\[aq]title\[aq]]
+\f[R]
+.fi
+.PP
+If \f[V]title\f[R] disappears from \f[V]meta\f[R] in future due to some
+changes on the hoster\[cq]s side the extraction would fail since
+\f[V]title\f[R] is mandatory.
+That\[cq]s expected.
+.PP
+Assume that you have some another source you can extract \f[V]title\f[R]
+from, for example \f[V]og:title\f[R] HTML meta of a \f[V]webpage\f[R].
+In this case you can provide a fallback scenario:
+.IP
+.nf
+\f[C]
+title = meta.get(\[aq]title\[aq]) or self._og_search_title(webpage)
+\f[R]
+.fi
+.PP
+This code will try to extract from \f[V]meta\f[R] first and if it fails
+it will try extracting \f[V]og:title\f[R] from a \f[V]webpage\f[R].
+.SS Regular expressions
+.SS Don\[cq]t capture groups you don\[cq]t use
+.PP
+Capturing group must be an indication that it\[cq]s used somewhere in
+the code.
+Any group that is not used must be non capturing.
+.SS Example
+.PP
+Don\[cq]t capture id attribute name here since you can\[cq]t use it for
+anything anyway.
+.PP
+Correct:
+.IP
+.nf
+\f[C]
+r\[aq](?:id|ID)=(?P<id>\[rs]d+)\[aq]
+\f[R]
+.fi
+.PP
+Incorrect:
+.IP
+.nf
+\f[C]
+r\[aq](id|ID)=(?P<id>\[rs]d+)\[aq]
+\f[R]
+.fi
+.SS Make regular expressions relaxed and flexible
+.PP
+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.
+.SS Example
+.PP
+Say you need to extract \f[V]title\f[R] from the following HTML code:
+.IP
+.nf
+\f[C]
+<span style=\[dq]position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;\[dq] class=\[dq]title\[dq]>some fancy title</span>
+\f[R]
+.fi
+.PP
+The code for that task should look similar to:
+.IP
+.nf
+\f[C]
+title = self._search_regex(
+ r\[aq]<span[\[ha]>]+class=\[dq]title\[dq][\[ha]>]*>([\[ha]<]+)\[aq], webpage, \[aq]title\[aq])
+\f[R]
+.fi
+.PP
+Or even better:
+.IP
+.nf
+\f[C]
+title = self._search_regex(
+ r\[aq]<span[\[ha]>]+class=([\[dq]\[rs]\[aq]])title\[rs]1[\[ha]>]*>(?P<title>[\[ha]<]+)\[aq],
+ webpage, \[aq]title\[aq], group=\[aq]title\[aq])
+\f[R]
+.fi
+.PP
+Note how you tolerate potential changes in the \f[V]style\f[R]
+attribute\[cq]s value or switch from using double quotes to single for
+\f[V]class\f[R] attribute:
+.PP
+The code definitely should not look like:
+.IP
+.nf
+\f[C]
+title = self._search_regex(
+ r\[aq]<span style=\[dq]position: absolute; left: 910px; width: 90px; float: right; z-index: 9999;\[dq] class=\[dq]title\[dq]>(.*?)</span>\[aq],
+ webpage, \[aq]title\[aq], group=\[aq]title\[aq])
+\f[R]
+.fi
+.SS Long lines policy
+.PP
+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.
+.PP
+For example, you should \f[B]never\f[R] split long string literals like
+URLs or some other often copied entities over multiple lines to fit this
+limit:
+.PP
+Correct:
+.IP
+.nf
+\f[C]
+\[aq]https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4\[aq]
+\f[R]
+.fi
+.PP
+Incorrect:
+.IP
+.nf
+\f[C]
+\[aq]https://www.youtube.com/watch?v=FqZTN594JQw&list=\[aq]
+\[aq]PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4\[aq]
+\f[R]
+.fi
+.SS Inline values
+.PP
+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.
+.SS Example
+.PP
+Correct:
+.IP
+.nf
+\f[C]
+title = self._html_search_regex(r\[aq]<title>([\[ha]<]+)</title>\[aq], webpage, \[aq]title\[aq])
+\f[R]
+.fi
+.PP
+Incorrect:
+.IP
+.nf
+\f[C]
+TITLE_RE = r\[aq]<title>([\[ha]<]+)</title>\[aq]
+# ...some lines of code...
+title = self._html_search_regex(TITLE_RE, webpage, \[aq]title\[aq])
+\f[R]
+.fi
+.SS Collapse fallbacks
+.PP
+Multiple fallback values can quickly become unwieldy.
+Collapse multiple fallback values into a single expression via a list of
+patterns.
+.SS Example
+.PP
+Good:
+.IP
+.nf
+\f[C]
+description = self._html_search_meta(
+ [\[aq]og:description\[aq], \[aq]description\[aq], \[aq]twitter:description\[aq]],
+ webpage, \[aq]description\[aq], default=None)
+\f[R]
+.fi
+.PP
+Unwieldy:
+.IP
+.nf
+\f[C]
+description = (
+ self._og_search_description(webpage, default=None)
+ or self._html_search_meta(\[aq]description\[aq], webpage, default=None)
+ or self._html_search_meta(\[aq]twitter:description\[aq], webpage, default=None))
+\f[R]
+.fi
+.PP
+Methods supporting list of patterns are: \f[V]_search_regex\f[R],
+\f[V]_html_search_regex\f[R], \f[V]_og_search_property\f[R],
+\f[V]_html_search_meta\f[R].
+.SS Trailing parentheses
+.PP
+Always move trailing parentheses after the last argument.
+.SS Example
+.PP
+Correct:
+.IP
+.nf
+\f[C]
+ lambda x: x[\[aq]ResultSet\[aq]][\[aq]Result\[aq]][0][\[aq]VideoUrlSet\[aq]][\[aq]VideoUrl\[aq]],
+ list)
+\f[R]
+.fi
+.PP
+Incorrect:
+.IP
+.nf
+\f[C]
+ lambda x: x[\[aq]ResultSet\[aq]][\[aq]Result\[aq]][0][\[aq]VideoUrlSet\[aq]][\[aq]VideoUrl\[aq]],
+ list,
+)
+\f[R]
+.fi
+.SS Use convenience conversion and parsing functions
+.PP
+Wrap all extracted numeric data into safe functions from
+\f[V]youtube_dl/utils.py\f[R] (https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/utils.py):
+\f[V]int_or_none\f[R], \f[V]float_or_none\f[R].
+Use them for string to number conversions as well.
+.PP
+Use \f[V]url_or_none\f[R] for safe URL processing.
+.PP
+Use \f[V]try_get\f[R] for safe metadata extraction from parsed JSON.
+.PP
+Use \f[V]unified_strdate\f[R] for uniform \f[V]upload_date\f[R] or any
+\f[V]YYYYMMDD\f[R] meta field extraction, \f[V]unified_timestamp\f[R]
+for uniform \f[V]timestamp\f[R] extraction, \f[V]parse_filesize\f[R] for
+\f[V]filesize\f[R] extraction, \f[V]parse_count\f[R] for count meta
+fields extraction, \f[V]parse_resolution\f[R], \f[V]parse_duration\f[R]
+for \f[V]duration\f[R] extraction, \f[V]parse_age_limit\f[R] for
+\f[V]age_limit\f[R] extraction.
+.PP
+Explore
+\f[V]youtube_dl/utils.py\f[R] (https://github.com/ytdl-org/youtube-dl/blob/master/youtube_dl/utils.py)
+for more useful convenience functions.
+.SS More examples
+.SS Safely extract optional description from parsed JSON
+.IP
+.nf
+\f[C]
+description = try_get(response, lambda x: x[\[aq]result\[aq]][\[aq]video\[aq]][0][\[aq]summary\[aq]], compat_str)
+\f[R]
+.fi
+.SS Safely extract more optional metadata
+.IP
+.nf
+\f[C]
+video = try_get(response, lambda x: x[\[aq]result\[aq]][\[aq]video\[aq]][0], dict) or {}
+description = video.get(\[aq]summary\[aq])
+duration = float_or_none(video.get(\[aq]durationMs\[aq]), scale=1000)
+view_count = int_or_none(video.get(\[aq]views\[aq]))
+\f[R]
+.fi
+.SH EMBEDDING YOUTUBE-DL
+.PP
+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 (https://github.com/ytdl-org/youtube-dl/issues/new).
+.PP
+From a Python program, you can embed youtube-dl in a more powerful
+fashion, like this:
+.IP
+.nf
+\f[C]
+from __future__ import unicode_literals
+import youtube_dl
+
+ydl_opts = {}
+with youtube_dl.YoutubeDL(ydl_opts) as ydl:
+ ydl.download([\[aq]https://www.youtube.com/watch?v=BaW_jenozKc\[aq]])
+\f[R]
+.fi
+.PP
+Most likely, you\[cq]ll want to use various options.
+For a list of options available, have a look at
+\f[V]youtube_dl/YoutubeDL.py\f[R] (https://github.com/ytdl-org/youtube-dl/blob/3e4cedf9e8cd3157df2457df7274d0c842421945/youtube_dl/YoutubeDL.py#L137-L312).
+For a start, if you want to intercept youtube-dl\[cq]s output, set a
+\f[V]logger\f[R] object.
+.PP
+Here\[cq]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:
+.IP
+.nf
+\f[C]
+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[\[aq]status\[aq]] == \[aq]finished\[aq]:
+ print(\[aq]Done downloading, now converting ...\[aq])
+
+
+ydl_opts = {
+ \[aq]format\[aq]: \[aq]bestaudio/best\[aq],
+ \[aq]postprocessors\[aq]: [{
+ \[aq]key\[aq]: \[aq]FFmpegExtractAudio\[aq],
+ \[aq]preferredcodec\[aq]: \[aq]mp3\[aq],
+ \[aq]preferredquality\[aq]: \[aq]192\[aq],
+ }],
+ \[aq]logger\[aq]: MyLogger(),
+ \[aq]progress_hooks\[aq]: [my_hook],
+}
+with youtube_dl.YoutubeDL(ydl_opts) as ydl:
+ ydl.download([\[aq]https://www.youtube.com/watch?v=BaW_jenozKc\[aq]])
+\f[R]
+.fi
+.SH BUGS
+.PP
+Bugs and suggestions should be reported in the issue tracker:
+<https://github.com/ytdl-org/youtube-dl/issues> (<https://yt-dl.org/bug>
+is an alias for this).
+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 (irc://chat.freenode.net/#youtube-dl) on freenode
+(webchat (https://webchat.freenode.net/?randomnick=1&channels=youtube-dl)).
+.SS Opening a bug report or suggestion
+.PP
+Be sure to follow instructions provided \f[B]below\f[R] and \f[B]in the
+issue tracker\f[R].
+Complete the appropriate issue template fully.
+Consider whether your problem is covered by an existing issue: if so,
+follow the discussion there.
+Avoid commenting on existing duplicate issues as such comments do not
+add to the discussion of the issue and are liable to be treated as spam.
+.PP
+\f[B]Please include the full output of youtube-dl when run with
+\f[VB]-v\f[B]\f[R], i.e.\ \f[B]add\f[R] \f[V]-v\f[R] flag to \f[B]your
+command line\f[R], copy the \f[B]whole\f[R] output and post it in the
+issue body wrapped in \[ga]\[ga]\[ga] for better formatting.
+It should look similar to this:
+.IP
+.nf
+\f[C]
+$ youtube-dl -v <your command line>
+[debug] System config: []
+[debug] User config: []
+[debug] Command-line args: [u\[aq]-v\[aq], u\[aq]https://www.youtube.com/watch?v=BaW_jenozKcj\[aq]]
+[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: {}
+\&...
+\f[R]
+.fi
+.PP
+\f[B]Do not post screenshots of verbose logs; only plain text is
+acceptable.\f[R]
+.PP
+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.
+.PP
+Finally please review your issue to avoid various common mistakes (you
+can and should use this as a checklist) listed below.
+.SS Is the description of the issue itself sufficient?
+.PP
+We often get issue reports that are hard to understand.
+To avoid subsequent clarifications, and to assist participants who are
+not native English speakers, please elaborate on what feature you are
+requesting, or what bug you want to be fixed.
+.PP
+Make sure that it\[cq]s obvious
+.IP \[bu] 2
+What the problem is
+.IP \[bu] 2
+How it could be fixed
+.IP \[bu] 2
+How your proposed solution would look
+.PP
+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\[cq]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.
+.PP
+For bug reports, this means that your report should contain the
+\f[I]complete\f[R] output of youtube-dl when called with the
+\f[V]-v\f[R] 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.
+.PP
+If your server has multiple IPs or you suspect censorship, adding
+\f[V]--call-home\f[R] may be a good idea to get more diagnostics.
+If the error is \f[V]ERROR: Unable to extract ...\f[R] and you cannot
+reproduce it from multiple countries, add \f[V]--dump-pages\f[R]
+(warning: this will yield a rather large output, redirect it to the file
+\f[V]log.txt\f[R] by adding \f[V]>log.txt 2>&1\f[R] to your
+command-line) or upload the \f[V].dump\f[R] files you get when you add
+\f[V]--write-pages\f[R] somewhere (https://gist.github.com/).
+.PP
+\f[B]Site support requests must contain an example URL\f[R].
+An example URL is a URL you might want to download, like
+\f[V]https://www.youtube.com/watch?v=BaW_jenozKc\f[R].
+There should be an obvious video present.
+Except under very special circumstances, the main page of a video
+service (e.g.\ \f[V]https://www.youtube.com/\f[R]) is \f[I]not\f[R] an
+example URL.
+.SS Is the issue already documented?
+.PP
+Make sure that someone has not already opened the issue you\[cq]re
+trying to open.
+Search at the top of the window or browse the GitHub
+Issues (https://github.com/ytdl-org/youtube-dl/search?type=Issues) of
+this repository.
+Initially, at least, use the search term \f[V]-label:duplicate\f[R] to
+focus on active issues.
+If there is an issue, feel free to write something along the lines of
+\[lq]This affects me as well, with version 2015.01.01.
+Here is some more information on the issue: \&...\[rq].
+While some issues may be old, a new post into them often spurs rapid
+activity.
+.SS Are you using the latest version?
+.PP
+Before reporting any issue, type \f[V]youtube-dl -U\f[R].
+This should report that you\[cq]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.
+.SS Why are existing options not enough?
+.PP
+Before requesting a new feature, please have a quick peek at the list of
+supported
+options (https://github.com/ytdl-org/youtube-dl/blob/master/README.md#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 \f[I]not\f[R] solve your problem.
+.SS Is there enough context in your bug report?
+.PP
+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).
+.PP
+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.
+.SS Does the issue involve one problem, and one problem only?
+.PP
+Some of our users seem to think there is a limit of issues they can or
+should open.
+There is no limit of issues they can or should open.
+While it may seem appealing to be able to dump all your issues into one
+ticket, that means that someone who solves one of your issues cannot
+mark the issue as closed.
+Typically, reporting a bunch of issues leads to the ticket lingering
+since nobody wants to attack that behemoth, until someone mercifully
+splits the issue into multiple ones.
+.PP
+In particular, every site support request issue should only pertain to
+services at one site (generally under a common domain, but always using
+the same backend technology).
+Do not request support for vimeo user videos, White house podcasts, and
+Google Plus pages in the same issue.
+Also, make sure that you don\[cq]t post bug reports alongside feature
+requests.
+As a rule of thumb, a feature request does not include outputs of
+youtube-dl that are not immediately related to the feature at hand.
+Do not post reports of a network error alongside the request for a new
+video service.
+.SS Is anyone going to need the feature?
+.PP
+Only post features that you (or an incapacitated friend you can
+personally talk to) require.
+Do not post features because they seem like a good idea.
+If they are really useful, they will be requested by someone who
+requires them.
+.SS Is your question about youtube-dl?
+.PP
+It may sound strange, but some bug reports we receive are completely
+unrelated to youtube-dl and relate to a different, or even the
+reporter\[cq]s own, application.
+Please make sure that you are actually using youtube-dl.
+If you are using a UI for youtube-dl, report the bug to the maintainer
+of the actual application providing the UI.
+On the other hand, if your UI for youtube-dl fails in some way you
+believe is related to youtube-dl, by all means, go ahead and report the
+bug.
+.SH COPYRIGHT
+.PP
+youtube-dl is released into the public domain by the copyright holders.
+.PP
+This README file was originally written by Daniel
+Bolton (https://github.com/dbbolton) and is likewise released into the
+public domain.
diff --git a/network/youtube-dl/youtube-dl.SlackBuild b/network/youtube-dl/youtube-dl.SlackBuild
index ef646435d096..24dc489070e0 100644
--- a/network/youtube-dl/youtube-dl.SlackBuild
+++ b/network/youtube-dl/youtube-dl.SlackBuild
@@ -23,6 +23,11 @@
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 20230627 bkw: Modified by SlackBuilds.org, BUILD=2:
+# - include the man page and shell completions in the package.
+# - get rid of empty (and wrong) /usr/doc/youtube_dl/ dir.
+# - get rid of doinst.sh: there is no need for update-desktop-database as
+# there are no .desktop files in the package.
# Date: 20/06/2023
# Many Thanks to B. Watson for the tool git2tarxz.sh
@@ -32,7 +37,7 @@ cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=youtube-dl
VERSION=${VERSION:-2021.12.17+20230618_07af47960}
-BUILD=${BUILD:-1}
+BUILD=${BUILD:-2}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
@@ -44,9 +49,6 @@ if [ -z "$ARCH" ]; then
esac
fi
-# If the variable PRINT_PACKAGE_NAME is set, then this script will report what
-# the name of the created package would be, and then exit. This information
-# could be useful to other scripts.
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
@@ -82,18 +84,29 @@ cd $PRGNAM-$VERSION
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
- -o -perm 511 \) -exec chmod 755 {} \; -o \
+ -o -perm 511 \) -exec chmod 755 {} + -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
- -o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
+ -o -perm 440 -o -perm 400 \) -exec chmod 644 {} +
# setup.py patch
patch -p1 < $CWD/setup.patch
+# 20230627 bkw: building the man page would require pandoc or pandoc-bin.
+# Easier to just include the prebuilt manpage in the SBo repo.
+cat $CWD/$PRGNAM.1 > $PRGNAM.1
+
+# 20230627 bkw: Unusual for a python build, we need this for the man page
+# and shell completions. It also installs the all-in-one youtube-dl
+# 'frozen' binary, which we don't want, but setup.py will overwrite that.
+make install DESTDIR=$PKG PREFIX=/usr MANDIR=/usr/man
+
python2 setup.py install --root=$PKG
python3 setup.py install --root=$PKG
-find $PKG/usr/man -type f -exec gzip -9 {} \;
-for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
+gzip $PKG/usr/man/man*/*
+
+# 20230627 bkw: this empty dir gets created, but we don't need it.
+rmdir $PKG/usr/doc/youtube_dl
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
cp -a README.md LICENSE AUTHORS ChangeLog $PKG/usr/doc/$PRGNAM-$VERSION
@@ -101,7 +114,6 @@ cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
-cat $CWD/doinst.sh > $PKG/install/doinst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE