j1-template 2024.3.13 → 2024.3.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +1 -1
- data/_includes/themes/j1/layouts/layout_resource_generator.html +1 -4
- data/_includes/themes/j1/procedures/blocks/footer/boxes/social_media_icons.proc +24 -23
- data/_includes/themes/j1/procedures/layouts/content_writer.proc +4 -3
- data/_includes/themes/j1/procedures/layouts/default_writer.proc +37 -6
- data/_includes/themes/j1/procedures/layouts/module_writer.proc +31 -95
- data/_includes/themes/j1/procedures/layouts/resource_writer.proc +51 -29
- data/assets/data/amplitude.28.html +887 -0
- data/assets/data/amplitude.29.html +923 -0
- data/assets/data/amplitude.html +311 -46
- data/assets/data/banner.html +9 -7
- data/assets/data/masterslider.html +128 -7
- data/assets/data/panel.html +16 -65
- data/assets/theme/j1/adapter/js/amplitude.23.js +1165 -0
- data/assets/theme/j1/adapter/js/amplitude.24.js +1164 -0
- data/assets/theme/j1/adapter/js/amplitude.25.js +1268 -0
- data/assets/theme/j1/adapter/js/amplitude.js +294 -117
- data/assets/theme/j1/adapter/js/attic.js +14 -11
- data/assets/theme/j1/adapter/js/docsearch.js +2 -2
- data/assets/theme/j1/adapter/js/fab.js +2 -2
- data/assets/theme/j1/adapter/js/j1.js +8 -8
- data/assets/theme/j1/adapter/js/lazyLoader.js +60 -10
- data/assets/theme/j1/adapter/js/masonry.js +1 -1
- data/assets/theme/j1/adapter/js/masterslider.js +2 -2
- data/assets/theme/j1/adapter/js/particles.js +2 -2
- data/assets/theme/j1/adapter/js/scroller.js +2 -2
- data/assets/theme/j1/adapter/js/slick.js +2 -2
- data/assets/theme/j1/adapter/js/themes.js +1 -1
- data/assets/theme/j1/adapter/js/translator.js +2 -2
- data/assets/theme/j1/adapter/js/waves.js +1 -1
- data/assets/theme/j1/core/css/animate.css +1634 -1070
- data/assets/theme/j1/core/css/animate.css.map +1 -0
- data/assets/theme/j1/core/css/animate.min.css +2 -1
- data/assets/theme/j1/core/css/animate.min.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.css +3060 -1538
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css +2 -1
- data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/iconify.css +2308 -1153
- data/assets/theme/j1/core/css/icon-fonts/iconify.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/iconify.min.css +2 -1
- data/assets/theme/j1/core/css/icon-fonts/iconify.min.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/mdi.css +16716 -8423
- data/assets/theme/j1/core/css/icon-fonts/mdi.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/mdi.min.css +2 -1
- data/assets/theme/j1/core/css/icon-fonts/mdi.min.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/mdib.css +5554 -2766
- data/assets/theme/j1/core/css/icon-fonts/mdib.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/mdib.min.css +2 -1
- data/assets/theme/j1/core/css/icon-fonts/mdib.min.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/mdil.css +742 -441
- data/assets/theme/j1/core/css/icon-fonts/mdil.css.map +1 -0
- data/assets/theme/j1/core/css/icon-fonts/mdil.min.css +2 -1
- data/assets/theme/j1/core/css/icon-fonts/mdil.min.css.map +1 -0
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css +6552 -3980
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css.map +1 -0
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css +2 -5
- data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css.map +1 -0
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.css +6818 -4131
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.css.map +1 -0
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css +2 -5
- data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css.map +1 -0
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +18568 -11577
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.css.map +1 -0
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +2 -35
- data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css.map +1 -0
- data/assets/theme/j1/core/css/vendor.css +1771 -1043
- data/assets/theme/j1/core/css/vendor.css.map +1 -0
- data/assets/theme/j1/core/css/vendor.min.css +2 -1
- data/assets/theme/j1/core/css/vendor.min.css.map +1 -0
- data/assets/theme/j1/core/js/template.js +399 -447
- data/assets/theme/j1/core/js/template.min.js +7 -7
- data/assets/theme/j1/core/js/template.min.js.map +1 -1
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +4 -2
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +39 -4
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +1 -1
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +57 -17
- data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -1
- data/assets/theme/j1/modules/amplitudejs/icons/player/blue/pause.png +0 -0
- data/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.png +0 -0
- data/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.svg +87 -0
- data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-backward.svg +60 -0
- data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-forward.svg +59 -0
- data/assets/theme/j1/modules/amplitudejs/js/amplitude.js +65 -21
- data/assets/theme/j1/modules/amplitudejs/js/amplitude.min.js +1 -1
- data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +113 -0
- data/assets/theme/j1/modules/iconPicker/js/universal-icon-picker.js +471 -471
- data/assets/theme/j1/modules/j1LazyLoader/LICENSE +21 -0
- data/assets/theme/j1/modules/j1LazyLoader/js/j1Lazy.js +870 -0
- data/assets/theme/j1/modules/js-cookies/js/js.cookie.js +3 -3
- data/assets/theme/j1/modules/lazyCssLoader/js/main.0.js +166 -0
- data/assets/theme/j1/modules/lazyCssLoader/js/main.1.js +65 -0
- data/assets/theme/j1/modules/lazyCssLoader/js/main.js +66 -0
- data/assets/theme/j1/modules/lazyCssLoader/js/plugins/examplePlugin.js +13 -0
- data/assets/theme/j1/modules/lazyCssLoader/js/plugins/my-plugin.js +25 -0
- data/assets/theme/j1/modules/lazyCssLoader/js/plugins/plugin-interface.js +9 -0
- data/assets/theme/j1/modules/lazyCssLoader/js/plugins/pluginA.js +46 -0
- data/assets/theme/j1/modules/lazyLoader/js/plugins/README.md +324 -0
- data/assets/theme/j1/modules/lazyLoader/js/plugins/jquery.lazy.picture.js +188 -0
- data/assets/theme/j1/modules/lightGallery/js/lightgallery.js +1 -1
- data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.0.js +794 -0
- data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.js +151 -67
- data/assets/theme/j1/modules/slimSelect/js/select.js +1 -1
- data/assets/theme/j1/modules/slimSelect/js/select.min.js +3 -3
- data/assets/theme/j1/modules/themeSwitcher/js/switcher.js +2 -1
- data/assets/theme/j1/modules/videojs/js/plugins/players/dm/dailymotion.min.js +1 -1
- data/assets/theme/j1/modules/videojs/js/plugins/players/dm/icon/scalable/dailymotion.svg +62 -0
- data/assets/theme/j1/modules/videojs/js/plugins/players/yt/v3.0.0/youtube.js +832 -0
- data/assets/theme/j1/modules/videojs/js/plugins/players/yt/v3.0.0/youtube.min.js +17 -0
- data/assets/theme/j1/modules/videojs/js/plugins/players/yt/youtube.min.js +1 -1
- data/assets/theme/j1/modules/videojs/js/video.js +2 -2
- data/lib/j1/version.rb +1 -1
- data/lib/starter_web/README.md +577 -560
- data/lib/starter_web/_config.yml +2 -2
- data/lib/starter_web/_data/blocks/footer.yml +10 -5
- data/lib/starter_web/_data/blocks/panel.yml +2 -2
- data/lib/starter_web/_data/layouts/default.yml +14 -3
- data/lib/starter_web/_data/modules/amplitude.yml +145 -0
- data/lib/starter_web/_data/modules/defaults/amplitude.yml +29 -7
- data/lib/starter_web/_data/modules/defaults/lazyLoader.yml +2 -2
- data/lib/starter_web/_data/modules/gallery.yml +136 -0
- data/lib/starter_web/_data/modules/lazyLoader.0.yml +118 -0
- data/lib/starter_web/_data/modules/lazyLoader.yml +68 -31
- data/lib/starter_web/_data/modules/masonry.yml +4 -4
- data/lib/starter_web/_data/modules/masterslider.yml +118 -12
- data/lib/starter_web/_data/modules/navigator_menu.yml +831 -803
- data/lib/starter_web/_data/resources.yml +154 -190
- data/lib/starter_web/_data/templates/feed.xml +1 -1
- data/lib/starter_web/_includes/attributes.asciidoc +1 -0
- data/lib/starter_web/_plugins/asciidoctor/amplitude-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/dailymotion-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/gallery-block.rb +4 -2
- data/lib/starter_web/_plugins/asciidoctor/masonry-block.rb +1 -1
- data/lib/starter_web/_plugins/asciidoctor/videojs-block.rb +58 -46
- data/lib/starter_web/_plugins/asciidoctor/vimeo-block.rb +26 -19
- data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +30 -40
- data/lib/starter_web/_plugins/index/lunr.rb +1 -1
- data/lib/starter_web/assets/image/icons/lanus/favicon.ico +0 -0
- data/lib/starter_web/assets/image/icons/lanus/lanus-512x512.png +0 -0
- data/lib/starter_web/assets/image/icons/lanus/lanus.ico +0 -0
- data/lib/starter_web/assets/image/icons/lanus/lanus.png +0 -0
- data/lib/starter_web/assets/image/icons/lanus/scalable/lanus.svg +76 -0
- data/lib/starter_web/assets/image/icons/lanus/scalable/lanus_sw.svg +62 -0
- data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28 - social.svg +86 -0
- data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28.svg +64 -0
- data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x.svg +1 -0
- data/lib/starter_web/assets/image/modules/icons/social/twitter_x.png +0 -0
- data/lib/starter_web/package.json +7 -18
- data/lib/starter_web/pages/public/amplitude_yt_tester.adoc +218 -0
- data/lib/starter_web/pages/public/features/template.adoc +18 -8
- data/lib/starter_web/pages/public/features/template.asciidoc +758 -0
- data/lib/starter_web/pages/public/lazy_loader_tester.adoc +402 -0
- data/lib/starter_web/pages/public/manuals/ytdl/man.adoc +3020 -0
- data/lib/starter_web/pages/public/manuals/ytdl/man.md +2378 -0
- data/lib/starter_web/pages/public/tools/previewer/_includes/attributes.asciidoc +0 -16
- data/lib/starter_web/pages/public/tools/previewer/_includes/documents/amplitudejs.large.css.asciidoc +505 -0
- data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.hover.html +69 -0
- data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.nested.html +75 -0
- data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.textarea.html +57 -0
- data/lib/starter_web/pages/public/tools/previewer/_includes/documents/my.content.html +112 -0
- data/lib/starter_web/pages/public/tools/previewer/preview_amplitudejs.adoc +172 -0
- data/lib/starter_web/pages/public/tour/_includes/attributes.asciidoc +2 -2
- data/lib/starter_web/pages/public/tour/_includes/documents/419_advanced_modals_demo.asciidoc +16 -16
- data/lib/starter_web/pages/public/tour/asciidoc_extensions.adoc +13 -3
- data/lib/starter_web/pages/public/tour/bootstrap_themes.adoc +12 -3
- data/lib/starter_web/pages/public/tour/highlghter_rouge.adoc +13 -3
- data/lib/starter_web/pages/public/tour/icon_fonts.adoc +12 -3
- data/lib/starter_web/pages/public/tour/modal_extentions.adoc +12 -6
- data/lib/starter_web/pages/public/tour/{playback_audio.adoc → play_audio.adoc} +207 -188
- data/lib/starter_web/pages/public/tour/{playback_video.adoc → play_video.adoc} +49 -51
- data/lib/starter_web/pages/public/tour/present_images.adoc +27 -5
- data/lib/starter_web/pages/public/tour/quicksearch.adoc +13 -3
- data/lib/starter_web/pages/public/tour/responsive_tables.adoc +13 -4
- data/lib/starter_web/pages/public/tour/typography.adoc +12 -3
- metadata +90 -22
- /data/assets/theme/j1/modules/{lazyLoader → j1LazyLoader/js}/plugins/README.md +0 -0
- /data/assets/theme/j1/modules/{lazyLoader/plugins/jquery.lazy.picture.js → j1LazyLoader/js/plugins/picture.js} +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.ajax.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.ajax.min.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.av.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.av.min.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.iframe.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.iframe.min.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.noop.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.noop.min.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.picture.min.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.script.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.script.min.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.vimeo.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.vimeo.min.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.youtube.js +0 -0
- /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.youtube.min.js +0 -0
@@ -0,0 +1,3020 @@
|
|
1
|
+
---
|
2
|
+
title: YouTube Downloader
|
3
|
+
title_extention: YouTube Downloader CLI
|
4
|
+
tagline: CLI User Guide
|
5
|
+
|
6
|
+
date: 2024-04-17
|
7
|
+
#last_modified: 2024-01-01
|
8
|
+
|
9
|
+
description: >
|
10
|
+
AmplitudeJS is a JavaScript library to control the design of audio media
|
11
|
+
elements on web pages. The concept allows designers to fully control the
|
12
|
+
look and feel of audio players without deep scripting knowledge.
|
13
|
+
keywords: >
|
14
|
+
open source, free, template, jekyll, jekyllone, web,
|
15
|
+
sites, static, jamstack, bootstrap, html, html5, audio,
|
16
|
+
Amplitude
|
17
|
+
|
18
|
+
categories: [ Manuals ]
|
19
|
+
tags: [ YouTube Downloader, CLI ]
|
20
|
+
|
21
|
+
image:
|
22
|
+
path: /assets/image/icons/videojs/videojs-poster.png
|
23
|
+
width: 1920
|
24
|
+
height: 1280
|
25
|
+
|
26
|
+
regenerate: false
|
27
|
+
personalization: true
|
28
|
+
permalink: /pages/public/manuals/ytdl/ytdl_cli/
|
29
|
+
|
30
|
+
resources: []
|
31
|
+
resource_options:
|
32
|
+
- toccer:
|
33
|
+
collapseDepth: 3
|
34
|
+
- attic:
|
35
|
+
slides:
|
36
|
+
- url: /assets/image/modules/attics/1920x1280/alexey-ruban.jpg
|
37
|
+
alt: Photo by Alexey Ruban on Unsplash
|
38
|
+
badge:
|
39
|
+
type: unsplash
|
40
|
+
author: Alexey Ruban
|
41
|
+
href: //unsplash.com/de/@intelligenciya
|
42
|
+
---
|
43
|
+
|
44
|
+
// Page Initializer
|
45
|
+
// =============================================================================
|
46
|
+
// Enable the Liquid Preprocessor
|
47
|
+
:page-liquid:
|
48
|
+
|
49
|
+
// Set (local) page attributes here
|
50
|
+
// -----------------------------------------------------------------------------
|
51
|
+
// :page--attr: <attr-value>
|
52
|
+
|
53
|
+
// Load Liquid procedures
|
54
|
+
// -----------------------------------------------------------------------------
|
55
|
+
{% capture load_attributes %}themes/{{site.template.name}}/procedures/global/attributes_loader.proc{%endcapture%}
|
56
|
+
|
57
|
+
// Load page attributes
|
58
|
+
// -----------------------------------------------------------------------------
|
59
|
+
{% include {{load_attributes}} scope="global" %}
|
60
|
+
|
61
|
+
// Page content
|
62
|
+
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
63
|
+
// See: https://521dimensions.com/open-source/amplitudejs/docs
|
64
|
+
// See: https://github.com/mediaelement/mediaelement-plugins
|
65
|
+
// See: https://github.com/serversideup/amplitudejs/
|
66
|
+
|
67
|
+
[role="dropcap"]
|
68
|
+
The audio tag in HTML5 is a great way to add audio media to web pages.
|
69
|
+
However, the browser fully controls the audio playback interface, which
|
70
|
+
can limit or even break a page's design if audio media is used.
|
71
|
+
|
72
|
+
AmplitudeJS for the J1 Template offers a straightforward solution for web
|
73
|
+
developers. It allows them to easily customize the appearance of their audio
|
74
|
+
players without the need for complex scripting. By leveraging J1 Template
|
75
|
+
and Amplitude's API, web designers can craft unique interfaces that define
|
76
|
+
the visual and functional aspects of a player's audio control elements.
|
77
|
+
|
78
|
+
mdi:clock-time-five-outline[24px, md-gray mr-2]
|
79
|
+
*5-10 Minutes* to read
|
80
|
+
|
81
|
+
|
82
|
+
// Include sub-documents (if any)
|
83
|
+
// -----------------------------------------------------------------------------
|
84
|
+
[role="mt-5"]
|
85
|
+
== USAGE AND OPTIONS
|
86
|
+
|
87
|
+
....
|
88
|
+
yt-dlp [OPTIONS] [--] URL [URL...]
|
89
|
+
....
|
90
|
+
|
91
|
+
`Ctrl+F` is your friend :D
|
92
|
+
|
93
|
+
[role="mt-4"]
|
94
|
+
=== General Options
|
95
|
+
|
96
|
+
....
|
97
|
+
-h, --help Print this help text and exit
|
98
|
+
--version Print program version and exit
|
99
|
+
-U, --update Update this program to the latest version
|
100
|
+
--no-update Do not check for updates (default)
|
101
|
+
--update-to [CHANNEL]@[TAG] Upgrade/downgrade to a specific version.
|
102
|
+
CHANNEL can be a repository as well. CHANNEL
|
103
|
+
and TAG default to "stable" and "latest"
|
104
|
+
respectively if omitted; See "UPDATE" for
|
105
|
+
details. Supported channels: stable,
|
106
|
+
nightly, master
|
107
|
+
-i, --ignore-errors Ignore download and postprocessing errors.
|
108
|
+
The download will be considered successful
|
109
|
+
even if the postprocessing fails
|
110
|
+
--no-abort-on-error Continue with next video on download errors;
|
111
|
+
e.g. to skip unavailable videos in a
|
112
|
+
playlist (default)
|
113
|
+
--abort-on-error Abort downloading of further videos if an
|
114
|
+
error occurs (Alias: --no-ignore-errors)
|
115
|
+
--dump-user-agent Display the current user-agent and exit
|
116
|
+
--list-extractors List all supported extractors and exit
|
117
|
+
--extractor-descriptions Output descriptions of all supported
|
118
|
+
extractors and exit
|
119
|
+
--use-extractors NAMES Extractor names to use separated by commas.
|
120
|
+
You can also use regexes, "all", "default"
|
121
|
+
and "end" (end URL matching); e.g. --ies
|
122
|
+
"holodex.*,end,youtube". Prefix the name
|
123
|
+
with a "-" to exclude it, e.g. --ies
|
124
|
+
default,-generic. Use --list-extractors for
|
125
|
+
a list of extractor names. (Alias: --ies)
|
126
|
+
--default-search PREFIX Use this prefix for unqualified URLs. E.g.
|
127
|
+
"gvsearch2:python" downloads two videos from
|
128
|
+
google videos for the search term "python".
|
129
|
+
Use the value "auto" to let yt-dlp guess
|
130
|
+
("auto_warning" to emit a warning when
|
131
|
+
guessing). "error" just throws an error. The
|
132
|
+
default value "fixup_error" repairs broken
|
133
|
+
URLs, but emits an error if this is not
|
134
|
+
possible instead of searching
|
135
|
+
--ignore-config Don't load any more configuration files
|
136
|
+
except those given to --config-locations.
|
137
|
+
For backward compatibility, if this option
|
138
|
+
is found inside the system configuration
|
139
|
+
file, the user configuration is not loaded.
|
140
|
+
(Alias: --no-config)
|
141
|
+
--no-config-locations Do not load any custom configuration files
|
142
|
+
(default). When given inside a configuration
|
143
|
+
file, ignore all previous --config-locations
|
144
|
+
defined in the current file
|
145
|
+
--config-locations PATH Location of the main configuration file;
|
146
|
+
either the path to the config or its
|
147
|
+
containing directory ("-" for stdin). Can be
|
148
|
+
used multiple times and inside other
|
149
|
+
configuration files
|
150
|
+
--flat-playlist Do not extract the videos of a playlist,
|
151
|
+
only list them
|
152
|
+
--no-flat-playlist Fully extract the videos of a playlist
|
153
|
+
(default)
|
154
|
+
--live-from-start Download livestreams from the start.
|
155
|
+
Currently only supported for YouTube
|
156
|
+
(Experimental)
|
157
|
+
--no-live-from-start Download livestreams from the current time
|
158
|
+
(default)
|
159
|
+
--wait-for-video MIN[-MAX] Wait for scheduled streams to become
|
160
|
+
available. Pass the minimum number of
|
161
|
+
seconds (or range) to wait between retries
|
162
|
+
--no-wait-for-video Do not wait for scheduled streams (default)
|
163
|
+
--mark-watched Mark videos watched (even with --simulate)
|
164
|
+
--no-mark-watched Do not mark videos watched (default)
|
165
|
+
--color [STREAM:]POLICY Whether to emit color codes in output,
|
166
|
+
optionally prefixed by the STREAM (stdout or
|
167
|
+
stderr) to apply the setting to. Can be one
|
168
|
+
of "always", "auto" (default), "never", or
|
169
|
+
"no_color" (use non color terminal
|
170
|
+
sequences). Use "auto-tty" or "no_color-tty"
|
171
|
+
to decide based on terminal support only.
|
172
|
+
Can be used multiple times
|
173
|
+
--compat-options OPTS Options that can help keep compatibility
|
174
|
+
with youtube-dl or youtube-dlc
|
175
|
+
configurations by reverting some of the
|
176
|
+
changes made in yt-dlp. See "Differences in
|
177
|
+
default behavior" for details
|
178
|
+
--alias ALIASES OPTIONS Create aliases for an option string. Unless
|
179
|
+
an alias starts with a dash "-", it is
|
180
|
+
prefixed with "--". Arguments are parsed
|
181
|
+
according to the Python string formatting
|
182
|
+
mini-language. E.g. --alias get-audio,-X
|
183
|
+
"-S=aext:{0},abr -x --audio-format {0}"
|
184
|
+
creates options "--get-audio" and "-X" that
|
185
|
+
takes an argument (ARG0) and expands to
|
186
|
+
"-S=aext:ARG0,abr -x --audio-format ARG0".
|
187
|
+
All defined aliases are listed in the --help
|
188
|
+
output. Alias options can trigger more
|
189
|
+
aliases; so be careful to avoid defining
|
190
|
+
recursive options. As a safety measure, each
|
191
|
+
alias may be triggered a maximum of 100
|
192
|
+
times. This option can be used multiple times
|
193
|
+
....
|
194
|
+
|
195
|
+
[role="mt-4"]
|
196
|
+
=== Network Options
|
197
|
+
|
198
|
+
....
|
199
|
+
--proxy URL Use the specified HTTP/HTTPS/SOCKS proxy. To
|
200
|
+
enable SOCKS proxy, specify a proper scheme,
|
201
|
+
e.g. socks5://user:pass@127.0.0.1:1080/.
|
202
|
+
Pass in an empty string (--proxy "") for
|
203
|
+
direct connection
|
204
|
+
--socket-timeout SECONDS Time to wait before giving up, in seconds
|
205
|
+
--source-address IP Client-side IP address to bind to
|
206
|
+
--impersonate CLIENT[:OS] Client to impersonate for requests. E.g.
|
207
|
+
chrome, chrome-110, chrome:windows-10. Pass
|
208
|
+
--impersonate="" to impersonate any client.
|
209
|
+
Note that forcing impersonation for all
|
210
|
+
requests may have a detrimental impact on
|
211
|
+
download speed and stability
|
212
|
+
--list-impersonate-targets List available clients to impersonate.
|
213
|
+
-4, --force-ipv4 Make all connections via IPv4
|
214
|
+
-6, --force-ipv6 Make all connections via IPv6
|
215
|
+
--enable-file-urls Enable file:// URLs. This is disabled by
|
216
|
+
default for security reasons.
|
217
|
+
....
|
218
|
+
|
219
|
+
[role="mt-4"]
|
220
|
+
=== Geo-restriction
|
221
|
+
|
222
|
+
....
|
223
|
+
--geo-verification-proxy URL Use this proxy to verify the IP address for
|
224
|
+
some geo-restricted sites. The default proxy
|
225
|
+
specified by --proxy (or none, if the option
|
226
|
+
is not present) is used for the actual
|
227
|
+
downloading
|
228
|
+
--xff VALUE How to fake X-Forwarded-For HTTP header to
|
229
|
+
try bypassing geographic restriction. One of
|
230
|
+
"default" (only when known to be useful),
|
231
|
+
"never", an IP block in CIDR notation, or a
|
232
|
+
two-letter ISO 3166-2 country code
|
233
|
+
....
|
234
|
+
|
235
|
+
[role="mt-4"]
|
236
|
+
=== Video Selection
|
237
|
+
|
238
|
+
....
|
239
|
+
-I, --playlist-items ITEM_SPEC Comma separated playlist_index of the items
|
240
|
+
to download. You can specify a range using
|
241
|
+
"[START]:[STOP][:STEP]". For backward
|
242
|
+
compatibility, START-STOP is also supported.
|
243
|
+
Use negative indices to count from the right
|
244
|
+
and negative STEP to download in reverse
|
245
|
+
order. E.g. "-I 1:3,7,-5::2" used on a
|
246
|
+
playlist of size 15 will download the items
|
247
|
+
at index 1,2,3,7,11,13,15
|
248
|
+
--min-filesize SIZE Abort download if filesize is smaller than
|
249
|
+
SIZE, e.g. 50k or 44.6M
|
250
|
+
--max-filesize SIZE Abort download if filesize is larger than
|
251
|
+
SIZE, e.g. 50k or 44.6M
|
252
|
+
--date DATE Download only videos uploaded on this date.
|
253
|
+
The date can be "YYYYMMDD" or in the format
|
254
|
+
[now|today|yesterday][-N[day|week|month|year]].
|
255
|
+
E.g. "--date today-2weeks" downloads only
|
256
|
+
videos uploaded on the same day two weeks ago
|
257
|
+
--datebefore DATE Download only videos uploaded on or before
|
258
|
+
this date. The date formats accepted is the
|
259
|
+
same as --date
|
260
|
+
--dateafter DATE Download only videos uploaded on or after
|
261
|
+
this date. The date formats accepted is the
|
262
|
+
same as --date
|
263
|
+
--match-filters FILTER Generic video filter. Any "OUTPUT TEMPLATE"
|
264
|
+
field can be compared with a number or a
|
265
|
+
string using the operators defined in
|
266
|
+
"Filtering Formats". You can also simply
|
267
|
+
specify a field to match if the field is
|
268
|
+
present, use "!field" to check if the field
|
269
|
+
is not present, and "&" to check multiple
|
270
|
+
conditions. Use a "\" to escape "&" or
|
271
|
+
quotes if needed. If used multiple times,
|
272
|
+
the filter matches if at least one of the
|
273
|
+
conditions is met. E.g. --match-filter
|
274
|
+
!is_live --match-filter "like_count>?100 &
|
275
|
+
description~='(?i)\bcats \& dogs\b'" matches
|
276
|
+
only videos that are not live OR those that
|
277
|
+
have a like count more than 100 (or the like
|
278
|
+
field is not available) and also has a
|
279
|
+
description that contains the phrase "cats &
|
280
|
+
dogs" (caseless). Use "--match-filter -" to
|
281
|
+
interactively ask whether to download each
|
282
|
+
video
|
283
|
+
--no-match-filters Do not use any --match-filter (default)
|
284
|
+
--break-match-filters FILTER Same as "--match-filters" but stops the
|
285
|
+
download process when a video is rejected
|
286
|
+
--no-break-match-filters Do not use any --break-match-filters (default)
|
287
|
+
--no-playlist Download only the video, if the URL refers
|
288
|
+
to a video and a playlist
|
289
|
+
--yes-playlist Download the playlist, if the URL refers to
|
290
|
+
a video and a playlist
|
291
|
+
--age-limit YEARS Download only videos suitable for the given
|
292
|
+
age
|
293
|
+
--download-archive FILE Download only videos not listed in the
|
294
|
+
archive file. Record the IDs of all
|
295
|
+
downloaded videos in it
|
296
|
+
--no-download-archive Do not use archive file (default)
|
297
|
+
--max-downloads NUMBER Abort after downloading NUMBER files
|
298
|
+
--break-on-existing Stop the download process when encountering
|
299
|
+
a file that is in the archive
|
300
|
+
--no-break-on-existing Do not stop the download process when
|
301
|
+
encountering a file that is in the archive
|
302
|
+
(default)
|
303
|
+
--break-per-input Alters --max-downloads, --break-on-existing,
|
304
|
+
--break-match-filter, and autonumber to
|
305
|
+
reset per input URL
|
306
|
+
--no-break-per-input --break-on-existing and similar options
|
307
|
+
terminates the entire download queue
|
308
|
+
--skip-playlist-after-errors N Number of allowed failures until the rest of
|
309
|
+
the playlist is skipped
|
310
|
+
....
|
311
|
+
|
312
|
+
[role="mt-4"]
|
313
|
+
=== Download Options
|
314
|
+
|
315
|
+
....
|
316
|
+
-N, --concurrent-fragments N Number of fragments of a dash/hlsnative
|
317
|
+
video that should be downloaded concurrently
|
318
|
+
(default is 1)
|
319
|
+
-r, --limit-rate RATE Maximum download rate in bytes per second,
|
320
|
+
e.g. 50K or 4.2M
|
321
|
+
--throttled-rate RATE Minimum download rate in bytes per second
|
322
|
+
below which throttling is assumed and the
|
323
|
+
video data is re-extracted, e.g. 100K
|
324
|
+
-R, --retries RETRIES Number of retries (default is 10), or
|
325
|
+
"infinite"
|
326
|
+
--file-access-retries RETRIES Number of times to retry on file access
|
327
|
+
error (default is 3), or "infinite"
|
328
|
+
--fragment-retries RETRIES Number of retries for a fragment (default is
|
329
|
+
10), or "infinite" (DASH, hlsnative and ISM)
|
330
|
+
--retry-sleep [TYPE:]EXPR Time to sleep between retries in seconds
|
331
|
+
(optionally) prefixed by the type of retry
|
332
|
+
(http (default), fragment, file_access,
|
333
|
+
extractor) to apply the sleep to. EXPR can
|
334
|
+
be a number, linear=START[:END[:STEP=1]] or
|
335
|
+
exp=START[:END[:BASE=2]]. This option can be
|
336
|
+
used multiple times to set the sleep for the
|
337
|
+
different retry types, e.g. --retry-sleep
|
338
|
+
linear=1::2 --retry-sleep fragment:exp=1:20
|
339
|
+
--skip-unavailable-fragments Skip unavailable fragments for DASH,
|
340
|
+
hlsnative and ISM downloads (default)
|
341
|
+
(Alias: --no-abort-on-unavailable-fragments)
|
342
|
+
--abort-on-unavailable-fragments
|
343
|
+
Abort download if a fragment is unavailable
|
344
|
+
(Alias: --no-skip-unavailable-fragments)
|
345
|
+
--keep-fragments Keep downloaded fragments on disk after
|
346
|
+
downloading is finished
|
347
|
+
--no-keep-fragments Delete downloaded fragments after
|
348
|
+
downloading is finished (default)
|
349
|
+
--buffer-size SIZE Size of download buffer, e.g. 1024 or 16K
|
350
|
+
(default is 1024)
|
351
|
+
--resize-buffer The buffer size is automatically resized
|
352
|
+
from an initial value of --buffer-size
|
353
|
+
(default)
|
354
|
+
--no-resize-buffer Do not automatically adjust the buffer size
|
355
|
+
--http-chunk-size SIZE Size of a chunk for chunk-based HTTP
|
356
|
+
downloading, e.g. 10485760 or 10M (default
|
357
|
+
is disabled). May be useful for bypassing
|
358
|
+
bandwidth throttling imposed by a webserver
|
359
|
+
(experimental)
|
360
|
+
--playlist-random Download playlist videos in random order
|
361
|
+
--lazy-playlist Process entries in the playlist as they are
|
362
|
+
received. This disables n_entries,
|
363
|
+
--playlist-random and --playlist-reverse
|
364
|
+
--no-lazy-playlist Process videos in the playlist only after
|
365
|
+
the entire playlist is parsed (default)
|
366
|
+
--xattr-set-filesize Set file xattribute ytdl.filesize with
|
367
|
+
expected file size
|
368
|
+
--hls-use-mpegts Use the mpegts container for HLS videos;
|
369
|
+
allowing some players to play the video
|
370
|
+
while downloading, and reducing the chance
|
371
|
+
of file corruption if download is
|
372
|
+
interrupted. This is enabled by default for
|
373
|
+
live streams
|
374
|
+
--no-hls-use-mpegts Do not use the mpegts container for HLS
|
375
|
+
videos. This is default when not downloading
|
376
|
+
live streams
|
377
|
+
--download-sections REGEX Download only chapters that match the
|
378
|
+
regular expression. A "*" prefix denotes
|
379
|
+
time-range instead of chapter. Negative
|
380
|
+
timestamps are calculated from the end.
|
381
|
+
"*from-url" can be used to download between
|
382
|
+
the "start_time" and "end_time" extracted
|
383
|
+
from the URL. Needs ffmpeg. This option can
|
384
|
+
be used multiple times to download multiple
|
385
|
+
sections, e.g. --download-sections
|
386
|
+
"*10:15-inf" --download-sections "intro"
|
387
|
+
--downloader [PROTO:]NAME Name or path of the external downloader to
|
388
|
+
use (optionally) prefixed by the protocols
|
389
|
+
(http, ftp, m3u8, dash, rstp, rtmp, mms) to
|
390
|
+
use it for. Currently supports native,
|
391
|
+
aria2c, avconv, axel, curl, ffmpeg, httpie,
|
392
|
+
wget. You can use this option multiple times
|
393
|
+
to set different downloaders for different
|
394
|
+
protocols. E.g. --downloader aria2c
|
395
|
+
--downloader "dash,m3u8:native" will use
|
396
|
+
aria2c for http/ftp downloads, and the
|
397
|
+
native downloader for dash/m3u8 downloads
|
398
|
+
(Alias: --external-downloader)
|
399
|
+
--downloader-args NAME:ARGS Give these arguments to the external
|
400
|
+
downloader. Specify the downloader name and
|
401
|
+
the arguments separated by a colon ":". For
|
402
|
+
ffmpeg, arguments can be passed to different
|
403
|
+
positions using the same syntax as
|
404
|
+
--postprocessor-args. You can use this
|
405
|
+
option multiple times to give different
|
406
|
+
arguments to different downloaders (Alias:
|
407
|
+
--external-downloader-args)
|
408
|
+
....
|
409
|
+
|
410
|
+
[role="mt-4"]
|
411
|
+
=== Filesystem Options
|
412
|
+
|
413
|
+
....
|
414
|
+
-a, --batch-file FILE File containing URLs to download ("-" for
|
415
|
+
stdin), one URL per line. Lines starting
|
416
|
+
with "#", ";" or "]" are considered as
|
417
|
+
comments and ignored
|
418
|
+
--no-batch-file Do not read URLs from batch file (default)
|
419
|
+
-P, --paths [TYPES:]PATH The paths where the files should be
|
420
|
+
downloaded. Specify the type of file and the
|
421
|
+
path separated by a colon ":". All the same
|
422
|
+
TYPES as --output are supported.
|
423
|
+
Additionally, you can also provide "home"
|
424
|
+
(default) and "temp" paths. All intermediary
|
425
|
+
files are first downloaded to the temp path
|
426
|
+
and then the final files are moved over to
|
427
|
+
the home path after download is finished.
|
428
|
+
This option is ignored if --output is an
|
429
|
+
absolute path
|
430
|
+
-o, --output [TYPES:]TEMPLATE Output filename template; see "OUTPUT
|
431
|
+
TEMPLATE" for details
|
432
|
+
--output-na-placeholder TEXT Placeholder for unavailable fields in
|
433
|
+
--output (default: "NA")
|
434
|
+
--restrict-filenames Restrict filenames to only ASCII characters,
|
435
|
+
and avoid "&" and spaces in filenames
|
436
|
+
--no-restrict-filenames Allow Unicode characters, "&" and spaces in
|
437
|
+
filenames (default)
|
438
|
+
--windows-filenames Force filenames to be Windows-compatible
|
439
|
+
--no-windows-filenames Make filenames Windows-compatible only if
|
440
|
+
using Windows (default)
|
441
|
+
--trim-filenames LENGTH Limit the filename length (excluding
|
442
|
+
extension) to the specified number of
|
443
|
+
characters
|
444
|
+
-w, --no-overwrites Do not overwrite any files
|
445
|
+
--force-overwrites Overwrite all video and metadata files. This
|
446
|
+
option includes --no-continue
|
447
|
+
--no-force-overwrites Do not overwrite the video, but overwrite
|
448
|
+
related files (default)
|
449
|
+
-c, --continue Resume partially downloaded files/fragments
|
450
|
+
(default)
|
451
|
+
--no-continue Do not resume partially downloaded
|
452
|
+
fragments. If the file is not fragmented,
|
453
|
+
restart download of the entire file
|
454
|
+
--part Use .part files instead of writing directly
|
455
|
+
into output file (default)
|
456
|
+
--no-part Do not use .part files - write directly into
|
457
|
+
output file
|
458
|
+
--mtime Use the Last-modified header to set the file
|
459
|
+
modification time (default)
|
460
|
+
--no-mtime Do not use the Last-modified header to set
|
461
|
+
the file modification time
|
462
|
+
--write-description Write video description to a .description file
|
463
|
+
--no-write-description Do not write video description (default)
|
464
|
+
--write-info-json Write video metadata to a .info.json file
|
465
|
+
(this may contain personal information)
|
466
|
+
--no-write-info-json Do not write video metadata (default)
|
467
|
+
--write-playlist-metafiles Write playlist metadata in addition to the
|
468
|
+
video metadata when using --write-info-json,
|
469
|
+
--write-description etc. (default)
|
470
|
+
--no-write-playlist-metafiles Do not write playlist metadata when using
|
471
|
+
--write-info-json, --write-description etc.
|
472
|
+
--clean-info-json Remove some internal metadata such as
|
473
|
+
filenames from the infojson (default)
|
474
|
+
--no-clean-info-json Write all fields to the infojson
|
475
|
+
--write-comments Retrieve video comments to be placed in the
|
476
|
+
infojson. The comments are fetched even
|
477
|
+
without this option if the extraction is
|
478
|
+
known to be quick (Alias: --get-comments)
|
479
|
+
--no-write-comments Do not retrieve video comments unless the
|
480
|
+
extraction is known to be quick (Alias:
|
481
|
+
--no-get-comments)
|
482
|
+
--load-info-json FILE JSON file containing the video information
|
483
|
+
(created with the "--write-info-json" option)
|
484
|
+
--cookies FILE Netscape formatted file to read cookies from
|
485
|
+
and dump cookie jar in
|
486
|
+
--no-cookies Do not read/dump cookies from/to file
|
487
|
+
(default)
|
488
|
+
--cookies-from-browser BROWSER[+KEYRING][:PROFILE][::CONTAINER]
|
489
|
+
The name of the browser to load cookies
|
490
|
+
from. Currently supported browsers are:
|
491
|
+
brave, chrome, chromium, edge, firefox,
|
492
|
+
opera, safari, vivaldi, whale. Optionally,
|
493
|
+
the KEYRING used for decrypting Chromium
|
494
|
+
cookies on Linux, the name/path of the
|
495
|
+
PROFILE to load cookies from, and the
|
496
|
+
CONTAINER name (if Firefox) ("none" for no
|
497
|
+
container) can be given with their
|
498
|
+
respective separators. By default, all
|
499
|
+
containers of the most recently accessed
|
500
|
+
profile are used. Currently supported
|
501
|
+
keyrings are: basictext, gnomekeyring,
|
502
|
+
kwallet, kwallet5, kwallet6
|
503
|
+
--no-cookies-from-browser Do not load cookies from browser (default)
|
504
|
+
--cache-dir DIR Location in the filesystem where yt-dlp can
|
505
|
+
store some downloaded information (such as
|
506
|
+
client ids and signatures) permanently. By
|
507
|
+
default ${XDG_CACHE_HOME}/yt-dlp
|
508
|
+
--no-cache-dir Disable filesystem caching
|
509
|
+
--rm-cache-dir Delete all filesystem cache files
|
510
|
+
....
|
511
|
+
|
512
|
+
[role="mt-4"]
|
513
|
+
=== Thumbnail Options
|
514
|
+
|
515
|
+
....
|
516
|
+
--write-thumbnail Write thumbnail image to disk
|
517
|
+
--no-write-thumbnail Do not write thumbnail image to disk (default)
|
518
|
+
--write-all-thumbnails Write all thumbnail image formats to disk
|
519
|
+
--list-thumbnails List available thumbnails of each video.
|
520
|
+
Simulate unless --no-simulate is used
|
521
|
+
....
|
522
|
+
|
523
|
+
[role="mt-4"]
|
524
|
+
=== Internet Shortcut Options
|
525
|
+
|
526
|
+
....
|
527
|
+
--write-link Write an internet shortcut file, depending
|
528
|
+
on the current platform (.url, .webloc or
|
529
|
+
.desktop). The URL may be cached by the OS
|
530
|
+
--write-url-link Write a .url Windows internet shortcut. The
|
531
|
+
OS caches the URL based on the file path
|
532
|
+
--write-webloc-link Write a .webloc macOS internet shortcut
|
533
|
+
--write-desktop-link Write a .desktop Linux internet shortcut
|
534
|
+
....
|
535
|
+
|
536
|
+
[role="mt-4"]
|
537
|
+
=== Verbosity and Simulation Options
|
538
|
+
|
539
|
+
....
|
540
|
+
-q, --quiet Activate quiet mode. If used with --verbose,
|
541
|
+
print the log to stderr
|
542
|
+
--no-quiet Deactivate quiet mode. (Default)
|
543
|
+
--no-warnings Ignore warnings
|
544
|
+
-s, --simulate Do not download the video and do not write
|
545
|
+
anything to disk
|
546
|
+
--no-simulate Download the video even if printing/listing
|
547
|
+
options are used
|
548
|
+
--ignore-no-formats-error Ignore "No video formats" error. Useful for
|
549
|
+
extracting metadata even if the videos are
|
550
|
+
not actually available for download
|
551
|
+
(experimental)
|
552
|
+
--no-ignore-no-formats-error Throw error when no downloadable video
|
553
|
+
formats are found (default)
|
554
|
+
--skip-download Do not download the video but write all
|
555
|
+
related files (Alias: --no-download)
|
556
|
+
-O, --print [WHEN:]TEMPLATE Field name or output template to print to
|
557
|
+
screen, optionally prefixed with when to
|
558
|
+
print it, separated by a ":". Supported
|
559
|
+
values of "WHEN" are the same as that of
|
560
|
+
--use-postprocessor (default: video).
|
561
|
+
Implies --quiet. Implies --simulate unless
|
562
|
+
--no-simulate or later stages of WHEN are
|
563
|
+
used. This option can be used multiple times
|
564
|
+
--print-to-file [WHEN:]TEMPLATE FILE
|
565
|
+
Append given template to the file. The
|
566
|
+
values of WHEN and TEMPLATE are same as that
|
567
|
+
of --print. FILE uses the same syntax as the
|
568
|
+
output template. This option can be used
|
569
|
+
multiple times
|
570
|
+
-j, --dump-json Quiet, but print JSON information for each
|
571
|
+
video. Simulate unless --no-simulate is
|
572
|
+
used. See "OUTPUT TEMPLATE" for a
|
573
|
+
description of available keys
|
574
|
+
-J, --dump-single-json Quiet, but print JSON information for each
|
575
|
+
url or infojson passed. Simulate unless
|
576
|
+
--no-simulate is used. If the URL refers to
|
577
|
+
a playlist, the whole playlist information
|
578
|
+
is dumped in a single line
|
579
|
+
--force-write-archive Force download archive entries to be written
|
580
|
+
as far as no errors occur, even if -s or
|
581
|
+
another simulation option is used (Alias:
|
582
|
+
--force-download-archive)
|
583
|
+
--newline Output progress bar as new lines
|
584
|
+
--no-progress Do not print progress bar
|
585
|
+
--progress Show progress bar, even if in quiet mode
|
586
|
+
--console-title Display progress in console titlebar
|
587
|
+
--progress-template [TYPES:]TEMPLATE
|
588
|
+
Template for progress outputs, optionally
|
589
|
+
prefixed with one of "download:" (default),
|
590
|
+
"download-title:" (the console title),
|
591
|
+
"postprocess:", or "postprocess-title:".
|
592
|
+
The video's fields are accessible under the
|
593
|
+
"info" key and the progress attributes are
|
594
|
+
accessible under "progress" key. E.g.
|
595
|
+
--console-title --progress-template
|
596
|
+
"download-title:%(info.id)s-%(progress.eta)s"
|
597
|
+
--progress-delta SECONDS Time between progress output (default: 0)
|
598
|
+
-v, --verbose Print various debugging information
|
599
|
+
--dump-pages Print downloaded pages encoded using base64
|
600
|
+
to debug problems (very verbose)
|
601
|
+
--write-pages Write downloaded intermediary pages to files
|
602
|
+
in the current directory to debug problems
|
603
|
+
--print-traffic Display sent and read HTTP traffic
|
604
|
+
....
|
605
|
+
|
606
|
+
[role="mt-4"]
|
607
|
+
=== Workarounds
|
608
|
+
|
609
|
+
....
|
610
|
+
--encoding ENCODING Force the specified encoding (experimental)
|
611
|
+
--legacy-server-connect Explicitly allow HTTPS connection to servers
|
612
|
+
that do not support RFC 5746 secure
|
613
|
+
renegotiation
|
614
|
+
--no-check-certificates Suppress HTTPS certificate validation
|
615
|
+
--prefer-insecure Use an unencrypted connection to retrieve
|
616
|
+
information about the video (Currently
|
617
|
+
supported only for YouTube)
|
618
|
+
--add-headers FIELD:VALUE Specify a custom HTTP header and its value,
|
619
|
+
separated by a colon ":". You can use this
|
620
|
+
option multiple times
|
621
|
+
--bidi-workaround Work around terminals that lack
|
622
|
+
bidirectional text support. Requires bidiv
|
623
|
+
or fribidi executable in PATH
|
624
|
+
--sleep-requests SECONDS Number of seconds to sleep between requests
|
625
|
+
during data extraction
|
626
|
+
--sleep-interval SECONDS Number of seconds to sleep before each
|
627
|
+
download. This is the minimum time to sleep
|
628
|
+
when used along with --max-sleep-interval
|
629
|
+
(Alias: --min-sleep-interval)
|
630
|
+
--max-sleep-interval SECONDS Maximum number of seconds to sleep. Can only
|
631
|
+
be used along with --min-sleep-interval
|
632
|
+
--sleep-subtitles SECONDS Number of seconds to sleep before each
|
633
|
+
subtitle download
|
634
|
+
....
|
635
|
+
|
636
|
+
[role="mt-4"]
|
637
|
+
=== Video Format Options
|
638
|
+
|
639
|
+
....
|
640
|
+
-f, --format FORMAT Video format code, see "FORMAT SELECTION"
|
641
|
+
for more details
|
642
|
+
-S, --format-sort SORTORDER Sort the formats by the fields given, see
|
643
|
+
"Sorting Formats" for more details
|
644
|
+
--format-sort-force Force user specified sort order to have
|
645
|
+
precedence over all fields, see "Sorting
|
646
|
+
Formats" for more details (Alias: --S-force)
|
647
|
+
--no-format-sort-force Some fields have precedence over the user
|
648
|
+
specified sort order (default)
|
649
|
+
--video-multistreams Allow multiple video streams to be merged
|
650
|
+
into a single file
|
651
|
+
--no-video-multistreams Only one video stream is downloaded for each
|
652
|
+
output file (default)
|
653
|
+
--audio-multistreams Allow multiple audio streams to be merged
|
654
|
+
into a single file
|
655
|
+
--no-audio-multistreams Only one audio stream is downloaded for each
|
656
|
+
output file (default)
|
657
|
+
--prefer-free-formats Prefer video formats with free containers
|
658
|
+
over non-free ones of same quality. Use with
|
659
|
+
"-S ext" to strictly prefer free containers
|
660
|
+
irrespective of quality
|
661
|
+
--no-prefer-free-formats Don't give any special preference to free
|
662
|
+
containers (default)
|
663
|
+
--check-formats Make sure formats are selected only from
|
664
|
+
those that are actually downloadable
|
665
|
+
--check-all-formats Check all formats for whether they are
|
666
|
+
actually downloadable
|
667
|
+
--no-check-formats Do not check that the formats are actually
|
668
|
+
downloadable
|
669
|
+
-F, --list-formats List available formats of each video.
|
670
|
+
Simulate unless --no-simulate is used
|
671
|
+
--merge-output-format FORMAT Containers that may be used when merging
|
672
|
+
formats, separated by "/", e.g. "mp4/mkv".
|
673
|
+
Ignored if no merge is required. (currently
|
674
|
+
supported: avi, flv, mkv, mov, mp4, webm)
|
675
|
+
....
|
676
|
+
|
677
|
+
[role="mt-4"]
|
678
|
+
=== Subtitle Options
|
679
|
+
|
680
|
+
....
|
681
|
+
--write-subs Write subtitle file
|
682
|
+
--no-write-subs Do not write subtitle file (default)
|
683
|
+
--write-auto-subs Write automatically generated subtitle file
|
684
|
+
(Alias: --write-automatic-subs)
|
685
|
+
--no-write-auto-subs Do not write auto-generated subtitles
|
686
|
+
(default) (Alias: --no-write-automatic-subs)
|
687
|
+
--list-subs List available subtitles of each video.
|
688
|
+
Simulate unless --no-simulate is used
|
689
|
+
--sub-format FORMAT Subtitle format; accepts formats preference,
|
690
|
+
e.g. "srt" or "ass/srt/best"
|
691
|
+
--sub-langs LANGS Languages of the subtitles to download (can
|
692
|
+
be regex) or "all" separated by commas, e.g.
|
693
|
+
--sub-langs "en.*,ja". You can prefix the
|
694
|
+
language code with a "-" to exclude it from
|
695
|
+
the requested languages, e.g. --sub-langs
|
696
|
+
all,-live_chat. Use --list-subs for a list
|
697
|
+
of available language tags
|
698
|
+
....
|
699
|
+
|
700
|
+
[role="mt-4"]
|
701
|
+
=== Authentication Options
|
702
|
+
|
703
|
+
....
|
704
|
+
-u, --username USERNAME Login with this account ID
|
705
|
+
-p, --password PASSWORD Account password. If this option is left
|
706
|
+
out, yt-dlp will ask interactively
|
707
|
+
-2, --twofactor TWOFACTOR Two-factor authentication code
|
708
|
+
-n, --netrc Use .netrc authentication data
|
709
|
+
--netrc-location PATH Location of .netrc authentication data;
|
710
|
+
either the path or its containing directory.
|
711
|
+
Defaults to ~/.netrc
|
712
|
+
--netrc-cmd NETRC_CMD Command to execute to get the credentials
|
713
|
+
for an extractor.
|
714
|
+
--video-password PASSWORD Video-specific password
|
715
|
+
--ap-mso MSO Adobe Pass multiple-system operator (TV
|
716
|
+
provider) identifier, use --ap-list-mso for
|
717
|
+
a list of available MSOs
|
718
|
+
--ap-username USERNAME Multiple-system operator account login
|
719
|
+
--ap-password PASSWORD Multiple-system operator account password.
|
720
|
+
If this option is left out, yt-dlp will ask
|
721
|
+
interactively
|
722
|
+
--ap-list-mso List all supported multiple-system operators
|
723
|
+
--client-certificate CERTFILE Path to client certificate file in PEM
|
724
|
+
format. May include the private key
|
725
|
+
--client-certificate-key KEYFILE
|
726
|
+
Path to private key file for client
|
727
|
+
certificate
|
728
|
+
--client-certificate-password PASSWORD
|
729
|
+
Password for client certificate private key,
|
730
|
+
if encrypted. If not provided, and the key
|
731
|
+
is encrypted, yt-dlp will ask interactively
|
732
|
+
....
|
733
|
+
|
734
|
+
[role="mt-4"]
|
735
|
+
=== Post-Processing Options
|
736
|
+
|
737
|
+
....
|
738
|
+
-x, --extract-audio Convert video files to audio-only files
|
739
|
+
(requires ffmpeg and ffprobe)
|
740
|
+
--audio-format FORMAT Format to convert the audio to when -x is
|
741
|
+
used. (currently supported: best (default),
|
742
|
+
aac, alac, flac, m4a, mp3, opus, vorbis,
|
743
|
+
wav). You can specify multiple rules using
|
744
|
+
similar syntax as --remux-video
|
745
|
+
--audio-quality QUALITY Specify ffmpeg audio quality to use when
|
746
|
+
converting the audio with -x. Insert a value
|
747
|
+
between 0 (best) and 10 (worst) for VBR or a
|
748
|
+
specific bitrate like 128K (default 5)
|
749
|
+
--remux-video FORMAT Remux the video into another container if
|
750
|
+
necessary (currently supported: avi, flv,
|
751
|
+
gif, mkv, mov, mp4, webm, aac, aiff, alac,
|
752
|
+
flac, m4a, mka, mp3, ogg, opus, vorbis,
|
753
|
+
wav). If target container does not support
|
754
|
+
the video/audio codec, remuxing will fail.
|
755
|
+
You can specify multiple rules; e.g.
|
756
|
+
"aac>m4a/mov>mp4/mkv" will remux aac to m4a,
|
757
|
+
mov to mp4 and anything else to mkv
|
758
|
+
--recode-video FORMAT Re-encode the video into another format if
|
759
|
+
necessary. The syntax and supported formats
|
760
|
+
are the same as --remux-video
|
761
|
+
--postprocessor-args NAME:ARGS Give these arguments to the postprocessors.
|
762
|
+
Specify the postprocessor/executable name
|
763
|
+
and the arguments separated by a colon ":"
|
764
|
+
to give the argument to the specified
|
765
|
+
postprocessor/executable. Supported PP are:
|
766
|
+
Merger, ModifyChapters, SplitChapters,
|
767
|
+
ExtractAudio, VideoRemuxer, VideoConvertor,
|
768
|
+
Metadata, EmbedSubtitle, EmbedThumbnail,
|
769
|
+
SubtitlesConvertor, ThumbnailsConvertor,
|
770
|
+
FixupStretched, FixupM4a, FixupM3u8,
|
771
|
+
FixupTimestamp and FixupDuration. The
|
772
|
+
supported executables are: AtomicParsley,
|
773
|
+
FFmpeg and FFprobe. You can also specify
|
774
|
+
"PP+EXE:ARGS" to give the arguments to the
|
775
|
+
specified executable only when being used by
|
776
|
+
the specified postprocessor. Additionally,
|
777
|
+
for ffmpeg/ffprobe, "_i"/"_o" can be
|
778
|
+
appended to the prefix optionally followed
|
779
|
+
by a number to pass the argument before the
|
780
|
+
specified input/output file, e.g. --ppa
|
781
|
+
"Merger+ffmpeg_i1:-v quiet". You can use
|
782
|
+
this option multiple times to give different
|
783
|
+
arguments to different postprocessors.
|
784
|
+
(Alias: --ppa)
|
785
|
+
-k, --keep-video Keep the intermediate video file on disk
|
786
|
+
after post-processing
|
787
|
+
--no-keep-video Delete the intermediate video file after
|
788
|
+
post-processing (default)
|
789
|
+
--post-overwrites Overwrite post-processed files (default)
|
790
|
+
--no-post-overwrites Do not overwrite post-processed files
|
791
|
+
--embed-subs Embed subtitles in the video (only for mp4,
|
792
|
+
webm and mkv videos)
|
793
|
+
--no-embed-subs Do not embed subtitles (default)
|
794
|
+
--embed-thumbnail Embed thumbnail in the video as cover art
|
795
|
+
--no-embed-thumbnail Do not embed thumbnail (default)
|
796
|
+
--embed-metadata Embed metadata to the video file. Also
|
797
|
+
embeds chapters/infojson if present unless
|
798
|
+
--no-embed-chapters/--no-embed-info-json are
|
799
|
+
used (Alias: --add-metadata)
|
800
|
+
--no-embed-metadata Do not add metadata to file (default)
|
801
|
+
(Alias: --no-add-metadata)
|
802
|
+
--embed-chapters Add chapter markers to the video file
|
803
|
+
(Alias: --add-chapters)
|
804
|
+
--no-embed-chapters Do not add chapter markers (default) (Alias:
|
805
|
+
--no-add-chapters)
|
806
|
+
--embed-info-json Embed the infojson as an attachment to
|
807
|
+
mkv/mka video files
|
808
|
+
--no-embed-info-json Do not embed the infojson as an attachment
|
809
|
+
to the video file
|
810
|
+
--parse-metadata [WHEN:]FROM:TO
|
811
|
+
Parse additional metadata like title/artist
|
812
|
+
from other fields; see "MODIFYING METADATA"
|
813
|
+
for details. Supported values of "WHEN" are
|
814
|
+
the same as that of --use-postprocessor
|
815
|
+
(default: pre_process)
|
816
|
+
--replace-in-metadata [WHEN:]FIELDS REGEX REPLACE
|
817
|
+
Replace text in a metadata field using the
|
818
|
+
given regex. This option can be used
|
819
|
+
multiple times. Supported values of "WHEN"
|
820
|
+
are the same as that of --use-postprocessor
|
821
|
+
(default: pre_process)
|
822
|
+
--xattrs Write metadata to the video file's xattrs
|
823
|
+
(using dublin core and xdg standards)
|
824
|
+
--concat-playlist POLICY Concatenate videos in a playlist. One of
|
825
|
+
"never", "always", or "multi_video"
|
826
|
+
(default; only when the videos form a single
|
827
|
+
show). All the video files must have same
|
828
|
+
codecs and number of streams to be
|
829
|
+
concatable. The "pl_video:" prefix can be
|
830
|
+
used with "--paths" and "--output" to set
|
831
|
+
the output filename for the concatenated
|
832
|
+
files. See "OUTPUT TEMPLATE" for details
|
833
|
+
--fixup POLICY Automatically correct known faults of the
|
834
|
+
file. One of never (do nothing), warn (only
|
835
|
+
emit a warning), detect_or_warn (the
|
836
|
+
default; fix file if we can, warn
|
837
|
+
otherwise), force (try fixing even if file
|
838
|
+
already exists)
|
839
|
+
--ffmpeg-location PATH Location of the ffmpeg binary; either the
|
840
|
+
path to the binary or its containing directory
|
841
|
+
--exec [WHEN:]CMD Execute a command, optionally prefixed with
|
842
|
+
when to execute it, separated by a ":".
|
843
|
+
Supported values of "WHEN" are the same as
|
844
|
+
that of --use-postprocessor (default:
|
845
|
+
after_move). Same syntax as the output
|
846
|
+
template can be used to pass any field as
|
847
|
+
arguments to the command. If no fields are
|
848
|
+
passed, %(filepath,_filename|)q is appended
|
849
|
+
to the end of the command. This option can
|
850
|
+
be used multiple times
|
851
|
+
--no-exec Remove any previously defined --exec
|
852
|
+
--convert-subs FORMAT Convert the subtitles to another format
|
853
|
+
(currently supported: ass, lrc, srt, vtt)
|
854
|
+
(Alias: --convert-subtitles)
|
855
|
+
--convert-thumbnails FORMAT Convert the thumbnails to another format
|
856
|
+
(currently supported: jpg, png, webp). You
|
857
|
+
can specify multiple rules using similar
|
858
|
+
syntax as --remux-video
|
859
|
+
--split-chapters Split video into multiple files based on
|
860
|
+
internal chapters. The "chapter:" prefix can
|
861
|
+
be used with "--paths" and "--output" to set
|
862
|
+
the output filename for the split files. See
|
863
|
+
"OUTPUT TEMPLATE" for details
|
864
|
+
--no-split-chapters Do not split video based on chapters (default)
|
865
|
+
--remove-chapters REGEX Remove chapters whose title matches the
|
866
|
+
given regular expression. The syntax is the
|
867
|
+
same as --download-sections. This option can
|
868
|
+
be used multiple times
|
869
|
+
--no-remove-chapters Do not remove any chapters from the file
|
870
|
+
(default)
|
871
|
+
--force-keyframes-at-cuts Force keyframes at cuts when
|
872
|
+
downloading/splitting/removing sections.
|
873
|
+
This is slow due to needing a re-encode, but
|
874
|
+
the resulting video may have fewer artifacts
|
875
|
+
around the cuts
|
876
|
+
--no-force-keyframes-at-cuts Do not force keyframes around the chapters
|
877
|
+
when cutting/splitting (default)
|
878
|
+
--use-postprocessor NAME[:ARGS]
|
879
|
+
The (case sensitive) name of plugin
|
880
|
+
postprocessors to be enabled, and
|
881
|
+
(optionally) arguments to be passed to it,
|
882
|
+
separated by a colon ":". ARGS are a
|
883
|
+
semicolon ";" delimited list of NAME=VALUE.
|
884
|
+
The "when" argument determines when the
|
885
|
+
postprocessor is invoked. It can be one of
|
886
|
+
"pre_process" (after video extraction),
|
887
|
+
"after_filter" (after video passes filter),
|
888
|
+
"video" (after --format; before
|
889
|
+
--print/--output), "before_dl" (before each
|
890
|
+
video download), "post_process" (after each
|
891
|
+
video download; default), "after_move"
|
892
|
+
(after moving video file to its final
|
893
|
+
locations), "after_video" (after downloading
|
894
|
+
and processing all formats of a video), or
|
895
|
+
"playlist" (at end of playlist). This option
|
896
|
+
can be used multiple times to add different
|
897
|
+
postprocessors
|
898
|
+
....
|
899
|
+
|
900
|
+
[role="mt-4"]
|
901
|
+
=== SponsorBlock Options
|
902
|
+
|
903
|
+
Make chapter entries for, or remove various segments (sponsor,
|
904
|
+
introductions, etc.) from downloaded YouTube videos using the
|
905
|
+
https://sponsor.ajay.app[SponsorBlock API]
|
906
|
+
|
907
|
+
....
|
908
|
+
--sponsorblock-mark CATS SponsorBlock categories to create chapters
|
909
|
+
for, separated by commas. Available
|
910
|
+
categories are sponsor, intro, outro,
|
911
|
+
selfpromo, preview, filler, interaction,
|
912
|
+
music_offtopic, poi_highlight, chapter, all
|
913
|
+
and default (=all). You can prefix the
|
914
|
+
category with a "-" to exclude it. See [1]
|
915
|
+
for description of the categories. E.g.
|
916
|
+
--sponsorblock-mark all,-preview
|
917
|
+
[1] https://wiki.sponsor.ajay.app/w/Segment_Categories
|
918
|
+
--sponsorblock-remove CATS SponsorBlock categories to be removed from
|
919
|
+
the video file, separated by commas. If a
|
920
|
+
category is present in both mark and remove,
|
921
|
+
remove takes precedence. The syntax and
|
922
|
+
available categories are the same as for
|
923
|
+
--sponsorblock-mark except that "default"
|
924
|
+
refers to "all,-filler" and poi_highlight,
|
925
|
+
chapter are not available
|
926
|
+
--sponsorblock-chapter-title TEMPLATE
|
927
|
+
An output template for the title of the
|
928
|
+
SponsorBlock chapters created by
|
929
|
+
--sponsorblock-mark. The only available
|
930
|
+
fields are start_time, end_time, category,
|
931
|
+
categories, name, category_names. Defaults
|
932
|
+
to "[SponsorBlock]: %(category_names)l"
|
933
|
+
--no-sponsorblock Disable both --sponsorblock-mark and
|
934
|
+
--sponsorblock-remove
|
935
|
+
--sponsorblock-api URL SponsorBlock API location, defaults to
|
936
|
+
https://sponsor.ajay.app
|
937
|
+
....
|
938
|
+
|
939
|
+
[role="mt-4"]
|
940
|
+
=== Extractor Options
|
941
|
+
|
942
|
+
....
|
943
|
+
--extractor-retries RETRIES Number of retries for known extractor errors
|
944
|
+
(default is 3), or "infinite"
|
945
|
+
--allow-dynamic-mpd Process dynamic DASH manifests (default)
|
946
|
+
(Alias: --no-ignore-dynamic-mpd)
|
947
|
+
--ignore-dynamic-mpd Do not process dynamic DASH manifests
|
948
|
+
(Alias: --no-allow-dynamic-mpd)
|
949
|
+
--hls-split-discontinuity Split HLS playlists to different formats at
|
950
|
+
discontinuities such as ad breaks
|
951
|
+
--no-hls-split-discontinuity Do not split HLS playlists to different
|
952
|
+
formats at discontinuities such as ad breaks
|
953
|
+
(default)
|
954
|
+
--extractor-args IE_KEY:ARGS Pass ARGS arguments to the IE_KEY extractor.
|
955
|
+
See "EXTRACTOR ARGUMENTS" for details. You
|
956
|
+
can use this option multiple times to give
|
957
|
+
arguments for different extractors
|
958
|
+
....
|
959
|
+
|
960
|
+
|
961
|
+
[role="mt-5"]
|
962
|
+
== CONFIGURATION
|
963
|
+
|
964
|
+
You can configure yt-dlp by placing any supported command line option to
|
965
|
+
a configuration file. The configuration is loaded from the following
|
966
|
+
locations:
|
967
|
+
|
968
|
+
[arabic]
|
969
|
+
. *Main Configuration*:
|
970
|
+
* The file given to `--config-location`
|
971
|
+
. *Portable Configuration*: (Recommended for portable installations)
|
972
|
+
* If using a binary, `yt-dlp.conf` in the same directory as the binary
|
973
|
+
* If running from source-code, `yt-dlp.conf` in the parent directory of
|
974
|
+
`yt_dlp`
|
975
|
+
. *Home Configuration*:
|
976
|
+
* `yt-dlp.conf` in the home path given to `-P`
|
977
|
+
* If `-P` is not given, the current directory is searched
|
978
|
+
. *User Configuration*:
|
979
|
+
* `${XDG_CONFIG_HOME}/yt-dlp.conf`
|
980
|
+
* `${XDG_CONFIG_HOME}/yt-dlp/config` (recommended on Linux/macOS)
|
981
|
+
* `${XDG_CONFIG_HOME}/yt-dlp/config.txt`
|
982
|
+
* `${APPDATA}/yt-dlp.conf`
|
983
|
+
* `${APPDATA}/yt-dlp/config` (recommended on Windows)
|
984
|
+
* `${APPDATA}/yt-dlp/config.txt`
|
985
|
+
* `~/yt-dlp.conf`
|
986
|
+
* `~/yt-dlp.conf.txt`
|
987
|
+
* `~/.yt-dlp/config`
|
988
|
+
* `~/.yt-dlp/config.txt`
|
989
|
+
+
|
990
|
+
See also: link:#notes-about-environment-variables[Notes about
|
991
|
+
environment variables]
|
992
|
+
. *System Configuration*:
|
993
|
+
* `/etc/yt-dlp.conf`
|
994
|
+
* `/etc/yt-dlp/config`
|
995
|
+
* `/etc/yt-dlp/config.txt`
|
996
|
+
|
997
|
+
E.g. with the following configuration file, yt-dlp will always extract
|
998
|
+
the audio, not copy the mtime, use a proxy and save all videos under
|
999
|
+
`YouTube` directory in your home directory:
|
1000
|
+
|
1001
|
+
....
|
1002
|
+
# Lines starting with # are comments
|
1003
|
+
|
1004
|
+
# Always extract audio
|
1005
|
+
-x
|
1006
|
+
|
1007
|
+
# Do not copy the mtime
|
1008
|
+
--no-mtime
|
1009
|
+
|
1010
|
+
# Use this proxy
|
1011
|
+
--proxy 127.0.0.1:3128
|
1012
|
+
|
1013
|
+
# Save all videos under YouTube directory in your home directory
|
1014
|
+
-o ~/YouTube/%(title)s.%(ext)s
|
1015
|
+
....
|
1016
|
+
|
1017
|
+
*Note*: Options in configuration file are just the same options aka
|
1018
|
+
switches used in regular command line calls; thus there *must be no
|
1019
|
+
whitespace* after `-` or `--`, e.g. `-o` or `--proxy` but not `- o` or
|
1020
|
+
`-- proxy`. They must also be quoted when necessary, as if it were a
|
1021
|
+
UNIX shell.
|
1022
|
+
|
1023
|
+
You can use `--ignore-config` if you want to disable all configuration
|
1024
|
+
files for a particular yt-dlp run. If `--ignore-config` is found inside
|
1025
|
+
any configuration file, no further configuration will be loaded. For
|
1026
|
+
example, having the option in the portable configuration file prevents
|
1027
|
+
loading of home, user, and system configurations. Additionally, (for
|
1028
|
+
backward compatibility) if `--ignore-config` is found inside the system
|
1029
|
+
configuration file, the user configuration is not loaded.
|
1030
|
+
|
1031
|
+
[role="mt-4"]
|
1032
|
+
=== Configuration file encoding
|
1033
|
+
|
1034
|
+
The configuration files are decoded according to the UTF BOM if present,
|
1035
|
+
and in the encoding from system locale otherwise.
|
1036
|
+
|
1037
|
+
If you want your file to be decoded differently, add
|
1038
|
+
`# coding: ENCODING` to the beginning of the file
|
1039
|
+
(e.g. `# coding: shift-jis`). There must be no characters before that,
|
1040
|
+
even spaces or BOM.
|
1041
|
+
|
1042
|
+
[role="mt-4"]
|
1043
|
+
=== Authentication with netrc
|
1044
|
+
|
1045
|
+
You may also want to configure automatic credentials storage for
|
1046
|
+
extractors that support authentication (by providing login and password
|
1047
|
+
with `--username` and `--password`) in order not to pass credentials as
|
1048
|
+
command line arguments on every yt-dlp execution and prevent tracking
|
1049
|
+
plain text passwords in the shell command history. You can achieve this
|
1050
|
+
using a https://stackoverflow.com/tags/.netrc/info[`.netrc` file] on a
|
1051
|
+
per-extractor basis. For that, you will need to create a `.netrc` file
|
1052
|
+
in `--netrc-location` and restrict permissions to read/write by only
|
1053
|
+
you:
|
1054
|
+
|
1055
|
+
....
|
1056
|
+
touch ${HOME}/.netrc
|
1057
|
+
chmod a-rwx,u+rw ${HOME}/.netrc
|
1058
|
+
....
|
1059
|
+
|
1060
|
+
After that, you can add credentials for an extractor in the following
|
1061
|
+
format, where _extractor_ is the name of the extractor in lowercase:
|
1062
|
+
|
1063
|
+
....
|
1064
|
+
machine <extractor> login <username> password <password>
|
1065
|
+
....
|
1066
|
+
|
1067
|
+
E.g.
|
1068
|
+
|
1069
|
+
....
|
1070
|
+
machine youtube login myaccount@gmail.com password my_youtube_password
|
1071
|
+
machine twitch login my_twitch_account_name password my_twitch_password
|
1072
|
+
....
|
1073
|
+
|
1074
|
+
To activate authentication with the `.netrc` file you should pass
|
1075
|
+
`--netrc` to yt-dlp or place it in the link:#configuration[configuration
|
1076
|
+
file].
|
1077
|
+
|
1078
|
+
The default location of the .netrc file is `~` (see below).
|
1079
|
+
|
1080
|
+
As an alternative to using the `.netrc` file, which has the disadvantage
|
1081
|
+
of keeping your passwords in a plain text file, you can configure a
|
1082
|
+
custom shell command to provide the credentials for an extractor. This
|
1083
|
+
is done by providing the `--netrc-cmd` parameter, it shall output the
|
1084
|
+
credentials in the netrc format and return `0` on success, other values
|
1085
|
+
will be treated as an error. `{}` in the command will be replaced by the
|
1086
|
+
name of the extractor to make it possible to select the credentials for
|
1087
|
+
the right extractor.
|
1088
|
+
|
1089
|
+
E.g. To use an encrypted `.netrc` file stored as `.authinfo.gpg`
|
1090
|
+
|
1091
|
+
....
|
1092
|
+
yt-dlp --netrc-cmd 'gpg --decrypt ~/.authinfo.gpg' https://www.youtube.com/watch?v=BaW_jenozKc
|
1093
|
+
....
|
1094
|
+
|
1095
|
+
[role="mt-4"]
|
1096
|
+
=== Notes about environment variables
|
1097
|
+
|
1098
|
+
* Environment variables are normally specified as
|
1099
|
+
`${VARIABLE}`/`$VARIABLE` on UNIX and `%VARIABLE%` on Windows; but is
|
1100
|
+
always shown as `${VARIABLE}` in this documentation
|
1101
|
+
* yt-dlp also allow using UNIX-style variables on Windows for path-like
|
1102
|
+
options; e.g. `--output`, `--config-location`
|
1103
|
+
* If unset, `${XDG_CONFIG_HOME}` defaults to `~/.config` and
|
1104
|
+
`${XDG_CACHE_HOME}` to `~/.cache`
|
1105
|
+
* On Windows, `~` points to `${HOME}` if present; or, `${USERPROFILE}`
|
1106
|
+
or `${HOMEDRIVE}${HOMEPATH}` otherwise
|
1107
|
+
* On Windows, `${USERPROFILE}` generally points to
|
1108
|
+
`C:\Users\<user name>` and `${APPDATA}` to
|
1109
|
+
`${USERPROFILE}\AppData\Roaming`
|
1110
|
+
|
1111
|
+
|
1112
|
+
[role="mt-5"]
|
1113
|
+
== OUTPUT TEMPLATE
|
1114
|
+
|
1115
|
+
The `-o` option is used to indicate a template for the output file names
|
1116
|
+
while `-P` option is used to specify the path each type of file should
|
1117
|
+
be saved to.
|
1118
|
+
|
1119
|
+
*tl;dr:* link:#output-template-examples[navigate me to examples].
|
1120
|
+
|
1121
|
+
The simplest usage of `-o` is not to set any template arguments when
|
1122
|
+
downloading a single file, like in
|
1123
|
+
`yt-dlp -o funny_video.flv "https://some/video"` (hard-coding file
|
1124
|
+
extension like this is _not_ recommended and could break some
|
1125
|
+
post-processing).
|
1126
|
+
|
1127
|
+
It may however also contain special sequences that will be replaced when
|
1128
|
+
downloading each video. The special sequences may be formatted according
|
1129
|
+
to
|
1130
|
+
https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting[Python
|
1131
|
+
string formatting operations], e.g. `%(NAME)s` or `%(NAME)05d`. To
|
1132
|
+
clarify, that is a percent symbol followed by a name in parentheses,
|
1133
|
+
followed by formatting operations.
|
1134
|
+
|
1135
|
+
The field names themselves (the part inside the parenthesis) can also
|
1136
|
+
have some special formatting:
|
1137
|
+
|
1138
|
+
[arabic]
|
1139
|
+
. *Object traversal*: The dictionaries and lists available in metadata
|
1140
|
+
can be traversed by using a dot `.` separator; e.g. `%(tags.0)s`,
|
1141
|
+
`%(subtitles.en.-1.ext)s`. You can do Python slicing with colon `:`;
|
1142
|
+
E.g. `%(id.3:7)s`, `%(id.6:2:-1)s`, `%(formats.:.format_id)s`. Curly
|
1143
|
+
braces `{}` can be used to build dictionaries with only specific keys;
|
1144
|
+
e.g. `%(formats.:.{format_id,height})#j`. An empty field name `%()s`
|
1145
|
+
refers to the entire infodict; e.g. `%(.{id,title})s`. Note that all the
|
1146
|
+
fields that become available using this method are not listed below. Use
|
1147
|
+
`-j` to see such fields
|
1148
|
+
. *Arithmetic*: Simple arithmetic can be done on numeric fields using
|
1149
|
+
`+`, `-` and `*`. E.g. `%(playlist_index+10)03d`,
|
1150
|
+
`%(n_entries+1-playlist_index)d`
|
1151
|
+
. *Date/time Formatting*: Date/time fields can be formatted according to
|
1152
|
+
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes[strftime
|
1153
|
+
formatting] by specifying it separated from the field name using a `>`.
|
1154
|
+
E.g. `%(duration>%H-%M-%S)s`, `%(upload_date>%Y-%m-%d)s`,
|
1155
|
+
`%(epoch-3600>%H-%M-%S)s`
|
1156
|
+
. *Alternatives*: Alternate fields can be specified separated with a
|
1157
|
+
`,`. E.g. `%(release_date>%Y,upload_date>%Y|Unknown)s`
|
1158
|
+
. *Replacement*: A replacement value can be specified using a `&`
|
1159
|
+
separator according to the
|
1160
|
+
https://docs.python.org/3/library/string.html#format-specification-mini-language[`str.format`
|
1161
|
+
mini-language]. If the field is _not_ empty, this replacement value will
|
1162
|
+
be used instead of the actual field content. This is done after
|
1163
|
+
alternate fields are considered; thus the replacement is used if _any_
|
1164
|
+
of the alternative fields is _not_ empty. E.g.
|
1165
|
+
`%(chapters&has chapters|no chapters)s`,
|
1166
|
+
`%(title&TITLE={:>20}|NO TITLE)s`
|
1167
|
+
. *Default*: A literal default value can be specified for when the field
|
1168
|
+
is empty using a `|` separator. This overrides
|
1169
|
+
`--output-na-placeholder`. E.g. `%(uploader|Unknown)s`
|
1170
|
+
. *More Conversions*: In addition to the normal format types
|
1171
|
+
`diouxXeEfFgGcrs`, yt-dlp additionally supports converting to `B` =
|
1172
|
+
**B**ytes, `j` = **j**son (flag `#` for pretty-printing, `+` for
|
1173
|
+
Unicode), `h` = HTML escaping, `l` = a comma separated **l**ist (flag
|
1174
|
+
`#` for `\n` newline-separated), `q` = a string **q**uoted for the
|
1175
|
+
terminal (flag `#` to split a list into different arguments), `D` = add
|
1176
|
+
**D**ecimal suffixes (e.g. 10M) (flag `#` to use 1024 as factor), and
|
1177
|
+
`S` = **S**anitize as filename (flag `#` for restricted)
|
1178
|
+
. *Unicode normalization*: The format type `U` can be used for NFC
|
1179
|
+
https://docs.python.org/3/library/unicodedata.html#unicodedata.normalize[Unicode
|
1180
|
+
normalization]. The alternate form flag (`#`) changes the normalization
|
1181
|
+
to NFD and the conversion flag `+` can be used for NFKC/NFKD
|
1182
|
+
compatibility equivalence normalization. E.g. `%(title)+.100U` is NFKC
|
1183
|
+
|
1184
|
+
To summarize, the general syntax for a field is:
|
1185
|
+
|
1186
|
+
....
|
1187
|
+
%(name[.keys][addition][>strf][,alternate][&replacement][|default])[flags][width][.precision][length]type
|
1188
|
+
....
|
1189
|
+
|
1190
|
+
Additionally, you can set different output templates for the various
|
1191
|
+
metadata files separately from the general output template by specifying
|
1192
|
+
the type of file followed by the template separated by a colon `:`. The
|
1193
|
+
different file types supported are `subtitle`, `thumbnail`,
|
1194
|
+
`description`, `annotation` (deprecated), `infojson`, `link`,
|
1195
|
+
`pl_thumbnail`, `pl_description`, `pl_infojson`, `chapter`, `pl_video`.
|
1196
|
+
E.g. `-o "%(title)s.%(ext)s" -o "thumbnail:%(title)s\%(title)s.%(ext)s"`
|
1197
|
+
will put the thumbnails in a folder with the same name as the video. If
|
1198
|
+
any of the templates is empty, that type of file will not be written.
|
1199
|
+
E.g. `--write-thumbnail -o "thumbnail:"` will write thumbnails only for
|
1200
|
+
playlists and not for video.
|
1201
|
+
|
1202
|
+
*Note*: Due to post-processing (i.e. merging etc.), the actual output
|
1203
|
+
filename might differ. Use `--print after_move:filepath` to get the name
|
1204
|
+
after all post-processing is complete.
|
1205
|
+
|
1206
|
+
The available fields are:
|
1207
|
+
|
1208
|
+
* `id` (string): Video identifier
|
1209
|
+
* `title` (string): Video title
|
1210
|
+
* `fulltitle` (string): Video title ignoring live timestamp and generic title
|
1211
|
+
* `ext` (string): Video filename extension
|
1212
|
+
* `alt_title` (string): A secondary title of the video
|
1213
|
+
* `description` (string): The description of the video
|
1214
|
+
* `display_id` (string): An alternative identifier for the video
|
1215
|
+
* `uploader` (string): Full name of the video uploader
|
1216
|
+
* `uploader_id` (string): Nickname or id of the video uploader
|
1217
|
+
* `uploader_url` (string): URL to the video uploader’s profile
|
1218
|
+
* `license` (string): License name the video is licensed under
|
1219
|
+
* `creators` (list): The creators of the video
|
1220
|
+
* `creator` (string): The creators of the video; comma-separated
|
1221
|
+
* `timestamp` (numeric): UNIX timestamp of the moment the video became available
|
1222
|
+
* `upload_date` (string): Video upload date in UTC (YYYYMMDD)
|
1223
|
+
* `release_timestamp` (numeric): UNIX timestamp of the moment the video was released
|
1224
|
+
* `release_date` (string): The date (YYYYMMDD) when the video was released in UTC
|
1225
|
+
* `release_year` (numeric): Year (YYYY) when the video or album was released
|
1226
|
+
* `modified_timestamp` (numeric): UNIX timestamp of the moment the video was last modified
|
1227
|
+
* `modified_date` (string): The date (YYYYMMDD) when the video was last modified in UTC
|
1228
|
+
* `channel` (string): Full name of the channel the video is uploaded on
|
1229
|
+
* `channel_id` (string): Id of the channel
|
1230
|
+
* `channel_url` (string): URL of the channel
|
1231
|
+
* `channel_follower_count` (numeric): Number of followers of the channel
|
1232
|
+
* `channel_is_verified` (boolean): Whether the channel is verified on the platform
|
1233
|
+
* `location` (string): Physical location where the video was filmed
|
1234
|
+
* `duration` (numeric): Length of the video in seconds
|
1235
|
+
* `duration_string` (string): Length of the video (HH:mm:ss)
|
1236
|
+
* `view_count` (numeric): How many users have watched the video on the platform
|
1237
|
+
* `concurrent_view_count` (numeric): How many users are currently watching the video on the platform.
|
1238
|
+
* `like_count` (numeric): Number of positive ratings of the video
|
1239
|
+
* `dislike_count` (numeric): Number of negative ratings of the video
|
1240
|
+
* `repost_count` (numeric): Number of reposts of the video
|
1241
|
+
* `average_rating` (numeric): Average rating give by users, the scale used depends on the webpage
|
1242
|
+
* `comment_count` (numeric): Number of comments on the video (For some extractors,
|
1243
|
+
comments are only downloaded at the end, and so this field cannot be used)
|
1244
|
+
* `age_limit` (numeric): Age restriction for the video (years)
|
1245
|
+
* `live_status` (string): One of ``not_live'', ``is_live'',
|
1246
|
+
``is_upcoming'', ``was_live'', ``post_live'' (was live, but VOD is not yet processed)
|
1247
|
+
* `is_live` (boolean): Whether this video is a live stream or a fixed-length video
|
1248
|
+
* `was_live` (boolean): Whether this video was originally a live stream
|
1249
|
+
* `playable_in_embed` (string): Whether this video is allowed to play in embedded players on other sites
|
1250
|
+
* `availability` (string): Whether the video is ``private'',
|
1251
|
+
``premium_only'', ``subscriber_only'', ``needs_auth'', ``unlisted'' or ``public''
|
1252
|
+
* `media_type` (string): The type of media as classified by the site,
|
1253
|
+
e.g. ``episode'', ``clip'', ``trailer''
|
1254
|
+
* `start_time` (numeric): Time in seconds where the reproduction should
|
1255
|
+
start, as specified in the URL
|
1256
|
+
* `end_time` (numeric): Time in seconds where the reproduction should
|
1257
|
+
end, as specified in the URL
|
1258
|
+
* `extractor` (string): Name of the extractor
|
1259
|
+
* `extractor_key` (string): Key name of the extractor
|
1260
|
+
* `epoch` (numeric): Unix epoch of when the information extraction was completed
|
1261
|
+
* `autonumber` (numeric): Number that will be increased with each
|
1262
|
+
download, starting at `--autonumber-start`, padded with leading zeros to 5 digits
|
1263
|
+
* `video_autonumber` (numeric): Number that will be increased with each video
|
1264
|
+
* `n_entries` (numeric): Total number of extracted items in the playlist
|
1265
|
+
* `playlist_id` (string): Identifier of the playlist that contains the video
|
1266
|
+
* `playlist_title` (string): Name of the playlist that contains the video
|
1267
|
+
* `playlist` (string): `playlist_title` if available or else `playlist_id`
|
1268
|
+
* `playlist_count` (numeric): Total number of items in the playlist. May
|
1269
|
+
not be known if entire playlist is not extracted
|
1270
|
+
* `playlist_index` (numeric): Index of the video in the playlist padded
|
1271
|
+
with leading zeros according the final index
|
1272
|
+
* `playlist_autonumber` (numeric): Position of the video in the playlist
|
1273
|
+
download queue padded with leading zeros according to the total length
|
1274
|
+
of the playlist
|
1275
|
+
* `playlist_uploader` (string): Full name of the playlist uploader
|
1276
|
+
* `playlist_uploader_id` (string): Nickname or id of the playlist uploader
|
1277
|
+
* `playlist_channel` (string): Display name of the channel that uploaded
|
1278
|
+
the playlist
|
1279
|
+
* `playlist_channel_id` (string): Identifier of the channel that
|
1280
|
+
uploaded the playlist
|
1281
|
+
* `webpage_url` (string): A URL to the video webpage which, if given to
|
1282
|
+
yt-dlp, should yield the same result again
|
1283
|
+
* `webpage_url_basename` (string): The basename of the webpage URL
|
1284
|
+
* `webpage_url_domain` (string): The domain of the webpage URL
|
1285
|
+
* `original_url` (string): The URL given by the user (or same as `webpage_url`
|
1286
|
+
for playlist entries)
|
1287
|
+
* `categories` (list): List of categories the video belongs to
|
1288
|
+
* `tags` (list): List of tags assigned to the video
|
1289
|
+
* `cast` (list): List of cast members
|
1290
|
+
|
1291
|
+
All the fields in link:#filtering-formats[Filtering Formats] can also be
|
1292
|
+
used
|
1293
|
+
|
1294
|
+
Available for the video that belongs to some logical chapter or section:
|
1295
|
+
|
1296
|
+
* `chapter` (string): Name or title of the chapter the video belongs to
|
1297
|
+
* `chapter_number` (numeric): Number of the chapter the video belongs to
|
1298
|
+
* `chapter_id` (string): Id of the chapter the video belongs to
|
1299
|
+
|
1300
|
+
Available for the video that is an episode of some series or program:
|
1301
|
+
|
1302
|
+
* `series` (string): Title of the series or program the video episode belongs to
|
1303
|
+
* `series_id` (string): Id of the series or program the video episode belongs to
|
1304
|
+
* `season` (string): Title of the season the video episode belongs to
|
1305
|
+
* `season_number` (numeric): Number of the season the video episode belongs to
|
1306
|
+
* `season_id` (string): Id of the season the video episode belongs to
|
1307
|
+
* `episode` (string): Title of the video episode
|
1308
|
+
* `episode_number` (numeric): Number of the video episode within a season
|
1309
|
+
* `episode_id` (string): Id of the video episode
|
1310
|
+
|
1311
|
+
Available for the media that is a track or a part of a music album:
|
1312
|
+
|
1313
|
+
* `track` (string): Title of the track
|
1314
|
+
* `track_number` (numeric): Number of the track within an album or a disc
|
1315
|
+
* `track_id` (string): Id of the track
|
1316
|
+
* `artists` (list): Artist(s) of the track
|
1317
|
+
* `artist` (string): Artist(s) of the track; comma-separated
|
1318
|
+
* `genres` (list): Genre(s) of the track
|
1319
|
+
* `genre` (string): Genre(s) of the track; comma-separated
|
1320
|
+
* `composers` (list): Composer(s) of the piece
|
1321
|
+
* `composer` (string): Composer(s) of the piece; comma-separated
|
1322
|
+
* `album` (string): Title of the album the track belongs to
|
1323
|
+
* `album_type` (string): Type of the album
|
1324
|
+
* `album_artists` (list): All artists appeared on the album
|
1325
|
+
* `album_artist` (string): All artists appeared on the album; comma-separated
|
1326
|
+
* `disc_number` (numeric): Number of the disc or other physical medium
|
1327
|
+
the track belongs to
|
1328
|
+
|
1329
|
+
Available only when using `--download-sections` and for `chapter:`
|
1330
|
+
prefix when using `--split-chapters` for videos with internal chapters:
|
1331
|
+
|
1332
|
+
* `section_title` (string): Title of the chapter
|
1333
|
+
* `section_number` (numeric): Number of the chapter within the file
|
1334
|
+
* `section_start` (numeric): Start time of the chapter in seconds
|
1335
|
+
* `section_end` (numeric): End time of the chapter in seconds
|
1336
|
+
|
1337
|
+
Available only when used in `--print`:
|
1338
|
+
|
1339
|
+
* `urls` (string): The URLs of all requested formats, one in each line
|
1340
|
+
* `filename` (string): Name of the video file. Note that the
|
1341
|
+
link:#outtmpl-postprocess-note[actual filename may differ]
|
1342
|
+
* `formats_table` (table): The video format table as printed by
|
1343
|
+
`--list-formats`
|
1344
|
+
* `thumbnails_table` (table): The thumbnail format table as printed by `--list-thumbnails`
|
1345
|
+
* `subtitles_table` (table): The subtitle format table as printed by `--list-subs`
|
1346
|
+
* `automatic_captions_table` (table): The automatic subtitle format table
|
1347
|
+
as printed by `--list-subs`
|
1348
|
+
|
1349
|
+
Available only after the video is downloaded
|
1350
|
+
(`post_process`/`after_move`):
|
1351
|
+
|
1352
|
+
* `filepath`: Actual path of downloaded video file
|
1353
|
+
|
1354
|
+
Available only in `--sponsorblock-chapter-title`:
|
1355
|
+
|
1356
|
+
* `start_time` (numeric): Start time of the chapter in seconds
|
1357
|
+
* `end_time` (numeric): End time of the chapter in seconds
|
1358
|
+
* `categories` (list): The
|
1359
|
+
https://wiki.sponsor.ajay.app/w/Types#Category[SponsorBlock categories]
|
1360
|
+
the chapter belongs to
|
1361
|
+
* `category` (string): The smallest SponsorBlock category the chapter
|
1362
|
+
belongs to
|
1363
|
+
* `category_names` (list): Friendly names of the categories
|
1364
|
+
* `name` (string): Friendly name of the smallest category
|
1365
|
+
* `type` (string): The
|
1366
|
+
https://wiki.sponsor.ajay.app/w/Types#Action_Type[SponsorBlock action
|
1367
|
+
type] of the chapter
|
1368
|
+
|
1369
|
+
Each aforementioned sequence when referenced in an output template will
|
1370
|
+
be replaced by the actual value corresponding to the sequence name. E.g.
|
1371
|
+
for `-o %(title)s-%(id)s.%(ext)s` and an mp4 video with title
|
1372
|
+
`yt-dlp test video` and id `BaW_jenozKc`, this will result in a
|
1373
|
+
`yt-dlp test video-BaW_jenozKc.mp4` file created in the current
|
1374
|
+
directory.
|
1375
|
+
|
1376
|
+
*Note*: Some of the sequences are not guaranteed to be present, since
|
1377
|
+
they depend on the metadata obtained by a particular extractor. Such
|
1378
|
+
sequences will be replaced with placeholder value provided with
|
1379
|
+
`--output-na-placeholder` (`NA` by default).
|
1380
|
+
|
1381
|
+
*Tip*: Look at the `-j` output to identify which fields are available
|
1382
|
+
for the particular URL
|
1383
|
+
|
1384
|
+
For numeric sequences you can use
|
1385
|
+
https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting[numeric
|
1386
|
+
related formatting]; e.g. `%(view_count)05d` will result in a string
|
1387
|
+
with view count padded with zeros up to 5 characters, like in `00042`.
|
1388
|
+
|
1389
|
+
Output templates can also contain arbitrary hierarchical path,
|
1390
|
+
e.g. `-o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s"` which
|
1391
|
+
will result in downloading each video in a directory corresponding to
|
1392
|
+
this path template. Any missing directory will be automatically created
|
1393
|
+
for you.
|
1394
|
+
|
1395
|
+
To use percent literals in an output template use `%%`. To output to
|
1396
|
+
stdout use `-o -`.
|
1397
|
+
|
1398
|
+
The current default template is `%(title)s [%(id)s].%(ext)s`.
|
1399
|
+
|
1400
|
+
In some cases, you don’t want special characters such as 中, spaces, or
|
1401
|
+
&, such as when transferring the downloaded filename to a Windows system
|
1402
|
+
or the filename through an 8bit-unsafe channel. In these cases, add the
|
1403
|
+
`--restrict-filenames` flag to get a shorter title.
|
1404
|
+
|
1405
|
+
[role="mt-4"]
|
1406
|
+
=== Output template examples
|
1407
|
+
|
1408
|
+
[source,bash]
|
1409
|
+
----
|
1410
|
+
$ yt-dlp --print filename -o "test video.%(ext)s" BaW_jenozKc
|
1411
|
+
test video.webm # Literal name with correct extension
|
1412
|
+
|
1413
|
+
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc
|
1414
|
+
youtube-dl test video ''_ä↭𝕐.webm # All kinds of weird characters
|
1415
|
+
|
1416
|
+
$ yt-dlp --print filename -o "%(title)s.%(ext)s" BaW_jenozKc --restrict-filenames
|
1417
|
+
youtube-dl_test_video_.webm # Restricted file name
|
1418
|
+
|
1419
|
+
# Download YouTube playlist videos in separate directory indexed by video order in a playlist
|
1420
|
+
$ yt-dlp -o "%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
|
1421
|
+
|
1422
|
+
# Download YouTube playlist videos in separate directories according to their uploaded year
|
1423
|
+
$ yt-dlp -o "%(upload_date>%Y)s/%(title)s.%(ext)s" "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
|
1424
|
+
|
1425
|
+
# Prefix playlist index with " - " separator, but only if it is available
|
1426
|
+
$ yt-dlp -o "%(playlist_index&{} - |)s%(title)s.%(ext)s" BaW_jenozKc "https://www.youtube.com/user/TheLinuxFoundation/playlists"
|
1427
|
+
|
1428
|
+
# Download all playlists of YouTube channel/user keeping each playlist in separate directory:
|
1429
|
+
$ yt-dlp -o "%(uploader)s/%(playlist)s/%(playlist_index)s - %(title)s.%(ext)s" "https://www.youtube.com/user/TheLinuxFoundation/playlists"
|
1430
|
+
|
1431
|
+
# Download Udemy course keeping each chapter in separate directory under MyVideos directory in your home
|
1432
|
+
$ 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"
|
1433
|
+
|
1434
|
+
# Download entire series season keeping each series and each season in separate directory under C:/MyVideos
|
1435
|
+
$ 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"
|
1436
|
+
|
1437
|
+
# Download video as "C:\MyVideos\uploader\title.ext", subtitles as "C:\MyVideos\subs\uploader\title.ext"
|
1438
|
+
# and put all temporary files in "C:\MyVideos\tmp"
|
1439
|
+
$ yt-dlp -P "C:/MyVideos" -P "temp:tmp" -P "subtitle:subs" -o "%(uploader)s/%(title)s.%(ext)s" BaW_jenoz --write-subs
|
1440
|
+
|
1441
|
+
# Download video as "C:\MyVideos\uploader\title.ext" and subtitles as "C:\MyVideos\uploader\subs\title.ext"
|
1442
|
+
$ 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
|
1443
|
+
|
1444
|
+
# Stream the video being downloaded to stdout
|
1445
|
+
$ yt-dlp -o - BaW_jenozKc
|
1446
|
+
----
|
1447
|
+
|
1448
|
+
|
1449
|
+
[role="mt-5"]
|
1450
|
+
== FORMAT SELECTION
|
1451
|
+
|
1452
|
+
By default, yt-dlp tries to download the best available quality if you
|
1453
|
+
*don’t* pass any options. This is generally equivalent to using
|
1454
|
+
`-f bestvideo*+bestaudio/best`. However, if multiple audiostreams is
|
1455
|
+
enabled (`--audio-multistreams`), the default format changes to
|
1456
|
+
`-f bestvideo+bestaudio/best`. Similarly, if ffmpeg is unavailable, or
|
1457
|
+
if you use yt-dlp to stream to `stdout` (`-o -`), the default becomes
|
1458
|
+
`-f best/bestvideo+bestaudio`.
|
1459
|
+
|
1460
|
+
*Deprecation warning*: Latest versions of yt-dlp can stream multiple
|
1461
|
+
formats to the stdout simultaneously using ffmpeg. So, in future
|
1462
|
+
versions, the default for this will be set to `-f bv*+ba/b` similar to
|
1463
|
+
normal downloads. If you want to preserve the `-f b/bv+ba` setting, it
|
1464
|
+
is recommended to explicitly specify it in the configuration options.
|
1465
|
+
|
1466
|
+
The general syntax for format selection is `-f FORMAT` (or
|
1467
|
+
`--format FORMAT`) where `FORMAT` is a _selector expression_, i.e. an
|
1468
|
+
expression that describes format or formats you would like to download.
|
1469
|
+
|
1470
|
+
*tl;dr:* link:#format-selection-examples[navigate me to examples].
|
1471
|
+
|
1472
|
+
The simplest case is requesting a specific format; e.g. with `-f 22` you
|
1473
|
+
can download the format with format code equal to 22. You can get the
|
1474
|
+
list of available format codes for particular video using
|
1475
|
+
`--list-formats` or `-F`. Note that these format codes are extractor
|
1476
|
+
specific.
|
1477
|
+
|
1478
|
+
You can also use a file extension (currently `3gp`, `aac`, `flv`, `m4a`,
|
1479
|
+
`mp3`, `mp4`, `ogg`, `wav`, `webm` are supported) to download the best
|
1480
|
+
quality format of a particular file extension served as a single file,
|
1481
|
+
e.g. `-f webm` will download the best quality format with the `webm`
|
1482
|
+
extension served as a single file.
|
1483
|
+
|
1484
|
+
You can use `-f -` to interactively provide the format selector _for
|
1485
|
+
each video_
|
1486
|
+
|
1487
|
+
You can also use special names to select particular edge case formats:
|
1488
|
+
|
1489
|
+
* `all`: Select *all formats* separately
|
1490
|
+
* `mergeall`: Select and *merge all formats* (Must be used with
|
1491
|
+
`--audio-multistreams`, `--video-multistreams` or both)
|
1492
|
+
* `b*`, `best*`: Select the best quality format that *contains either* a
|
1493
|
+
video or an audio or both (i.e.; `vcodec!=none or acodec!=none`)
|
1494
|
+
* `b`, `best`: Select the best quality format that *contains both* video
|
1495
|
+
and audio. Equivalent to `best*[vcodec!=none][acodec!=none]`
|
1496
|
+
* `bv`, `bestvideo`: Select the best quality *video-only* format.
|
1497
|
+
Equivalent to `best*[acodec=none]`
|
1498
|
+
* `bv*`, `bestvideo*`: Select the best quality format that *contains
|
1499
|
+
video*. It may also contain audio. Equivalent to `best*[vcodec!=none]`
|
1500
|
+
* `ba`, `bestaudio`: Select the best quality *audio-only* format.
|
1501
|
+
Equivalent to `best*[vcodec=none]`
|
1502
|
+
* `ba*`, `bestaudio*`: Select the best quality format that *contains
|
1503
|
+
audio*. It may also contain video. Equivalent to `best*[acodec!=none]`
|
1504
|
+
(https://github.com/yt-dlp/yt-dlp/issues/979#issuecomment-919629354[Do
|
1505
|
+
not use!])
|
1506
|
+
* `w*`, `worst*`: Select the worst quality format that contains either a
|
1507
|
+
video or an audio
|
1508
|
+
* `w`, `worst`: Select the worst quality format that contains both video
|
1509
|
+
and audio. Equivalent to `worst*[vcodec!=none][acodec!=none]`
|
1510
|
+
* `wv`, `worstvideo`: Select the worst quality video-only format.
|
1511
|
+
Equivalent to `worst*[acodec=none]`
|
1512
|
+
* `wv*`, `worstvideo*`: Select the worst quality format that contains
|
1513
|
+
video. It may also contain audio. Equivalent to `worst*[vcodec!=none]`
|
1514
|
+
* `wa`, `worstaudio`: Select the worst quality audio-only format.
|
1515
|
+
Equivalent to `worst*[vcodec=none]`
|
1516
|
+
* `wa*`, `worstaudio*`: Select the worst quality format that contains
|
1517
|
+
audio. It may also contain video. Equivalent to `worst*[acodec!=none]`
|
1518
|
+
|
1519
|
+
For example, to download the worst quality video-only format you can use
|
1520
|
+
`-f worstvideo`. It is, however, recommended not to use `worst` and
|
1521
|
+
related options. When your format selector is `worst`, the format which
|
1522
|
+
is worst in all respects is selected. Most of the time, what you
|
1523
|
+
actually want is the video with the smallest filesize instead. So it is
|
1524
|
+
generally better to use `-S +size` or more rigorously,
|
1525
|
+
`-S +size,+br,+res,+fps` instead of `-f worst`. See
|
1526
|
+
link:#sorting-formats[Sorting Formats] for more details.
|
1527
|
+
|
1528
|
+
You can select the n’th best format of a type by using `best<type>.<n>`.
|
1529
|
+
For example, `best.2` will select the 2nd best combined format.
|
1530
|
+
Similarly, `bv*.3` will select the 3rd best format that contains a video
|
1531
|
+
stream.
|
1532
|
+
|
1533
|
+
If you want to download multiple videos, and they don’t have the same
|
1534
|
+
formats available, you can specify the order of preference using
|
1535
|
+
slashes. Note that formats on the left hand side are preferred;
|
1536
|
+
e.g. `-f 22/17/18` will download format 22 if it’s available, otherwise
|
1537
|
+
it will download format 17 if it’s available, otherwise it will download
|
1538
|
+
format 18 if it’s available, otherwise it will complain that no suitable
|
1539
|
+
formats are available for download.
|
1540
|
+
|
1541
|
+
If you want to download several formats of the same video use a comma as
|
1542
|
+
a separator, e.g. `-f 22,17,18` will download all these three formats,
|
1543
|
+
of course if they are available. Or a more sophisticated example
|
1544
|
+
combined with the precedence feature:
|
1545
|
+
`-f 136/137/mp4/bestvideo,140/m4a/bestaudio`.
|
1546
|
+
|
1547
|
+
You can merge the video and audio of multiple formats into a single file
|
1548
|
+
using `-f <format1>+<format2>+...` (requires ffmpeg installed);
|
1549
|
+
e.g. `-f bestvideo+bestaudio` will download the best video-only format,
|
1550
|
+
the best audio-only format and mux them together with ffmpeg.
|
1551
|
+
|
1552
|
+
*Deprecation warning*: Since the _below_ described behavior is complex
|
1553
|
+
and counter-intuitive, this will be removed and multistreams will be
|
1554
|
+
enabled by default in the future. A new operator will be instead added
|
1555
|
+
to limit formats to single audio/video
|
1556
|
+
|
1557
|
+
Unless `--video-multistreams` is used, all formats with a video stream
|
1558
|
+
except the first one are ignored. Similarly, unless
|
1559
|
+
`--audio-multistreams` is used, all formats with an audio stream except
|
1560
|
+
the first one are ignored. E.g.
|
1561
|
+
`-f bestvideo+best+bestaudio --video-multistreams --audio-multistreams`
|
1562
|
+
will download and merge all 3 given formats. The resulting file will
|
1563
|
+
have 2 video streams and 2 audio streams. But
|
1564
|
+
`-f bestvideo+best+bestaudio --no-video-multistreams` will download and
|
1565
|
+
merge only `bestvideo` and `bestaudio`. `best` is ignored since another
|
1566
|
+
format containing a video stream (`bestvideo`) has already been
|
1567
|
+
selected. The order of the formats is therefore important.
|
1568
|
+
`-f best+bestaudio --no-audio-multistreams` will download only `best`
|
1569
|
+
while `-f bestaudio+best --no-audio-multistreams` will ignore `best` and
|
1570
|
+
download only `bestaudio`.
|
1571
|
+
|
1572
|
+
[role="mt-4"]
|
1573
|
+
=== Filtering Formats
|
1574
|
+
|
1575
|
+
You can also filter the video formats by putting a condition in
|
1576
|
+
brackets, as in `-f "best[height=720]"` (or `-f "[filesize>10M]"` since
|
1577
|
+
filters without a selector are interpreted as `best`).
|
1578
|
+
|
1579
|
+
The following numeric meta fields can be used with comparisons `<`,
|
1580
|
+
`<=`, `>`, `>=`, `=` (equals), `!=` (not equals):
|
1581
|
+
|
1582
|
+
* `filesize`: The number of bytes, if known in advance
|
1583
|
+
* `filesize_approx`: An estimate for the number of bytes
|
1584
|
+
* `width`: Width of the video, if known
|
1585
|
+
* `height`: Height of the video, if known
|
1586
|
+
* `aspect_ratio`: Aspect ratio of the video, if known
|
1587
|
+
* `tbr`: Average bitrate of audio and video in link:##[kbps]
|
1588
|
+
* `abr`: Average audio bitrate in link:##[kbps]
|
1589
|
+
* `vbr`: Average video bitrate in link:##[kbps]
|
1590
|
+
* `asr`: Audio sampling rate in Hertz
|
1591
|
+
* `fps`: Frame rate
|
1592
|
+
* `audio_channels`: The number of audio channels
|
1593
|
+
* `stretched_ratio`: `width:height` of the video’s pixels, if not square
|
1594
|
+
|
1595
|
+
Also filtering work for comparisons `=` (equals), `^=` (starts with),
|
1596
|
+
`$=` (ends with), `*=` (contains), `~=` (matches regex) and following
|
1597
|
+
string meta fields:
|
1598
|
+
|
1599
|
+
* `url`: Video URL
|
1600
|
+
* `ext`: File extension
|
1601
|
+
* `acodec`: Name of the audio codec in use
|
1602
|
+
* `vcodec`: Name of the video codec in use
|
1603
|
+
* `container`: Name of the container format
|
1604
|
+
* `protocol`: The protocol that will be used for the actual download,
|
1605
|
+
lower-case (`http`, `https`, `rtsp`, `rtmp`, `rtmpe`, `mms`, `f4m`,
|
1606
|
+
`ism`, `http_dash_segments`, `m3u8`, or `m3u8_native`)
|
1607
|
+
* `language`: Language code
|
1608
|
+
* `dynamic_range`: The dynamic range of the video
|
1609
|
+
* `format_id`: A short description of the format
|
1610
|
+
* `format`: A human-readable description of the format
|
1611
|
+
* `format_note`: Additional info about the format
|
1612
|
+
* `resolution`: Textual description of width and height
|
1613
|
+
|
1614
|
+
Any string comparison may be prefixed with negation `!` in order to
|
1615
|
+
produce an opposite comparison, e.g. `!*=` (does not contain). The
|
1616
|
+
comparand of a string comparison needs to be quoted with either double
|
1617
|
+
or single quotes if it contains spaces or special characters other than
|
1618
|
+
`._-`.
|
1619
|
+
|
1620
|
+
*Note*: None of the aforementioned meta fields are guaranteed to be
|
1621
|
+
present since this solely depends on the metadata obtained by the
|
1622
|
+
particular extractor, i.e. the metadata offered by the website. Any
|
1623
|
+
other field made available by the extractor can also be used for
|
1624
|
+
filtering.
|
1625
|
+
|
1626
|
+
Formats for which the value is not known are excluded unless you put a
|
1627
|
+
question mark (`?`) after the operator. You can combine format filters,
|
1628
|
+
so `-f "bv[height<=?720][tbr>500]"` selects up to 720p videos (or videos
|
1629
|
+
where the height is not known) with a bitrate of at least 500 kbps. You
|
1630
|
+
can also use the filters with `all` to download all formats that satisfy
|
1631
|
+
the filter, e.g. `-f "all[vcodec=none]"` selects all audio-only formats.
|
1632
|
+
|
1633
|
+
Format selectors can also be grouped using parentheses;
|
1634
|
+
e.g. `-f "(mp4,webm)[height<480]"` will download the best pre-merged mp4
|
1635
|
+
and webm formats with a height lower than 480.
|
1636
|
+
|
1637
|
+
[role="mt-4"]
|
1638
|
+
=== Sorting Formats
|
1639
|
+
|
1640
|
+
You can change the criteria for being considered the `best` by using
|
1641
|
+
`-S` (`--format-sort`). The general format for this is
|
1642
|
+
`--format-sort field1,field2...`.
|
1643
|
+
|
1644
|
+
The available fields are:
|
1645
|
+
|
1646
|
+
* `hasvid`: Gives priority to formats that have a video stream
|
1647
|
+
* `hasaud`: Gives priority to formats that have an audio stream
|
1648
|
+
* `ie_pref`: The format preference
|
1649
|
+
* `lang`: The language preference
|
1650
|
+
* `quality`: The quality of the format
|
1651
|
+
* `source`: The preference of the source
|
1652
|
+
* `proto`: Protocol used for download (`https`/`ftps` > `http`/`ftp` >
|
1653
|
+
`m3u8_native`/`m3u8` > `http_dash_segments`> `websocket_frag` >
|
1654
|
+
`mms`/`rtsp` > `f4f`/`f4m`)
|
1655
|
+
* `vcodec`: Video Codec (`av01` > `vp9.2` > `vp9` > `h265` > `h264` >
|
1656
|
+
`vp8` > `h263` > `theora` > other)
|
1657
|
+
* `acodec`: Audio Codec (`flac`/`alac` > `wav`/`aiff` > `opus` >
|
1658
|
+
`vorbis` > `aac` > `mp4a` > `mp3` > `ac4` > `eac3` > `ac3` > `dts` >
|
1659
|
+
other)
|
1660
|
+
* `codec`: Equivalent to `vcodec,acodec`
|
1661
|
+
* `vext`: Video Extension (`mp4` > `mov` > `webm` > `flv` > other). If
|
1662
|
+
`--prefer-free-formats` is used, `webm` is preferred.
|
1663
|
+
* `aext`: Audio Extension (`m4a` > `aac` > `mp3` > `ogg` > `opus` >
|
1664
|
+
`webm` > other). If `--prefer-free-formats` is used, the order changes
|
1665
|
+
to `ogg` > `opus` > `webm` > `mp3` > `m4a` > `aac`
|
1666
|
+
* `ext`: Equivalent to `vext,aext`
|
1667
|
+
* `filesize`: Exact filesize, if known in advance
|
1668
|
+
* `fs_approx`: Approximate filesize
|
1669
|
+
* `size`: Exact filesize if available, otherwise approximate filesize
|
1670
|
+
* `height`: Height of video
|
1671
|
+
* `width`: Width of video
|
1672
|
+
* `res`: Video resolution, calculated as the smallest dimension.
|
1673
|
+
* `fps`: Framerate of video
|
1674
|
+
* `hdr`: The dynamic range of the video (`DV` > `HDR12` > `HDR10+` >
|
1675
|
+
`HDR10` > `HLG` > `SDR`)
|
1676
|
+
* `channels`: The number of audio channels
|
1677
|
+
* `tbr`: Total average bitrate in link:##[kbps]
|
1678
|
+
* `vbr`: Average video bitrate in link:##[kbps]
|
1679
|
+
* `abr`: Average audio bitrate in link:##[kbps]
|
1680
|
+
* `br`: Average bitrate in link:##[kbps], `tbr`/`vbr`/`abr`
|
1681
|
+
* `asr`: Audio sample rate in Hz
|
1682
|
+
|
1683
|
+
*Deprecation warning*: Many of these fields have (currently
|
1684
|
+
undocumented) aliases, that may be removed in a future version. It is
|
1685
|
+
recommended to use only the documented field names.
|
1686
|
+
|
1687
|
+
All fields, unless specified otherwise, are sorted in descending order.
|
1688
|
+
To reverse this, prefix the field with a `+`. E.g. `+res` prefers format
|
1689
|
+
with the smallest resolution. Additionally, you can suffix a preferred
|
1690
|
+
value for the fields, separated by a `:`. E.g. `res:720` prefers larger
|
1691
|
+
videos, but no larger than 720p and the smallest video if there are no
|
1692
|
+
videos less than 720p. For `codec` and `ext`, you can provide two
|
1693
|
+
preferred values, the first for video and the second for audio. E.g.
|
1694
|
+
`+codec:avc:m4a` (equivalent to `+vcodec:avc,+acodec:m4a`) sets the
|
1695
|
+
video codec preference to `h264` > `h265` > `vp9` > `vp9.2` > `av01` >
|
1696
|
+
`vp8` > `h263` > `theora` and audio codec preference to `mp4a` > `aac` >
|
1697
|
+
`vorbis` > `opus` > `mp3` > `ac3` > `dts`. You can also make the sorting
|
1698
|
+
prefer the nearest values to the provided by using `~` as the delimiter.
|
1699
|
+
E.g. `filesize~1G` prefers the format with filesize closest to 1 GiB.
|
1700
|
+
|
1701
|
+
The fields `hasvid` and `ie_pref` are always given highest priority in
|
1702
|
+
sorting, irrespective of the user-defined order. This behavior can be
|
1703
|
+
changed by using `--format-sort-force`. Apart from these, the default
|
1704
|
+
order used is:
|
1705
|
+
`lang,quality,res,fps,hdr:12,vcodec:vp9.2,channels,acodec,size,br,asr,proto,ext,hasaud,source,id`.
|
1706
|
+
The extractors may override this default order, but they cannot override
|
1707
|
+
the user-provided order.
|
1708
|
+
|
1709
|
+
Note that the default has `vcodec:vp9.2`; i.e. `av1` is not preferred.
|
1710
|
+
Similarly, the default for hdr is `hdr:12`; i.e. Dolby Vision is not
|
1711
|
+
preferred. These choices are made since DV and AV1 formats are not yet
|
1712
|
+
fully compatible with most devices. This may be changed in the future as
|
1713
|
+
more devices become capable of smoothly playing back these formats.
|
1714
|
+
|
1715
|
+
If your format selector is `worst`, the last item is selected after
|
1716
|
+
sorting. This means it will select the format that is worst in all
|
1717
|
+
respects. Most of the time, what you actually want is the video with the
|
1718
|
+
smallest filesize instead. So it is generally better to use
|
1719
|
+
`-f best -S +size,+br,+res,+fps`.
|
1720
|
+
|
1721
|
+
*Tip*: You can use the `-v -F` to see how the formats have been sorted
|
1722
|
+
(worst to best).
|
1723
|
+
|
1724
|
+
[role="mt-4"]
|
1725
|
+
=== Format Selection examples
|
1726
|
+
|
1727
|
+
[source,bash]
|
1728
|
+
----
|
1729
|
+
# Download and merge the best video-only format and the best audio-only format,
|
1730
|
+
# or download the best combined format if video-only format is not available
|
1731
|
+
$ yt-dlp -f "bv+ba/b"
|
1732
|
+
|
1733
|
+
# Download best format that contains video,
|
1734
|
+
# and if it doesn't already have an audio stream, merge it with best audio-only format
|
1735
|
+
$ yt-dlp -f "bv*+ba/b"
|
1736
|
+
|
1737
|
+
# Same as above
|
1738
|
+
$ yt-dlp
|
1739
|
+
|
1740
|
+
# Download the best video-only format and the best audio-only format without merging them
|
1741
|
+
# For this case, an output template should be used since
|
1742
|
+
# by default, bestvideo and bestaudio will have the same file name.
|
1743
|
+
$ yt-dlp -f "bv,ba" -o "%(title)s.f%(format_id)s.%(ext)s"
|
1744
|
+
|
1745
|
+
# Download and merge the best format that has a video stream,
|
1746
|
+
# and all audio-only formats into one file
|
1747
|
+
$ yt-dlp -f "bv*+mergeall[vcodec=none]" --audio-multistreams
|
1748
|
+
|
1749
|
+
# Download and merge the best format that has a video stream,
|
1750
|
+
# and the best 2 audio-only formats into one file
|
1751
|
+
$ yt-dlp -f "bv*+ba+ba.2" --audio-multistreams
|
1752
|
+
|
1753
|
+
|
1754
|
+
# The following examples show the old method (without -S) of format selection
|
1755
|
+
# and how to use -S to achieve a similar but (generally) better result
|
1756
|
+
|
1757
|
+
# Download the worst video available (old method)
|
1758
|
+
$ yt-dlp -f "wv*+wa/w"
|
1759
|
+
|
1760
|
+
# Download the best video available but with the smallest resolution
|
1761
|
+
$ yt-dlp -S "+res"
|
1762
|
+
|
1763
|
+
# Download the smallest video available
|
1764
|
+
$ yt-dlp -S "+size,+br"
|
1765
|
+
|
1766
|
+
|
1767
|
+
|
1768
|
+
# Download the best mp4 video available, or the best video if no mp4 available
|
1769
|
+
$ yt-dlp -f "bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4] / bv*+ba/b"
|
1770
|
+
|
1771
|
+
# Download the best video with the best extension
|
1772
|
+
# (For video, mp4 > mov > webm > flv. For audio, m4a > aac > mp3 ...)
|
1773
|
+
$ yt-dlp -S "ext"
|
1774
|
+
|
1775
|
+
|
1776
|
+
|
1777
|
+
# Download the best video available but no better than 480p,
|
1778
|
+
# or the worst video if there is no video under 480p
|
1779
|
+
$ yt-dlp -f "bv*[height<=480]+ba/b[height<=480] / wv*+ba/w"
|
1780
|
+
|
1781
|
+
# Download the best video available with the largest height but no better than 480p,
|
1782
|
+
# or the best video with the smallest resolution if there is no video under 480p
|
1783
|
+
$ yt-dlp -S "height:480"
|
1784
|
+
|
1785
|
+
# Download the best video available with the largest resolution but no better than 480p,
|
1786
|
+
# or the best video with the smallest resolution if there is no video under 480p
|
1787
|
+
# Resolution is determined by using the smallest dimension.
|
1788
|
+
# So this works correctly for vertical videos as well
|
1789
|
+
$ yt-dlp -S "res:480"
|
1790
|
+
|
1791
|
+
|
1792
|
+
|
1793
|
+
# Download the best video (that also has audio) but no bigger than 50 MB,
|
1794
|
+
# or the worst video (that also has audio) if there is no video under 50 MB
|
1795
|
+
$ yt-dlp -f "b[filesize<50M] / w"
|
1796
|
+
|
1797
|
+
# Download largest video (that also has audio) but no bigger than 50 MB,
|
1798
|
+
# or the smallest video (that also has audio) if there is no video under 50 MB
|
1799
|
+
$ yt-dlp -f "b" -S "filesize:50M"
|
1800
|
+
|
1801
|
+
# Download best video (that also has audio) that is closest in size to 50 MB
|
1802
|
+
$ yt-dlp -f "b" -S "filesize~50M"
|
1803
|
+
|
1804
|
+
# Download best video available via direct link over HTTP/HTTPS protocol,
|
1805
|
+
# or the best video available via any protocol if there is no such video
|
1806
|
+
$ yt-dlp -f "(bv*+ba/b)[protocol^=http][protocol!*=dash] / (bv*+ba/b)"
|
1807
|
+
|
1808
|
+
# Download best video available via the best protocol
|
1809
|
+
# (https/ftps > http/ftp > m3u8_native > m3u8 > http_dash_segments ...)
|
1810
|
+
$ yt-dlp -S "proto"
|
1811
|
+
|
1812
|
+
# Download the best video with either h264 or h265 codec,
|
1813
|
+
# or the best video if there is no such video
|
1814
|
+
$ yt-dlp -f "(bv*[vcodec~='^((he|a)vc|h26[45])']+ba) / (bv*+ba/b)"
|
1815
|
+
|
1816
|
+
# Download the best video with best codec no better than h264,
|
1817
|
+
# or the best video with worst codec if there is no such video
|
1818
|
+
$ yt-dlp -S "codec:h264"
|
1819
|
+
|
1820
|
+
# Download the best video with worst codec no worse than h264,
|
1821
|
+
# or the best video with best codec if there is no such video
|
1822
|
+
$ yt-dlp -S "+codec:h264"
|
1823
|
+
|
1824
|
+
# More complex examples
|
1825
|
+
|
1826
|
+
# Download the best video no better than 720p preferring framerate greater than 30,
|
1827
|
+
# or the worst video (still preferring framerate greater than 30) if there is no such video
|
1828
|
+
$ yt-dlp -f "((bv*[fps>30]/bv*)[height<=720]/(wv*[fps>30]/wv*)) + ba / (b[fps>30]/b)[height<=720]/(w[fps>30]/w)"
|
1829
|
+
|
1830
|
+
# Download the video with the largest resolution no better than 720p,
|
1831
|
+
# or the video with the smallest resolution available if there is no such video,
|
1832
|
+
# preferring larger framerate for formats with the same resolution
|
1833
|
+
$ yt-dlp -S "res:720,fps"
|
1834
|
+
|
1835
|
+
# Download the video with smallest resolution no worse than 480p,
|
1836
|
+
# or the video with the largest resolution available if there is no such video,
|
1837
|
+
# preferring better codec and then larger total bitrate for the same resolution
|
1838
|
+
$ yt-dlp -S "+res:480,codec,br"
|
1839
|
+
----
|
1840
|
+
|
1841
|
+
|
1842
|
+
[role="mt-5"]
|
1843
|
+
== MODIFYING METADATA
|
1844
|
+
|
1845
|
+
The metadata obtained by the extractors can be modified by using
|
1846
|
+
`--parse-metadata` and `--replace-in-metadata`
|
1847
|
+
|
1848
|
+
`--replace-in-metadata FIELDS REGEX REPLACE` is used to replace text in
|
1849
|
+
any metadata field using
|
1850
|
+
https://docs.python.org/3/library/re.html#regular-expression-syntax[Python
|
1851
|
+
regular expression].
|
1852
|
+
https://docs.python.org/3/library/re.html?highlight=backreferences#re.sub[Backreferences]
|
1853
|
+
can be used in the replace string for advanced use.
|
1854
|
+
|
1855
|
+
The general syntax of `--parse-metadata FROM:TO` is to give the name of
|
1856
|
+
a field or an link:#output-template[output template] to extract data
|
1857
|
+
from, and the format to interpret it as, separated by a colon `:`.
|
1858
|
+
Either a
|
1859
|
+
https://docs.python.org/3/library/re.html#regular-expression-syntax[Python
|
1860
|
+
regular expression] with named capture groups, a single field name, or a
|
1861
|
+
similar syntax to the link:#output-template[output template] (only
|
1862
|
+
`%(field)s` formatting is supported) can be used for `TO`. The option
|
1863
|
+
can be used multiple times to parse and modify various fields.
|
1864
|
+
|
1865
|
+
Note that these options preserve their relative order, allowing
|
1866
|
+
replacements to be made in parsed fields and viceversa. Also, any field
|
1867
|
+
thus created can be used in the link:#output-template[output template]
|
1868
|
+
and will also affect the media file’s metadata added when using
|
1869
|
+
`--embed-metadata`.
|
1870
|
+
|
1871
|
+
This option also has a few special uses:
|
1872
|
+
|
1873
|
+
* You can download an additional URL based on the metadata of the
|
1874
|
+
currently downloaded video. To do this, set the field `additional_urls`
|
1875
|
+
to the URL that you want to download. E.g.
|
1876
|
+
`--parse-metadata "description:(?P<additional_urls>https?://www\.vimeo\.com/\d+)"`
|
1877
|
+
will download the first vimeo video found in the description
|
1878
|
+
* You can use this to change the metadata that is embedded in the media
|
1879
|
+
file. To do this, set the value of the corresponding field with a
|
1880
|
+
`meta_` prefix. For example, any value you set to `meta_description`
|
1881
|
+
field will be added to the `description` field in the file - you can use
|
1882
|
+
this to set a different ``description'' and ``synopsis''. To modify the
|
1883
|
+
metadata of individual streams, use the `meta<n>_` prefix
|
1884
|
+
(e.g. `meta1_language`). Any value set to the `meta_` field will
|
1885
|
+
overwrite all default values.
|
1886
|
+
|
1887
|
+
*Note*: Metadata modification happens before format selection,
|
1888
|
+
post-extraction and other post-processing operations. Some fields may be
|
1889
|
+
added or changed during these steps, overriding your changes.
|
1890
|
+
|
1891
|
+
For reference, these are the fields yt-dlp adds by default to the file
|
1892
|
+
metadata:
|
1893
|
+
|
1894
|
+
[cols="<,<",options="header",]
|
1895
|
+
|===
|
1896
|
+
|Metadata fields |From
|
1897
|
+
|`title` |`track` or `title`
|
1898
|
+
|
1899
|
+
|`date` |`upload_date`
|
1900
|
+
|
1901
|
+
|`description`, `synopsis` |`description`
|
1902
|
+
|
1903
|
+
|`purl`, `comment` |`webpage_url`
|
1904
|
+
|
1905
|
+
|`track` |`track_number`
|
1906
|
+
|
1907
|
+
|`artist` |`artist`, `artists`, `creator`, `creators`, `uploader` or
|
1908
|
+
`uploader_id`
|
1909
|
+
|
1910
|
+
|`composer` |`composer` or `composers`
|
1911
|
+
|
1912
|
+
|`genre` |`genre` or `genres`
|
1913
|
+
|
1914
|
+
|`album` |`album`
|
1915
|
+
|
1916
|
+
|`album_artist` |`album_artist` or `album_artists`
|
1917
|
+
|
1918
|
+
|`disc` |`disc_number`
|
1919
|
+
|
1920
|
+
|`show` |`series`
|
1921
|
+
|
1922
|
+
|`season_number` |`season_number`
|
1923
|
+
|
1924
|
+
|`episode_id` |`episode` or `episode_id`
|
1925
|
+
|
1926
|
+
|`episode_sort` |`episode_number`
|
1927
|
+
|
1928
|
+
|`language` of each stream |the format’s `language`
|
1929
|
+
|===
|
1930
|
+
|
1931
|
+
*Note*: The file format may not support some of these fields
|
1932
|
+
|
1933
|
+
[role="mt-4"]
|
1934
|
+
=== Modifying metadata examples
|
1935
|
+
|
1936
|
+
[source,bash]
|
1937
|
+
----
|
1938
|
+
# Interpret the title as "Artist - Title"
|
1939
|
+
$ yt-dlp --parse-metadata "title:%(artist)s - %(title)s"
|
1940
|
+
|
1941
|
+
# Regex example
|
1942
|
+
$ yt-dlp --parse-metadata "description:Artist - (?P<artist>.+)"
|
1943
|
+
|
1944
|
+
# Set title as "Series name S01E05"
|
1945
|
+
$ yt-dlp --parse-metadata "%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s"
|
1946
|
+
|
1947
|
+
# Prioritize uploader as the "artist" field in video metadata
|
1948
|
+
$ yt-dlp --parse-metadata "%(uploader|)s:%(meta_artist)s" --embed-metadata
|
1949
|
+
|
1950
|
+
# Set "comment" field in video metadata using description instead of webpage_url,
|
1951
|
+
# handling multiple lines correctly
|
1952
|
+
$ yt-dlp --parse-metadata "description:(?s)(?P<meta_comment>.+)" --embed-metadata
|
1953
|
+
|
1954
|
+
# Do not set any "synopsis" in the video metadata
|
1955
|
+
$ yt-dlp --parse-metadata ":(?P<meta_synopsis>)"
|
1956
|
+
|
1957
|
+
# Remove "formats" field from the infojson by setting it to an empty string
|
1958
|
+
$ yt-dlp --parse-metadata "video::(?P<formats>)" --write-info-json
|
1959
|
+
|
1960
|
+
# Replace all spaces and "_" in title and uploader with a `-`
|
1961
|
+
$ yt-dlp --replace-in-metadata "title,uploader" "[ _]" "-"
|
1962
|
+
----
|
1963
|
+
|
1964
|
+
|
1965
|
+
[role="mt-5"]
|
1966
|
+
== EXTRACTOR ARGUMENTS
|
1967
|
+
|
1968
|
+
Some extractors accept additional arguments which can be passed using
|
1969
|
+
`--extractor-args KEY:ARGS`. `ARGS` is a `;` (semicolon) separated
|
1970
|
+
string of `ARG=VAL1,VAL2`. E.g.
|
1971
|
+
`--extractor-args "youtube:player-client=mediaconnect,web;formats=incomplete" --extractor-args "funimation:version=uncut"`
|
1972
|
+
|
1973
|
+
Note: In CLI, `ARG` can use `-` instead of `_`;
|
1974
|
+
e.g. `youtube:player-client"` becomes `youtube:player_client"`
|
1975
|
+
|
1976
|
+
The following extractors use this feature:
|
1977
|
+
|
1978
|
+
[role="mt-4"]
|
1979
|
+
=== youtube
|
1980
|
+
|
1981
|
+
* `lang`: Prefer translated metadata (`title`, `description` etc) of
|
1982
|
+
this language code (case-sensitive). By default, the video primary
|
1983
|
+
language metadata is preferred, with a fallback to `en` translated. See
|
1984
|
+
https://github.com/yt-dlp/yt-dlp/blob/c26f9b991a0681fd3ea548d535919cec1fbbd430/yt_dlp/extractor/youtube.py#L381-L390[youtube.py]
|
1985
|
+
for list of supported content language codes
|
1986
|
+
* `skip`: One or more of `hls`, `dash` or `translated_subs` to skip
|
1987
|
+
extraction of the m3u8 manifests, dash manifests and
|
1988
|
+
https://github.com/yt-dlp/yt-dlp/issues/4090#issuecomment-1158102032[auto-translated
|
1989
|
+
subtitles] respectively
|
1990
|
+
* `player_client`: Clients to extract video data from. The main clients
|
1991
|
+
are `web`, `ios` and `android`, with variants `_music` and `_creator`
|
1992
|
+
(e.g. `ios_creator`); and `mediaconnect`, `mweb`, `android_producer`,
|
1993
|
+
`android_testsuite`, `android_vr`, `web_safari`, `web_embedded`, `tv`
|
1994
|
+
and `tv_embedded` with no variants. By default, `ios,web_creator` is
|
1995
|
+
used, and `tv_embedded`, `web_creator` and `mediaconnect` are added as
|
1996
|
+
required for age-gated videos. Similarly, the music variants are added
|
1997
|
+
for `music.youtube.com` urls. Most `android` clients will be given
|
1998
|
+
lowest priority since their formats are broken. You can use `all` to use
|
1999
|
+
all the clients, and `default` for the default clients.
|
2000
|
+
* `player_skip`: Skip some network requests that are generally needed
|
2001
|
+
for robust extraction. One or more of `configs` (skip client configs),
|
2002
|
+
`webpage` (skip initial webpage), `js` (skip js player). While these
|
2003
|
+
options can help reduce the number of requests needed or avoid some
|
2004
|
+
rate-limiting, they could cause some issues. See
|
2005
|
+
https://github.com/yt-dlp/yt-dlp/pull/860[#860] for more details
|
2006
|
+
* `player_params`: YouTube player parameters to use for player requests.
|
2007
|
+
Will overwrite any default ones set by yt-dlp.
|
2008
|
+
* `comment_sort`: `top` or `new` (default) - choose comment sorting mode
|
2009
|
+
(on YouTube’s side)
|
2010
|
+
* `max_comments`: Limit the amount of comments to gather.
|
2011
|
+
Comma-separated list of integers representing
|
2012
|
+
`max-comments,max-parents,max-replies,max-replies-per-thread`. Default
|
2013
|
+
is `all,all,all,all`
|
2014
|
+
** E.g. `all,all,1000,10` will get a maximum of 1000 replies total, with
|
2015
|
+
up to 10 replies per thread. `1000,all,100` will get a maximum of 1000
|
2016
|
+
comments, with a maximum of 100 replies total
|
2017
|
+
* `formats`: Change the types of formats to return. `dashy` (convert
|
2018
|
+
HTTP to DASH), `duplicate` (identical content but different URLs or
|
2019
|
+
protocol; includes `dashy`), `incomplete` (cannot be downloaded
|
2020
|
+
completely - live dash and post-live m3u8)
|
2021
|
+
* `innertube_host`: Innertube API host to use for all API requests;
|
2022
|
+
e.g. `studio.youtube.com`, `youtubei.googleapis.com`. Note that cookies
|
2023
|
+
exported from one subdomain will not work on others
|
2024
|
+
* `innertube_key`: Innertube API key to use for all API requests. By
|
2025
|
+
default, no API key is used
|
2026
|
+
* `raise_incomplete_data`: `Incomplete Data Received` raises an error
|
2027
|
+
instead of reporting a warning
|
2028
|
+
* `data_sync_id`: Overrides the account Data Sync ID used in Innertube
|
2029
|
+
API requests. This may be needed if you are using an account with
|
2030
|
+
`youtube:player_skip=webpage,configs` or `youtubetab:skip=webpage`
|
2031
|
+
* `visitor_data`: Overrides the Visitor Data used in Innertube API
|
2032
|
+
requests. This should be used with `player_skip=webpage,configs` and
|
2033
|
+
without cookies. Note: this may have adverse effects if used improperly.
|
2034
|
+
If a session from a browser is wanted, you should pass cookies instead
|
2035
|
+
(which contain the Visitor ID)
|
2036
|
+
* `po_token`: Proof of Origin (PO) Token(s) to use for requesting video
|
2037
|
+
playback. Comma seperated list of PO Tokens in the format
|
2038
|
+
`CLIENT+PO_TOKEN`, e.g. `youtube:po_token=web+XXX,android+YYY`
|
2039
|
+
|
2040
|
+
[role="mt-4"]
|
2041
|
+
=== youtubetab (YouTube playlists, channels, feeds, etc.)
|
2042
|
+
|
2043
|
+
* `skip`: One or more of `webpage` (skip initial webpage download),
|
2044
|
+
`authcheck` (allow the download of playlists requiring authentication
|
2045
|
+
when no initial webpage is downloaded. This may cause unwanted behavior,
|
2046
|
+
see https://github.com/yt-dlp/yt-dlp/pull/1122[#1122] for more details)
|
2047
|
+
* `approximate_date`: Extract approximate `upload_date` and `timestamp`
|
2048
|
+
in flat-playlist. This may cause date-based filters to be slightly off
|
2049
|
+
|
2050
|
+
[role="mt-4"]
|
2051
|
+
=== generic
|
2052
|
+
|
2053
|
+
* `fragment_query`: Passthrough any query in mpd/m3u8 manifest URLs to
|
2054
|
+
their fragments if no value is provided, or else apply the query string
|
2055
|
+
given as `fragment_query=VALUE`. Note that if the stream has an HLS
|
2056
|
+
AES-128 key, then the query parameters will be passed to the key URI as
|
2057
|
+
well, unless the `key_query` extractor-arg is passed, or unless an
|
2058
|
+
external key URI is provided via the `hls_key` extractor-arg. Does not
|
2059
|
+
apply to ffmpeg
|
2060
|
+
* `variant_query`: Passthrough the master m3u8 URL query to its variant
|
2061
|
+
playlist URLs if no value is provided, or else apply the query string
|
2062
|
+
given as `variant_query=VALUE`
|
2063
|
+
* `key_query`: Passthrough the master m3u8 URL query to its HLS AES-128
|
2064
|
+
decryption key URI if no value is provided, or else apply the query
|
2065
|
+
string given as `key_query=VALUE`. Note that this will have no effect if
|
2066
|
+
the key URI is provided via the `hls_key` extractor-arg. Does not apply
|
2067
|
+
to ffmpeg
|
2068
|
+
* `hls_key`: An HLS AES-128 key URI _or_ key (as hex), and optionally
|
2069
|
+
the IV (as hex), in the form of `(URI|KEY)[,IV]`;
|
2070
|
+
e.g. `generic:hls_key=ABCDEF1234567980,0xFEDCBA0987654321`. Passing any
|
2071
|
+
of these values will force usage of the native HLS downloader and
|
2072
|
+
override the corresponding values found in the m3u8 playlist
|
2073
|
+
* `is_live`: Bypass live HLS detection and manually set `live_status` -
|
2074
|
+
a value of `false` will set `not_live`, any other value (or no value)
|
2075
|
+
will set `is_live`
|
2076
|
+
|
2077
|
+
[role="mt-4"]
|
2078
|
+
=== funimation
|
2079
|
+
|
2080
|
+
* `language`: Audio languages to extract,
|
2081
|
+
e.g. `funimation:language=english,japanese`
|
2082
|
+
* `version`: The video version to extract - `uncut` or `simulcast`
|
2083
|
+
|
2084
|
+
[role="mt-4"]
|
2085
|
+
=== crunchyrollbeta (Crunchyroll)
|
2086
|
+
|
2087
|
+
* `hardsub`: One or more hardsub versions to extract (in order of
|
2088
|
+
preference), or `all` (default: `None` = no hardsubs will be extracted),
|
2089
|
+
e.g. `crunchyrollbeta:hardsub=en-US,de-DE`
|
2090
|
+
|
2091
|
+
[role="mt-4"]
|
2092
|
+
=== vikichannel
|
2093
|
+
|
2094
|
+
* `video_types`: Types of videos to download - one or more of
|
2095
|
+
`episodes`, `movies`, `clips`, `trailers`
|
2096
|
+
|
2097
|
+
[role="mt-4"]
|
2098
|
+
=== niconico
|
2099
|
+
|
2100
|
+
* `segment_duration`: Segment duration in milliseconds for HLS-DMC
|
2101
|
+
formats. Use it at your own risk since this feature *may result in your
|
2102
|
+
account termination.*
|
2103
|
+
|
2104
|
+
[role="mt-4"]
|
2105
|
+
=== youtubewebarchive
|
2106
|
+
|
2107
|
+
* `check_all`: Try to check more at the cost of more requests. One or
|
2108
|
+
more of `thumbnails`, `captures`
|
2109
|
+
|
2110
|
+
[role="mt-4"]
|
2111
|
+
=== gamejolt
|
2112
|
+
|
2113
|
+
* `comment_sort`: `hot` (default), `you` (cookies needed), `top`, `new`
|
2114
|
+
- choose comment sorting mode (on GameJolt’s side)
|
2115
|
+
|
2116
|
+
[role="mt-4"]
|
2117
|
+
=== hotstar
|
2118
|
+
|
2119
|
+
* `res`: resolution to ignore - one or more of `sd`, `hd`, `fhd`
|
2120
|
+
* `vcodec`: vcodec to ignore - one or more of `h264`, `h265`, `dvh265`
|
2121
|
+
* `dr`: dynamic range to ignore - one or more of `sdr`, `hdr10`, `dv`
|
2122
|
+
|
2123
|
+
[role="mt-4"]
|
2124
|
+
=== niconicochannelplus
|
2125
|
+
|
2126
|
+
* `max_comments`: Maximum number of comments to extract - default is
|
2127
|
+
`120`
|
2128
|
+
|
2129
|
+
[role="mt-4"]
|
2130
|
+
=== tiktok
|
2131
|
+
|
2132
|
+
* `api_hostname`: Hostname to use for mobile API calls,
|
2133
|
+
e.g. `api22-normal-c-alisg.tiktokv.com`
|
2134
|
+
* `app_name`: Default app name to use with mobile API calls,
|
2135
|
+
e.g. `trill`
|
2136
|
+
* `app_version`: Default app version to use with mobile API calls -
|
2137
|
+
should be set along with `manifest_app_version`, e.g. `34.1.2`
|
2138
|
+
* `manifest_app_version`: Default numeric app version to use with mobile
|
2139
|
+
API calls, e.g. `2023401020`
|
2140
|
+
* `aid`: Default app ID to use with mobile API calls, e.g. `1180`
|
2141
|
+
* `app_info`: Enable mobile API extraction with one or more app info
|
2142
|
+
strings in the format of
|
2143
|
+
`<iid>/[app_name]/[app_version]/[manifest_app_version]/[aid]`, where
|
2144
|
+
`iid` is the unique app install ID. `iid` is the only required value;
|
2145
|
+
all other values and their `/` separators can be omitted,
|
2146
|
+
e.g. `tiktok:app_info=1234567890123456789` or
|
2147
|
+
`tiktok:app_info=123,456/trill///1180,789//34.0.1/340001`
|
2148
|
+
* `device_id`: Enable mobile API extraction with a genuine device ID to
|
2149
|
+
be used with mobile API calls. Default is a random 19-digit string
|
2150
|
+
|
2151
|
+
[role="mt-4"]
|
2152
|
+
=== rokfinchannel
|
2153
|
+
|
2154
|
+
* `tab`: Which tab to download - one of `new`, `top`, `videos`,
|
2155
|
+
`podcasts`, `streams`, `stacks`
|
2156
|
+
|
2157
|
+
[role="mt-4"]
|
2158
|
+
=== twitter
|
2159
|
+
|
2160
|
+
* `api`: Select one of `graphql` (default), `legacy` or `syndication` as
|
2161
|
+
the API for tweet extraction. Has no effect if logged in
|
2162
|
+
|
2163
|
+
[role="mt-4"]
|
2164
|
+
=== stacommu, wrestleuniverse
|
2165
|
+
|
2166
|
+
* `device_id`: UUID value assigned by the website and used to enforce
|
2167
|
+
device limits for paid livestream content. Can be found in browser local
|
2168
|
+
storage
|
2169
|
+
|
2170
|
+
[role="mt-4"]
|
2171
|
+
=== twitch
|
2172
|
+
|
2173
|
+
* `client_id`: Client ID value to be sent with GraphQL requests,
|
2174
|
+
e.g. `twitch:client_id=kimne78kx3ncx6brgo4mv6wki5h1ko`
|
2175
|
+
|
2176
|
+
[role="mt-4"]
|
2177
|
+
=== nhkradirulive (NHK らじる★らじる LIVE)
|
2178
|
+
|
2179
|
+
* `area`: Which regional variation to extract. Valid areas are:
|
2180
|
+
`sapporo`, `sendai`, `tokyo`, `nagoya`, `osaka`, `hiroshima`,
|
2181
|
+
`matsuyama`, `fukuoka`. Defaults to `tokyo`
|
2182
|
+
|
2183
|
+
[role="mt-4"]
|
2184
|
+
=== nflplusreplay
|
2185
|
+
|
2186
|
+
* `type`: Type(s) of game replays to extract. Valid types are:
|
2187
|
+
`full_game`, `full_game_spanish`, `condensed_game` and `all_22`. You can
|
2188
|
+
use `all` to extract all available replay types, which is the default
|
2189
|
+
|
2190
|
+
[role="mt-4"]
|
2191
|
+
=== jiocinema
|
2192
|
+
|
2193
|
+
* `refresh_token`: The `refreshToken` UUID from browser local storage
|
2194
|
+
can be passed to extend the life of your login session when logging in
|
2195
|
+
with `token` as username and the `accessToken` from browser local
|
2196
|
+
storage as password
|
2197
|
+
|
2198
|
+
[role="mt-4"]
|
2199
|
+
=== jiosaavn
|
2200
|
+
|
2201
|
+
* `bitrate`: Audio bitrates to request. One or more of `16`, `32`, `64`,
|
2202
|
+
`128`, `320`. Default is `128,320`
|
2203
|
+
|
2204
|
+
[role="mt-4"]
|
2205
|
+
=== afreecatvlive
|
2206
|
+
|
2207
|
+
* `cdn`: One or more CDN IDs to use with the API call for stream URLs,
|
2208
|
+
e.g. `gcp_cdn`, `gs_cdn_pc_app`, `gs_cdn_mobile_web`, `gs_cdn_pc_web`
|
2209
|
+
|
2210
|
+
[role="mt-4"]
|
2211
|
+
=== soundcloud
|
2212
|
+
|
2213
|
+
* `formats`: Formats to request from the API. Requested values should be
|
2214
|
+
in the format of `{protocol}_{extension}` (omitting the bitrate),
|
2215
|
+
e.g. `hls_opus,http_aac`. The `*` character functions as a wildcard,
|
2216
|
+
e.g. `*_mp3`, and can be passed by itself to request all formats. Known
|
2217
|
+
protocols include `http`, `hls` and `hls-aes`; known extensions include
|
2218
|
+
`aac`, `opus` and `mp3`. Original `download` formats are always
|
2219
|
+
extracted. Default is
|
2220
|
+
`http_aac,hls_aac,http_opus,hls_opus,http_mp3,hls_mp3`
|
2221
|
+
|
2222
|
+
[role="mt-4"]
|
2223
|
+
=== orfon (orf:on)
|
2224
|
+
|
2225
|
+
* `prefer_segments_playlist`: Prefer a playlist of program segments
|
2226
|
+
instead of a single complete video when available. If individual
|
2227
|
+
segments are desired, use
|
2228
|
+
`--concat-playlist never --extractor-args "orfon:prefer_segments_playlist"`
|
2229
|
+
|
2230
|
+
[role="mt-4"]
|
2231
|
+
=== bilibili
|
2232
|
+
|
2233
|
+
* `prefer_multi_flv`: Prefer extracting flv formats over mp4 for older
|
2234
|
+
videos that still provide legacy formats
|
2235
|
+
|
2236
|
+
[role="mt-4"]
|
2237
|
+
=== digitalconcerthall
|
2238
|
+
|
2239
|
+
* `prefer_combined_hls`: Prefer extracting combined/pre-merged video and
|
2240
|
+
audio HLS formats. This will exclude 4K/HEVC video and lossless/FLAC
|
2241
|
+
audio formats, which are only available as split video/audio HLS formats
|
2242
|
+
|
2243
|
+
*Note*: These options may be changed/removed in the future without
|
2244
|
+
concern for backward compatibility
|
2245
|
+
|
2246
|
+
|
2247
|
+
[role="mt-5"]
|
2248
|
+
== PLUGINS
|
2249
|
+
|
2250
|
+
Note that *all* plugins are imported even if not invoked, and that
|
2251
|
+
*there are no checks* performed on plugin code. *Use plugins at your own
|
2252
|
+
risk and only if you trust the code!*
|
2253
|
+
|
2254
|
+
Plugins can be of `<type>`s `extractor` or `postprocessor`. - Extractor
|
2255
|
+
plugins do not need to be enabled from the CLI and are automatically
|
2256
|
+
invoked when the input URL is suitable for it. - Extractor plugins take
|
2257
|
+
priority over built-in extractors. - Postprocessor plugins can be
|
2258
|
+
invoked using `--use-postprocessor NAME`.
|
2259
|
+
|
2260
|
+
Plugins are loaded from the namespace packages
|
2261
|
+
`yt_dlp_plugins.extractor` and `yt_dlp_plugins.postprocessor`.
|
2262
|
+
|
2263
|
+
In other words, the file structure on the disk looks something like:
|
2264
|
+
|
2265
|
+
....
|
2266
|
+
yt_dlp_plugins/
|
2267
|
+
extractor/
|
2268
|
+
myplugin.py
|
2269
|
+
postprocessor/
|
2270
|
+
myplugin.py
|
2271
|
+
....
|
2272
|
+
|
2273
|
+
yt-dlp looks for these `yt_dlp_plugins` namespace folders in many
|
2274
|
+
locations (see below) and loads in plugins from *all* of them.
|
2275
|
+
|
2276
|
+
See the https://github.com/yt-dlp/yt-dlp/wiki/Plugins[wiki for some
|
2277
|
+
known plugins]
|
2278
|
+
|
2279
|
+
[role="mt-4"]
|
2280
|
+
=== Installing Plugins
|
2281
|
+
|
2282
|
+
Plugins can be installed using various methods and locations.
|
2283
|
+
|
2284
|
+
[arabic]
|
2285
|
+
. *Configuration directories*: Plugin packages (containing a
|
2286
|
+
`yt_dlp_plugins` namespace folder) can be dropped into the following
|
2287
|
+
standard link:#configuration[configuration locations]:
|
2288
|
+
* *User Plugins*
|
2289
|
+
** `${XDG_CONFIG_HOME}/yt-dlp/plugins/<package name>/yt_dlp_plugins/`
|
2290
|
+
(recommended on Linux/macOS)
|
2291
|
+
** `${XDG_CONFIG_HOME}/yt-dlp-plugins/<package name>/yt_dlp_plugins/`
|
2292
|
+
** `${APPDATA}/yt-dlp/plugins/<package name>/yt_dlp_plugins/`
|
2293
|
+
(recommended on Windows)
|
2294
|
+
** `${APPDATA}/yt-dlp-plugins/<package name>/yt_dlp_plugins/`
|
2295
|
+
** `~/.yt-dlp/plugins/<package name>/yt_dlp_plugins/`
|
2296
|
+
** `~/yt-dlp-plugins/<package name>/yt_dlp_plugins/`
|
2297
|
+
* *System Plugins*
|
2298
|
+
** `/etc/yt-dlp/plugins/<package name>/yt_dlp_plugins/`
|
2299
|
+
** `/etc/yt-dlp-plugins/<package name>/yt_dlp_plugins/`
|
2300
|
+
. *Executable location*: Plugin packages can similarly be installed in a
|
2301
|
+
`yt-dlp-plugins` directory under the executable location (recommended
|
2302
|
+
for portable installations):
|
2303
|
+
* Binary: where `<root-dir>/yt-dlp.exe`,
|
2304
|
+
`<root-dir>/yt-dlp-plugins/<package name>/yt_dlp_plugins/`
|
2305
|
+
* Source: where `<root-dir>/yt_dlp/__main__.py`,
|
2306
|
+
`<root-dir>/yt-dlp-plugins/<package name>/yt_dlp_plugins/`
|
2307
|
+
. *pip and other locations in `PYTHONPATH`*
|
2308
|
+
* Plugin packages can be installed and managed using `pip`. See
|
2309
|
+
https://github.com/yt-dlp/yt-dlp-sample-plugins[yt-dlp-sample-plugins]
|
2310
|
+
for an example.
|
2311
|
+
** Note: plugin files between plugin packages installed with pip must
|
2312
|
+
have unique filenames.
|
2313
|
+
* Any path in `PYTHONPATH` is searched in for the `yt_dlp_plugins`
|
2314
|
+
namespace folder.
|
2315
|
+
** Note: This does not apply for Pyinstaller/py2exe builds.
|
2316
|
+
|
2317
|
+
`.zip`, `.egg` and `.whl` archives containing a `yt_dlp_plugins`
|
2318
|
+
namespace folder in their root are also supported as plugin packages.
|
2319
|
+
|
2320
|
+
* e.g. `${XDG_CONFIG_HOME}/yt-dlp/plugins/mypluginpkg.zip` where
|
2321
|
+
`mypluginpkg.zip` contains `yt_dlp_plugins/<type>/myplugin.py`
|
2322
|
+
|
2323
|
+
Run yt-dlp with `--verbose` to check if the plugin has been loaded.
|
2324
|
+
|
2325
|
+
[role="mt-4"]
|
2326
|
+
=== Developing Plugins
|
2327
|
+
|
2328
|
+
See the
|
2329
|
+
https://github.com/yt-dlp/yt-dlp-sample-plugins[yt-dlp-sample-plugins]
|
2330
|
+
repo for a template plugin package and the
|
2331
|
+
https://github.com/yt-dlp/yt-dlp/wiki/Plugin-Development[Plugin
|
2332
|
+
Development] section of the wiki for a plugin development guide.
|
2333
|
+
|
2334
|
+
All public classes with a name ending in `IE`/`PP` are imported from
|
2335
|
+
each file for extractors and postprocessors respectively. This respects
|
2336
|
+
underscore prefix (e.g. `_MyBasePluginIE` is private) and `__all__`.
|
2337
|
+
Modules can similarly be excluded by prefixing the module name with an
|
2338
|
+
underscore (e.g. `_myplugin.py`).
|
2339
|
+
|
2340
|
+
To replace an existing extractor with a subclass of one, set the
|
2341
|
+
`plugin_name` class keyword argument
|
2342
|
+
(e.g. `class MyPluginIE(ABuiltInIE, plugin_name='myplugin')` will
|
2343
|
+
replace `ABuiltInIE` with `MyPluginIE`). Since the extractor replaces
|
2344
|
+
the parent, you should exclude the subclass extractor from being
|
2345
|
+
imported separately by making it private using one of the methods
|
2346
|
+
described above.
|
2347
|
+
|
2348
|
+
If you are a plugin author, add
|
2349
|
+
https://github.com/topics/yt-dlp-plugins[yt-dlp-plugins] as a topic to
|
2350
|
+
your repository for discoverability.
|
2351
|
+
|
2352
|
+
See the
|
2353
|
+
https://github.com/yt-dlp/yt-dlp/blob/master/CONTRIBUTING.md#developer-instructions[Developer
|
2354
|
+
Instructions] on how to write and test an extractor.
|
2355
|
+
|
2356
|
+
|
2357
|
+
[role="mt-5"]
|
2358
|
+
== EMBEDDING YT-DLP
|
2359
|
+
|
2360
|
+
yt-dlp makes the best effort to be a good command-line program, and thus
|
2361
|
+
should be callable from any programming language.
|
2362
|
+
|
2363
|
+
Your program should avoid parsing the normal stdout since they may
|
2364
|
+
change in future versions. Instead, they should use options such as
|
2365
|
+
`-J`, `--print`, `--progress-template`, `--exec` etc to create console
|
2366
|
+
output that you can reliably reproduce and parse.
|
2367
|
+
|
2368
|
+
From a Python program, you can embed yt-dlp in a more powerful fashion,
|
2369
|
+
like this:
|
2370
|
+
|
2371
|
+
[source,python]
|
2372
|
+
----
|
2373
|
+
from yt_dlp import YoutubeDL
|
2374
|
+
|
2375
|
+
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
2376
|
+
with YoutubeDL() as ydl:
|
2377
|
+
ydl.download(URLS)
|
2378
|
+
----
|
2379
|
+
|
2380
|
+
Most likely, you’ll want to use various options. For a list of options
|
2381
|
+
available, have a look at
|
2382
|
+
link:yt_dlp/YoutubeDL.py#L183[`yt_dlp/YoutubeDL.py`] or
|
2383
|
+
`help(yt_dlp.YoutubeDL)` in a Python shell. If you are already familiar
|
2384
|
+
with the CLI, you can use
|
2385
|
+
https://github.com/yt-dlp/yt-dlp/blob/master/devscripts/cli_to_api.py[`devscripts/cli_to_api.py`]
|
2386
|
+
to translate any CLI switches to `YoutubeDL` params.
|
2387
|
+
|
2388
|
+
*Tip*: If you are porting your code from youtube-dl to yt-dlp, one
|
2389
|
+
important point to look out for is that we do not guarantee the return
|
2390
|
+
value of `YoutubeDL.extract_info` to be json serializable, or even be a
|
2391
|
+
dictionary. It will be dictionary-like, but if you want to ensure it is
|
2392
|
+
a serializable dictionary, pass it through `YoutubeDL.sanitize_info` as
|
2393
|
+
shown in the link:#extracting-information[example below]
|
2394
|
+
|
2395
|
+
[role="mt-4"]
|
2396
|
+
=== Embedding examples
|
2397
|
+
|
2398
|
+
[role="mt-4"]
|
2399
|
+
==== Extracting information
|
2400
|
+
|
2401
|
+
[source,python]
|
2402
|
+
----
|
2403
|
+
import json
|
2404
|
+
import yt_dlp
|
2405
|
+
|
2406
|
+
URL = 'https://www.youtube.com/watch?v=BaW_jenozKc'
|
2407
|
+
|
2408
|
+
# ℹ️ See help(yt_dlp.YoutubeDL) for a list of available options and public functions
|
2409
|
+
ydl_opts = {}
|
2410
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
2411
|
+
info = ydl.extract_info(URL, download=False)
|
2412
|
+
|
2413
|
+
# ℹ️ ydl.sanitize_info makes the info json-serializable
|
2414
|
+
print(json.dumps(ydl.sanitize_info(info)))
|
2415
|
+
----
|
2416
|
+
|
2417
|
+
[role="mt-4"]
|
2418
|
+
==== Download using an info-json
|
2419
|
+
|
2420
|
+
[source,python]
|
2421
|
+
----
|
2422
|
+
import yt_dlp
|
2423
|
+
|
2424
|
+
INFO_FILE = 'path/to/video.info.json'
|
2425
|
+
|
2426
|
+
with yt_dlp.YoutubeDL() as ydl:
|
2427
|
+
error_code = ydl.download_with_info_file(INFO_FILE)
|
2428
|
+
|
2429
|
+
print('Some videos failed to download' if error_code
|
2430
|
+
else 'All videos successfully downloaded')
|
2431
|
+
----
|
2432
|
+
|
2433
|
+
[role="mt-4"]
|
2434
|
+
==== Extract audio
|
2435
|
+
|
2436
|
+
[source,python]
|
2437
|
+
----
|
2438
|
+
import yt_dlp
|
2439
|
+
|
2440
|
+
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
2441
|
+
|
2442
|
+
ydl_opts = {
|
2443
|
+
'format': 'm4a/bestaudio/best',
|
2444
|
+
# ℹ️ See help(yt_dlp.postprocessor) for a list of available Postprocessors and their arguments
|
2445
|
+
'postprocessors': [{ # Extract audio using ffmpeg
|
2446
|
+
'key': 'FFmpegExtractAudio',
|
2447
|
+
'preferredcodec': 'm4a',
|
2448
|
+
}]
|
2449
|
+
}
|
2450
|
+
|
2451
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
2452
|
+
error_code = ydl.download(URLS)
|
2453
|
+
----
|
2454
|
+
|
2455
|
+
[role="mt-4"]
|
2456
|
+
==== Filter videos
|
2457
|
+
|
2458
|
+
[source,python]
|
2459
|
+
----
|
2460
|
+
import yt_dlp
|
2461
|
+
|
2462
|
+
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
2463
|
+
|
2464
|
+
def longer_than_a_minute(info, *, incomplete):
|
2465
|
+
"""Download only videos longer than a minute (or with unknown duration)"""
|
2466
|
+
duration = info.get('duration')
|
2467
|
+
if duration and duration < 60:
|
2468
|
+
return 'The video is too short'
|
2469
|
+
|
2470
|
+
ydl_opts = {
|
2471
|
+
'match_filter': longer_than_a_minute,
|
2472
|
+
}
|
2473
|
+
|
2474
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
2475
|
+
error_code = ydl.download(URLS)
|
2476
|
+
----
|
2477
|
+
|
2478
|
+
[role="mt-4"]
|
2479
|
+
==== Adding logger and progress hook
|
2480
|
+
|
2481
|
+
[source,python]
|
2482
|
+
----
|
2483
|
+
import yt_dlp
|
2484
|
+
|
2485
|
+
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
2486
|
+
|
2487
|
+
class MyLogger:
|
2488
|
+
def debug(self, msg):
|
2489
|
+
# For compatibility with youtube-dl, both debug and info are passed into debug
|
2490
|
+
# You can distinguish them by the prefix '[debug] '
|
2491
|
+
if msg.startswith('[debug] '):
|
2492
|
+
pass
|
2493
|
+
else:
|
2494
|
+
self.info(msg)
|
2495
|
+
|
2496
|
+
def info(self, msg):
|
2497
|
+
pass
|
2498
|
+
|
2499
|
+
def warning(self, msg):
|
2500
|
+
pass
|
2501
|
+
|
2502
|
+
def error(self, msg):
|
2503
|
+
print(msg)
|
2504
|
+
|
2505
|
+
|
2506
|
+
# ℹ️ See "progress_hooks" in help(yt_dlp.YoutubeDL)
|
2507
|
+
def my_hook(d):
|
2508
|
+
if d['status'] == 'finished':
|
2509
|
+
print('Done downloading, now post-processing ...')
|
2510
|
+
|
2511
|
+
|
2512
|
+
ydl_opts = {
|
2513
|
+
'logger': MyLogger(),
|
2514
|
+
'progress_hooks': [my_hook],
|
2515
|
+
}
|
2516
|
+
|
2517
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
2518
|
+
ydl.download(URLS)
|
2519
|
+
----
|
2520
|
+
|
2521
|
+
[role="mt-4"]
|
2522
|
+
==== Add a custom PostProcessor
|
2523
|
+
|
2524
|
+
[source,python]
|
2525
|
+
----
|
2526
|
+
import yt_dlp
|
2527
|
+
|
2528
|
+
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
2529
|
+
|
2530
|
+
# ℹ️ See help(yt_dlp.postprocessor.PostProcessor)
|
2531
|
+
class MyCustomPP(yt_dlp.postprocessor.PostProcessor):
|
2532
|
+
def run(self, info):
|
2533
|
+
self.to_screen('Doing stuff')
|
2534
|
+
return [], info
|
2535
|
+
|
2536
|
+
|
2537
|
+
with yt_dlp.YoutubeDL() as ydl:
|
2538
|
+
# ℹ️ "when" can take any value in yt_dlp.utils.POSTPROCESS_WHEN
|
2539
|
+
ydl.add_post_processor(MyCustomPP(), when='pre_process')
|
2540
|
+
ydl.download(URLS)
|
2541
|
+
----
|
2542
|
+
|
2543
|
+
[role="mt-4"]
|
2544
|
+
==== Use a custom format selector
|
2545
|
+
|
2546
|
+
[source,python]
|
2547
|
+
----
|
2548
|
+
import yt_dlp
|
2549
|
+
|
2550
|
+
URLS = ['https://www.youtube.com/watch?v=BaW_jenozKc']
|
2551
|
+
|
2552
|
+
def format_selector(ctx):
|
2553
|
+
""" Select the best video and the best audio that won't result in an mkv.
|
2554
|
+
NOTE: This is just an example and does not handle all cases """
|
2555
|
+
|
2556
|
+
# formats are already sorted worst to best
|
2557
|
+
formats = ctx.get('formats')[::-1]
|
2558
|
+
|
2559
|
+
# acodec='none' means there is no audio
|
2560
|
+
best_video = next(f for f in formats
|
2561
|
+
if f['vcodec'] != 'none' and f['acodec'] == 'none')
|
2562
|
+
|
2563
|
+
# find compatible audio extension
|
2564
|
+
audio_ext = {'mp4': 'm4a', 'webm': 'webm'}[best_video['ext']]
|
2565
|
+
# vcodec='none' means there is no video
|
2566
|
+
best_audio = next(f for f in formats if (
|
2567
|
+
f['acodec'] != 'none' and f['vcodec'] == 'none' and f['ext'] == audio_ext))
|
2568
|
+
|
2569
|
+
# These are the minimum required fields for a merged format
|
2570
|
+
yield {
|
2571
|
+
'format_id': f'{best_video["format_id"]}+{best_audio["format_id"]}',
|
2572
|
+
'ext': best_video['ext'],
|
2573
|
+
'requested_formats': [best_video, best_audio],
|
2574
|
+
# Must be + separated list of protocols
|
2575
|
+
'protocol': f'{best_video["protocol"]}+{best_audio["protocol"]}'
|
2576
|
+
}
|
2577
|
+
|
2578
|
+
|
2579
|
+
ydl_opts = {
|
2580
|
+
'format': format_selector,
|
2581
|
+
}
|
2582
|
+
|
2583
|
+
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
2584
|
+
ydl.download(URLS)
|
2585
|
+
----
|
2586
|
+
|
2587
|
+
|
2588
|
+
[role="mt-5"]
|
2589
|
+
== CHANGES FROM YOUTUBE-DL
|
2590
|
+
|
2591
|
+
[role="mt-4"]
|
2592
|
+
=== New features
|
2593
|
+
|
2594
|
+
* Forked from
|
2595
|
+
https://github.com/blackjack4494/yt-dlc/commit/f9401f2a91987068139c5f757b12fc711d4c0cee[*yt-dlc@f9401f2*]
|
2596
|
+
and merged with
|
2597
|
+
https://github.com/ytdl-org/youtube-dl/commit/a08f2b7e4567cdc50c0614ee0a4ffdff49b8b6e6[*youtube-dl@a08f2b7*]
|
2598
|
+
(https://github.com/yt-dlp/yt-dlp/issues/21[exceptions])
|
2599
|
+
* *link:#sponsorblock-options[SponsorBlock Integration]*: You can
|
2600
|
+
mark/remove sponsor sections in YouTube videos by utilizing the
|
2601
|
+
https://sponsor.ajay.app[SponsorBlock] API
|
2602
|
+
* *link:#sorting-formats[Format Sorting]*: The default format sorting
|
2603
|
+
options have been changed so that higher resolution and better codecs
|
2604
|
+
will be now preferred instead of simply using larger bitrate.
|
2605
|
+
Furthermore, you can now specify the sort order using `-S`. This allows
|
2606
|
+
for much easier format selection than what is possible by simply using
|
2607
|
+
`--format` (link:#format-selection-examples[examples])
|
2608
|
+
* *Merged with animelover1984/youtube-dl*: You get most of the features
|
2609
|
+
and improvements from
|
2610
|
+
https://github.com/animelover1984/youtube-dl[animelover1984/youtube-dl]
|
2611
|
+
including `--write-comments`, `BiliBiliSearch`, `BilibiliChannel`,
|
2612
|
+
Embedding thumbnail in mp4/ogg/opus, playlist infojson etc. Note that
|
2613
|
+
NicoNico livestreams are not available. See
|
2614
|
+
https://github.com/yt-dlp/yt-dlp/pull/31[#31] for details.
|
2615
|
+
* *YouTube improvements*:
|
2616
|
+
** Supports Clips, Stories (`ytstories:<channel UCID>`), Search
|
2617
|
+
(including filters)***, YouTube Music Search, Channel-specific search,
|
2618
|
+
Search prefixes (`ytsearch:`, `ytsearchdate:`)***, Mixes, and Feeds
|
2619
|
+
(`:ytfav`, `:ytwatchlater`, `:ytsubs`, `:ythistory`, `:ytrec`,
|
2620
|
+
`:ytnotif`)
|
2621
|
+
** Fix for https://github.com/ytdl-org/youtube-dl/issues/29326[n-sig
|
2622
|
+
based throttling] ***
|
2623
|
+
** Supports some (but not all) age-gated content without cookies
|
2624
|
+
** Download livestreams from the start using `--live-from-start`
|
2625
|
+
(_experimental_)
|
2626
|
+
** Channel URLs download all uploads of the channel, including shorts
|
2627
|
+
and live
|
2628
|
+
* *Cookies from browser*: Cookies can be automatically extracted from
|
2629
|
+
all major web browsers using
|
2630
|
+
`--cookies-from-browser BROWSER[+KEYRING][:PROFILE][::CONTAINER]`
|
2631
|
+
* *Download time range*: Videos can be downloaded partially based on
|
2632
|
+
either timestamps or chapters using `--download-sections`
|
2633
|
+
* *Split video by chapters*: Videos can be split into multiple files
|
2634
|
+
based on chapters using `--split-chapters`
|
2635
|
+
* *Multi-threaded fragment downloads*: Download multiple fragments of
|
2636
|
+
m3u8/mpd videos in parallel. Use `--concurrent-fragments` (`-N`) option
|
2637
|
+
to set the number of threads used
|
2638
|
+
* *Aria2c with HLS/DASH*: You can use `aria2c` as the external
|
2639
|
+
downloader for DASH(mpd) and HLS(m3u8) formats
|
2640
|
+
* *New and fixed extractors*: Many new extractors have been added and a
|
2641
|
+
lot of existing ones have been fixed. See the
|
2642
|
+
link:Changelog.md[changelog] or the link:supportedsites.md[list of
|
2643
|
+
supported sites]
|
2644
|
+
* *New MSOs*: Philo, Spectrum, SlingTV, Cablevision, RCN etc.
|
2645
|
+
* *Subtitle extraction from manifests*: Subtitles can be extracted from
|
2646
|
+
streaming media manifests. See
|
2647
|
+
https://github.com/yt-dlp/yt-dlp/commit/be6202f12b97858b9d716e608394b51065d0419f[commit/be6202f]
|
2648
|
+
for details
|
2649
|
+
* *Multiple paths and output templates*: You can give different
|
2650
|
+
link:#output-template[output templates] and download paths for different
|
2651
|
+
types of files. You can also set a temporary path where intermediary
|
2652
|
+
files are downloaded to using `--paths` (`-P`)
|
2653
|
+
* *Portable Configuration*: Configuration files are automatically loaded
|
2654
|
+
from the home and root directories. See
|
2655
|
+
link:#configuration[CONFIGURATION] for details
|
2656
|
+
* *Output template improvements*: Output templates can now have
|
2657
|
+
date-time formatting, numeric offsets, object traversal etc. See
|
2658
|
+
link:#output-template[output template] for details. Even more advanced
|
2659
|
+
operations can also be done with the help of `--parse-metadata` and
|
2660
|
+
`--replace-in-metadata`
|
2661
|
+
* *Other new options*: Many new options have been added such as
|
2662
|
+
`--alias`, `--print`, `--concat-playlist`, `--wait-for-video`,
|
2663
|
+
`--retry-sleep`, `--sleep-requests`, `--convert-thumbnails`,
|
2664
|
+
`--force-download-archive`, `--force-overwrites`, `--break-match-filter`
|
2665
|
+
etc
|
2666
|
+
* *Improvements*: Regex and other operators in
|
2667
|
+
`--format`/`--match-filter`, multiple `--postprocessor-args` and
|
2668
|
+
`--downloader-args`, faster archive checking, more
|
2669
|
+
link:#format-selection[format selection options], merge
|
2670
|
+
multi-video/audio, multiple `--config-locations`, `--exec` at different
|
2671
|
+
stages, etc
|
2672
|
+
* *Plugins*: Extractors and PostProcessors can be loaded from an
|
2673
|
+
external file. See link:#plugins[plugins] for details
|
2674
|
+
* *Self updater*: The releases can be updated using `yt-dlp -U`, and
|
2675
|
+
downgraded using `--update-to` if required
|
2676
|
+
* *Automated builds*: link:#update-channels[Nightly/master builds] can
|
2677
|
+
be used with `--update-to nightly` and `--update-to master`
|
2678
|
+
|
2679
|
+
See link:Changelog.md[changelog] or
|
2680
|
+
https://github.com/yt-dlp/yt-dlp/commits[commits] for the full list of
|
2681
|
+
changes
|
2682
|
+
|
2683
|
+
Features marked with a *** have been back-ported to youtube-dl
|
2684
|
+
|
2685
|
+
[role="mt-4"]
|
2686
|
+
=== Differences in default behavior
|
2687
|
+
|
2688
|
+
Some of yt-dlp’s default options are different from that of youtube-dl
|
2689
|
+
and youtube-dlc:
|
2690
|
+
|
2691
|
+
* yt-dlp supports only link:##[Python 3.8+], and _may_ remove support
|
2692
|
+
for more versions as they
|
2693
|
+
https://devguide.python.org/versions/#python-release-cycle[become EOL];
|
2694
|
+
while
|
2695
|
+
https://github.com/ytdl-org/youtube-dl/issues/30568#issue-1118238743[youtube-dl
|
2696
|
+
still supports Python 2.6+ and 3.2+]
|
2697
|
+
* The options `--auto-number` (`-A`), `--title` (`-t`) and `--literal`
|
2698
|
+
(`-l`), no longer work. See link:#Removed[removed options] for details
|
2699
|
+
* `avconv` is not supported as an alternative to `ffmpeg`
|
2700
|
+
* yt-dlp stores config files in slightly different locations to
|
2701
|
+
youtube-dl. See link:#configuration[CONFIGURATION] for a list of correct
|
2702
|
+
locations
|
2703
|
+
* The default link:#output-template[output template] is
|
2704
|
+
`%(title)s [%(id)s].%(ext)s`. There is no real reason for this change.
|
2705
|
+
This was changed before yt-dlp was ever made public and now there are no
|
2706
|
+
plans to change it back to `%(title)s-%(id)s.%(ext)s`. Instead, you may
|
2707
|
+
use `--compat-options filename`
|
2708
|
+
* The default link:#sorting-formats[format sorting] is different from
|
2709
|
+
youtube-dl and prefers higher resolution and better codecs rather than
|
2710
|
+
higher bitrates. You can use the `--format-sort` option to change this
|
2711
|
+
to any order you prefer, or use `--compat-options format-sort` to use
|
2712
|
+
youtube-dl’s sorting order
|
2713
|
+
* The default format selector is `bv*+ba/b`. This means that if a
|
2714
|
+
combined video + audio format that is better than the best video-only
|
2715
|
+
format is found, the former will be preferred. Use `-f bv+ba/b` or
|
2716
|
+
`--compat-options format-spec` to revert this
|
2717
|
+
* Unlike youtube-dlc, yt-dlp does not allow merging multiple audio/video
|
2718
|
+
streams into one file by default (since this conflicts with the use of
|
2719
|
+
`-f bv*+ba`). If needed, this feature must be enabled using
|
2720
|
+
`--audio-multistreams` and `--video-multistreams`. You can also use
|
2721
|
+
`--compat-options multistreams` to enable both
|
2722
|
+
* `--no-abort-on-error` is enabled by default. Use `--abort-on-error` or
|
2723
|
+
`--compat-options abort-on-error` to abort on errors instead
|
2724
|
+
* When writing metadata files such as thumbnails, description or
|
2725
|
+
infojson, the same information (if available) is also written for
|
2726
|
+
playlists. Use `--no-write-playlist-metafiles` or
|
2727
|
+
`--compat-options no-playlist-metafiles` to not write these files
|
2728
|
+
* `--add-metadata` attaches the `infojson` to `mkv` files in addition to
|
2729
|
+
writing the metadata when used with `--write-info-json`. Use
|
2730
|
+
`--no-embed-info-json` or `--compat-options no-attach-info-json` to
|
2731
|
+
revert this
|
2732
|
+
* Some metadata are embedded into different fields when using
|
2733
|
+
`--add-metadata` as compared to youtube-dl. Most notably, `comment`
|
2734
|
+
field contains the `webpage_url` and `synopsis` contains the
|
2735
|
+
`description`. You can link:#modifying-metadata[use `--parse-metadata`]
|
2736
|
+
to modify this to your liking or use `--compat-options embed-metadata`
|
2737
|
+
to revert this
|
2738
|
+
* `playlist_index` behaves differently when used with options like
|
2739
|
+
`--playlist-reverse` and `--playlist-items`. See
|
2740
|
+
https://github.com/yt-dlp/yt-dlp/issues/302[#302] for details. You can
|
2741
|
+
use `--compat-options playlist-index` if you want to keep the earlier
|
2742
|
+
behavior
|
2743
|
+
* The output of `-F` is listed in a new format. Use
|
2744
|
+
`--compat-options list-formats` to revert this
|
2745
|
+
* Live chats (if available) are considered as subtitles. Use
|
2746
|
+
`--sub-langs all,-live_chat` to download all subtitles except live chat.
|
2747
|
+
You can also use `--compat-options no-live-chat` to prevent any live
|
2748
|
+
chat/danmaku from downloading
|
2749
|
+
* YouTube channel URLs download all uploads of the channel. To download
|
2750
|
+
only the videos in a specific tab, pass the tab’s URL. If the channel
|
2751
|
+
does not show the requested tab, an error will be raised. Also, `/live`
|
2752
|
+
URLs raise an error if there are no live videos instead of silently
|
2753
|
+
downloading the entire channel. You may use
|
2754
|
+
`--compat-options no-youtube-channel-redirect` to revert all these
|
2755
|
+
redirections
|
2756
|
+
* Unavailable videos are also listed for YouTube playlists. Use
|
2757
|
+
`--compat-options no-youtube-unavailable-videos` to remove this
|
2758
|
+
* The upload dates extracted from YouTube are in UTC
|
2759
|
+
https://github.com/yt-dlp/yt-dlp/blob/89e4d86171c7b7c997c77d4714542e0383bf0db0/yt_dlp/extractor/youtube.py#L3898-L3900[when
|
2760
|
+
available]. Use `--compat-options no-youtube-prefer-utc-upload-date` to
|
2761
|
+
prefer the non-UTC upload date.
|
2762
|
+
* If `ffmpeg` is used as the downloader, the downloading and merging of
|
2763
|
+
formats happen in a single step when possible. Use
|
2764
|
+
`--compat-options no-direct-merge` to revert this
|
2765
|
+
* Thumbnail embedding in `mp4` is done with mutagen if possible. Use
|
2766
|
+
`--compat-options embed-thumbnail-atomicparsley` to force the use of
|
2767
|
+
AtomicParsley instead
|
2768
|
+
* Some internal metadata such as filenames are removed by default from
|
2769
|
+
the infojson. Use `--no-clean-infojson` or
|
2770
|
+
`--compat-options no-clean-infojson` to revert this
|
2771
|
+
* When `--embed-subs` and `--write-subs` are used together, the
|
2772
|
+
subtitles are written to disk and also embedded in the media file. You
|
2773
|
+
can use just `--embed-subs` to embed the subs and automatically delete
|
2774
|
+
the separate file. See
|
2775
|
+
https://github.com/yt-dlp/yt-dlp/issues/630#issuecomment-893659460[#630
|
2776
|
+
(comment)] for more info. `--compat-options no-keep-subs` can be used to
|
2777
|
+
revert this
|
2778
|
+
* `certifi` will be used for SSL root certificates, if installed. If you
|
2779
|
+
want to use system certificates (e.g. self-signed), use
|
2780
|
+
`--compat-options no-certifi`
|
2781
|
+
* yt-dlp’s sanitization of invalid characters in filenames is
|
2782
|
+
different/smarter than in youtube-dl. You can use
|
2783
|
+
`--compat-options filename-sanitization` to revert to youtube-dl’s
|
2784
|
+
behavior
|
2785
|
+
* [line-through]*yt-dlp tries to parse the external downloader outputs
|
2786
|
+
into the standard progress output if possible (Currently implemented:
|
2787
|
+
https://github.com/yt-dlp/yt-dlp/issues/5931[aria2c]). You can use
|
2788
|
+
`--compat-options no-external-downloader-progress` to get the downloader
|
2789
|
+
output as-is*
|
2790
|
+
* yt-dlp versions between 2021.09.01 and 2023.01.02 applies
|
2791
|
+
`--match-filter` to nested playlists. This was an unintentional
|
2792
|
+
side-effect of
|
2793
|
+
https://github.com/yt-dlp/yt-dlp/commit/8f18aca8717bb0dd49054555af8d386e5eda3a88[8f18ac]
|
2794
|
+
and is fixed in
|
2795
|
+
https://github.com/yt-dlp/yt-dlp/commit/d7b460d0e5fc710950582baed2e3fc616ed98a80[d7b460].
|
2796
|
+
Use `--compat-options playlist-match-filter` to revert this
|
2797
|
+
* yt-dlp versions between 2021.11.10 and 2023.06.21 estimated
|
2798
|
+
`filesize_approx` values for fragmented/manifest formats. This was added
|
2799
|
+
for convenience in
|
2800
|
+
https://github.com/yt-dlp/yt-dlp/commit/f2fe69c7b0d208bdb1f6292b4ae92bc1e1a7444a[f2fe69],
|
2801
|
+
but was reverted in
|
2802
|
+
https://github.com/yt-dlp/yt-dlp/commit/0dff8e4d1e6e9fb938f4256ea9af7d81f42fd54f[0dff8e]
|
2803
|
+
due to the potentially extreme inaccuracy of the estimated values. Use
|
2804
|
+
`--compat-options manifest-filesize-approx` to keep extracting the
|
2805
|
+
estimated values
|
2806
|
+
* yt-dlp uses modern http client backends such as `requests`. Use
|
2807
|
+
`--compat-options prefer-legacy-http-handler` to prefer the legacy http
|
2808
|
+
handler (`urllib`) to be used for standard http requests.
|
2809
|
+
* The sub-modules `swfinterp`, `casefold` are removed.
|
2810
|
+
* Passing `--simulate` (or calling `extract_info` with `download=False`)
|
2811
|
+
no longer alters the default format selection. See
|
2812
|
+
https://github.com/yt-dlp/yt-dlp/issues/9843[#9843] for details.
|
2813
|
+
|
2814
|
+
For ease of use, a few more compat options are available:
|
2815
|
+
|
2816
|
+
* `--compat-options all`: Use all compat options (*Do NOT use this!*)
|
2817
|
+
* `--compat-options youtube-dl`: Same as
|
2818
|
+
`--compat-options all,-multistreams,-playlist-match-filter,-manifest-filesize-approx,-allow-unsafe-ext`
|
2819
|
+
* `--compat-options youtube-dlc`: Same as
|
2820
|
+
`--compat-options all,-no-live-chat,-no-youtube-channel-redirect,-playlist-match-filter,-manifest-filesize-approx,-allow-unsafe-ext`
|
2821
|
+
* `--compat-options 2021`: Same as
|
2822
|
+
`--compat-options 2022,no-certifi,filename-sanitization,no-youtube-prefer-utc-upload-date`
|
2823
|
+
* `--compat-options 2022`: Same as
|
2824
|
+
`--compat-options 2023,playlist-match-filter,no-external-downloader-progress,prefer-legacy-http-handler,manifest-filesize-approx`
|
2825
|
+
* `--compat-options 2023`: Currently does nothing. Use this to enable
|
2826
|
+
all future compat options
|
2827
|
+
|
2828
|
+
The following compat options restore vulnerable behavior from before
|
2829
|
+
security patches:
|
2830
|
+
|
2831
|
+
* `--compat-options allow-unsafe-ext`: Allow files with any extension
|
2832
|
+
(including unsafe ones) to be downloaded
|
2833
|
+
(https://github.com/yt-dlp/yt-dlp/security/advisories/GHSA-79w7-vh3h-8g4j[GHSA-79w7-vh3h-8g4j])
|
2834
|
+
+
|
2835
|
+
____
|
2836
|
+
:warning: Only use if a valid file download is rejected because its
|
2837
|
+
extension is detected as uncommon
|
2838
|
+
|
2839
|
+
*This option can enable remote code execution! Consider
|
2840
|
+
https://github.com/yt-dlp/yt-dlp/issues/new/choose[opening an issue]
|
2841
|
+
instead!*
|
2842
|
+
____
|
2843
|
+
|
2844
|
+
[role="mt-4"]
|
2845
|
+
=== Deprecated options
|
2846
|
+
|
2847
|
+
These are all the deprecated options and the current alternative to
|
2848
|
+
achieve the same effect
|
2849
|
+
|
2850
|
+
[role="mt-4"]
|
2851
|
+
==== Almost redundant options
|
2852
|
+
|
2853
|
+
While these options are almost the same as their new counterparts, there
|
2854
|
+
are some differences that prevents them being redundant
|
2855
|
+
|
2856
|
+
....
|
2857
|
+
-j, --dump-json --print "%()j"
|
2858
|
+
-F, --list-formats --print formats_table
|
2859
|
+
--list-thumbnails --print thumbnails_table --print playlist:thumbnails_table
|
2860
|
+
--list-subs --print automatic_captions_table --print subtitles_table
|
2861
|
+
....
|
2862
|
+
|
2863
|
+
[role="mt-4"]
|
2864
|
+
==== Redundant options
|
2865
|
+
|
2866
|
+
While these options are redundant, they are still expected to be used
|
2867
|
+
due to their ease of use
|
2868
|
+
|
2869
|
+
....
|
2870
|
+
--get-description --print description
|
2871
|
+
--get-duration --print duration_string
|
2872
|
+
--get-filename --print filename
|
2873
|
+
--get-format --print format
|
2874
|
+
--get-id --print id
|
2875
|
+
--get-thumbnail --print thumbnail
|
2876
|
+
-e, --get-title --print title
|
2877
|
+
-g, --get-url --print urls
|
2878
|
+
--match-title REGEX --match-filter "title ~= (?i)REGEX"
|
2879
|
+
--reject-title REGEX --match-filter "title !~= (?i)REGEX"
|
2880
|
+
--min-views COUNT --match-filter "view_count >=? COUNT"
|
2881
|
+
--max-views COUNT --match-filter "view_count <=? COUNT"
|
2882
|
+
--break-on-reject Use --break-match-filter
|
2883
|
+
--user-agent UA --add-header "User-Agent:UA"
|
2884
|
+
--referer URL --add-header "Referer:URL"
|
2885
|
+
--playlist-start NUMBER -I NUMBER:
|
2886
|
+
--playlist-end NUMBER -I :NUMBER
|
2887
|
+
--playlist-reverse -I ::-1
|
2888
|
+
--no-playlist-reverse Default
|
2889
|
+
--no-colors --color no_color
|
2890
|
+
....
|
2891
|
+
|
2892
|
+
[role="mt-4"]
|
2893
|
+
==== Not recommended
|
2894
|
+
|
2895
|
+
While these options still work, their use is not recommended since there
|
2896
|
+
are other alternatives to achieve the same
|
2897
|
+
|
2898
|
+
....
|
2899
|
+
--force-generic-extractor --ies generic,default
|
2900
|
+
--exec-before-download CMD --exec "before_dl:CMD"
|
2901
|
+
--no-exec-before-download --no-exec
|
2902
|
+
--all-formats -f all
|
2903
|
+
--all-subs --sub-langs all --write-subs
|
2904
|
+
--print-json -j --no-simulate
|
2905
|
+
--autonumber-size NUMBER Use string formatting, e.g. %(autonumber)03d
|
2906
|
+
--autonumber-start NUMBER Use internal field formatting like %(autonumber+NUMBER)s
|
2907
|
+
--id -o "%(id)s.%(ext)s"
|
2908
|
+
--metadata-from-title FORMAT --parse-metadata "%(title)s:FORMAT"
|
2909
|
+
--hls-prefer-native --downloader "m3u8:native"
|
2910
|
+
--hls-prefer-ffmpeg --downloader "m3u8:ffmpeg"
|
2911
|
+
--list-formats-old --compat-options list-formats (Alias: --no-list-formats-as-table)
|
2912
|
+
--list-formats-as-table --compat-options -list-formats [Default] (Alias: --no-list-formats-old)
|
2913
|
+
--youtube-skip-dash-manifest --extractor-args "youtube:skip=dash" (Alias: --no-youtube-include-dash-manifest)
|
2914
|
+
--youtube-skip-hls-manifest --extractor-args "youtube:skip=hls" (Alias: --no-youtube-include-hls-manifest)
|
2915
|
+
--youtube-include-dash-manifest Default (Alias: --no-youtube-skip-dash-manifest)
|
2916
|
+
--youtube-include-hls-manifest Default (Alias: --no-youtube-skip-hls-manifest)
|
2917
|
+
--geo-bypass --xff "default"
|
2918
|
+
--no-geo-bypass --xff "never"
|
2919
|
+
--geo-bypass-country CODE --xff CODE
|
2920
|
+
--geo-bypass-ip-block IP_BLOCK --xff IP_BLOCK
|
2921
|
+
....
|
2922
|
+
|
2923
|
+
[role="mt-4"]
|
2924
|
+
==== Developer options
|
2925
|
+
|
2926
|
+
These options are not intended to be used by the end-user
|
2927
|
+
|
2928
|
+
....
|
2929
|
+
--test Download only part of video for testing extractors
|
2930
|
+
--load-pages Load pages dumped by --write-pages
|
2931
|
+
--youtube-print-sig-code For testing youtube signatures
|
2932
|
+
--allow-unplayable-formats List unplayable formats also
|
2933
|
+
--no-allow-unplayable-formats Default
|
2934
|
+
....
|
2935
|
+
|
2936
|
+
[role="mt-4"]
|
2937
|
+
==== Old aliases
|
2938
|
+
|
2939
|
+
These are aliases that are no longer documented for various reasons
|
2940
|
+
|
2941
|
+
....
|
2942
|
+
--avconv-location --ffmpeg-location
|
2943
|
+
--clean-infojson --clean-info-json
|
2944
|
+
--cn-verification-proxy URL --geo-verification-proxy URL
|
2945
|
+
--dump-headers --print-traffic
|
2946
|
+
--dump-intermediate-pages --dump-pages
|
2947
|
+
--force-write-download-archive --force-write-archive
|
2948
|
+
--load-info --load-info-json
|
2949
|
+
--no-clean-infojson --no-clean-info-json
|
2950
|
+
--no-split-tracks --no-split-chapters
|
2951
|
+
--no-write-srt --no-write-subs
|
2952
|
+
--prefer-unsecure --prefer-insecure
|
2953
|
+
--rate-limit RATE --limit-rate RATE
|
2954
|
+
--split-tracks --split-chapters
|
2955
|
+
--srt-lang LANGS --sub-langs LANGS
|
2956
|
+
--trim-file-names LENGTH --trim-filenames LENGTH
|
2957
|
+
--write-srt --write-subs
|
2958
|
+
--yes-overwrites --force-overwrites
|
2959
|
+
....
|
2960
|
+
|
2961
|
+
[role="mt-4"]
|
2962
|
+
==== Sponskrub Options
|
2963
|
+
|
2964
|
+
Support for https://github.com/faissaloo/SponSkrub[SponSkrub] has been
|
2965
|
+
deprecated in favor of the `--sponsorblock` options
|
2966
|
+
|
2967
|
+
....
|
2968
|
+
--sponskrub --sponsorblock-mark all
|
2969
|
+
--no-sponskrub --no-sponsorblock
|
2970
|
+
--sponskrub-cut --sponsorblock-remove all
|
2971
|
+
--no-sponskrub-cut --sponsorblock-remove -all
|
2972
|
+
--sponskrub-force Not applicable
|
2973
|
+
--no-sponskrub-force Not applicable
|
2974
|
+
--sponskrub-location Not applicable
|
2975
|
+
--sponskrub-args Not applicable
|
2976
|
+
....
|
2977
|
+
|
2978
|
+
[role="mt-4"]
|
2979
|
+
==== No longer supported
|
2980
|
+
|
2981
|
+
These options may no longer work as intended
|
2982
|
+
|
2983
|
+
....
|
2984
|
+
--prefer-avconv avconv is not officially supported by yt-dlp (Alias: --no-prefer-ffmpeg)
|
2985
|
+
--prefer-ffmpeg Default (Alias: --no-prefer-avconv)
|
2986
|
+
-C, --call-home Not implemented
|
2987
|
+
--no-call-home Default
|
2988
|
+
--include-ads No longer supported
|
2989
|
+
--no-include-ads Default
|
2990
|
+
--write-annotations No supported site has annotations now
|
2991
|
+
--no-write-annotations Default
|
2992
|
+
--compat-options seperate-video-versions No longer needed
|
2993
|
+
--compat-options no-youtube-prefer-utc-upload-date No longer supported
|
2994
|
+
....
|
2995
|
+
|
2996
|
+
[role="mt-4"]
|
2997
|
+
==== Removed
|
2998
|
+
|
2999
|
+
These options were deprecated since 2014 and have now been entirely
|
3000
|
+
removed
|
3001
|
+
|
3002
|
+
....
|
3003
|
+
-A, --auto-number -o "%(autonumber)s-%(id)s.%(ext)s"
|
3004
|
+
-t, -l, --title, --literal -o "%(title)s-%(id)s.%(ext)s"
|
3005
|
+
....
|
3006
|
+
|
3007
|
+
|
3008
|
+
[role="mt-5"]
|
3009
|
+
== CONTRIBUTING
|
3010
|
+
|
3011
|
+
See link:CONTRIBUTING.md#contributing-to-yt-dlp[CONTRIBUTING.md] for
|
3012
|
+
instructions on link:CONTRIBUTING.md#opening-an-issue[Opening an Issue]
|
3013
|
+
and link:CONTRIBUTING.md#developer-instructions[Contributing code to the
|
3014
|
+
project]
|
3015
|
+
|
3016
|
+
|
3017
|
+
[role="mt-5"]
|
3018
|
+
== WIKI
|
3019
|
+
|
3020
|
+
See the https://github.com/yt-dlp/yt-dlp/wiki[Wiki] for more information
|