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.
Files changed (193) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_news_panel_posts.html +1 -1
  3. data/_includes/themes/j1/layouts/layout_resource_generator.html +1 -4
  4. data/_includes/themes/j1/procedures/blocks/footer/boxes/social_media_icons.proc +24 -23
  5. data/_includes/themes/j1/procedures/layouts/content_writer.proc +4 -3
  6. data/_includes/themes/j1/procedures/layouts/default_writer.proc +37 -6
  7. data/_includes/themes/j1/procedures/layouts/module_writer.proc +31 -95
  8. data/_includes/themes/j1/procedures/layouts/resource_writer.proc +51 -29
  9. data/assets/data/amplitude.28.html +887 -0
  10. data/assets/data/amplitude.29.html +923 -0
  11. data/assets/data/amplitude.html +311 -46
  12. data/assets/data/banner.html +9 -7
  13. data/assets/data/masterslider.html +128 -7
  14. data/assets/data/panel.html +16 -65
  15. data/assets/theme/j1/adapter/js/amplitude.23.js +1165 -0
  16. data/assets/theme/j1/adapter/js/amplitude.24.js +1164 -0
  17. data/assets/theme/j1/adapter/js/amplitude.25.js +1268 -0
  18. data/assets/theme/j1/adapter/js/amplitude.js +294 -117
  19. data/assets/theme/j1/adapter/js/attic.js +14 -11
  20. data/assets/theme/j1/adapter/js/docsearch.js +2 -2
  21. data/assets/theme/j1/adapter/js/fab.js +2 -2
  22. data/assets/theme/j1/adapter/js/j1.js +8 -8
  23. data/assets/theme/j1/adapter/js/lazyLoader.js +60 -10
  24. data/assets/theme/j1/adapter/js/masonry.js +1 -1
  25. data/assets/theme/j1/adapter/js/masterslider.js +2 -2
  26. data/assets/theme/j1/adapter/js/particles.js +2 -2
  27. data/assets/theme/j1/adapter/js/scroller.js +2 -2
  28. data/assets/theme/j1/adapter/js/slick.js +2 -2
  29. data/assets/theme/j1/adapter/js/themes.js +1 -1
  30. data/assets/theme/j1/adapter/js/translator.js +2 -2
  31. data/assets/theme/j1/adapter/js/waves.js +1 -1
  32. data/assets/theme/j1/core/css/animate.css +1634 -1070
  33. data/assets/theme/j1/core/css/animate.css.map +1 -0
  34. data/assets/theme/j1/core/css/animate.min.css +2 -1
  35. data/assets/theme/j1/core/css/animate.min.css.map +1 -0
  36. data/assets/theme/j1/core/css/icon-fonts/fontawesome.css +3060 -1538
  37. data/assets/theme/j1/core/css/icon-fonts/fontawesome.css.map +1 -0
  38. data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css +2 -1
  39. data/assets/theme/j1/core/css/icon-fonts/fontawesome.min.css.map +1 -0
  40. data/assets/theme/j1/core/css/icon-fonts/iconify.css +2308 -1153
  41. data/assets/theme/j1/core/css/icon-fonts/iconify.css.map +1 -0
  42. data/assets/theme/j1/core/css/icon-fonts/iconify.min.css +2 -1
  43. data/assets/theme/j1/core/css/icon-fonts/iconify.min.css.map +1 -0
  44. data/assets/theme/j1/core/css/icon-fonts/mdi.css +16716 -8423
  45. data/assets/theme/j1/core/css/icon-fonts/mdi.css.map +1 -0
  46. data/assets/theme/j1/core/css/icon-fonts/mdi.min.css +2 -1
  47. data/assets/theme/j1/core/css/icon-fonts/mdi.min.css.map +1 -0
  48. data/assets/theme/j1/core/css/icon-fonts/mdib.css +5554 -2766
  49. data/assets/theme/j1/core/css/icon-fonts/mdib.css.map +1 -0
  50. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css +2 -1
  51. data/assets/theme/j1/core/css/icon-fonts/mdib.min.css.map +1 -0
  52. data/assets/theme/j1/core/css/icon-fonts/mdil.css +742 -441
  53. data/assets/theme/j1/core/css/icon-fonts/mdil.css.map +1 -0
  54. data/assets/theme/j1/core/css/icon-fonts/mdil.min.css +2 -1
  55. data/assets/theme/j1/core/css/icon-fonts/mdil.min.css.map +1 -0
  56. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css +6552 -3980
  57. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.css.map +1 -0
  58. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css +2 -5
  59. data/assets/theme/j1/core/css/themes/bootstrap/bootstrap.min.css.map +1 -0
  60. data/assets/theme/j1/core/css/themes/unodark/bootstrap.css +6818 -4131
  61. data/assets/theme/j1/core/css/themes/unodark/bootstrap.css.map +1 -0
  62. data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css +2 -5
  63. data/assets/theme/j1/core/css/themes/unodark/bootstrap.min.css.map +1 -0
  64. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css +18568 -11577
  65. data/assets/theme/j1/core/css/themes/unolight/bootstrap.css.map +1 -0
  66. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css +2 -35
  67. data/assets/theme/j1/core/css/themes/unolight/bootstrap.min.css.map +1 -0
  68. data/assets/theme/j1/core/css/vendor.css +1771 -1043
  69. data/assets/theme/j1/core/css/vendor.css.map +1 -0
  70. data/assets/theme/j1/core/css/vendor.min.css +2 -1
  71. data/assets/theme/j1/core/css/vendor.min.css.map +1 -0
  72. data/assets/theme/j1/core/js/template.js +399 -447
  73. data/assets/theme/j1/core/js/template.min.js +7 -7
  74. data/assets/theme/j1/core/js/template.min.js.map +1 -1
  75. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/amplitude.css +4 -2
  76. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.css +39 -4
  77. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/compact.min.css +1 -1
  78. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.css +57 -17
  79. data/assets/theme/j1/modules/amplitudejs/css/theme/uno/dark/player/large.min.css +1 -1
  80. data/assets/theme/j1/modules/amplitudejs/icons/player/blue/pause.png +0 -0
  81. data/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.png +0 -0
  82. data/assets/theme/j1/modules/amplitudejs/icons/player/blue/play.svg +87 -0
  83. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-backward.svg +60 -0
  84. data/assets/theme/j1/modules/amplitudejs/icons/player/dark/skip-forward.svg +59 -0
  85. data/assets/theme/j1/modules/amplitudejs/js/amplitude.js +65 -21
  86. data/assets/theme/j1/modules/amplitudejs/js/amplitude.min.js +1 -1
  87. data/assets/theme/j1/modules/amplitudejs/js/tech/ytp.js +113 -0
  88. data/assets/theme/j1/modules/iconPicker/js/universal-icon-picker.js +471 -471
  89. data/assets/theme/j1/modules/j1LazyLoader/LICENSE +21 -0
  90. data/assets/theme/j1/modules/j1LazyLoader/js/j1Lazy.js +870 -0
  91. data/assets/theme/j1/modules/js-cookies/js/js.cookie.js +3 -3
  92. data/assets/theme/j1/modules/lazyCssLoader/js/main.0.js +166 -0
  93. data/assets/theme/j1/modules/lazyCssLoader/js/main.1.js +65 -0
  94. data/assets/theme/j1/modules/lazyCssLoader/js/main.js +66 -0
  95. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/examplePlugin.js +13 -0
  96. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/my-plugin.js +25 -0
  97. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/plugin-interface.js +9 -0
  98. data/assets/theme/j1/modules/lazyCssLoader/js/plugins/pluginA.js +46 -0
  99. data/assets/theme/j1/modules/lazyLoader/js/plugins/README.md +324 -0
  100. data/assets/theme/j1/modules/lazyLoader/js/plugins/jquery.lazy.picture.js +188 -0
  101. data/assets/theme/j1/modules/lightGallery/js/lightgallery.js +1 -1
  102. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.0.js +794 -0
  103. data/assets/theme/j1/modules/lightGallery/js/plugins/lg-video.js +151 -67
  104. data/assets/theme/j1/modules/slimSelect/js/select.js +1 -1
  105. data/assets/theme/j1/modules/slimSelect/js/select.min.js +3 -3
  106. data/assets/theme/j1/modules/themeSwitcher/js/switcher.js +2 -1
  107. data/assets/theme/j1/modules/videojs/js/plugins/players/dm/dailymotion.min.js +1 -1
  108. data/assets/theme/j1/modules/videojs/js/plugins/players/dm/icon/scalable/dailymotion.svg +62 -0
  109. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/v3.0.0/youtube.js +832 -0
  110. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/v3.0.0/youtube.min.js +17 -0
  111. data/assets/theme/j1/modules/videojs/js/plugins/players/yt/youtube.min.js +1 -1
  112. data/assets/theme/j1/modules/videojs/js/video.js +2 -2
  113. data/lib/j1/version.rb +1 -1
  114. data/lib/starter_web/README.md +577 -560
  115. data/lib/starter_web/_config.yml +2 -2
  116. data/lib/starter_web/_data/blocks/footer.yml +10 -5
  117. data/lib/starter_web/_data/blocks/panel.yml +2 -2
  118. data/lib/starter_web/_data/layouts/default.yml +14 -3
  119. data/lib/starter_web/_data/modules/amplitude.yml +145 -0
  120. data/lib/starter_web/_data/modules/defaults/amplitude.yml +29 -7
  121. data/lib/starter_web/_data/modules/defaults/lazyLoader.yml +2 -2
  122. data/lib/starter_web/_data/modules/gallery.yml +136 -0
  123. data/lib/starter_web/_data/modules/lazyLoader.0.yml +118 -0
  124. data/lib/starter_web/_data/modules/lazyLoader.yml +68 -31
  125. data/lib/starter_web/_data/modules/masonry.yml +4 -4
  126. data/lib/starter_web/_data/modules/masterslider.yml +118 -12
  127. data/lib/starter_web/_data/modules/navigator_menu.yml +831 -803
  128. data/lib/starter_web/_data/resources.yml +154 -190
  129. data/lib/starter_web/_data/templates/feed.xml +1 -1
  130. data/lib/starter_web/_includes/attributes.asciidoc +1 -0
  131. data/lib/starter_web/_plugins/asciidoctor/amplitude-block.rb +1 -1
  132. data/lib/starter_web/_plugins/asciidoctor/dailymotion-block.rb +1 -1
  133. data/lib/starter_web/_plugins/asciidoctor/gallery-block.rb +4 -2
  134. data/lib/starter_web/_plugins/asciidoctor/masonry-block.rb +1 -1
  135. data/lib/starter_web/_plugins/asciidoctor/videojs-block.rb +58 -46
  136. data/lib/starter_web/_plugins/asciidoctor/vimeo-block.rb +26 -19
  137. data/lib/starter_web/_plugins/asciidoctor/youtube-block.rb +30 -40
  138. data/lib/starter_web/_plugins/index/lunr.rb +1 -1
  139. data/lib/starter_web/assets/image/icons/lanus/favicon.ico +0 -0
  140. data/lib/starter_web/assets/image/icons/lanus/lanus-512x512.png +0 -0
  141. data/lib/starter_web/assets/image/icons/lanus/lanus.ico +0 -0
  142. data/lib/starter_web/assets/image/icons/lanus/lanus.png +0 -0
  143. data/lib/starter_web/assets/image/icons/lanus/scalable/lanus.svg +76 -0
  144. data/lib/starter_web/assets/image/icons/lanus/scalable/lanus_sw.svg +62 -0
  145. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28 - social.svg +86 -0
  146. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x-28.svg +64 -0
  147. data/lib/starter_web/assets/image/modules/icons/social/scalable/icon-twitter-x.svg +1 -0
  148. data/lib/starter_web/assets/image/modules/icons/social/twitter_x.png +0 -0
  149. data/lib/starter_web/package.json +7 -18
  150. data/lib/starter_web/pages/public/amplitude_yt_tester.adoc +218 -0
  151. data/lib/starter_web/pages/public/features/template.adoc +18 -8
  152. data/lib/starter_web/pages/public/features/template.asciidoc +758 -0
  153. data/lib/starter_web/pages/public/lazy_loader_tester.adoc +402 -0
  154. data/lib/starter_web/pages/public/manuals/ytdl/man.adoc +3020 -0
  155. data/lib/starter_web/pages/public/manuals/ytdl/man.md +2378 -0
  156. data/lib/starter_web/pages/public/tools/previewer/_includes/attributes.asciidoc +0 -16
  157. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/amplitudejs.large.css.asciidoc +505 -0
  158. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.hover.html +69 -0
  159. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.nested.html +75 -0
  160. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/frame.textarea.html +57 -0
  161. data/lib/starter_web/pages/public/tools/previewer/_includes/documents/my.content.html +112 -0
  162. data/lib/starter_web/pages/public/tools/previewer/preview_amplitudejs.adoc +172 -0
  163. data/lib/starter_web/pages/public/tour/_includes/attributes.asciidoc +2 -2
  164. data/lib/starter_web/pages/public/tour/_includes/documents/419_advanced_modals_demo.asciidoc +16 -16
  165. data/lib/starter_web/pages/public/tour/asciidoc_extensions.adoc +13 -3
  166. data/lib/starter_web/pages/public/tour/bootstrap_themes.adoc +12 -3
  167. data/lib/starter_web/pages/public/tour/highlghter_rouge.adoc +13 -3
  168. data/lib/starter_web/pages/public/tour/icon_fonts.adoc +12 -3
  169. data/lib/starter_web/pages/public/tour/modal_extentions.adoc +12 -6
  170. data/lib/starter_web/pages/public/tour/{playback_audio.adoc → play_audio.adoc} +207 -188
  171. data/lib/starter_web/pages/public/tour/{playback_video.adoc → play_video.adoc} +49 -51
  172. data/lib/starter_web/pages/public/tour/present_images.adoc +27 -5
  173. data/lib/starter_web/pages/public/tour/quicksearch.adoc +13 -3
  174. data/lib/starter_web/pages/public/tour/responsive_tables.adoc +13 -4
  175. data/lib/starter_web/pages/public/tour/typography.adoc +12 -3
  176. metadata +90 -22
  177. /data/assets/theme/j1/modules/{lazyLoader → j1LazyLoader/js}/plugins/README.md +0 -0
  178. /data/assets/theme/j1/modules/{lazyLoader/plugins/jquery.lazy.picture.js → j1LazyLoader/js/plugins/picture.js} +0 -0
  179. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.ajax.js +0 -0
  180. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.ajax.min.js +0 -0
  181. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.av.js +0 -0
  182. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.av.min.js +0 -0
  183. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.iframe.js +0 -0
  184. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.iframe.min.js +0 -0
  185. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.noop.js +0 -0
  186. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.noop.min.js +0 -0
  187. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.picture.min.js +0 -0
  188. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.script.js +0 -0
  189. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.script.min.js +0 -0
  190. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.vimeo.js +0 -0
  191. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.vimeo.min.js +0 -0
  192. /data/assets/theme/j1/modules/lazyLoader/{plugins → js/plugins}/jquery.lazy.youtube.js +0 -0
  193. /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