|
|
[YT-DLP]
|
|
|
|
|
|
[Release version] [PyPi] [Donate] [Matrix] [Discord] [Supported Sites]
|
|
|
[License: Unlicense] [CI Status] [Commits] [Last Commit]
|
|
|
|
|
|
yt-dlp is a youtube-dl fork based on the now inactive youtube-dlc. The
|
|
|
main focus of this project is adding new features and patches while also
|
|
|
keeping up to date with the original project
|
|
|
|
|
|
- NEW FEATURES
|
|
|
- Differences in default behavior
|
|
|
- INSTALLATION
|
|
|
- Detailed instructions
|
|
|
- Update
|
|
|
- Release Files
|
|
|
- Dependencies
|
|
|
- Compile
|
|
|
- USAGE AND OPTIONS
|
|
|
- General Options
|
|
|
- Network Options
|
|
|
- Geo-restriction
|
|
|
- Video Selection
|
|
|
- Download Options
|
|
|
- Filesystem Options
|
|
|
- Thumbnail Options
|
|
|
- Internet Shortcut Options
|
|
|
- Verbosity and Simulation Options
|
|
|
- Workarounds
|
|
|
- Video Format Options
|
|
|
- Subtitle Options
|
|
|
- Authentication Options
|
|
|
- Post-processing Options
|
|
|
- SponsorBlock Options
|
|
|
- Extractor Options
|
|
|
- CONFIGURATION
|
|
|
- Configuration file encoding
|
|
|
- Authentication with .netrc file
|
|
|
- Notes about environment variables
|
|
|
- OUTPUT TEMPLATE
|
|
|
- Output template examples
|
|
|
- FORMAT SELECTION
|
|
|
- Filtering Formats
|
|
|
- Sorting Formats
|
|
|
- Format Selection examples
|
|
|
- MODIFYING METADATA
|
|
|
- Modifying metadata examples
|
|
|
- EXTRACTOR ARGUMENTS
|
|
|
- PLUGINS
|
|
|
- Installing Plugins
|
|
|
- Developing Plugins
|
|
|
- EMBEDDING YT-DLP
|
|
|
- Embedding examples
|
|
|
- DEPRECATED OPTIONS
|
|
|
- CONTRIBUTING
|
|
|
- Opening an Issue
|
|
|
- Developer Instructions
|
|
|
- WIKI
|
|
|
- FAQ
|
|
|
|
|
|
NEW FEATURES
|
|
|
|
|
|
- Merged with youtube-dl v2021.12.17+ commit/2dd6c6e (exceptions) and
|
|
|
youtube-dlc v2020.11.11-3+ commit/f9401f2: You get all the features
|
|
|
and patches of youtube-dlc in addition to the latest youtube-dl
|
|
|
|
|
|
- SponsorBlock Integration: You can mark/remove sponsor sections in
|
|
|
YouTube videos by utilizing the SponsorBlock API
|
|
|
|
|
|
- Format Sorting: The default format sorting options have been changed
|
|
|
so that higher resolution and better codecs will be now preferred
|
|
|
instead of simply using larger bitrate. Furthermore, you can now
|
|
|
specify the sort order using -S. This allows for much easier format
|
|
|
selection than what is possible by simply using --format (examples)
|
|
|
|
|
|
- Merged with animelover1984/youtube-dl: You get most of the features
|
|
|
and improvements from animelover1984/youtube-dl including
|
|
|
--write-comments, BiliBiliSearch, BilibiliChannel, Embedding
|
|
|
thumbnail in mp4/ogg/opus, playlist infojson etc. Note that NicoNico
|
|
|
livestreams are not available. See #31 for details.
|
|
|
|
|
|
- YouTube improvements:
|
|
|
|
|
|
- Supports Clips, Stories (ytstories:<channel UCID>), Search
|
|
|
(including filters)*, YouTube Music Search, Channel-specific
|
|
|
search, Search prefixes (ytsearch:, ytsearchdate:)*, Mixes,
|
|
|
YouTube Music Albums/Channels (except self-uploaded music), and
|
|
|
Feeds (:ytfav, :ytwatchlater, :ytsubs, :ythistory, :ytrec,
|
|
|
:ytnotif)
|
|
|
- Fix for n-sig based throttling *
|
|
|
- Supports some (but not all) age-gated content without cookies
|
|
|
- Download livestreams from the start using --live-from-start
|
|
|
(experimental)
|
|
|
- 255kbps audio is extracted (if available) from YouTube Music
|
|
|
when premium cookies are given
|
|
|
- Channel URLs download all uploads of the channel, including
|
|
|
shorts and live
|
|
|
|
|
|
- Cookies from browser: Cookies can be automatically extracted from
|
|
|
all major web browsers using
|
|
|
--cookies-from-browser BROWSER[+KEYRING][:PROFILE][::CONTAINER]
|
|
|
|
|
|
- Download time range: Videos can be downloaded partially based on
|
|
|
either timestamps or chapters using --download-sections
|
|
|
|
|
|
- Split video by chapters: Videos can be split into multiple files
|
|
|
based on chapters using --split-chapters
|
|
|
|
|
|
- Multi-threaded fragment downloads: Download multiple fragments of
|
|
|
m3u8/mpd videos in parallel. Use --concurrent-fragments (-N) option
|
|
|
to set the number of threads used
|
|
|
|
|
|
- Aria2c with HLS/DASH: You can use aria2c as the external downloader
|
|
|
for DASH(mpd) and HLS(m3u8) formats
|
|
|
|
|
|
- New and fixed extractors: Many new extractors have been added and a
|
|
|
lot of existing ones have been fixed. See the changelog or the list
|
|
|
of supported sites
|
|
|
|
|
|
- New MSOs: Philo, Spectrum, SlingTV, Cablevision, RCN etc.
|
|
|
|
|
|
- Subtitle extraction from manifests: Subtitles can be extracted from
|
|
|
streaming media manifests. See commit/be6202f for details
|
|
|
|
|
|
- Multiple paths and output templates: You can give different output
|
|
|
templates and download paths for different types of files. You can
|
|
|
also set a temporary path where intermediary files are downloaded to
|
|
|
using --paths (-P)
|
|
|
|
|
|
- Portable Configuration: Configuration files are automatically loaded
|
|
|
from the home and root directories. See CONFIGURATION for details
|
|
|
|
|
|
- Output template improvements: Output templates can now have
|
|
|
date-time formatting, numeric offsets, object traversal etc. See
|
|
|
output template for details. Even more advanced operations can also
|
|
|
be done with the help of --parse-metadata and --replace-in-metadata
|
|
|
|
|
|
- Other new options: Many new options have been added such as --alias,
|
|
|
--print, --concat-playlist, --wait-for-video, --retry-sleep,
|
|
|
--sleep-requests, --convert-thumbnails, --force-download-archive,
|
|
|
--force-overwrites, --break-match-filter etc
|
|
|
|
|
|
- Improvements: Regex and other operators in --format/--match-filter,
|
|
|
multiple --postprocessor-args and --downloader-args, faster archive
|
|
|
checking, more format selection options, merge multi-video/audio,
|
|
|
multiple --config-locations, --exec at different stages, etc
|
|
|
|
|
|
- Plugins: Extractors and PostProcessors can be loaded from an
|
|
|
external file. See plugins for details
|
|
|
|
|
|
- Self updater: The releases can be updated using yt-dlp -U, and
|
|
|
downgraded using --update-to if required
|
|
|
|
|
|
- Nightly builds: Automated nightly builds can be used with
|
|
|
--update-to nightly
|
|
|
|
|
|
See changelog or commits for the full list of changes
|
|
|
|
|
|
Features marked with a * have been back-ported to youtube-dl
|
|
|
|
|
|
Differences in default behavior
|
|
|
|
|
|
Some of yt-dlp's default options are different from that of youtube-dl
|
|
|
and youtube-dlc:
|
|
|
|
|
|
- yt-dlp supports only Python 3.7+, and may remove support for more
|
|
|
versions as they become EOL; while youtube-dl still supports Python
|
|
|
2.6+ and 3.2+
|
|
|
- The options --auto-number (-A), --title (-t) and --literal (-l), no
|
|
|
longer work. See removed options for details
|
|
|
- avconv is not supported as an alternative to ffmpeg
|
|
|
- yt-dlp stores config files in slightly different locations to
|
|
|
youtube-dl. See CONFIGURATION for a list of correct locations
|
|
|
- The default output template is %(title)s [%(id)s].%(ext)s. There is
|
|
|
no real reason for this change. This was changed before yt-dlp was
|
|
|
ever made public and now there are no plans to change it back to
|
|
|
%(title)s-%(id)s.%(ext)s. Instead, you may use
|
|
|
--compat-options filename
|
|
|
- The default format sorting is different from youtube-dl and prefers
|
|
|
higher resolution and better codecs rather than higher bitrates. You
|
|
|
can use the --format-sort option to change this to any order you
|
|
|
prefer, or use --compat-options format-sort to use youtube-dl's
|
|
|
sorting order
|
|
|
- The default format selector is bv*+ba/b. This means that if a
|
|
|
combined video + audio format that is better than the best
|
|
|
video-only format is found, the former will be preferred. Use
|
|
|
-f bv+ba/b or --compat-options format-spec to revert this
|
|
|
- Unlike youtube-dlc, yt-dlp does not allow merging multiple
|
|
|
audio/video streams into one file by default (since this conflicts
|
|
|
with the use of -f bv*+ba). If needed, this feature must be enabled
|
|
|
using --audio-multistreams and --video-multistreams. You can also
|
|
|
use --compat-options multistreams to enable both
|
|
|
- --no-abort-on-error is enabled by default. Use --abort-on-error or
|
|
|
--compat-options abort-on-error to abort on errors instead
|
|
|
- When writing metadata files such as thumbnails, description or
|
|
|
infojson, the same information (if available) is also written for
|
|
|
playlists. Use --no-write-playlist-metafiles or
|
|
|
--compat-options no-playlist-metafiles to not write these files
|
|
|
- --add-metadata attaches the infojson to mkv files in addition to
|
|
|
writing the metadata when used with --write-info-json. Use
|
|
|
--no-embed-info-json or --compat-options no-attach-info-json to
|
|
|
revert this
|
|
|
- Some metadata are embedded into different fields when using
|
|
|
--add-metadata as compared to youtube-dl. Most notably, comment
|
|
|
field contains the webpage_url and synopsis contains the
|
|
|
description. You can use --parse-metadata to modify this to your
|
|
|
liking or use --compat-options embed-metadata to revert this
|
|
|
- playlist_index behaves differently when used with options like
|
|
|
--playlist-reverse and --playlist-items. See #302 for details. You
|
|
|
can use --compat-options playlist-index if you want to keep the
|
|
|
earlier behavior
|
|
|
- The output of -F is listed in a new format. Use
|
|
|
--compat-options list-formats to revert this
|
|
|
- Live chats (if available) are considered as subtitles. Use
|
|
|
--sub-langs all,-live_chat to download all subtitles except live
|
|
|
chat. You can also use --compat-options no-live-chat to prevent any
|
|
|
live chat/danmaku from downloading
|
|
|
- YouTube channel URLs download all uploads of the channel. To
|
|
|
download only the videos in a specific tab, pass the tab's URL. If
|
|
|
the channel does not show the requested tab, an error will be
|
|
|
raised. Also, /live URLs raise an error if there are no live videos
|
|
|
instead of silently downloading the entire channel. You may use
|
|
|
--compat-options no-youtube-channel-redirect to revert all these
|
|
|
redirections
|
|
|
- Unavailable videos are also listed for YouTube playlists. Use
|
|
|
--compat-options no-youtube-unavailable-videos to remove this
|
|
|
- The upload dates extracted from YouTube are in UTC when available.
|
|
|
Use --compat-options no-youtube-prefer-utc-upload-date to prefer the
|
|
|
non-UTC upload date.
|
|
|
- If ffmpeg is used as the downloader, the downloading and merging of
|
|
|
formats happen in a single step when possible. Use
|
|
|
--compat-options no-direct-merge to revert this
|
|
|
- Thumbnail embedding in mp4 is done with mutagen if possible. Use
|
|
|
--compat-options embed-thumbnail-atomicparsley to force the use of
|
|
|
AtomicParsley instead
|
|
|
- Some private fields such as filenames are removed by default from
|
|
|
the infojson. Use --no-clean-infojson or
|
|
|
--compat-options no-clean-infojson to revert this
|
|
|
- When --embed-subs and --write-subs are used together, the subtitles
|
|
|
are written to disk and also embedded in the media file. You can use
|
|
|
just --embed-subs to embed the subs and automatically delete the
|
|
|
separate file. See #630 (comment) for more info.
|
|
|
--compat-options no-keep-subs can be used to revert this
|
|
|
- certifi will be used for SSL root certificates, if installed. If you
|
|
|
want to use system certificates (e.g. self-signed), use
|
|
|
--compat-options no-certifi
|
|
|
- yt-dlp's sanitization of invalid characters in filenames is
|
|
|
different/smarter than in youtube-dl. You can use
|
|
|
--compat-options filename-sanitization to revert to youtube-dl's
|
|
|
behavior
|
|
|
- yt-dlp tries to parse the external downloader outputs into the
|
|
|
standard progress output if possible (Currently implemented:
|
|
|
~~aria2c~~). You can use
|
|
|
--compat-options no-external-downloader-progress to get the
|
|
|
downloader output as-is
|
|
|
|
|
|
For ease of use, a few more compat options are available:
|
|
|
|
|
|
- --compat-options all: Use all compat options (Do NOT use)
|
|
|
- --compat-options youtube-dl: Same as
|
|
|
--compat-options all,-multistreams
|
|
|
- --compat-options youtube-dlc: Same as
|
|
|
--compat-options all,-no-live-chat,-no-youtube-channel-redirect
|
|
|
- --compat-options 2021: Same as
|
|
|
--compat-options 2022,no-certifi,filename-sanitization,no-youtube-prefer-utc-upload-date
|
|
|
- --compat-options 2022: Same as
|
|
|
--compat-options no-external-downloader-progress. Use this to enable
|
|
|
all future compat options
|
|
|
|
|
|
INSTALLATION
|
|
|
|
|
|
[Windows] [Unix] [MacOS] [PyPi] [Source Tarball] [Other variants] [All
|
|
|
versions]
|
|
|
|
|
|
You can install yt-dlp using the binaries, PIP or one using a
|
|
|
third-party package manager. See the wiki for detailed instructions
|
|
|
|
|
|
UPDATE
|
|
|
|
|
|
You can use yt-dlp -U to update if you are using the release binaries
|
|
|
|
|
|
If you installed with PIP, simply re-run the same command that was used
|
|
|
to install the program
|
|
|
|
|
|
For other third-party package managers, see the wiki or refer their
|
|
|
documentation
|
|
|
|
|
|
There are currently two release channels for binaries, stable and
|
|
|
nightly. stable is the default channel, and many of its changes have
|
|
|
been tested by users of the nightly channel. The nightly channel has
|
|
|
releases built after each push to the master branch, and will have the
|
|
|
most recent fixes and additions, but also have more risk of regressions.
|
|
|
They are available in their own repo.
|
|
|
|
|
|
When using --update/-U, a release binary will only update to its current
|
|
|
channel. This release channel can be changed by using the --update-to
|
|
|
option. --update-to can also be used to upgrade or downgrade to specific
|
|
|
tags from a channel.
|
|
|
|
|
|
Example usage: * yt-dlp --update-to nightly change to nightly channel
|
|
|
and update to its latest release * yt-dlp --update-to stable@2023.02.17
|
|
|
upgrade/downgrade to release to stable channel tag 2023.02.17 *
|
|
|
yt-dlp --update-to 2023.01.06 upgrade/downgrade to tag 2023.01.06 if it
|
|
|
exists on the current channel
|
|
|
|
|
|
RELEASE FILES
|
|
|
|
|
|
Recommended
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
|
File Description
|
|
|
----------------------------------- -----------------------------------
|
|
|
yt-dlp Platform-independent zipimport
|
|
|
binary. Needs Python (recommended
|
|
|
for Linux/BSD)
|
|
|
|
|
|
yt-dlp.exe Windows (Win7 SP1+) standalone x64
|
|
|
binary (recommended for Windows)
|
|
|
|
|
|
yt-dlp_macos Universal MacOS (10.15+) standalone
|
|
|
executable (recommended for MacOS)
|
|
|
-----------------------------------------------------------------------
|
|
|
|
|
|
Alternatives
|
|
|
|
|
|
-----------------------------------------------------------------------
|
|
|
File Description
|
|
|
----------------------------------- -----------------------------------
|
|
|
yt-dlp_x86.exe Windows (Vista SP2+) standalone x86
|
|
|
(32-bit) binary
|
|
|
|
|
|
yt-dlp_min.exe Windows (Win7 SP1+) standalone x64
|
|
|
binary built with py2exe (Not
|
|
|
recommended)
|
|
|
|
|
|
yt-dlp_linux Linux standalone x64 binary
|
|
|
|
|
|
yt-dlp_linux.zip Unpackaged Linux executable (no
|
|
|
auto-update)
|
|
|
|
|
|
yt-dlp_linux_armv7l Linux standalone armv7l (32-bit)
|
|
|
binary
|
|
|
|
|
|
yt-dlp_linux_aarch64 Linux standalone aarch64 (64-bit)
|
|
|
binary
|
|
|
|
|
|
yt-dlp_win.zip Unpackaged Windows executable (no
|
|
|
auto-update)
|
|
|
|
|
|
yt-dlp_macos.zip Unpackaged MacOS (10.15+)
|
|
|
executable (no auto-update)
|
|
|
|
|
|
yt-dlp_macos_legacy MacOS (10.9+) standalone x64
|
|
|
executable
|
|
|
-----------------------------------------------------------------------
|
|
|
|
|
|
Misc
|
|
|
|
|
|
File Description
|
|
|
------------------ ------------------------------------
|
|
|
yt-dlp.tar.gz Source tarball
|
|
|
SHA2-512SUMS GNU-style SHA512 sums
|
|
|
SHA2-512SUMS.sig GPG signature file for SHA512 sums
|
|
|
SHA2-256SUMS GNU-style SHA256 sums
|
|
|
SHA2-256SUMS.sig GPG signature file for SHA256 sums
|
|
|
|
|
|
The public key that can be used to verify the GPG signatures is
|
|
|
available here Example usage:
|
|
|
|
|
|
curl -L https://github.com/yt-dlp/yt-dlp/raw/master/public.key | gpg --import
|
|
|
gpg --verify SHA2-256SUMS.sig SHA2-256SUMS
|
|
|
gpg --verify SHA2-512SUMS.sig SHA2-512SUMS
|
|
|
|
|
|
Note: The manpages, shell completion files etc. are available inside the
|
|
|
source tarball
|
|
|
|
|
|
DEPENDENCIES
|
|
|
|
|
|
Python versions 3.7+ (CPython and PyPy) are supported. Other versions
|
|
|
and implementations may or may not work correctly.
|
|
|
|
|
|
While all the other dependencies are optional, ffmpeg and ffprobe are
|
|
|
highly recommended
|
|
|
|
|
|
Strongly recommended
|
|
|
|
|
|
- ffmpeg and ffprobe - Required for merging separate video and audio
|
|
|
files as well as for various post-processing tasks. License depends
|
|
|
on the build
|
|
|
|
|
|
There are bugs in ffmpeg that causes various issues when used
|
|
|
alongside yt-dlp. Since ffmpeg is such an important dependency, we
|
|
|
provide custom builds with patches for some of these issues at
|
|
|
yt-dlp/FFmpeg-Builds. See the readme for details on the specific
|
|
|
issues solved by these builds
|
|
|
|
|
|
Important: What you need is ffmpeg binary, NOT the python package of
|
|
|
the same name
|
|
|
|
|
|
Networking
|
|
|
|
|
|
- certifi* - Provides Mozilla's root certificate bundle. Licensed
|
|
|
under MPLv2
|
|
|
- brotli* or brotlicffi - Brotli content encoding support. Both
|
|
|
licensed under MIT 1 2
|
|
|
- websockets* - For downloading over websocket. Licensed under
|
|
|
BSD-3-Clause
|
|
|
|
|
|
Metadata
|
|
|
|
|
|
- mutagen* - For --embed-thumbnail in certain formats. Licensed under
|
|
|
GPLv2+
|
|
|
- AtomicParsley - For --embed-thumbnail in mp4/m4a files when
|
|
|
mutagen/ffmpeg cannot. Licensed under GPLv2+
|
|
|
- xattr, pyxattr or setfattr - For writing xattr metadata (--xattr) on
|
|
|
Linux. Licensed under MIT, LGPL2.1 and GPLv2+ respectively
|
|
|
|
|
|
Misc
|
|
|
|
|
|
- pycryptodomex* - For decrypting AES-128 HLS streams and various
|
|
|
other data. Licensed under BSD-2-Clause
|
|
|
- phantomjs - Used in extractors where javascript needs to be run.
|
|
|
Licensed under BSD-3-Clause
|
|
|
- secretstorage - For --cookies-from-browser to access the Gnome
|
|
|
keyring while decrypting cookies of Chromium-based browsers on
|
|
|
Linux. Licensed under BSD-3-Clause
|
|
|
- Any external downloader that you want to use with --downloader
|
|
|
|
|
|
Deprecated
|
|
|
|
|
|
- avconv and avprobe - Now deprecated alternative to ffmpeg. License
|
|
|
depends on the build
|
|
|
- sponskrub - For using the now deprecated sponskrub options. Licensed
|
|
|
under GPLv3+
|
|
|
- rtmpdump - For downloading rtmp streams. ffmpeg can be used instead
|
|
|
with --downloader ffmpeg. Licensed under GPLv2+
|
|
|
- mplayer or mpv - For downloading rstp/mms streams. ffmpeg can be
|
|
|
used instead with --downloader ffmpeg. Licensed under GPLv2+
|
|
|
|
|
|
To use or redistribute the dependencies, you must agree to their
|
|
|
respective licensing terms.
|
|
|
|
|
|
The standalone release binaries are built with the Python interpreter
|
|
|
and the packages marked with * included.
|
|
|
|
|
|
If you do not have the necessary dependencies for a task you are
|
|
|
attempting, yt-dlp will warn you. All the currently available
|
|
|
dependencies are visible at the top of the --verbose output
|
|
|
|
|
|
COMPILE
|
|
|
|
|
|
Standalone PyInstaller Builds
|
|
|
|
|
|
To build the standalone executable, you must have Python and pyinstaller
|
|
|
(plus any of yt-dlp's optional dependencies if needed). Once you have
|
|
|
all the necessary dependencies installed, simply run pyinst.py. The
|
|
|
executable will be built for the same architecture (x86/ARM, 32/64 bit)
|
|
|
as the Python used.
|
|
|
|
|
|
python3 -m pip install -U pyinstaller -r requirements.txt
|
|
|
python3 devscripts/make_lazy_extractors.py
|
|
|
python3 pyinst.py
|
|
|
|
|
|
On some systems, you may need to use py or python instead of python3.
|
|
|
|
|
|
pyinst.py accepts any arguments that can be passed to pyinstaller, such
|
|
|
as --onefile/-F or --onedir/-D, which is further documented here.
|
|
|
|
|
|
Note: Pyinstaller versions below 4.4 do not support Python installed
|
|
|
from the Windows store without using a virtual environment.
|
|
|
|
|
|
Important: Running pyinstaller directly without using pyinst.py is not
|
|
|
officially supported. This may or may not work correctly.
|
|
|
|
|
|
Platform-independent Binary (UNIX)
|
|
|
|
|
|
You will need the build tools python (3.7+), zip, make (GNU), pandoc*
|
|
|
and pytest*.
|
|
|
|
|
|
After installing these, simply run make.
|
|
|
|
|
|
You can also run make yt-dlp instead to compile only the binary without
|
|
|
updating any of the additional files. (The build tools marked with * are
|
|
|
not needed for this)
|
|
|
|
|
|
Standalone Py2Exe Builds (Windows)
|
|
|
|
|
|
While we provide the option to build with py2exe, it is recommended to
|
|
|
build using PyInstaller instead since the py2exe builds cannot contain
|
|
|
pycryptodomex/certifi and needs VC++14 on the target computer to run.
|
|
|
|
|
|
If you wish to build it anyway, install Python and py2exe, and then
|
|
|
simply run setup.py py2exe
|
|
|
|
|
|
py -m pip install -U py2exe -r requirements.txt
|
|
|
py devscripts/make_lazy_extractors.py
|
|
|
py setup.py py2exe
|
|
|
|
|
|
Related scripts
|
|
|
|
|
|
- devscripts/update-version.py - Update the version number based on
|
|
|
current date.
|
|
|
- devscripts/set-variant.py - Set the build variant of the executable.
|
|
|
- devscripts/make_changelog.py - Create a markdown changelog using
|
|
|
short commit messages and update CONTRIBUTORS file.
|
|
|
- devscripts/make_lazy_extractors.py - Create lazy extractors. Running
|
|
|
this before building the binaries (any variant) will improve their
|
|
|
startup performance. Set the environment variable
|
|
|
YTDLP_NO_LAZY_EXTRACTORS=1 if you wish to forcefully disable lazy
|
|
|
extractor loading.
|
|
|
|
|
|
Note: See their --help for more info.
|
|
|
|
|
|
Forking the project
|
|
|
|
|
|
If you fork the project on GitHub, you can run your fork's build
|
|
|
workflow to automatically build the selected version(s) as artifacts.
|
|
|
Alternatively, you can run the release workflow or enable the nightly
|
|
|
workflow to create full (pre-)releases.
|
|
|
|
|
|
USAGE AND OPTIONS
|
|
|
|
|
|
yt-dlp [OPTIONS] [--] URL [URL...]
|
|
|
|
|
|
Ctrl+F is your friend :D
|
|
|
|
|
|
General Options:
|
|
|
|
|
|
-h, --help Print this help text and exit
|
|
|
--version Print program version and exit
|
|
|
-U, --update Update this program to the latest version
|
|
|
--no-update Do not check for updates (default)
|
|
|
--update-to [CHANNEL]@[TAG] Upgrade/downgrade to a specific version.
|
|
|
CHANNEL and TAG defaults to "stable" and
|
|
|
"latest" respectively if omitted; See
|
|
|
"UPDATE" for details. Supported channels:
|
|
|
stable, nightly
|
|
|
-i, --ignore-errors Ignore download and postprocessing errors.
|
|
|
The download will be considered successful
|
|
|
even if the postprocessing fails
|
|
|
--no-abort-on-error Continue with next video on download errors;
|
|
|
e.g. to skip unavailable videos in a
|
|
|
playlist (default)
|
|
|
--abort-on-error Abort downloading of further videos if an
|
|
|
error occurs (Alias: --no-ignore-errors)
|
|
|
--dump-user-agent Display the current user-agent and exit
|
|
|
--list-extractors List all supported extractors and exit
|
|
|
--extractor-descriptions Output descriptions of all supported
|
|
|
extractors and exit
|
|
|
--use-extractors NAMES Extractor names to use separated by commas.
|
|
|
You can also use regexes, "all", "default"
|
|
|
and "end" (end URL matching); e.g. --ies
|
|
|
"holodex.*,end,youtube". Prefix the name
|
|
|
with a "-" to exclude it, e.g. --ies
|
|
|
default,-generic. Use --list-extractors for
|
|
|
a list of extractor names. (Alias: --ies)
|
|
|
--default-search PREFIX Use this prefix for unqualified URLs. E.g.
|
|
|
"gvsearch2:python" downloads two videos from
|
|
|
google videos for the search term "python".
|
|
|
Use the value "auto" to let yt-dlp guess
|
|
|
("auto_warning" to emit a warning when
|
|
|
guessing). "error" just throws an error. The
|
|
|
default value "fixup_error" repairs broken
|
|
|
URLs, but emits an error if this is not
|
|
|
possible instead of searching
|
|
|
--ignore-config Don't load any more configuration files
|
|
|
except those given by --config-locations.
|
|
|
For backward compatibility, if this option
|
|
|
is found inside the system configuration
|
|
|
file, the user configuration is not loaded.
|
|
|
(Alias: --no-config)
|
|
|
--no-config-locations Do not load any custom configuration files
|
|
|
(default). When given inside a configuration
|
|
|
file, ignore all previous --config-locations
|
|
|
defined in the current file
|
|
|
--config-locations PATH Location of the main configuration file;
|
|
|
either the path to the config or its
|
|
|
containing directory ("-" for stdin). Can be
|
|
|
used multiple times and inside other
|
|
|
configuration files
|
|
|
--flat-playlist Do not extract the videos of a playlist,
|
|
|
only list them
|
|
|
--no-flat-playlist Extract the videos of a playlist
|
|
|
--live-from-start Download livestreams from the start.
|
|
|
Currently only supported for YouTube
|
|
|
(Experimental)
|
|
|
--no-live-from-start Download livestreams from the current time
|
|
|
(default)
|
|
|
--wait-for-video MIN[-MAX] Wait for scheduled streams to become
|
|
|
available. Pass the minimum number of
|
|
|
seconds (or range) to wait between retries
|
|
|
--no-wait-for-video Do not wait for scheduled streams (default)
|
|
|
--mark-watched Mark videos watched (even with --simulate)
|
|
|
--no-mark-watched Do not mark videos watched (default)
|
|
|
--no-colors Do not emit color codes in output (Alias:
|
|
|
--no-colours)
|
|
|
--compat-options OPTS Options that can help keep compatibility
|
|
|
with youtube-dl or youtube-dlc
|
|
|
configurations by reverting some of the
|
|
|
changes made in yt-dlp. See "Differences in
|
|
|
default behavior" for details
|
|
|
--alias ALIASES OPTIONS Create aliases for an option string. Unless
|
|
|
an alias starts with a dash "-", it is
|
|
|
prefixed with "--". Arguments are parsed
|
|
|
according to the Python string formatting
|
|
|
mini-language. E.g. --alias get-audio,-X
|
|
|
"-S=aext:{0},abr -x --audio-format {0}"
|
|
|
creates options "--get-audio" and "-X" that
|
|
|
takes an argument (ARG0) and expands to
|
|
|
"-S=aext:ARG0,abr -x --audio-format ARG0".
|
|
|
All defined aliases are listed in the --help
|
|
|
output. Alias options can trigger more
|
|
|
aliases; so be careful to avoid defining
|
|
|
recursive options. As a safety measure, each
|
|
|
alias may be triggered a maximum of 100
|
|
|
times. This option can be used multiple times
|
|
|
|
|
|
Network Options:
|
|
|
|
|
|
--proxy URL Use the specified HTTP/HTTPS/SOCKS proxy. To
|
|
|
enable SOCKS proxy, specify a proper scheme,
|
|
|
e.g. socks5://user:pass@127.0.0.1:1080/.
|
|
|
Pass in an empty string (--proxy "") for
|
|
|
direct connection
|
|
|
--socket-timeout SECONDS Time to wait before giving up, in seconds
|
|
|
--source-address IP Client-side IP address to bind to
|
|
|
-4, --force-ipv4 Make all connections via IPv4
|
|
|
-6, --force-ipv6 Make all connections via IPv6
|
|
|
--enable-file-urls Enable file:// URLs. This is disabled by
|
|
|
default for security reasons.
|
|
|
|
|
|
Geo-restriction:
|
|
|
|
|
|
--geo-verification-proxy URL Use this proxy to verify the IP address for
|
|
|
some geo-restricted sites. The default proxy
|
|
|
specified by --proxy (or none, if the option
|
|
|
is not present) is used for the actual
|
|
|
downloading
|
|
|
--geo-bypass Bypass geographic restriction via faking
|
|
|
X-Forwarded-For HTTP header (default)
|
|
|
--no-geo-bypass Do not bypass geographic restriction via
|
|
|
faking X-Forwarded-For HTTP header
|
|
|
--geo-bypass-country CODE Force bypass geographic restriction with
|
|
|
explicitly provided two-letter ISO 3166-2
|
|
|
country code
|
|
|
--geo-bypass-ip-block IP_BLOCK Force bypass geographic restriction with
|
|
|
explicitly provided IP block in CIDR notation
|
|
|
|
|
|
Video Selection:
|
|
|
|
|
|
-I, --playlist-items ITEM_SPEC Comma separated playlist_index of the items
|
|
|
to download. You can specify a range using
|
|
|
"[START]:[STOP][:STEP]". For backward
|
|
|
compatibility, START-STOP is also supported.
|
|
|
Use negative indices to count from the right
|
|
|
and negative STEP to download in reverse
|
|
|
order. E.g. "-I 1:3,7,-5::2" used on a
|
|
|
playlist of size 15 will download the items
|
|
|
at index 1,2,3,7,11,13,15
|
|
|
--min-filesize SIZE Abort download if filesize is smaller than
|
|
|
SIZE, e.g. 50k or 44.6M
|
|
|
--max-filesize SIZE Abort download if filesize is larger than
|
|
|
SIZE, e.g. 50k or 44.6M
|
|
|
--date DATE Download only videos uploaded on this date.
|
|
|
The date can be "YYYYMMDD" or in the format
|
|
|
[now|today|yesterday][-N[day|week|month|year]].
|
|
|
E.g. "--date today-2weeks" downloads only
|
|
|
videos uploaded on the same day two weeks ago
|
|
|
--datebefore DATE Download only videos uploaded on or before
|
|
|
this date. The date formats accepted is the
|
|
|
same as --date
|
|
|
--dateafter DATE Download only videos uploaded on or after
|
|
|
this date. The date formats accepted is the
|
|
|
same as --date
|
|
|
--match-filters FILTER Generic video filter. Any "OUTPUT TEMPLATE"
|
|
|
field can be compared with a number or a
|
|
|
string using the operators defined in
|
|
|
"Filtering Formats". You can also simply
|
|
|
specify a field to match if the field is
|
|
|
present, use "!field" to check if the field
|
|
|
is not present, and "&" to check multiple
|
|
|
conditions. Use a "\" to escape "&" or
|
|
|
quotes if needed. If used multiple times,
|
|
|
the filter matches if atleast one of the
|
|
|
conditions are met. E.g. --match-filter
|
|
|
!is_live --match-filter "like_count>?100 &
|
|
|
description~='(?i)\bcats \& dogs\b'" matches
|
|
|
only videos that are not live OR those that
|
|
|
have a like count more than 100 (or the like
|
|
|
field is not available) and also has a
|
|
|
description that contains the phrase "cats &
|
|
|
dogs" (caseless). Use "--match-filter -" to
|
|
|
interactively ask whether to download each
|
|
|
video
|
|
|
--no-match-filter Do not use any --match-filter (default)
|
|
|
--break-match-filters FILTER Same as "--match-filters" but stops the
|
|
|
download process when a video is rejected
|
|
|
--no-break-match-filters Do not use any --break-match-filters (default)
|
|
|
--no-playlist Download only the video, if the URL refers
|
|
|
to a video and a playlist
|
|
|
--yes-playlist Download the playlist, if the URL refers to
|
|
|
a video and a playlist
|
|
|
--age-limit YEARS Download only videos suitable for the given
|
|
|
age
|
|
|
--download-archive FILE Download only videos not listed in the
|
|
|
archive file. Record the IDs of all
|
|
|
downloaded videos in it
|
|
|
--no-download-archive Do not use archive file (default)
|
|
|
--max-downloads NUMBER Abort after downloading NUMBER files
|
|
|
--break-on-existing Stop the download process when encountering
|
|
|
a file that is in the archive
|
|
|
--break-per-input Alters --max-downloads, --break-on-existing,
|
|
|
--break-match-filter, and autonumber to
|
|
|
reset per input URL
|
|
|
--no-break-per-input --break-on-existing and similar options
|
|
|
terminates the entire download queue
|
|
|
--skip-playlist-after-errors N Number of allowed failures until the rest of
|
|
|
the playlist is skipped
|
|
|
|
|
|
Download Options:
|
|
|
|
|
|
-N, --concurrent-fragments N Number of fragments of a dash/hlsnative
|
|
|
video that should be downloaded concurrently
|
|
|
(default is 1)
|
|
|
-r, --limit-rate RATE Maximum download rate in bytes per second,
|
|
|
e.g. 50K or 4.2M
|
|
|
--throttled-rate RATE Minimum download rate in bytes per second
|
|
|
below which throttling is assumed and the
|
|
|
video data is re-extracted, e.g. 100K
|
|
|
-R, --retries RETRIES Number of retries (default is 10), or
|
|
|
"infinite"
|
|
|
--file-access-retries RETRIES Number of times to retry on file access
|
|
|
error (default is 3), or "infinite"
|
|
|
--fragment-retries RETRIES Number of retries for a fragment (default is
|
|
|
10), or "infinite" (DASH, hlsnative and ISM)
|
|
|
--retry-sleep [TYPE:]EXPR Time to sleep between retries in seconds
|
|
|
(optionally) prefixed by the type of retry
|
|
|
(http (default), fragment, file_access,
|
|
|
extractor) to apply the sleep to. EXPR can
|
|
|
be a number, linear=START[:END[:STEP=1]] or
|
|
|
exp=START[:END[:BASE=2]]. This option can be
|
|
|
used multiple times to set the sleep for the
|
|
|
different retry types, e.g. --retry-sleep
|
|
|
linear=1::2 --retry-sleep fragment:exp=1:20
|
|
|
--skip-unavailable-fragments Skip unavailable fragments for DASH,
|
|
|
hlsnative and ISM downloads (default)
|
|
|
(Alias: --no-abort-on-unavailable-fragments)
|
|
|
--abort-on-unavailable-fragments
|
|
|
Abort download if a fragment is unavailable
|
|
|
(Alias: --no-skip-unavailable-fragments)
|
|
|
--keep-fragments Keep downloaded fragments on disk after
|
|
|
downloading is finished
|
|
|
--no-keep-fragments Delete downloaded fragments after
|
|
|
downloading is finished (default)
|
|
|
--buffer-size SIZE Size of download buffer, e.g. 1024 or 16K
|
|
|
(default is 1024)
|
|
|
--resize-buffer The buffer size is automatically resized
|
|
|
from an initial value of --buffer-size
|
|
|
(default)
|
|
|
--no-resize-buffer Do not automatically adjust the buffer size
|
|
|
--http-chunk-size SIZE Size of a chunk for chunk-based HTTP
|
|
|
downloading, e.g. 10485760 or 10M (default
|
|
|
is disabled). May be useful for bypassing
|
|
|
bandwidth throttling imposed by a webserver
|
|
|
(experimental)
|
|
|
--playlist-random Download playlist videos in random order
|
|
|
--lazy-playlist Process entries in the playlist as they are
|
|
|
received. This disables n_entries,
|
|
|
--playlist-random and --playlist-reverse
|
|
|
--no-lazy-playlist Process videos in the playlist only after
|
|
|
the entire playlist is parsed (default)
|
|
|
--xattr-set-filesize Set file xattribute ytdl.filesize with
|
|
|
expected file size
|
|
|
--hls-use-mpegts Use the mpegts container for HLS videos;
|
|
|
allowing some players to play the video
|
|
|
while downloading, and reducing the chance
|
|
|
of file corruption if download is
|
|
|
interrupted. This is enabled by default for
|
|
|
live streams
|
|
|
--no-hls-use-mpegts Do not use the mpegts container for HLS
|
|
|
videos. This is default when not downloading
|
|
|
live streams
|
|
|
--download-sections REGEX Download only chapters whose title matches
|
|
|
the given regular expression. Time ranges
|
|
|
prefixed by a "*" can also be used in place
|
|
|
of chapters to download the specified range.
|
|
|
Needs ffmpeg. This option can be used
|
|
|
multiple times to download multiple
|
|
|
sections, e.g. --download-sections
|
|
|
"*10:15-inf" --download-sections "intro"
|
|
|
--downloader [PROTO:]NAME Name or path of the external downloader to
|
|
|
use (optionally) prefixed by the protocols
|
|
|
(http, ftp, m3u8, dash, rstp, rtmp, mms) to
|
|
|
use it for. Currently supports native,
|
|
|
aria2c, avconv, axel, curl, ffmpeg, httpie,
|
|
|
wget. You can use this option multiple times
|
|
|
to set different downloaders for different
|
|
|
protocols. E.g. --downloader aria2c
|
|
|
--downloader "dash,m3u8:native" will use
|
|
|
aria2c for http/ftp downloads, and the
|
|
|
native downloader for dash/m3u8 downloads
|
|
|
(Alias: --external-downloader)
|
|
|
--downloader-args NAME:ARGS Give these arguments to the external
|
|
|
downloader. Specify the downloader name and
|
|
|
the arguments separated by a colon ":". For
|
|
|
ffmpeg, arguments can be passed to different
|
|
|
positions using the same syntax as
|
|
|
--postprocessor-args. You can use this
|
|
|
option multiple times to give different
|
|
|
arguments to different downloaders (Alias:
|
|
|
--external-downloader-args)
|
|
|
|
|
|
Filesystem Options:
|
|
|
|
|
|
-a, --batch-file FILE File containing URLs to download ("-" for
|
|
|
stdin), one URL per line. Lines starting
|
|
|
with "#", ";" or "]" are considered as
|
|
|
comments and ignored
|
|
|
--no-batch-file Do not read URLs from batch file (default)
|
|
|
-P, --paths [TYPES:]PATH The paths where the files should be
|
|
|
downloaded. Specify the type of file and the
|
|
|
path separated by a colon ":". All the same
|
|
|
TYPES as --output are supported.
|
|
|
Additionally, you can also provide "home"
|
|
|
(default) and "temp" paths. All intermediary
|
|
|
files are first downloaded to the temp path
|
|
|
and then the final files are moved over to
|
|
|
the home path after download is finished.
|
|
|
This option is ignored if --output is an
|
|
|
absolute path
|
|
|
-o, --output [TYPES:]TEMPLATE Output filename template; see "OUTPUT
|
|
|
TEMPLATE" for details
|
|
|
--output-na-placeholder TEXT Placeholder for unavailable fields in
|
|
|
"OUTPUT TEMPLATE" (default: "NA")
|
|
|
--restrict-filenames Restrict filenames to only ASCII characters,
|
|
|
and avoid "&" and spaces in filenames
|
|
|
--no-restrict-filenames Allow Unicode characters, "&" and spaces in
|
|
|
filenames (default)
|
|
|
--windows-filenames Force filenames to be Windows-compatible
|
|
|
--no-windows-filenames Make filenames Windows-compatible only if
|
|
|
using Windows (default)
|
|
|
--trim-filenames LENGTH Limit the filename length (excluding
|
|
|
extension) to the specified number of
|
|
|
characters
|
|
|
-w, --no-overwrites Do not overwrite any files
|
|
|
--force-overwrites Overwrite all video and metadata files. This
|
|
|
option includes --no-continue
|
|
|
--no-force-overwrites Do not overwrite the video, but overwrite
|
|
|
related files (default)
|
|
|
-c, --continue Resume partially downloaded files/fragments
|
|
|
(default)
|
|
|
--no-continue Do not resume partially downloaded
|
|
|
fragments. If the file is not fragmented,
|
|
|
restart download of the entire file
|
|
|
--part Use .part files instead of writing directly
|
|
|
into output file (default)
|
|
|
--no-part Do not use .part files - write directly into
|
|
|
output file
|
|
|
--mtime Use the Last-modified header to set the file
|
|
|
modification time (default)
|
|
|
--no-mtime Do not use the Last-modified header to set
|
|
|
the file modification time
|
|
|
--write-description Write video description to a .description file
|
|
|
--no-write-description Do not write video description (default)
|
|
|
--write-info-json Write video metadata to a .info.json file
|
|
|
(this may contain personal information)
|
|
|
--no-write-info-json Do not write video metadata (default)
|
|
|
--write-playlist-metafiles Write playlist metadata in addition to the
|
|
|
video metadata when using --write-info-json,
|
|
|
--write-description etc. (default)
|
|
|
--no-write-playlist-metafiles Do not write playlist metadata when using
|
|
|
--write-info-json, --write-description etc.
|
|
|
--clean-info-json Remove some private fields such as filenames
|
|
|
from the infojson. Note that it could still
|
|
|
contain some personal information (default)
|
|
|
--no-clean-info-json Write all fields to the infojson
|
|
|
--write-comments Retrieve video comments to be placed in the
|
|
|
infojson. The comments are fetched even
|
|
|
without this option if the extraction is
|
|
|
known to be quick (Alias: --get-comments)
|
|
|
--no-write-comments Do not retrieve video comments unless the
|
|
|
extraction is known to be quick (Alias:
|
|
|
--no-get-comments)
|
|
|
--load-info-json FILE JSON file containing the video information
|
|
|
(created with the "--write-info-json" option)
|
|
|
--cookies FILE Netscape formatted file to read cookies from
|
|
|
and dump cookie jar in
|
|
|
--no-cookies Do not read/dump cookies from/to file
|
|
|
(default)
|
|
|
--cookies-from-browser BROWSER[+KEYRING][:PROFILE][::CONTAINER]
|
|
|
The name of the browser to load cookies
|
|
|
from. Currently supported browsers are:
|
|
|
brave, chrome, chromium, edge, firefox,
|
|
|
opera, safari, vivaldi. Optionally, the
|
|
|
KEYRING used for decrypting Chromium cookies
|
|
|
on Linux, the name/path of the PROFILE to
|
|
|
load cookies from, and the CONTAINER name
|
|
|
(if Firefox) ("none" for no container) can
|
|
|
be given with their respective seperators.
|
|
|
By default, all containers of the most
|
|
|
recently accessed profile are used.
|
|
|
Currently supported keyrings are: basictext,
|
|
|
gnomekeyring, kwallet
|
|
|
--no-cookies-from-browser Do not load cookies from browser (default)
|
|
|
--cache-dir DIR Location in the filesystem where yt-dlp can
|
|
|
store some downloaded information (such as
|
|
|
client ids and signatures) permanently. By
|
|
|
default ${XDG_CACHE_HOME}/yt-dlp
|
|
|
--no-cache-dir Disable filesystem caching
|
|
|
--rm-cache-dir Delete all filesystem cache files
|
|
|
|
|
|
Thumbnail Options:
|
|
|
|
|
|
--write-thumbnail Write thumbnail image to disk
|
|
|
--no-write-thumbnail Do not write thumbnail image to disk (default)
|
|
|
--write-all-thumbnails Write all thumbnail image formats to disk
|
|
|
--list-thumbnails List available thumbnails of each video.
|
|
|
Simulate unless --no-simulate is used
|
|
|
|
|
|
Internet Shortcut Options:
|
|
|
|
|
|
--write-link Write an internet shortcut file, depending
|
|
|
on the current platform (.url, .webloc or
|
|
|
.desktop). The URL may be cached by the OS
|
|
|
--write-url-link Write a .url Windows internet shortcut. The
|
|
|
OS caches the URL based on the file path
|
|
|
--write-webloc-link Write a .webloc macOS internet shortcut
|
|
|
--write-desktop-link Write a .desktop Linux internet shortcut
|
|
|
|
|
|
Verbosity and Simulation Options:
|
|
|
|
|
|
-q, --quiet Activate quiet mode. If used with --verbose,
|
|
|
print the log to stderr
|
|
|
--no-warnings Ignore warnings
|
|
|
-s, --simulate Do not download the video and do not write
|
|
|
anything to disk
|
|
|
--no-simulate Download the video even if printing/listing
|
|
|
options are used
|
|
|
--ignore-no-formats-error Ignore "No video formats" error. Useful for
|
|
|
extracting metadata even if the videos are
|
|
|
not actually available for download
|
|
|
(experimental)
|
|
|
--no-ignore-no-formats-error Throw error when no downloadable video
|
|
|
formats are found (default)
|
|
|
--skip-download Do not download the video but write all
|
|
|
related files (Alias: --no-download)
|
|
|
-O, --print [WHEN:]TEMPLATE Field name or output template to print to
|
|
|
screen, optionally prefixed with when to
|
|
|
print it, separated by a ":". Supported
|
|
|
values of "WHEN" are the same as that of
|
|
|
--use-postprocessor (default: video).
|
|
|
Implies --quiet. Implies --simulate unless
|
|
|
--no-simulate or later stages of WHEN are
|
|
|
used. This option can be used multiple times
|
|
|
--print-to-file [WHEN:]TEMPLATE FILE
|
|
|
Append given template to the file. The
|
|
|
values of WHEN and TEMPLATE are same as that
|
|
|
of --print. FILE uses the same syntax as the
|
|
|
output template. This option can be used
|
|
|
multiple times
|
|
|
-j, --dump-json Quiet, but print JSON information for each
|
|
|
video. Simulate unless --no-simulate is
|
|
|
used. See "OUTPUT TEMPLATE" for a
|
|
|
description of available keys
|
|
|
-J, --dump-single-json Quiet, but print JSON information for each
|
|
|
url or infojson passed. Simulate unless
|
|
|
--no-simulate is used. If the URL refers to
|
|
|
a playlist, the whole playlist information
|
|
|
is dumped in a single line
|
|
|
--force-write-archive Force download archive entries to be written
|
|
|
as far as no errors occur, even if -s or
|
|
|
another simulation option is used (Alias:
|
|
|
--force-download-archive)
|
|
|
--newline Output progress bar as new lines
|
|
|
--no-progress Do not print progress bar
|
|
|
--progress Show progress bar, even if in quiet mode
|
|
|
--console-title Display progress in console titlebar
|
|
|
--progress-template [TYPES:]TEMPLATE
|
|
|
Template for progress outputs, optionally
|
|
|
prefixed with one of "download:" (default),
|
|
|
"download-title:" (the console title),
|
|
|
"postprocess:", or "postprocess-title:".
|
|
|
The video's fields are accessible under the
|
|
|
"info" key and the progress attributes are
|
|
|
accessible under "progress" key. E.g.
|
|
|
--console-title --progress-template
|
|
|
"download-title:%(info.id)s-%(progress.eta)s"
|
|
|
-v, --verbose Print various debugging information
|
|
|
--dump-pages Print downloaded pages encoded using base64
|
|
|
to debug problems (very verbose)
|
|
|
--write-pages Write downloaded intermediary pages to files
|
|
|
in the current directory to debug problems
|
|
|
--print-traffic Display sent and read HTTP traffic
|
|
|
|
|
|
Workarounds:
|
|
|
|
|
|
--encoding ENCODING Force the specified encoding (experimental)
|
|
|
--legacy-server-connect Explicitly allow HTTPS connection to servers
|
|
|
that do not support RFC 5746 secure
|
|
|
renegotiation
|
|
|
--no-check-certificates Suppress HTTPS certificate validation
|
|
|
--prefer-insecure Use an unencrypted connection to retrieve
|
|
|
information about the video (Currently
|
|
|
supported only for YouTube)
|
|
|
--add-headers FIELD:VALUE Specify a custom HTTP header and its value,
|
|
|
separated by a colon ":". You can use this
|
|
|
option multiple times
|
|
|
--bidi-workaround Work around terminals that lack
|
|
|
bidirectional text support. Requires bidiv
|
|
|
or fribidi executable in PATH
|
|
|
--sleep-requests SECONDS Number of seconds to sleep between requests
|
|
|
during data extraction
|
|
|
--sleep-interval SECONDS Number of seconds to sleep before each
|
|
|
download. This is the minimum time to sleep
|
|
|
when used along with --max-sleep-interval
|
|
|
(Alias: --min-sleep-interval)
|
|
|
--max-sleep-interval SECONDS Maximum number of seconds to sleep. Can only
|
|
|
be used along with --min-sleep-interval
|
|
|
--sleep-subtitles SECONDS Number of seconds to sleep before each
|
|
|
subtitle download
|
|
|
|
|
|
Video Format Options:
|
|
|
|
|
|
-f, --format FORMAT Video format code, see "FORMAT SELECTION"
|
|
|
for more details
|
|
|
-S, --format-sort SORTORDER Sort the formats by the fields given, see
|
|
|
"Sorting Formats" for more details
|
|
|
--format-sort-force Force user specified sort order to have
|
|
|
precedence over all fields, see "Sorting
|
|
|
Formats" for more details (Alias: --S-force)
|
|
|
--no-format-sort-force Some fields have precedence over the user
|
|
|
specified sort order (default)
|
|
|
--video-multistreams Allow multiple video streams to be merged
|
|
|
into a single file
|
|
|
--no-video-multistreams Only one video stream is downloaded for each
|
|
|
output file (default)
|
|
|
--audio-multistreams Allow multiple audio streams to be merged
|
|
|
into a single file
|
|
|
--no-audio-multistreams Only one audio stream is downloaded for each
|
|
|
output file (default)
|
|
|
--prefer-free-formats Prefer video formats with free containers
|
|
|
over non-free ones of same quality. Use with
|
|
|
"-S ext" to strictly prefer free containers
|
|
|
irrespective of quality
|
|
|
--no-prefer-free-formats Don't give any special preference to free
|
|
|
containers (default)
|
|
|
--check-formats Make sure formats are selected only from
|
|
|
those that are actually downloadable
|
|
|
--check-all-formats Check all formats for whether they are
|
|
|
actually downloadable
|
|
|
--no-check-formats Do not check that the formats are actually
|
|
|
downloadable
|
|
|
-F, --list-formats List available formats of each video.
|
|
|
Simulate unless --no-simulate is used
|
|
|
--merge-output-format FORMAT Containers that may be used when merging
|
|
|
formats, separated by "/", e.g. "mp4/mkv".
|
|
|
Ignored if no merge is required. (currently
|
|
|
supported: avi, flv, mkv, mov, mp4, webm)
|
|
|
|
|
|
Subtitle Options:
|
|
|
|
|
|
--write-subs Write subtitle file
|
|
|
--no-write-subs Do not write subtitle file (default)
|
|
|
--write-auto-subs Write automatically generated subtitle file
|
|
|
(Alias: --write-automatic-subs)
|
|
|
--no-write-auto-subs Do not write auto-generated subtitles
|
|
|
(default) (Alias: --no-write-automatic-subs)
|
|
|
--list-subs List available subtitles of each video.
|
|
|
Simulate unless --no-simulate is used
|
|
|
--sub-format FORMAT Subtitle format; accepts formats preference,
|
|
|
e.g. "srt" or "ass/srt/best"
|
|
|
--sub-langs LANGS Languages of the subtitles to download (can
|
|
|
be regex) or "all" separated by commas, e.g.
|
|
|
--sub-langs "en.*,ja". You can prefix the
|
|
|
language code with a "-" to exclude it from
|
|
|
the requested languages, e.g. --sub-langs
|
|
|
all,-live_chat. Use --list-subs for a list
|
|
|
of available language tags
|
|
|
|
|
|
Authentication Options:
|
|
|
|
|
|
-u, --username USERNAME Login with this account ID
|
|
|
-p, --password PASSWORD Account password. If this option is left
|
|
|
out, yt-dlp will ask interactively
|
|
|
-2, --twofactor TWOFACTOR Two-factor authentication code
|
|
|
-n, --netrc Use .netrc authentication data
|
|
|
--netrc-location PATH Location of .netrc authentication data;
|
|
|
either the path or its containing directory.
|
|
|
Defaults to ~/.netrc
|
|
|
--video-password PASSWORD Video password (vimeo, youku)
|
|
|
--ap-mso MSO Adobe Pass multiple-system operator (TV
|
|
|
provider) identifier, use --ap-list-mso for
|
|
|
a list of available MSOs
|
|
|
--ap-username USERNAME Multiple-system operator account login
|
|
|
--ap-password PASSWORD Multiple-system operator account password.
|
|
|
If this option is left out, yt-dlp will ask
|
|
|
interactively
|
|
|
--ap-list-mso List all supported multiple-system operators
|
|
|
--client-certificate CERTFILE Path to client certificate file in PEM
|
|
|
format. May include the private key
|
|
|
--client-certificate-key KEYFILE
|
|
|
Path to private key file for client
|
|
|
certificate
|
|
|
--client-certificate-password PASSWORD
|
|
|
Password for client certificate private key,
|
|
|
if encrypted. If not provided, and the key
|
|
|
is encrypted, yt-dlp will ask interactively
|
|
|
|
|
|
Post-Processing Options:
|
|
|
|
|
|
-x, --extract-audio Convert video files to audio-only files
|
|
|
(requires ffmpeg and ffprobe)
|
|
|
--audio-format FORMAT Format to convert the audio to when -x is
|
|
|
used. (currently supported: best (default),
|
|
|
aac, alac, flac, m4a, mp3, opus, vorbis,
|
|
|
wav). You can specify multiple rules using
|
|
|
similar syntax as --remux-video
|
|
|
--audio-quality QUALITY Specify ffmpeg audio quality to use when
|
|
|
converting the audio with -x. Insert a value
|
|
|
between 0 (best) and 10 (worst) for VBR or a
|
|
|
specific bitrate like 128K (default 5)
|
|
|
--remux-video FORMAT Remux the video into another container if
|
|
|
necessary (currently supported: avi, flv,
|
|
|
gif, mkv, mov, mp4, webm, aac, aiff, alac,
|
|
|
flac, m4a, mka, mp3, ogg, opus, vorbis,
|
|
|
wav). If target container does not support
|
|
|
the video/audio codec, remuxing will fail.
|
|
|
You can specify multiple rules; e.g.
|
|
|
"aac>m4a/mov>mp4/mkv" will remux aac to m4a,
|
|
|
mov to mp4 and anything else to mkv
|
|
|
--recode-video FORMAT Re-encode the video into another format if
|
|
|
necessary. The syntax and supported formats
|
|
|
are the same as --remux-video
|
|
|
--postprocessor-args NAME:ARGS Give these arguments to the postprocessors.
|
|
|
Specify the postprocessor/executable name
|
|
|
and the arguments separated by a colon ":"
|
|
|
to give the argument to the specified
|
|
|
postprocessor/executable. Supported PP are:
|
|
|
Merger, ModifyChapters, SplitChapters,
|
|
|
ExtractAudio, VideoRemuxer, VideoConvertor,
|
|
|
Metadata, EmbedSubtitle, EmbedThumbnail,
|
|
|
SubtitlesConvertor, ThumbnailsConvertor,
|
|
|
FixupStretched, FixupM4a, FixupM3u8,
|
|
|
FixupTimestamp and FixupDuration. The
|
|
|
supported executables are: AtomicParsley,
|
|
|
FFmpeg and FFprobe. You can also specify
|
|
|
"PP+EXE:ARGS" to give the arguments to the
|
|
|
specified executable only when being used by
|
|
|
the specified postprocessor. Additionally,
|
|
|
for ffmpeg/ffprobe, "_i"/"_o" can be
|
|
|
appended to the prefix optionally followed
|
|
|
by a number to pass the argument before the
|
|
|
specified input/output file, e.g. --ppa
|
|
|
"Merger+ffmpeg_i1:-v quiet". You can use
|
|
|
this option multiple times to give different
|
|
|
arguments to different postprocessors.
|
|
|
(Alias: --ppa)
|
|
|
-k, --keep-video Keep the intermediate video file on disk
|
|
|
after post-processing
|
|
|
--no-keep-video Delete the intermediate video file after
|
|
|
post-processing (default)
|
|
|
--post-overwrites Overwrite post-processed files (default)
|
|
|
--no-post-overwrites Do not overwrite post-processed files
|
|
|
--embed-subs Embed subtitles in the video (only for mp4,
|
|
|
webm and mkv videos)
|
|
|
--no-embed-subs Do not embed subtitles (default)
|
|
|
--embed-thumbnail Embed thumbnail in the video as cover art
|
|
|
--no-embed-thumbnail Do not embed thumbnail (default)
|
|
|
--embed-metadata Embed metadata to the video file. Also
|
|
|
embeds chapters/infojson if present unless
|
|
|
--no-embed-chapters/--no-embed-info-json are
|
|
|
used (Alias: --add-metadata)
|
|
|
--no-embed-metadata Do not add metadata to file (default)
|
|
|
(Alias: --no-add-metadata)
|
|
|
--embed-chapters Add chapter markers to the video file
|
|
|
(Alias: --add-chapters)
|
|
|
--no-embed-chapters Do not add chapter markers (default) (Alias:
|
|
|
--no-add-chapters)
|
|
|
--embed-info-json Embed the infojson as an attachment to
|
|
|
mkv/mka video files
|
|
|
--no-embed-info-json Do not embed the infojson as an attachment
|
|
|
to the video file
|
|
|
--parse-metadata [WHEN:]FROM:TO
|
|
|
Parse additional metadata like title/artist
|
|
|
from other fields; see "MODIFYING METADATA"
|
|
|
for details. Supported values of "WHEN" are
|
|
|
the same as that of --use-postprocessor
|
|
|
(default: pre_process)
|
|
|
--replace-in-metadata [WHEN:]FIELDS REGEX REPLACE
|
|
|
Replace text in a metadata field using the
|
|
|
given regex. This option can be used
|
|
|
multiple times. Supported values of "WHEN"
|
|
|
are the same as that of --use-postprocessor
|
|
|
(default: pre_process)
|
|
|
--xattrs Write metadata to the video file's xattrs
|
|
|
(using dublin core and xdg standards)
|
|
|
--concat-playlist POLICY Concatenate videos in a playlist. One of
|
|
|
"never", "always", or "multi_video"
|
|
|
(default; only when the videos form a single
|
|
|
show). All the video files must have same
|
|
|
codecs and number of streams to be
|
|
|
concatable. The "pl_video:" prefix can be
|
|
|
used with "--paths" and "--output" to set
|
|
|
the output filename for the concatenated
|
|
|
files. See "OUTPUT TEMPLATE" for details
|
|
|
--fixup POLICY Automatically correct known faults of the
|
|
|
file. One of never (do nothing), warn (only
|
|
|
emit a warning), detect_or_warn (the
|
|
|
default; fix file if we can, warn
|
|
|
otherwise), force (try fixing even if file
|
|
|
already exists)
|
|
|
--ffmpeg-location PATH Location of the ffmpeg binary; either the
|
|
|
path to the binary or its containing directory
|
|
|
--exec [WHEN:]CMD Execute a command, optionally prefixed with
|
|
|
when to execute it, separated by a ":".
|
|
|
Supported values of "WHEN" are the same as
|
|
|
that of --use-postprocessor (default:
|
|
|
after_move). Same syntax as the output
|
|
|
template can be used to pass any field as
|
|
|
arguments to the command. After download, an
|
|
|
additional field "filepath" that contains
|
|
|
the final path of the downloaded file is
|
|
|
also available, and if no fields are passed,
|
|
|
%(filepath,_filename|)q is appended to the
|
|
|
end of the command. This option can be used
|
|
|
multiple times
|
|
|
--no-exec Remove any previously defined --exec
|
|
|
--convert-subs FORMAT Convert the subtitles to another format
|
|
|
(currently supported: ass, lrc, srt, vtt)
|
|
|
(Alias: --convert-subtitles)
|
|
|
--convert-thumbnails FORMAT Convert the thumbnails to another format
|
|
|
(currently supported: jpg, png, webp). You
|
|
|
can specify multiple rules using similar
|
|
|
syntax as --remux-video
|
|
|
--split-chapters Split video into multiple files based on
|
|
|
internal chapters. The "chapter:" prefix can
|
|
|
be used with "--paths" and "--output" to set
|
|
|
the output filename for the split files. See
|
|
|
"OUTPUT TEMPLATE" for details
|
|
|
--no-split-chapters Do not split video based on chapters (default)
|
|
|
--remove-chapters REGEX Remove chapters whose title matches the
|
|
|
given regular expression. The syntax is the
|
|
|
same as --download-sections. This option can
|
|
|
be used multiple times
|
|
|
--no-remove-chapters Do not remove any chapters from the file
|
|
|
(default)
|
|
|
--force-keyframes-at-cuts Force keyframes at cuts when
|
|
|
downloading/splitting/removing sections.
|
|
|
This is slow due to needing a re-encode, but
|
|
|
the resulting video may have fewer artifacts
|
|
|
around the cuts
|
|
|
--no-force-keyframes-at-cuts Do not force keyframes around the chapters
|
|
|
when cutting/splitting (default)
|
|
|
--use-postprocessor NAME[:ARGS]
|
|
|
The (case sensitive) name of plugin
|
|
|
postprocessors to be enabled, and
|
|
|
(optionally) arguments to be passed to it,
|
|
|
separated by a colon ":". ARGS are a
|
|
|
semicolon ";" delimited list of NAME=VALUE.
|
|
|
The "when" argument determines when the
|
|
|
postprocessor is invoked. It can be one of
|
|
|
"pre_process" (after video extraction),
|
|
|
"after_filter" (after video passes filter),
|
|
|
"video" (after --format; before
|
|
|
--print/--output), "before_dl" (before each
|
|
|
video download), "post_process" (after each
|
|
|
video download; default), "after_move"
|
|
|
(after moving video file to it's final
|
|
|
locations), "after_video" (after downloading
|
|
|
and processing all formats of a video), or
|
|
|
"playlist" (at end of playlist). This option
|
|
|
can be used multiple times to add different
|
|
|
postprocessors
|
|
|
|
|
|
SponsorBlock Options:
|
|
|
|
|
|
Make chapter entries for, or remove various segments (sponsor,
|
|
|
introductions, etc.) from downloaded YouTube videos using the
|
|
|
SponsorBlock API
|
|
|
|
|
|
--sponsorblock-mark CATS SponsorBlock categories to create chapters
|
|
|
for, separated by commas. Available
|
|
|
categories are sponsor, intro, outro,
|
|
|
selfpromo, preview, filler, interaction,
|
|
|
music_offtopic, poi_highlight, chapter, all
|
|
|
and default (=all). You can prefix the
|
|
|
category with a "-" to exclude it. See [1]
|
|
|
for description of the categories. E.g.
|
|
|
--sponsorblock-mark all,-preview
|
|
|
[1] https://wiki.sponsor.ajay.app/w/Segment_Categories
|
|
|
--sponsorblock-remove CATS SponsorBlock categories to be removed from
|
|
|
the video file, separated by commas. If a
|
|
|
category is present in both mark and remove,
|
|
|
remove takes precedence. The syntax and
|
|
|
available categories are the same as for
|
|
|
--sponsorblock-mark except that "default"
|
|
|
refers to "all,-filler" and poi_highlight,
|
|
|
chapter are not available
|
|
|
--sponsorblock-chapter-title TEMPLATE
|
|
|
An output template for the title of the
|
|
|
SponsorBlock chapters created by
|
|
|
--sponsorblock-mark. The only available
|
|
|
fields are start_time, end_time, category,
|
|
|
categories, name, category_names. Defaults
|
|
|
to "[SponsorBlock]: %(category_names)l"
|
|
|
--no-sponsorblock Disable both --sponsorblock-mark and
|
|
|
--sponsorblock-remove
|
|
|
--sponsorblock-api URL SponsorBlock API location, defaults to
|
|
|
https://sponsor.ajay.app
|
|
|
|
|
|
Extractor Options:
|
|
|
|
|
|
--extractor-retries RETRIES Number of retries for known extractor errors
|
|
|
(default is 3), or "infinite"
|
|
|
--allow-dynamic-mpd Process dynamic DASH manifests (default)
|
|
|
(Alias: --no-ignore-dynamic-mpd)
|
|
|
--ignore-dynamic-mpd Do not process dynamic DASH manifests
|
|
|
(Alias: --no-allow-dynamic-mpd)
|
|
|
--hls-split-discontinuity Split HLS playlists to different formats at
|
|
|
discontinuities such as ad breaks
|
|
|
--no-hls-split-discontinuity Do not split HLS playlists to different
|
|
|
formats at discontinuities such as ad breaks
|
|
|
(default)
|
|
|
--extractor-args IE_KEY:ARGS Pass ARGS arguments to the IE_KEY extractor.
|
|
|
See "EXTRACTOR ARGUMENTS" for details. You
|
|
|
can use this option multiple times to give
|
|
|
arguments for different extractors
|
|
|
|
|
|
CONFIGURATION
|
|
|
|
|
|
You can configure yt-dlp by placing any supported command line option to
|
|
|
a configuration file. The configuration is loaded from the following
|
|
|
locations:
|
|
|
|
|
|
1. Main Configuration:
|
|
|
- The file given by --config-location
|
|
|
2. Portable Configuration: (Recommended for portable installations)
|
|
|
- If using a binary, yt-dlp.conf in the same directory as the
|
|
|
binary
|
|
|
- If running from source-code, yt-dlp.conf in the parent directory
|
|
|
of yt_dlp
|
|
|
3. Home Configuration:
|
|
|
- yt-dlp.conf in the home path given by -P
|
|
|
- If -P is not given, the current directory is searched
|
|
|
4. User Configuration:
|
|
|
- ${XDG_CONFIG_HOME}/yt-dlp.conf
|
|
|
- ${XDG_CONFIG_HOME}/yt-dlp/config (recommended on Linux/macOS)
|
|
|
- ${XDG_CONFIG_HOME}/yt-dlp/config.txt
|
|
|
- ${APPDATA}/yt-dlp.conf
|
|
|
- ${APPDATA}/yt-dlp/config (recommended on Windows)
|
|
|
- ${APPDATA}/yt-dlp/config.txt
|
|
|
- ~/yt-dlp.conf
|
|
|
- ~/yt-dlp.conf.txt
|
|
|
- ~/.yt-dlp/config
|
|
|
- ~/.yt-dlp/config.txt
|
|
|
|
|
|
See also: Notes about environment variables
|
|
|
5. System Configuration:
|
|
|
- /etc/yt-dlp.conf
|
|
|
- /etc/yt-dlp/config
|
|
|
- /etc/yt-dlp/config.txt
|
|
|
|
|
|
E.g. with the following configuration file yt-dlp will always extract
|
|
|
the audio, not copy the mtime, use a proxy and save all videos under
|
|
|
YouTube directory in your home directory:
|
|
|
|
|
|
# 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 YouTube directory in your home directory
|
|
|
-o ~/YouTube/%(title)s.%(ext)s
|
|
|
|
|
|
Note: Options in configuration file are just the same options aka
|
|
|
switches used in regular command line calls; thus there must be no
|
|
|
whitespace after - or --, e.g. -o or --proxy but not - o or -- proxy.
|
|
|
They must also be quoted when necessary as-if it were a UNIX shell.
|
|
|
|
|
|
You can use --ignore-config if you want to disable all configuration
|
|
|
files for a particular yt-dlp run. If --ignore-config is found inside
|
|
|
any configuration file, no further configuration will be loaded. For
|
|
|
example, having the option in the portable configuration file prevents
|
|
|
loading of home, user, and system configurations. Additionally, (for
|
|
|
backward compatibility) if --ignore-config is found inside the system
|
|
|
configuration file, the user configuration is not loaded.
|
|
|
|
|
|
Configuration file encoding
|
|
|
|
|
|
The configuration files are decoded according to the UTF BOM if present,
|
|
|
and in the encoding from system locale otherwise.
|
|
|
|
|
|
If you want your file to be decoded differently, add # coding: ENCODING
|
|
|
to the beginning of the file (e.g. # coding: shift-jis). There must be
|
|
|
no characters before that, even spaces or BOM.
|
|
|
|
|
|
Authentication with .netrc file
|
|
|
|
|
|
You may also want to configure automatic credentials storage for
|
|
|
extractors that support authentication (by providing login and password
|
|
|
with --username and --password) in order not to pass credentials as
|
|
|
command line arguments on every yt-dlp execution and prevent tracking
|
|
|
plain text passwords in the shell command history. You can achieve this
|
|
|
using a .netrc file on a per-extractor basis. For that you will need to
|
|
|
create a .netrc file in --netrc-location and restrict permissions to
|
|
|
read/write by only you:
|
|
|
|
|
|
touch ${HOME}/.netrc
|
|
|
chmod a-rwx,u+rw ${HOME}/.netrc
|
|
|
|
|
|
After that you can add credentials for an extractor in the following
|
|
|
format, where extractor is the name of the extractor in lowercase:
|
|
|
|
|
|
machine <extractor> login <username> password <password>
|
|
|
|
|
|
E.g.
|
|
|
|
|
|
machine youtube login myaccount@gmail.com password my_youtube_password
|
|
|
machine twitch login my_twitch_account_name password my_twitch_password
|
|
|
|
|
|
To activate authentication with the .netrc file you should pass --netrc
|
|
|
to yt-dlp or place it in the configuration file.
|
|
|
|
|
|
The default location of the .netrc file is ~ (see below).
|
|
|
|
|
|
Notes about environment variables
|
|
|
|
|
|
- Environment variables are normally specified as
|
|
|
${VARIABLE}/$VARIABLE on UNIX and %VARIABLE% on Windows; but is
|
|
|
always shown as ${VARIABLE} in this documentation
|
|
|
- yt-dlp also allow using UNIX-style variables on Windows for
|
|
|
path-like options; e.g. --output, --config-location
|
|
|
- If unset, ${XDG_CONFIG_HOME} defaults to ~/.config and
|
|
|
${XDG_CACHE_HOME} to ~/.cache
|
|
|
- On Windows, ~ points to ${HOME} if present; or, ${USERPROFILE} or
|
|
|
${HOMEDRIVE}${HOMEPATH} otherwise
|
|
|
- On Windows, ${USERPROFILE} generally points to C:\Users\<user name>
|
|
|
and ${APPDATA} to ${USERPROFILE}\AppData\Roaming
|
|
|
|
|
|
OUTPUT TEMPLATE
|
|
|
|
|
|
The -o option is used to indicate a template for the output file names
|
|
|
while -P option is used to specify the path each type of file should be
|
|
|
saved to.
|
|
|
|
|
|
tl;dr: navigate me to examples.
|
|
|
|
|
|
The simplest usage of -o is not to set any template arguments when
|
|
|
downloading a single file, like in
|
|
|
yt-dlp -o funny_video.flv "https://some/video" (hard-coding file
|
|
|
extension like this is not recommended and could break some
|
|
|
post-processing).
|
|
|
|
|
|
It may however also contain special sequences that will be replaced when
|
|
|
downloading each video. The special sequences may be formatted according
|
|
|
to Python string formatting operations, e.g. %(NAME)s or %(NAME)05d. To
|
|
|
clarify, that is a percent symbol followed by a name in parentheses,
|
|
|
followed by formatting operations.
|
|
|
|
|
|
The field names themselves (the part inside the parenthesis) can also
|
|
|
have some special formatting:
|
|
|
|
|
|
1. Object traversal: The dictionaries and lists available in metadata
|
|
|
can be traversed by using a dot . separator; e.g. %(tags.0)s,
|
|
|
%(subtitles.en.-1.ext)s. You can do Python slicing with colon :;
|
|
|
E.g. %(id.3:7:-1)s, %(formats.:.format_id)s. Curly braces {} can be
|
|
|
used to build dictionaries with only specific keys; e.g.
|
|
|
%(formats.:.{format_id,height})#j. An empty field name %()s refers
|
|
|
to the entire infodict; e.g. %(.{id,title})s. Note that all the
|
|
|
fields that become available using this method are not listed below.
|
|
|
Use -j to see such fields
|
|
|
|
|
|
2. Addition: Addition and subtraction of numeric fields can be done
|
|
|
using + and - respectively. E.g. %(playlist_index+10)03d,
|
|
|
%(n_entries+1-playlist_index)d
|
|
|
|
|
|
3. Date/time Formatting: Date/time fields can be formatted according to
|
|
|
strftime formatting by specifying it separated from the field name
|
|
|
using a >. E.g. %(duration>%H-%M-%S)s, %(upload_date>%Y-%m-%d)s,
|
|
|
%(epoch-3600>%H-%M-%S)s
|
|
|
|
|
|
4. Alternatives: Alternate fields can be specified separated with a ,.
|
|
|
E.g. %(release_date>%Y,upload_date>%Y|Unknown)s
|
|
|
|
|
|
5. Replacement: A replacement value can be specified using a &
|
|
|
separator. If the field is not empty, this replacement value will be
|
|
|
used instead of the actual field content. This is done after
|
|
|
alternate fields are considered; thus the replacement is used if any
|
|
|
of the alternative fields is not empty.
|
|
|
|
|
|
6. Default: A literal default value can be specified for when the field
|
|
|
is empty using a | separator. This overrides
|
|
|
--output-na-placeholder. E.g. %(uploader|Unknown)s
|
|
|
|
|
|
7. More Conversions: In addition to the normal format types
|
|
|
diouxXeEfFgGcrs, yt-dlp additionally supports converting to B =
|
|
|
Bytes, j = json (flag # for pretty-printing, + for Unicode), h =
|
|
|
HTML escaping, l = a comma separated list (flag # for \n
|
|
|
newline-separated), q = a string quoted for the terminal (flag # to
|
|
|
split a list into different arguments), D = add Decimal suffixes
|
|
|
(e.g. 10M) (flag # to use 1024 as factor), and S = Sanitize as
|
|
|
filename (flag # for restricted)
|
|
|
|
|
|
8. Unicode normalization: The format type U can be used for NFC Unicode
|
|
|
normalization. The alternate form flag (#) changes the normalization
|
|
|
to NFD and the conversion flag + can be used for NFKC/NFKD
|
|
|
compatibility equivalence normalization. E.g. %(title)+.100U is NFKC
|
|
|
|
|
|
To summarize, the general syntax for a field is:
|
|
|
|
|
|
%(name[.keys][addition][>strf][,alternate][&replacement][|default])[flags][width][.precision][length]type
|
|
|
|
|
|
Additionally, you can set different output templates for the various
|
|
|
metadata files separately from the general output template by specifying
|
|
|
the type of file followed by the template separated by a colon :. The
|
|
|
different file types supported are subtitle, thumbnail, description,
|
|
|
annotation (deprecated), infojson, link, pl_thumbnail, pl_description,
|
|
|
pl_infojson, chapter, pl_video. E.g.
|
|
|
-o "%(title)s.%(ext)s" -o "thumbnail:%(title)s\%(title)s.%(ext)s" will
|
|
|
put the thumbnails in a folder with the same name as the video. If any
|
|
|
of the templates is empty, that type of file will not be written. E.g.
|
|
|
--write-thumbnail -o "thumbnail:" will write thumbnails only for
|
|
|
playlists and not for video.
|
|
|
|
|
|
Note: Due to post-processing (i.e. merging etc.), the actual output
|
|
|
filename might differ. Use --print after_move:filepath to get the name
|
|
|
after all post-processing is complete.
|
|
|
|
|
|
The available fields are:
|
|
|
|
|
|
- id (string): Video identifier
|
|
|
- title (string): Video title
|
|
|
- fulltitle (string): Video title ignoring live timestamp and generic
|
|
|
title
|
|
|
- ext (string): Video filename extension
|
|
|
- alt_title (string): A secondary title of the video
|
|
|
- description (string): The description of the video
|
|
|
- display_id (string): An alternative identifier for the video
|
|
|
- uploader (string): Full name of the video uploader
|
|
|
- license (string): License name the video is licensed under
|
|
|
- creator (string): The creator of the video
|
|
|
- timestamp (numeric): UNIX timestamp of the moment the video became
|
|
|
available
|
|
|
- upload_date (string): Video upload date in UTC (YYYYMMDD)
|
|
|
- release_timestamp (numeric): UNIX timestamp of the moment the video
|
|
|
was released
|
|
|
- release_date (string): The date (YYYYMMDD) when the video was
|
|
|
released in UTC
|
|
|
- modified_timestamp (numeric): UNIX timestamp of the moment the video
|
|
|
was last modified
|
|
|
- modified_date (string): The date (YYYYMMDD) when the video was last
|
|
|
modified in UTC
|
|
|
- uploader_id (string): Nickname or id of the video uploader
|
|
|
- channel (string): Full name of the channel the video is uploaded on
|
|
|
- channel_id (string): Id of the channel
|
|
|
- channel_follower_count (numeric): Number of followers of the channel
|
|
|
- location (string): Physical location where the video was filmed
|
|
|
- duration (numeric): Length of the video in seconds
|
|
|
- duration_string (string): Length of the video (HH:mm:ss)
|
|
|
- view_count (numeric): How many users have watched the video on the
|
|
|
platform
|
|
|
- concurrent_view_count (numeric): How many users are currently
|
|
|
watching the video on the platform.
|
|
|
- like_count (numeric): Number of positive ratings of the video
|
|
|
- dislike_count (numeric): Number of negative ratings of the video
|
|
|
- repost_count (numeric): Number of reposts of the video
|
|
|
- average_rating (numeric): Average rating give by users, the scale
|
|
|
used depends on the webpage
|
|
|
- comment_count (numeric): Number of comments on the video (For some
|
|
|
extractors, comments are only downloaded at the end, and so this
|
|
|
field cannot be used)
|
|
|
- age_limit (numeric): Age restriction for the video (years)
|
|
|
- live_status (string): One of "not_live", "is_live", "is_upcoming",
|
|
|
"was_live", "post_live" (was live, but VOD is not yet processed)
|
|
|
- is_live (boolean): Whether this video is a live stream or a
|
|
|
fixed-length video
|
|
|
- was_live (boolean): Whether this video was originally a live stream
|
|
|
- playable_in_embed (string): Whether this video is allowed to play in
|
|
|
embedded players on other sites
|
|
|
- availability (string): Whether the video is "private",
|
|
|
"premium_only", "subscriber_only", "needs_auth", "unlisted" or
|
|
|
"public"
|
|
|
- start_time (numeric): Time in seconds where the reproduction should
|
|
|
start, as specified in the URL
|
|
|
- end_time (numeric): Time in seconds where the reproduction should
|
|
|
end, as specified in the URL
|
|
|
- extractor (string): Name of the extractor
|
|
|
- extractor_key (string): Key name of the extractor
|
|
|
- epoch (numeric): Unix epoch of when the information extraction was
|
|
|
completed
|
|
|
- autonumber (numeric): Number that will be increased with each
|
|
|
download, starting at --autonumber-start
|
|
|
- video_autonumber (numeric): Number that will be increased with each
|
|
|
video
|
|
|
- n_entries (numeric): Total number of extracted items in the playlist
|
|
|
- playlist_id (string): Identifier of the playlist that contains the
|
|
|
video
|
|
|
- playlist_title (string): Name of the playlist that contains the
|
|
|
video
|
|
|
- playlist (string): playlist_id or playlist_title
|
|
|
- playlist_count (numeric): Total number of items in the playlist. May
|
|
|
not be known if entire playlist is not extracted
|
|
|
- playlist_index (numeric): Index of the video in the playlist padded
|
|
|
with leading zeros according the final index
|
|
|
- playlist_autonumber (numeric): Position of the video in the playlist
|
|
|
download queue padded with leading zeros according to the total
|
|
|
length of the playlist
|
|
|
- playlist_uploader (string): Full name of the playlist uploader
|
|
|
- playlist_uploader_id (string): Nickname or id of the playlist
|
|
|
uploader
|
|
|
- webpage_url (string): A URL to the video webpage which if given to
|
|
|
yt-dlp should allow to get the same result again
|
|
|
- webpage_url_basename (string): The basename of the webpage URL
|
|
|
- webpage_url_domain (string): The domain of the webpage URL
|
|
|
- original_url (string): The URL given by the user (or same as
|
|
|
webpage_url for playlist entries)
|
|
|
|
|
|
All the fields in Filtering Formats can also be used
|
|
|
|
|
|
Available for the video that belongs to some logical chapter or section:
|
|
|
|
|
|
- chapter (string): Name or title of the chapter the video belongs to
|
|
|
- chapter_number (numeric): Number of the chapter the video belongs to
|
|
|
- chapter_id (string): Id of the chapter the video belongs to
|
|
|
|
|
|
Available for the video that is an episode of some series or programme:
|
|
|
|
|
|
- series (string): Title of the series or programme the video episode
|
|
|
belongs to
|
|
|
- season (string): Title of the season the video episode belongs to
|
|
|
- season_number (numeric): Number of the season the video episode
|
|
|
belongs to
|
|
|
- season_id (string): Id of the season the video episode belongs to
|
|
|
- episode (string): Title of the video episode
|
|
|
- episode_number (numeric): Number of the video episode within a
|
|
|
season
|
|
|
- episode_id (string): Id of the video episode
|
|
|
|
|
|
Available for the media that is a track or a part of a music album:
|
|
|
|
|
|
- track (string): Title of the track
|
|
|
- track_number (numeric): Number of the track within an album or a
|
|
|
disc
|
|
|
- track_id (string): Id of the track
|
|
|
- artist (string): Artist(s) of the track
|
|
|
- genre (string): Genre(s) of the track
|
|
|
- album (string): Title of the album the track belongs to
|
|
|
- album_type (string): Type of the album
|
|
|
- album_artist (string): List of all artists appeared on the album
|
|
|
- disc_number (numeric): Number of the disc or other physical medium
|
|
|
the track belongs to
|
|
|
- release_year (numeric): Year (YYYY) when the album was released
|
|
|
|
|
|
Available only when using --download-sections and for chapter: prefix
|
|
|
when using --split-chapters for videos with internal chapters:
|
|
|
|
|
|
- section_title (string): Title of the chapter
|
|
|
- section_number (numeric): Number of the chapter within the file
|
|
|
- section_start (numeric): Start time of the chapter in seconds
|
|
|
- section_end (numeric): End time of the chapter in seconds
|
|
|
|
|
|
Available only when used in --print:
|
|
|
|
|
|
- urls (string): The URLs of all requested formats, one in each line
|
|
|
- filename (string): Name of the video file. Note that the actual
|
|
|
filename may differ
|
|
|
- formats_table (table): The video format table as printed by
|
|
|
--list-formats
|
|
|
- thumbnails_table (table): The thumbnail format table as printed by
|
|
|
--list-thumbnails
|
|
|
- subtitles_table (table): The subtitle format table as printed by
|
|
|
--list-subs
|
|
|
- automatic_captions_table (table): The automatic subtitle format
|
|
|
table as printed by --list-subs
|
|
|
|
|
|
Available only in --sponsorblock-chapter-title:
|
|
|
|
|
|
- start_time (numeric): Start time of the chapter in seconds
|
|
|
- end_time (numeric): End time of the chapter in seconds
|
|
|
- categories (list): The SponsorBlock categories the chapter belongs
|
|
|
to
|
|
|
- category (string): The smallest SponsorBlock category the chapter
|
|
|
belongs to
|
|
|
- category_names (list): Friendly names of the categories
|
|
|
- name (string): Friendly name of the smallest category
|
|
|
- type (string): The SponsorBlock action type of the chapter
|
|
|
|
|
|
Each aforementioned sequence when referenced in an output template will
|
|
|
be replaced by the actual value corresponding to the sequence name. E.g.
|
|
|
for -o %(title)s-%(id)s.%(ext)s and an mp4 video with title
|
|
|
yt-dlp test video and id BaW_jenozKc, this will result in a
|
|
|
yt-dlp test video-BaW_jenozKc.mp4 file created in the current directory.
|
|
|
|
|
|
Note: 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
|
|
|
--output-na-placeholder (NA by default).
|
|
|
|
|
|
Tip: Look at the -j output to identify which fields are available for
|
|
|
the particular URL
|
|
|
|
|
|
For numeric sequences you can use numeric related formatting; e.g.
|
|
|
%(view_count)05d will result in a string with view count padded with
|
|
|
zeros up to 5 characters, like in 00042.
|
|
|
|
|
|
Output templates can also contain arbitrary hierarchical path, e.g.
|
|
|
-o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" which will
|
|
|
result in downloading each video in a directory corresponding to this
|
|
|
path template. Any missing directory will be automatically created for
|
|
|
you.
|
|
|
|
|
|
To use percent literals in an output template use %%. To output to
|
|
|
stdout use -o -.
|
|
|
|
|
|
The current default template is %(title)s [%(id)s].%(ext)s.
|
|
|
|
|
|
In some cases, you don'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
|
|
|
--restrict-filenames flag to get a shorter title.
|
|
|
|
|
|
Output template examples
|
|
|
|
|
|
$ yt-dlp --print filename -o "test video.%(ext)s" BaW_jenozKc
|
|
|
test video.webm # Literal name with correct extension
|
|
|
|
|
|
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc
|
|
|
youtube-dl test video ''_ä↭𝕐.webm # All kinds of weird characters
|
|
|
|
|
|
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc --restrict-filenames
|
|
|
youtube-dl_test_video_.webm # Restricted file name
|
|
|
|
|
|
# Download YouTube playlist videos in separate directory indexed by video order in a playlist
|
|
|
$ yt-dlp -o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
|
|
|
|
|
|
# Download YouTube playlist videos in separate directories according to their uploaded year
|
|
|
$ yt-dlp -o "%(upload_date>%Y)s/%(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
|
|
|
|
|
|
# Prefix playlist index with " - " separator, but only if it is available
|
|
|
$ yt-dlp -o '%(playlist_index|)s%(playlist_index& - |)s%(title)s.%(ext)s' BaW_jenozKc "https://www.youtube.com/user/TheLinuxFoundation/playlists"
|
|
|
|
|
|
# Download all playlists of YouTube channel/user keeping each playlist in separate directory:
|
|
|
$ yt-dlp -o "%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "https://www.youtube.com/user/TheLinuxFoundation/playlists"
|
|
|
|
|
|
# Download Udemy course keeping each chapter in separate directory under MyVideos directory in your home
|
|
|
$ yt-dlp -u user -p password -P "~/MyVideos" -o "%(playlist)s/%(chapter_number)s - %(chapter)s/%(title)s.%(ext)s" "https://www.udemy.com/java-tutorial"
|
|
|
|
|
|
# Download entire series season keeping each series and each season in separate directory under C:/MyVideos
|
|
|
$ yt-dlp -P "C:/MyVideos" -o "%(series)s/%(season_number)s - %(season)s/%(episode_number)s - %(episode)s.%(ext)s" "https://videomore.ru/kino_v_detalayah/5_sezon/367617"
|
|
|
|
|
|
# Download video as "C:\MyVideos\uploader\title.ext", subtitles as "C:\MyVideos\subs\uploader\title.ext"
|
|
|
# and put all temporary files in "C:\MyVideos\tmp"
|
|
|
$ yt-dlp -P "C:/MyVideos" -P "temp:tmp" -P "subtitle:subs" -o "%(uploader)s/%(title)s.%(ext)s" BaW_jenoz --write-subs
|
|
|
|
|
|
# Download video as "C:\MyVideos\uploader\title.ext" and subtitles as "C:\MyVideos\uploader\subs\title.ext"
|
|
|
$ yt-dlp -P "C:/MyVideos" -o "%(uploader)s/%(title)s.%(ext)s" -o "subtitle:%(uploader)s/subs/%(title)s.%(ext)s" BaW_jenozKc --write-subs
|
|
|
|
|
|
# Stream the video being downloaded to stdout
|
|
|
$ yt-dlp -o - BaW_jenozKc
|
|
|
|
|
|
FORMAT SELECTION
|
|
|
|
|
|
By default, yt-dlp tries to download the best available quality if you
|
|
|
don't pass any options. This is generally equivalent to using
|
|
|
-f bestvideo*+bestaudio/best. However, if multiple audiostreams is
|
|
|
enabled (--audio-multistreams), the default format changes to
|
|
|
-f bestvideo+bestaudio/best. Similarly, if ffmpeg is unavailable, or if
|
|
|
you use yt-dlp to stream to stdout (-o -), the default becomes
|
|
|
-f best/bestvideo+bestaudio.
|
|
|
|
|
|
Deprecation warning: Latest versions of yt-dlp can stream multiple
|
|
|
formats to the stdout simultaneously using ffmpeg. So, in future
|
|
|
versions, the default for this will be set to -f bv*+ba/b similar to
|
|
|
normal downloads. If you want to preserve the -f b/bv+ba setting, it is
|
|
|
recommended to explicitly specify it in the configuration options.
|
|
|
|
|
|
The general syntax for format selection is -f FORMAT (or
|
|
|
--format FORMAT) where FORMAT is a selector expression, i.e. an
|
|
|
expression that describes format or formats you would like to download.
|
|
|
|
|
|
tl;dr: navigate me to examples.
|
|
|
|
|
|
The simplest case is requesting a specific format; e.g. with -f 22 you
|
|
|
can download the format with format code equal to 22. You can get the
|
|
|
list of available format codes for particular video using --list-formats
|
|
|
or -F. Note that these format codes are extractor specific.
|
|
|
|
|
|
You can also use a file extension (currently 3gp, aac, flv, m4a, mp3,
|
|
|
mp4, ogg, wav, webm are supported) to download the best quality format
|
|
|
of a particular file extension served as a single file, e.g. -f webm
|
|
|
will download the best quality format with the webm extension served as
|
|
|
a single file.
|
|
|
|
|
|
You can use -f - to interactively provide the format selector for each
|
|
|
video
|
|
|
|
|
|
You can also use special names to select particular edge case formats:
|
|
|
|
|
|
- all: Select all formats separately
|
|
|
- mergeall: Select and merge all formats (Must be used with
|
|
|
--audio-multistreams, --video-multistreams or both)
|
|
|
- b*, best*: Select the best quality format that contains either a
|
|
|
video or an audio or both (ie; vcodec!=none or acodec!=none)
|
|
|
- b, best: Select the best quality format that contains both video and
|
|
|
audio. Equivalent to best*[vcodec!=none][acodec!=none]
|
|
|
- bv, bestvideo: Select the best quality video-only format. Equivalent
|
|
|
to best*[acodec=none]
|
|
|
- bv*, bestvideo*: Select the best quality format that contains video.
|
|
|
It may also contain audio. Equivalent to best*[vcodec!=none]
|
|
|
- ba, bestaudio: Select the best quality audio-only format. Equivalent
|
|
|
to best*[vcodec=none]
|
|
|
- ba*, bestaudio*: Select the best quality format that contains audio.
|
|
|
It may also contain video. Equivalent to best*[acodec!=none] (Do not
|
|
|
use!)
|
|
|
- w*, worst*: Select the worst quality format that contains either a
|
|
|
video or an audio
|
|
|
- w, worst: Select the worst quality format that contains both video
|
|
|
and audio. Equivalent to worst*[vcodec!=none][acodec!=none]
|
|
|
- wv, worstvideo: Select the worst quality video-only format.
|
|
|
Equivalent to worst*[acodec=none]
|
|
|
- wv*, worstvideo*: Select the worst quality format that contains
|
|
|
video. It may also contain audio. Equivalent to worst*[vcodec!=none]
|
|
|
- wa, worstaudio: Select the worst quality audio-only format.
|
|
|
Equivalent to worst*[vcodec=none]
|
|
|
- wa*, worstaudio*: Select the worst quality format that contains
|
|
|
audio. It may also contain video. Equivalent to worst*[acodec!=none]
|
|
|
|
|
|
For example, to download the worst quality video-only format you can use
|
|
|
-f worstvideo. It is however recommended not to use worst and related
|
|
|
options. When your format selector is worst, the format which is worst
|
|
|
in all respects is selected. Most of the time, what you actually want is
|
|
|
the video with the smallest filesize instead. So it is generally better
|
|
|
to use -S +size or more rigorously, -S +size,+br,+res,+fps instead of
|
|
|
-f worst. See Sorting Formats for more details.
|
|
|
|
|
|
You can select the n'th best format of a type by using best<type>.<n>.
|
|
|
For example, best.2 will select the 2nd best combined format. Similarly,
|
|
|
bv*.3 will select the 3rd best format that contains a video stream.
|
|
|
|
|
|
If you want to download multiple videos, and they don't have the same
|
|
|
formats available, you can specify the order of preference using
|
|
|
slashes. Note that formats on the left hand side are preferred; e.g.
|
|
|
-f 22/17/18 will download format 22 if it's available, otherwise it will
|
|
|
download format 17 if it's available, otherwise it will download format
|
|
|
18 if it's available, otherwise it will complain that no suitable
|
|
|
formats are available for download.
|
|
|
|
|
|
If you want to download several formats of the same video use a comma as
|
|
|
a separator, e.g. -f 22,17,18 will download all these three formats, of
|
|
|
course if they are available. Or a more sophisticated example combined
|
|
|
with the precedence feature: -f 136/137/mp4/bestvideo,140/m4a/bestaudio.
|
|
|
|
|
|
You can merge the video and audio of multiple formats into a single file
|
|
|
using -f <format1>+<format2>+... (requires ffmpeg installed); e.g.
|
|
|
-f bestvideo+bestaudio will download the best video-only format, the
|
|
|
best audio-only format and mux them together with ffmpeg.
|
|
|
|
|
|
Deprecation warning: Since the below described behavior is complex and
|
|
|
counter-intuitive, this will be removed and multistreams will be enabled
|
|
|
by default in the future. A new operator will be instead added to limit
|
|
|
formats to single audio/video
|
|
|
|
|
|
Unless --video-multistreams is used, all formats with a video stream
|
|
|
except the first one are ignored. Similarly, unless --audio-multistreams
|
|
|
is used, all formats with an audio stream except the first one are
|
|
|
ignored. E.g.
|
|
|
-f bestvideo+best+bestaudio --video-multistreams --audio-multistreams
|
|
|
will download and merge all 3 given formats. The resulting file will
|
|
|
have 2 video streams and 2 audio streams. But
|
|
|
-f bestvideo+best+bestaudio --no-video-multistreams will download and
|
|
|
merge only bestvideo and bestaudio. best is ignored since another format
|
|
|
containing a video stream (bestvideo) has already been selected. The
|
|
|
order of the formats is therefore important.
|
|
|
-f best+bestaudio --no-audio-multistreams will download only best while
|
|
|
-f bestaudio+best --no-audio-multistreams will ignore best and download
|
|
|
only bestaudio.
|
|
|
|
|
|
Filtering Formats
|
|
|
|
|
|
You can also filter the video formats by putting a condition in
|
|
|
brackets, as in -f "best[height=720]" (or -f "[filesize>10M]").
|
|
|
|
|
|
The following numeric meta fields can be used with comparisons <, <=, >,
|
|
|
>=, = (equals), != (not equals):
|
|
|
|
|
|
- filesize: The number of bytes, if known in advance
|
|
|
- filesize_approx: An estimate for the number of bytes
|
|
|
- width: Width of the video, if known
|
|
|
- height: Height of the video, if known
|
|
|
- aspect_ratio: Aspect ratio of the video, if known
|
|
|
- tbr: Average bitrate of audio and video in KBit/s
|
|
|
- abr: Average audio bitrate in KBit/s
|
|
|
- vbr: Average video bitrate in KBit/s
|
|
|
- asr: Audio sampling rate in Hertz
|
|
|
- fps: Frame rate
|
|
|
- audio_channels: The number of audio channels
|
|
|
- stretched_ratio: width:height of the video's pixels, if not square
|
|
|
|
|
|
Also filtering work for comparisons = (equals), ^= (starts with), $=
|
|
|
(ends with), *= (contains), ~= (matches regex) and following string meta
|
|
|
fields:
|
|
|
|
|
|
- url: Video URL
|
|
|
- ext: File extension
|
|
|
- acodec: Name of the audio codec in use
|
|
|
- vcodec: Name of the video codec in use
|
|
|
- container: Name of the container format
|
|
|
- protocol: The protocol that will be used for the actual download,
|
|
|
lower-case (http, https, rtsp, rtmp, rtmpe, mms, f4m, ism,
|
|
|
http_dash_segments, m3u8, or m3u8_native)
|
|
|
- language: Language code
|
|
|
- dynamic_range: The dynamic range of the video
|
|
|
- format_id: A short description of the format
|
|
|
- format: A human-readable description of the format
|
|
|
- format_note: Additional info about the format
|
|
|
- resolution: Textual description of width and height
|
|
|
|
|
|
Any string comparison may be prefixed with negation ! in order to
|
|
|
produce an opposite comparison, e.g. !*= (does not contain). The
|
|
|
comparand of a string comparison needs to be quoted with either double
|
|
|
or single quotes if it contains spaces or special characters other than
|
|
|
._-.
|
|
|
|
|
|
Note: 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 website. Any other field
|
|
|
made available by the extractor can also be used for filtering.
|
|
|
|
|
|
Formats for which the value is not known are excluded unless you put a
|
|
|
question mark (?) after the operator. You can combine format filters, so
|
|
|
-f "[height<=?720][tbr>500]" selects up to 720p videos (or videos where
|
|
|
the height is not known) with a bitrate of at least 500 KBit/s. You can
|
|
|
also use the filters with all to download all formats that satisfy the
|
|
|
filter, e.g. -f "all[vcodec=none]" selects all audio-only formats.
|
|
|
|
|
|
Format selectors can also be grouped using parentheses; e.g.
|
|
|
-f "(mp4,webm)[height<480]" will download the best pre-merged mp4 and
|
|
|
webm formats with a height lower than 480.
|
|
|
|
|
|
Sorting Formats
|
|
|
|
|
|
You can change the criteria for being considered the best by using -S
|
|
|
(--format-sort). The general format for this is
|
|
|
--format-sort field1,field2....
|
|
|
|
|
|
The available fields are:
|
|
|
|
|
|
- hasvid: Gives priority to formats that have a video stream
|
|
|
- hasaud: Gives priority to formats that have an audio stream
|
|
|
- ie_pref: The format preference
|
|
|
- lang: The language preference
|
|
|
- quality: The quality of the format
|
|
|
- source: The preference of the source
|
|
|
- proto: Protocol used for download (https/ftps > http/ftp >
|
|
|
m3u8_native/m3u8 > http_dash_segments> websocket_frag > mms/rtsp >
|
|
|
f4f/f4m)
|
|
|
- vcodec: Video Codec (av01 > vp9.2 > vp9 > h265 > h264 > vp8 > h263 >
|
|
|
theora > other)
|
|
|
- acodec: Audio Codec (flac/alac > wav/aiff > opus > vorbis > aac >
|
|
|
mp4a > mp3 > ac4 > eac3 > ac3 > dts > other)
|
|
|
- codec: Equivalent to vcodec,acodec
|
|
|
- vext: Video Extension (mp4 > mov > webm > flv > other). If
|
|
|
--prefer-free-formats is used, webm is preferred.
|
|
|
- aext: Audio Extension (m4a > aac > mp3 > ogg > opus > webm > other).
|
|
|
If --prefer-free-formats is used, the order changes to ogg > opus >
|
|
|
webm > mp3 > m4a > aac
|
|
|
- ext: Equivalent to vext,aext
|
|
|
- filesize: Exact filesize, if known in advance
|
|
|
- fs_approx: Approximate filesize calculated from the manifests
|
|
|
- size: Exact filesize if available, otherwise approximate filesize
|
|
|
- height: Height of video
|
|
|
- width: Width of video
|
|
|
- res: Video resolution, calculated as the smallest dimension.
|
|
|
- fps: Framerate of video
|
|
|
- hdr: The dynamic range of the video (DV > HDR12 > HDR10+ > HDR10 >
|
|
|
HLG > SDR)
|
|
|
- channels: The number of audio channels
|
|
|
- tbr: Total average bitrate in KBit/s
|
|
|
- vbr: Average video bitrate in KBit/s
|
|
|
- abr: Average audio bitrate in KBit/s
|
|
|
- br: Equivalent to using tbr,vbr,abr
|
|
|
- asr: Audio sample rate in Hz
|
|
|
|
|
|
Deprecation warning: Many of these fields have (currently undocumented)
|
|
|
aliases, that may be removed in a future version. It is recommended to
|
|
|
use only the documented field names.
|
|
|
|
|
|
All fields, unless specified otherwise, are sorted in descending order.
|
|
|
To reverse this, prefix the field with a +. E.g. +res prefers format
|
|
|
with the smallest resolution. Additionally, you can suffix a preferred
|
|
|
value for the fields, separated by a :. E.g. res:720 prefers larger
|
|
|
videos, but no larger than 720p and the smallest video if there are no
|
|
|
videos less than 720p. For codec and ext, you can provide two preferred
|
|
|
values, the first for video and the second for audio. E.g.
|
|
|
+codec:avc:m4a (equivalent to +vcodec:avc,+acodec:m4a) sets the video
|
|
|
codec preference to h264 > h265 > vp9 > vp9.2 > av01 > vp8 > h263 >
|
|
|
theora and audio codec preference to mp4a > aac > vorbis > opus > mp3 >
|
|
|
ac3 > dts. You can also make the sorting prefer the nearest values to
|
|
|
the provided by using ~ as the delimiter. E.g. filesize~1G prefers the
|
|
|
format with filesize closest to 1 GiB.
|
|
|
|
|
|
The fields hasvid and ie_pref are always given highest priority in
|
|
|
sorting, irrespective of the user-defined order. This behaviour can be
|
|
|
changed by using --format-sort-force. Apart from these, the default
|
|
|
order used is:
|
|
|
lang,quality,res,fps,hdr:12,vcodec:vp9.2,channels,acodec,size,br,asr,proto,ext,hasaud,source,id.
|
|
|
The extractors may override this default order, but they cannot override
|
|
|
the user-provided order.
|
|
|
|
|
|
Note that the default has vcodec:vp9.2; i.e. av1 is not preferred.
|
|
|
Similarly, the default for hdr is hdr:12; i.e. dolby vision is not
|
|
|
preferred. These choices are made since DV and AV1 formats are not yet
|
|
|
fully compatible with most devices. This may be changed in the future as
|
|
|
more devices become capable of smoothly playing back these formats.
|
|
|
|
|
|
If your format selector is worst, the last item is selected after
|
|
|
sorting. This means it will select the format that is worst in all
|
|
|
respects. Most of the time, what you actually want is the video with the
|
|
|
smallest filesize instead. So it is generally better to use
|
|
|
-f best -S +size,+br,+res,+fps.
|
|
|
|
|
|
Tip: You can use the -v -F to see how the formats have been sorted
|
|
|
(worst to best).
|
|
|
|
|
|
Format Selection examples
|
|
|
|
|
|
# Download and merge the best video-only format and the best audio-only format,
|
|
|
# or download the best combined format if video-only format is not available
|
|
|
$ yt-dlp -f "bv+ba/b"
|
|
|
|
|
|
# Download best format that contains video,
|
|
|
# and if it doesn't already have an audio stream, merge it with best audio-only format
|
|
|
$ yt-dlp -f "bv*+ba/b"
|
|
|
|
|
|
# Same as above
|
|
|
$ yt-dlp
|
|
|
|
|
|
# Download the best video-only format and the best audio-only format without merging them
|
|
|
# For this case, an output template should be used since
|
|
|
# by default, bestvideo and bestaudio will have the same file name.
|
|
|
$ yt-dlp -f "bv,ba" -o "%(title)s.f%(format_id)s.%(ext)s"
|
|
|
|
|
|
# Download and merge the best format that has a video stream,
|
|
|
# and all audio-only formats into one file
|
|
|
$ yt-dlp -f "bv*+mergeall[vcodec=none]" --audio-multistreams
|
|
|
|
|
|
# Download and merge the best format that has a video stream,
|
|
|
# and the best 2 audio-only formats into one file
|
|
|
$ yt-dlp -f "bv*+ba+ba.2" --audio-multistreams
|
|
|
|
|
|
|
|
|
# The following examples show the old method (without -S) of format selection
|
|
|
# and how to use -S to achieve a similar but (generally) better result
|
|
|
|
|
|
# Download the worst video available (old method)
|
|
|
$ yt-dlp -f "wv*+wa/w"
|
|
|
|
|
|
# Download the best video available but with the smallest resolution
|
|
|
$ yt-dlp -S "+res"
|
|
|
|
|
|
# Download the smallest video available
|
|
|
$ yt-dlp -S "+size,+br"
|
|
|
|
|
|
|
|
|
|
|
|
# Download the best mp4 video available, or the best video if no mp4 available
|
|
|
$ yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b"
|
|
|
|
|
|
# Download the best video with the best extension
|
|
|
# (For video, mp4 > mov > webm > flv. For audio, m4a > aac > mp3 ...)
|
|
|
$ yt-dlp -S "ext"
|
|
|
|
|
|
|
|
|
|
|
|
# Download the best video available but no better than 480p,
|
|
|
# or the worst video if there is no video under 480p
|
|
|
$ yt-dlp -f "bv*[height<=480]+ba/b[height<=480] / wv*+ba/w"
|
|
|
|
|
|
# Download the best video available with the largest height but no better than 480p,
|
|
|
# or the best video with the smallest resolution if there is no video under 480p
|
|
|
$ yt-dlp -S "height:480"
|
|
|
|
|
|
# Download the best video available with the largest resolution but no better than 480p,
|
|
|
# or the best video with the smallest resolution if there is no video under 480p
|
|
|
# Resolution is determined by using the smallest dimension.
|
|
|
# So this works correctly for vertical videos as well
|
|
|
$ yt-dlp -S "res:480"
|
|
|
|
|
|
|
|
|
|
|
|
# Download the best video (that also has audio) but no bigger than 50 MB,
|
|
|
# or the worst video (that also has audio) if there is no video under 50 MB
|
|
|
$ yt-dlp -f "b[filesize<50M] / w"
|
|
|
|
|
|
# Download largest video (that also has audio) but no bigger than 50 MB,
|
|
|
# or the smallest video (that also has audio) if there is no video under 50 MB
|
|
|
$ yt-dlp -f "b" -S "filesize:50M"
|
|
|
|
|
|
# Download best video (that also has audio) that is closest in size to 50 MB
|
|
|
$ yt-dlp -f "b" -S "filesize~50M"
|
|
|
|
|
|
|
|
|
|
|
|
# Download best video available via direct link over HTTP/HTTPS protocol,
|
|
|
# or the best video available via any protocol if there is no such video
|
|
|
$ yt-dlp -f "(bv*+ba/b)[protocol^=http][protocol!*=dash] / (bv*+ba/b)"
|
|
|
|
|
|
# Download best video available via the best protocol
|
|
|
# (https/ftps > http/ftp > m3u8_native > m3u8 > http_dash_segments ...)
|
|
|
$ yt-dlp -S "proto"
|
|
|
|
|
|
|
|
|
|
|
|
# Download the best video with either h264 or h265 codec,
|
|
|
# or the best video if there is no such video
|
|
|
$ yt-dlp -f "(bv*[vcodec~='^((he|a)vc|h26[45])']+ba) / (bv*+ba/b)"
|
|
|
|
|
|
# Download the best video with best codec no better than h264,
|
|
|
# or the best video with worst codec if there is no such video
|
|
|
$ yt-dlp -S "codec:h264"
|
|
|
|
|
|
# Download the best video with worst codec no worse than h264,
|
|
|
# or the best video with best codec if there is no such video
|
|
|
$ yt-dlp -S "+codec:h264"
|
|
|
|
|
|
|
|
|
|
|
|
# More complex examples
|
|
|
|
|
|
# Download the best video no better than 720p preferring framerate greater than 30,
|
|
|
# or the worst video (still preferring framerate greater than 30) if there is no such video
|
|
|
$ yt-dlp -f "((bv*[fps>30]/bv*)[height<=720]/(wv*[fps>30]/wv*)) + ba / (b[fps>30]/b)[height<=720]/(w[fps>30]/w)"
|
|
|
|
|
|
# Download the video with the largest resolution no better than 720p,
|
|
|
# or the video with the smallest resolution available if there is no such video,
|
|
|
# preferring larger framerate for formats with the same resolution
|
|
|
$ yt-dlp -S "res:720,fps"
|
|
|
|
|
|
|
|
|
|
|
|
# Download the video with smallest resolution no worse than 480p,
|
|
|
# or the video with the largest resolution available if there is no such video,
|
|
|
# preferring better codec and then larger total bitrate for the same resolution
|
|
|
$ yt-dlp -S "+res:480,codec,br"
|
|
|
|
|
|
MODIFYING METADATA
|
|
|
|
|
|
The metadata obtained by the extractors can be modified by using
|
|
|
--parse-metadata and --replace-in-metadata
|
|
|
|
|
|
--replace-in-metadata FIELDS REGEX REPLACE is used to replace text in
|
|
|
any metadata field using python regular expression. Backreferences can
|
|
|
be used in the replace string for advanced use.
|
|
|
|
|
|
The general syntax of --parse-metadata FROM:TO is to give the name of a
|
|
|
field or an output template to extract data from, and the format to
|
|
|
interpret it as, separated by a colon :. Either a python regular
|
|
|
expression with named capture groups, a single field name, or a similar
|
|
|
syntax to the output template (only %(field)s formatting is supported)
|
|
|
can be used for TO. The option can be used multiple times to parse and
|
|
|
modify various fields.
|
|
|
|
|
|
Note that these options preserve their relative order, allowing
|
|
|
replacements to be made in parsed fields and viceversa. Also, any field
|
|
|
thus created can be used in the output template and will also affect the
|
|
|
media file's metadata added when using --embed-metadata.
|
|
|
|
|
|
This option also has a few special uses:
|
|
|
|
|
|
- You can download an additional URL based on the metadata of the
|
|
|
currently downloaded video. To do this, set the field
|
|
|
additional_urls to the URL that you want to download. E.g.
|
|
|
--parse-metadata "description:(?P<additional_urls>https?://www\.vimeo\.com/\d+)
|
|
|
will download the first vimeo video found in the description
|
|
|
|
|
|
- You can use this to change the metadata that is embedded in the
|
|
|
media file. To do this, set the value of the corresponding field
|
|
|
with a meta_ prefix. For example, any value you set to
|
|
|
meta_description field will be added to the description field in the
|
|
|
file - you can use this to set a different "description" and
|
|
|
"synopsis". To modify the metadata of individual streams, use the
|
|
|
meta<n>_ prefix (e.g. meta1_language). Any value set to the meta_
|
|
|
field will overwrite all default values.
|
|
|
|
|
|
Note: Metadata modification happens before format selection,
|
|
|
post-extraction and other post-processing operations. Some fields may be
|
|
|
added or changed during these steps, overriding your changes.
|
|
|
|
|
|
For reference, these are the fields yt-dlp adds by default to the file
|
|
|
metadata:
|
|
|
|
|
|
Metadata fields From
|
|
|
------------------------- ------------------------------------------
|
|
|
title track or title
|
|
|
date upload_date
|
|
|
description, synopsis description
|
|
|
purl, comment webpage_url
|
|
|
track track_number
|
|
|
artist artist, creator, uploader or uploader_id
|
|
|
genre genre
|
|
|
album album
|
|
|
album_artist album_artist
|
|
|
disc disc_number
|
|
|
show series
|
|
|
season_number season_number
|
|
|
episode_id episode or episode_id
|
|
|
episode_sort episode_number
|
|
|
language of each stream the format's language
|
|
|
|
|
|
Note: The file format may not support some of these fields
|
|
|
|
|
|
Modifying metadata examples
|
|
|
|
|
|
# Interpret the title as "Artist - Title"
|
|
|
$ yt-dlp --parse-metadata "title:%(artist)s - %(title)s"
|
|
|
|
|
|
# Regex example
|
|
|
$ yt-dlp --parse-metadata "description:Artist - (?P<artist>.+)"
|
|
|
|
|
|
# Set title as "Series name S01E05"
|
|
|
$ yt-dlp --parse-metadata "%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s"
|
|
|
|
|
|
# Prioritize uploader as the "artist" field in video metadata
|
|
|
$ yt-dlp --parse-metadata "%(uploader|)s:%(meta_artist)s" --embed-metadata
|
|
|
|
|
|
# Set "comment" field in video metadata using description instead of webpage_url,
|
|
|
# handling multiple lines correctly
|
|
|
$ yt-dlp --parse-metadata "description:(?s)(?P<meta_comment>.+)" --embed-metadata
|
|
|
|
|
|
# Do not set any "synopsis" in the video metadata
|
|
|
$ yt-dlp --parse-metadata ":(?P<meta_synopsis>)"
|
|
|
|
|
|
# Remove "formats" field from the infojson by setting it to an empty string
|
|
|
$ yt-dlp --parse-metadata ":(?P<formats>)" -j
|
|
|
|
|
|
# Replace all spaces and "_" in title and uploader with a `-`
|
|
|
$ yt-dlp --replace-in-metadata "title,uploader" "[ _]" "-"
|
|
|
|
|
|
EXTRACTOR ARGUMENTS
|
|
|
|
|
|
Some extractors accept additional arguments which can be passed using
|
|
|
--extractor-args KEY:ARGS. ARGS is a ; (semicolon) separated string of
|
|
|
ARG=VAL1,VAL2. E.g.
|
|
|
--extractor-args "youtube:player-client=android_embedded,web;include_live_dash" --extractor-args "funimation:version=uncut"
|
|
|
|
|
|
Note: In CLI, ARG can use - instead of _; e.g. youtube:player-client"
|
|
|
becomes youtube:player_client"
|
|
|
|
|
|
The following extractors use this feature:
|
|
|
|
|
|
youtube
|
|
|
|
|
|
- lang: Prefer translated metadata (title, description etc) of this
|
|
|
language code (case-sensitive). By default, the video primary
|
|
|
language metadata is preferred, with a fallback to en translated.
|
|
|
See youtube.py for list of supported content language codes
|
|
|
- skip: One or more of hls, dash or translated_subs to skip extraction
|
|
|
of the m3u8 manifests, dash manifests and auto-translated subtitles
|
|
|
respectively
|
|
|
- player_client: Clients to extract video data from. The main clients
|
|
|
are web, android and ios with variants _music, _embedded,
|
|
|
_embedscreen, _creator (e.g. web_embedded); and mweb and tv_embedded
|
|
|
(agegate bypass) with no variants. By default, android,web is used,
|
|
|
but tv_embedded and creator variants are added as required for
|
|
|
age-gated videos. Similarly, the music variants are added for
|
|
|
music.youtube.com urls. You can use all to use all the clients, and
|
|
|
default for the default clients.
|
|
|
- player_skip: Skip some network requests that are generally needed
|
|
|
for robust extraction. One or more of configs (skip client configs),
|
|
|
webpage (skip initial webpage), js (skip js player). While these
|
|
|
options can help reduce the number of requests needed or avoid some
|
|
|
rate-limiting, they could cause some issues. See #860 for more
|
|
|
details
|
|
|
- comment_sort: top or new (default) - choose comment sorting mode (on
|
|
|
YouTube's side)
|
|
|
- max_comments: Limit the amount of comments to gather.
|
|
|
Comma-separated list of integers representing
|
|
|
max-comments,max-parents,max-replies,max-replies-per-thread. Default
|
|
|
is all,all,all,all
|
|
|
- E.g. all,all,1000,10 will get a maximum of 1000 replies total,
|
|
|
with up to 10 replies per thread. 1000,all,100 will get a
|
|
|
maximum of 1000 comments, with a maximum of 100 replies total
|
|
|
- include_incomplete_formats: Extract formats that cannot be
|
|
|
downloaded completely (live dash and post-live m3u8)
|
|
|
- innertube_host: Innertube API host to use for all API requests; e.g.
|
|
|
studio.youtube.com, youtubei.googleapis.com. Note that cookies
|
|
|
exported from one subdomain will not work on others
|
|
|
- innertube_key: Innertube API key to use for all API requests
|
|
|
|
|
|
youtubetab (YouTube playlists, channels, feeds, etc.)
|
|
|
|
|
|
- skip: One or more of webpage (skip initial webpage download),
|
|
|
authcheck (allow the download of playlists requiring authentication
|
|
|
when no initial webpage is downloaded. This may cause unwanted
|
|
|
behavior, see #1122 for more details)
|
|
|
- approximate_date: Extract approximate upload_date and timestamp in
|
|
|
flat-playlist. This may cause date-based filters to be slightly off
|
|
|
|
|
|
generic
|
|
|
|
|
|
- fragment_query: Passthrough any query in mpd/m3u8 manifest URLs to
|
|
|
their fragments. Does not apply to ffmpeg
|
|
|
|
|
|
funimation
|
|
|
|
|
|
- language: Audio languages to extract, e.g.
|
|
|
funimation:language=english,japanese
|
|
|
- version: The video version to extract - uncut or simulcast
|
|
|
|
|
|
crunchyrollbeta (Crunchyroll)
|
|
|
|
|
|
- format: Which stream type(s) to extract (default: adaptive_hls).
|
|
|
Potentially useful values include adaptive_hls, adaptive_dash,
|
|
|
vo_adaptive_hls, vo_adaptive_dash, download_hls, download_dash,
|
|
|
multitrack_adaptive_hls_v2
|
|
|
- hardsub: Preference order for which hardsub versions to extract, or
|
|
|
all (default: None = no hardsubs), e.g.
|
|
|
crunchyrollbeta:hardsub=en-US,None
|
|
|
|
|
|
vikichannel
|
|
|
|
|
|
- video_types: Types of videos to download - one or more of episodes,
|
|
|
movies, clips, trailers
|
|
|
|
|
|
niconico
|
|
|
|
|
|
- segment_duration: Segment duration in milliseconds for HLS-DMC
|
|
|
formats. Use it at your own risk since this feature may result in
|
|
|
your account termination.
|
|
|
|
|
|
youtubewebarchive
|
|
|
|
|
|
- check_all: Try to check more at the cost of more requests. One or
|
|
|
more of thumbnails, captures
|
|
|
|
|
|
gamejolt
|
|
|
|
|
|
- comment_sort: hot (default), you (cookies needed), top, new - choose
|
|
|
comment sorting mode (on GameJolt's side)
|
|
|
|
|
|
hotstar
|
|
|
|
|
|
- res: resolution to ignore - one or more of sd, hd, fhd
|
|
|
- vcodec: vcodec to ignore - one or more of h264, h265, dvh265
|
|
|
- dr: dynamic range to ignore - one or more of sdr, hdr10, dv
|
|
|
|
|
|
tiktok
|
|
|
|
|
|
- api_hostname: Hostname to use for mobile API requests, e.g.
|
|
|
api-h2.tiktokv.com
|
|
|
- app_version: App version to call mobile APIs with - should be set
|
|
|
along with manifest_app_version, e.g. 20.2.1
|
|
|
- manifest_app_version: Numeric app version to call mobile APIs with,
|
|
|
e.g. 221
|
|
|
|
|
|
rokfinchannel
|
|
|
|
|
|
- tab: Which tab to download - one of new, top, videos, podcasts,
|
|
|
streams, stacks
|
|
|
|
|
|
twitter
|
|
|
|
|
|
- force_graphql: Force usage of the GraphQL API. By default it will
|
|
|
only be used if login cookies are provided
|
|
|
|
|
|
Note: These options may be changed/removed in the future without concern
|
|
|
for backward compatibility
|
|
|
|
|
|
PLUGINS
|
|
|
|
|
|
Note that all plugins are imported even if not invoked, and that there
|
|
|
are no checks performed on plugin code. Use plugins at your own risk and
|
|
|
only if you trust the code!
|
|
|
|
|
|
Plugins can be of <type>s extractor or postprocessor. - Extractor
|
|
|
plugins do not need to be enabled from the CLI and are automatically
|
|
|
invoked when the input URL is suitable for it. - Extractor plugins take
|
|
|
priority over builtin extractors. - Postprocessor plugins can be invoked
|
|
|
using --use-postprocessor NAME.
|
|
|
|
|
|
Plugins are loaded from the namespace packages yt_dlp_plugins.extractor
|
|
|
and yt_dlp_plugins.postprocessor.
|
|
|
|
|
|
In other words, the file structure on the disk looks something like:
|
|
|
|
|
|
yt_dlp_plugins/
|
|
|
extractor/
|
|
|
myplugin.py
|
|
|
postprocessor/
|
|
|
myplugin.py
|
|
|
|
|
|
yt-dlp looks for these yt_dlp_plugins namespace folders in many
|
|
|
locations (see below) and loads in plugins from all of them.
|
|
|
|
|
|
See the wiki for some known plugins
|
|
|
|
|
|
Installing Plugins
|
|
|
|
|
|
Plugins can be installed using various methods and locations.
|
|
|
|
|
|
1. Configuration directories: Plugin packages (containing a
|
|
|
yt_dlp_plugins namespace folder) can be dropped into the following
|
|
|
standard configuration locations:
|
|
|
- User Plugins
|
|
|
- ${XDG_CONFIG_HOME}/yt-dlp/plugins/<package name>/yt_dlp_plugins/
|
|
|
(recommended on Linux/macOS)
|
|
|
- ${XDG_CONFIG_HOME}/yt-dlp-plugins/<package name>/yt_dlp_plugins/
|
|
|
- ${APPDATA}/yt-dlp/plugins/<package name>/yt_dlp_plugins/
|
|
|
(recommended on Windows)
|
|
|
- ${APPDATA}/yt-dlp-plugins/<package name>/yt_dlp_plugins/
|
|
|
- ~/.yt-dlp/plugins/<package name>/yt_dlp_plugins/
|
|
|
- ~/yt-dlp-plugins/<package name>/yt_dlp_plugins/
|
|
|
- System Plugins
|
|
|
- /etc/yt-dlp/plugins/<package name>/yt_dlp_plugins/
|
|
|
- /etc/yt-dlp-plugins/<package name>/yt_dlp_plugins/
|
|
|
2. Executable location: Plugin packages can similarly be installed in a
|
|
|
yt-dlp-plugins directory under the executable location:
|
|
|
- Binary: where <root-dir>/yt-dlp.exe,
|
|
|
<root-dir>/yt-dlp-plugins/<package name>/yt_dlp_plugins/
|
|
|
- Source: where <root-dir>/yt_dlp/__main__.py,
|
|
|
<root-dir>/yt-dlp-plugins/<package name>/yt_dlp_plugins/
|
|
|
3. pip and other locations in PYTHONPATH
|
|
|
- Plugin packages can be installed and managed using pip. See
|
|
|
yt-dlp-sample-plugins for an example.
|
|
|
- Note: plugin files between plugin packages installed with
|
|
|
pip must have unique filenames.
|
|
|
- Any path in PYTHONPATH is searched in for the yt_dlp_plugins
|
|
|
namespace folder.
|
|
|
- Note: This does not apply for Pyinstaller/py2exe builds.
|
|
|
|
|
|
.zip, .egg and .whl archives containing a yt_dlp_plugins namespace
|
|
|
folder in their root are also supported as plugin packages. * e.g.
|
|
|
${XDG_CONFIG_HOME}/yt-dlp/plugins/mypluginpkg.zip where mypluginpkg.zip
|
|
|
contains yt_dlp_plugins/<type>/myplugin.py
|
|
|
|
|
|
Run yt-dlp with --verbose to check if the plugin has been loaded.
|
|
|
|
|
|
Developing Plugins
|
|
|
|
|
|
See the yt-dlp-sample-plugins repo for a template plugin package and the
|
|
|
Plugin Development section of the wiki for a plugin development guide.
|
|
|
|
|
|
All public classes with a name ending in IE/PP are imported from each
|
|
|
file for extractors and postprocessors repectively. This respects
|
|
|
underscore prefix (e.g. _MyBasePluginIE is private) and __all__. Modules
|
|
|
can similarly be excluded by prefixing the module name with an
|
|
|
underscore (e.g. _myplugin.py).
|
|
|
|
|
|
To replace an existing extractor with a subclass of one, set the
|
|
|
plugin_name class keyword argument (e.g.
|
|
|
class MyPluginIE(ABuiltInIE, plugin_name='myplugin') will replace
|
|
|
ABuiltInIE with MyPluginIE). Since the extractor replaces the parent,
|
|
|
you should exclude the subclass extractor from being imported separately
|
|
|
by making it private using one of the methods described above.
|
|
|
|
|
|
If you are a plugin author, add yt-dlp-plugins as a topic to your
|
|
|
repository for discoverability.
|
|
|
|
|
|
See the Developer Instructions on how to write and test an extractor.
|
|
|
|
|
|
EMBEDDING YT-DLP
|
|
|
|
|
|
yt-dlp makes the best effort to be a good command-line program, and thus
|
|
|
should be callable from any programming language.
|
|
|
|
|
|
Your program should avoid parsing the normal stdout since they may
|
|
|
change in future versions. Instead they should use options such as -J,
|
|
|
--print, --progress-template, --exec etc to create console output that
|
|
|
you can reliably reproduce and parse.
|
|
|
|
|
|
From a Python program, you can embed yt-dlp in a more powerful fashion,
|
|
|
like this:
|
|
|
|
|
|
from yt_dlp import YoutubeDL
|
|
|
|
|
|
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
|
|
with YoutubeDL() as ydl:
|
|
|
ydl.download(URLS)
|
|
|
|
|
|
Most likely, you'll want to use various options. For a list of options
|
|
|
available, have a look at yt_dlp/YoutubeDL.py.
|
|
|
|
|
|
Tip: If you are porting your code from youtube-dl to yt-dlp, one
|
|
|
important point to look out for is that we do not guarantee the return
|
|
|
value of YoutubeDL.extract_info to be json serializable, or even be a
|
|
|
dictionary. It will be dictionary-like, but if you want to ensure it is
|
|
|
a serializable dictionary, pass it through YoutubeDL.sanitize_info as
|
|
|
shown in the example below
|
|
|
|
|
|
Embedding examples
|
|
|
|
|
|
Extracting information
|
|
|
|
|
|
import json
|
|
|
import yt_dlp
|
|
|
|
|
|
URL = 'https://www.youtube.com/watch?v=BaW_jenozKc'
|
|
|
|
|
|
# ℹ️ See help(yt_dlp.YoutubeDL) for a list of available options and public functions
|
|
|
ydl_opts = {}
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
info = ydl.extract_info(URL, download=False)
|
|
|
|
|
|
# ℹ️ ydl.sanitize_info makes the info json-serializable
|
|
|
print(json.dumps(ydl.sanitize_info(info)))
|
|
|
|
|
|
Download using an info-json
|
|
|
|
|
|
import yt_dlp
|
|
|
|
|
|
INFO_FILE = 'path/to/video.info.json'
|
|
|
|
|
|
with yt_dlp.YoutubeDL() as ydl:
|
|
|
error_code = ydl.download_with_info_file(INFO_FILE)
|
|
|
|
|
|
print('Some videos failed to download' if error_code
|
|
|
else 'All videos successfully downloaded')
|
|
|
|
|
|
Extract audio
|
|
|
|
|
|
import yt_dlp
|
|
|
|
|
|
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
|
|
|
|
|
ydl_opts = {
|
|
|
'format': 'm4a/bestaudio/best',
|
|
|
# ℹ️ See help(yt_dlp.postprocessor) for a list of available Postprocessors and their arguments
|
|
|
'postprocessors': [{ # Extract audio using ffmpeg
|
|
|
'key': 'FFmpegExtractAudio',
|
|
|
'preferredcodec': 'm4a',
|
|
|
}]
|
|
|
}
|
|
|
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
error_code = ydl.download(URLS)
|
|
|
|
|
|
Filter videos
|
|
|
|
|
|
import yt_dlp
|
|
|
|
|
|
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
|
|
|
|
|
def longer_than_a_minute(info, *, incomplete):
|
|
|
"""Download only videos longer than a minute (or with unknown duration)"""
|
|
|
duration = info.get('duration')
|
|
|
if duration and duration < 60:
|
|
|
return 'The video is too short'
|
|
|
|
|
|
ydl_opts = {
|
|
|
'match_filter': longer_than_a_minute,
|
|
|
}
|
|
|
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
error_code = ydl.download(URLS)
|
|
|
|
|
|
Adding logger and progress hook
|
|
|
|
|
|
import yt_dlp
|
|
|
|
|
|
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
|
|
|
|
|
class MyLogger:
|
|
|
def debug(self, msg):
|
|
|
# For compatibility with youtube-dl, both debug and info are passed into debug
|
|
|
# You can distinguish them by the prefix '[debug] '
|
|
|
if msg.startswith('[debug] '):
|
|
|
pass
|
|
|
else:
|
|
|
self.info(msg)
|
|
|
|
|
|
def info(self, msg):
|
|
|
pass
|
|
|
|
|
|
def warning(self, msg):
|
|
|
pass
|
|
|
|
|
|
def error(self, msg):
|
|
|
print(msg)
|
|
|
|
|
|
|
|
|
# ℹ️ See "progress_hooks" in help(yt_dlp.YoutubeDL)
|
|
|
def my_hook(d):
|
|
|
if d['status'] == 'finished':
|
|
|
print('Done downloading, now post-processing ...')
|
|
|
|
|
|
|
|
|
ydl_opts = {
|
|
|
'logger': MyLogger(),
|
|
|
'progress_hooks': [my_hook],
|
|
|
}
|
|
|
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
ydl.download(URLS)
|
|
|
|
|
|
Add a custom PostProcessor
|
|
|
|
|
|
import yt_dlp
|
|
|
|
|
|
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
|
|
|
|
|
# ℹ️ See help(yt_dlp.postprocessor.PostProcessor)
|
|
|
class MyCustomPP(yt_dlp.postprocessor.PostProcessor):
|
|
|
def run(self, info):
|
|
|
self.to_screen('Doing stuff')
|
|
|
return [], info
|
|
|
|
|
|
|
|
|
with yt_dlp.YoutubeDL() as ydl:
|
|
|
# ℹ️ "when" can take any value in yt_dlp.utils.POSTPROCESS_WHEN
|
|
|
ydl.add_post_processor(MyCustomPP(), when='pre_process')
|
|
|
ydl.download(URLS)
|
|
|
|
|
|
Use a custom format selector
|
|
|
|
|
|
import yt_dlp
|
|
|
|
|
|
URL = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
|
|
|
|
|
def format_selector(ctx):
|
|
|
""" Select the best video and the best audio that won't result in an mkv.
|
|
|
NOTE: This is just an example and does not handle all cases """
|
|
|
|
|
|
# formats are already sorted worst to best
|
|
|
formats = ctx.get('formats')[::-1]
|
|
|
|
|
|
# acodec='none' means there is no audio
|
|
|
best_video = next(f for f in formats
|
|
|
if f['vcodec'] != 'none' and f['acodec'] == 'none')
|
|
|
|
|
|
# find compatible audio extension
|
|
|
audio_ext = {'mp4': 'm4a', 'webm': 'webm'}[best_video['ext']]
|
|
|
# vcodec='none' means there is no video
|
|
|
best_audio = next(f for f in formats if (
|
|
|
f['acodec'] != 'none' and f['vcodec'] == 'none' and f['ext'] == audio_ext))
|
|
|
|
|
|
# These are the minimum required fields for a merged format
|
|
|
yield {
|
|
|
'format_id': f'{best_video["format_id"]}+{best_audio["format_id"]}',
|
|
|
'ext': best_video['ext'],
|
|
|
'requested_formats': [best_video, best_audio],
|
|
|
# Must be + separated list of protocols
|
|
|
'protocol': f'{best_video["protocol"]}+{best_audio["protocol"]}'
|
|
|
}
|
|
|
|
|
|
|
|
|
ydl_opts = {
|
|
|
'format': format_selector,
|
|
|
}
|
|
|
|
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
|
ydl.download(URLS)
|
|
|
|
|
|
DEPRECATED OPTIONS
|
|
|
|
|
|
These are all the deprecated options and the current alternative to
|
|
|
achieve the same effect
|
|
|
|
|
|
Almost redundant options
|
|
|
|
|
|
While these options are almost the same as their new counterparts, there
|
|
|
are some differences that prevents them being redundant
|
|
|
|
|
|
-j, --dump-json --print "%()j"
|
|
|
-F, --list-formats --print formats_table
|
|
|
--list-thumbnails --print thumbnails_table --print playlist:thumbnails_table
|
|
|
--list-subs --print automatic_captions_table --print subtitles_table
|
|
|
|
|
|
Redundant options
|
|
|
|
|
|
While these options are redundant, they are still expected to be used
|
|
|
due to their ease of use
|
|
|
|
|
|
--get-description --print description
|
|
|
--get-duration --print duration_string
|
|
|
--get-filename --print filename
|
|
|
--get-format --print format
|
|
|
--get-id --print id
|
|
|
--get-thumbnail --print thumbnail
|
|
|
-e, --get-title --print title
|
|
|
-g, --get-url --print urls
|
|
|
--match-title REGEX --match-filter "title ~= (?i)REGEX"
|
|
|
--reject-title REGEX --match-filter "title !~= (?i)REGEX"
|
|
|
--min-views COUNT --match-filter "view_count >=? COUNT"
|
|
|
--max-views COUNT --match-filter "view_count <=? COUNT"
|
|
|
--break-on-reject Use --break-match-filter
|
|
|
--user-agent UA --add-header "User-Agent:UA"
|
|
|
--referer URL --add-header "Referer:URL"
|
|
|
--playlist-start NUMBER -I NUMBER:
|
|
|
--playlist-end NUMBER -I :NUMBER
|
|
|
--playlist-reverse -I ::-1
|
|
|
--no-playlist-reverse Default
|
|
|
|
|
|
Not recommended
|
|
|
|
|
|
While these options still work, their use is not recommended since there
|
|
|
are other alternatives to achieve the same
|
|
|
|
|
|
--force-generic-extractor --ies generic,default
|
|
|
--exec-before-download CMD --exec "before_dl:CMD"
|
|
|
--no-exec-before-download --no-exec
|
|
|
--all-formats -f all
|
|
|
--all-subs --sub-langs all --write-subs
|
|
|
--print-json -j --no-simulate
|
|
|
--autonumber-size NUMBER Use string formatting, e.g. %(autonumber)03d
|
|
|
--autonumber-start NUMBER Use internal field formatting like %(autonumber+NUMBER)s
|
|
|
--id -o "%(id)s.%(ext)s"
|
|
|
--metadata-from-title FORMAT --parse-metadata "%(title)s:FORMAT"
|
|
|
--hls-prefer-native --downloader "m3u8:native"
|
|
|
--hls-prefer-ffmpeg --downloader "m3u8:ffmpeg"
|
|
|
--list-formats-old --compat-options list-formats (Alias: --no-list-formats-as-table)
|
|
|
--list-formats-as-table --compat-options -list-formats [Default] (Alias: --no-list-formats-old)
|
|
|
--youtube-skip-dash-manifest --extractor-args "youtube:skip=dash" (Alias: --no-youtube-include-dash-manifest)
|
|
|
--youtube-skip-hls-manifest --extractor-args "youtube:skip=hls" (Alias: --no-youtube-include-hls-manifest)
|
|
|
--youtube-include-dash-manifest Default (Alias: --no-youtube-skip-dash-manifest)
|
|
|
--youtube-include-hls-manifest Default (Alias: --no-youtube-skip-hls-manifest)
|
|
|
|
|
|
Developer options
|
|
|
|
|
|
These options are not intended to be used by the end-user
|
|
|
|
|
|
--test Download only part of video for testing extractors
|
|
|
--load-pages Load pages dumped by --write-pages
|
|
|
--youtube-print-sig-code For testing youtube signatures
|
|
|
--allow-unplayable-formats List unplayable formats also
|
|
|
--no-allow-unplayable-formats Default
|
|
|
|
|
|
Old aliases
|
|
|
|
|
|
These are aliases that are no longer documented for various reasons
|
|
|
|
|
|
--avconv-location --ffmpeg-location
|
|
|
--clean-infojson --clean-info-json
|
|
|
--cn-verification-proxy URL --geo-verification-proxy URL
|
|
|
--dump-headers --print-traffic
|
|
|
--dump-intermediate-pages --dump-pages
|
|
|
--force-write-download-archive --force-write-archive
|
|
|
--load-info --load-info-json
|
|
|
--no-clean-infojson --no-clean-info-json
|
|
|
--no-split-tracks --no-split-chapters
|
|
|
--no-write-srt --no-write-subs
|
|
|
--prefer-unsecure --prefer-insecure
|
|
|
--rate-limit RATE --limit-rate RATE
|
|
|
--split-tracks --split-chapters
|
|
|
--srt-lang LANGS --sub-langs LANGS
|
|
|
--trim-file-names LENGTH --trim-filenames LENGTH
|
|
|
--write-srt --write-subs
|
|
|
--yes-overwrites --force-overwrites
|
|
|
|
|
|
Sponskrub Options
|
|
|
|
|
|
Support for SponSkrub has been deprecated in favor of the --sponsorblock
|
|
|
options
|
|
|
|
|
|
--sponskrub --sponsorblock-mark all
|
|
|
--no-sponskrub --no-sponsorblock
|
|
|
--sponskrub-cut --sponsorblock-remove all
|
|
|
--no-sponskrub-cut --sponsorblock-remove -all
|
|
|
--sponskrub-force Not applicable
|
|
|
--no-sponskrub-force Not applicable
|
|
|
--sponskrub-location Not applicable
|
|
|
--sponskrub-args Not applicable
|
|
|
|
|
|
No longer supported
|
|
|
|
|
|
These options may no longer work as intended
|
|
|
|
|
|
--prefer-avconv avconv is not officially supported by yt-dlp (Alias: --no-prefer-ffmpeg)
|
|
|
--prefer-ffmpeg Default (Alias: --no-prefer-avconv)
|
|
|
-C, --call-home Not implemented
|
|
|
--no-call-home Default
|
|
|
--include-ads No longer supported
|
|
|
--no-include-ads Default
|
|
|
--write-annotations No supported site has annotations now
|
|
|
--no-write-annotations Default
|
|
|
--compat-options seperate-video-versions No longer needed
|
|
|
|
|
|
Removed
|
|
|
|
|
|
These options were deprecated since 2014 and have now been entirely
|
|
|
removed
|
|
|
|
|
|
-A, --auto-number -o "%(autonumber)s-%(id)s.%(ext)s"
|
|
|
-t, -l, --title, --literal -o "%(title)s-%(id)s.%(ext)s"
|
|
|
|
|
|
CONTRIBUTING
|
|
|
|
|
|
See CONTRIBUTING.md for instructions on Opening an Issue and
|
|
|
Contributing code to the project
|
|
|
|
|
|
WIKI
|
|
|
|
|
|
See the Wiki for more information
|