yt-dlp 2025.12.6.232939.dev0__py3-none-any.whl → 2025.12.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
yt_dlp/cookies.py CHANGED
@@ -212,9 +212,16 @@ def _firefox_browser_dirs():
212
212
 
213
213
  else:
214
214
  yield from map(os.path.expanduser, (
215
+ # New installations of FF147+ respect the XDG base directory specification
216
+ # Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=259356
217
+ os.path.join(_config_home(), 'mozilla/firefox'),
218
+ # Existing FF version<=146 installations
215
219
  '~/.mozilla/firefox',
216
- '~/snap/firefox/common/.mozilla/firefox',
220
+ # Flatpak XDG: https://docs.flatpak.org/en/latest/conventions.html#xdg-base-directories
221
+ '~/.var/app/org.mozilla.firefox/config/mozilla/firefox',
217
222
  '~/.var/app/org.mozilla.firefox/.mozilla/firefox',
223
+ # Snap installations do not respect the XDG base directory specification
224
+ '~/snap/firefox/common/.mozilla/firefox',
218
225
  ))
219
226
 
220
227
 
@@ -2914,10 +2914,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2914
2914
 
2915
2915
  if not (requested_clients or excluded_clients) and default_clients == self._DEFAULT_JSLESS_CLIENTS:
2916
2916
  self.report_warning(
2917
- f'No supported JavaScript runtime could be found. YouTube extraction without '
2918
- f'a JS runtime has been deprecated, and some formats may be missing. '
2919
- f'See {_EJS_WIKI_URL} for details on installing one. To silence this warning, '
2920
- f'you can use --extractor-args "youtube:player_client=default"', only_once=True)
2917
+ f'No supported JavaScript runtime could be found. Only deno is enabled by default; '
2918
+ f'to use another runtime add --js-runtimes RUNTIME[:PATH] to your command/config. '
2919
+ f'YouTube extraction without a JS runtime has been deprecated, and some formats may be missing. '
2920
+ f'See {_EJS_WIKI_URL} for details on installing one', only_once=True)
2921
2921
 
2922
2922
  if not requested_clients:
2923
2923
  requested_clients.extend(default_clients)
@@ -21,6 +21,7 @@ from yt_dlp.extractor.youtube.jsc.provider import (
21
21
  )
22
22
  from yt_dlp.extractor.youtube.pot._provider import configuration_arg
23
23
  from yt_dlp.extractor.youtube.pot.provider import provider_bug_report_message
24
+ from yt_dlp.utils import version_tuple
24
25
  from yt_dlp.utils._jsruntime import JsRuntimeInfo
25
26
 
26
27
  if _has_ejs:
@@ -223,7 +224,8 @@ class EJSBaseJCP(JsChallengeProvider):
223
224
  skipped_components.append(script)
224
225
  continue
225
226
  if not self.is_dev:
226
- if script.version != self._SCRIPT_VERSION:
227
+ # Matching patch version is expected to have same hash
228
+ if version_tuple(script.version, lenient=True)[:2] != version_tuple(self._SCRIPT_VERSION, lenient=True)[:2]:
227
229
  self.logger.warning(
228
230
  f'Challenge solver {script_type.value} script version {script.version} '
229
231
  f'is not supported (source: {script.source.value}, variant: {script.variant}, supported version: {self._SCRIPT_VERSION})')
@@ -1,6 +1,6 @@
1
1
  # This file is generated by devscripts/update_ejs.py. DO NOT MODIFY!
2
2
 
3
- VERSION = '0.3.1'
3
+ VERSION = '0.3.2'
4
4
  HASHES = {
5
5
  'yt.solver.bun.lib.js': '6ff45e94de9f0ea936a183c48173cfa9ce526ee4b7544cd556428427c1dd53c8073ef0174e79b320252bf0e7c64b0032cc1cf9c4358f3fda59033b7caa01c241',
6
6
  'yt.solver.core.js': '0cd96b2d3f319dfa62cae689efa7d930ef1706e95f5921794db5089b2262957ec0a17d73938d8975ea35d0309cbfb4c8e4418d5e219837215eee242890c8b64d',
yt_dlp/options.py CHANGED
@@ -689,7 +689,7 @@ def create_parser():
689
689
  '-I', '--playlist-items',
690
690
  dest='playlist_items', metavar='ITEM_SPEC', default=None,
691
691
  help=(
692
- 'Comma separated playlist_index of the items to download. '
692
+ 'Comma-separated playlist_index of the items to download. '
693
693
  'You can specify a range using "[START]:[STOP][:STEP]". For backward compatibility, START-STOP is also supported. '
694
694
  'Use negative indices to count from the right and negative STEP to download in reverse order. '
695
695
  'E.g. "-I 1:3,7,-5::2" used on a playlist of size 15 will download the items at index 1,2,3,7,11,13,15'))
@@ -750,8 +750,8 @@ class FFmpegMetadataPP(FFmpegPostProcessor):
750
750
  add('track', 'track_number')
751
751
  add('artist', ('artist', 'artists', 'creator', 'creators', 'uploader', 'uploader_id'))
752
752
  add('composer', ('composer', 'composers'))
753
- add('genre', ('genre', 'genres'))
754
- add('album')
753
+ add('genre', ('genre', 'genres', 'categories', 'tags'))
754
+ add('album', ('album', 'series'))
755
755
  add('album_artist', ('album_artist', 'album_artists'))
756
756
  add('disc', 'disc_number')
757
757
  add('show', 'series')
@@ -6,12 +6,7 @@ import functools
6
6
  import os.path
7
7
  import sys
8
8
 
9
- from ._utils import _get_exe_version_output, detect_exe_version, int_or_none
10
-
11
-
12
- def _runtime_version_tuple(v):
13
- # NB: will return (0,) if `v` is an invalid version string
14
- return tuple(int_or_none(x, default=0) for x in v.split('.'))
9
+ from ._utils import _get_exe_version_output, detect_exe_version, version_tuple
15
10
 
16
11
 
17
12
  _FALLBACK_PATHEXT = ('.COM', '.EXE', '.BAT', '.CMD')
@@ -92,7 +87,7 @@ class DenoJsRuntime(JsRuntime):
92
87
  if not out:
93
88
  return None
94
89
  version = detect_exe_version(out, r'^deno (\S+)', 'unknown')
95
- vt = _runtime_version_tuple(version)
90
+ vt = version_tuple(version, lenient=True)
96
91
  return JsRuntimeInfo(
97
92
  name='deno', path=path, version=version, version_tuple=vt,
98
93
  supported=vt >= self.MIN_SUPPORTED_VERSION)
@@ -107,7 +102,7 @@ class BunJsRuntime(JsRuntime):
107
102
  if not out:
108
103
  return None
109
104
  version = detect_exe_version(out, r'^(\S+)', 'unknown')
110
- vt = _runtime_version_tuple(version)
105
+ vt = version_tuple(version, lenient=True)
111
106
  return JsRuntimeInfo(
112
107
  name='bun', path=path, version=version, version_tuple=vt,
113
108
  supported=vt >= self.MIN_SUPPORTED_VERSION)
@@ -122,7 +117,7 @@ class NodeJsRuntime(JsRuntime):
122
117
  if not out:
123
118
  return None
124
119
  version = detect_exe_version(out, r'^v(\S+)', 'unknown')
125
- vt = _runtime_version_tuple(version)
120
+ vt = version_tuple(version, lenient=True)
126
121
  return JsRuntimeInfo(
127
122
  name='node', path=path, version=version, version_tuple=vt,
128
123
  supported=vt >= self.MIN_SUPPORTED_VERSION)
@@ -140,7 +135,7 @@ class QuickJsRuntime(JsRuntime):
140
135
  is_ng = 'QuickJS-ng' in out
141
136
 
142
137
  version = detect_exe_version(out, r'^QuickJS(?:-ng)?\s+version\s+(\S+)', 'unknown')
143
- vt = _runtime_version_tuple(version.replace('-', '.'))
138
+ vt = version_tuple(version, lenient=True)
144
139
  if is_ng:
145
140
  return JsRuntimeInfo(
146
141
  name='quickjs-ng', path=path, version=version, version_tuple=vt,
yt_dlp/utils/_utils.py CHANGED
@@ -2895,8 +2895,9 @@ def limit_length(s, length):
2895
2895
  return s
2896
2896
 
2897
2897
 
2898
- def version_tuple(v):
2899
- return tuple(int(e) for e in re.split(r'[-.]', v))
2898
+ def version_tuple(v, *, lenient=False):
2899
+ parse = int_or_none(default=-1) if lenient else int
2900
+ return tuple(parse(e) for e in re.split(r'[-.]', v))
2900
2901
 
2901
2902
 
2902
2903
  def is_outdated_version(version, limit, assume_new=True):
yt_dlp/version.py CHANGED
@@ -1,15 +1,15 @@
1
1
  # Autogenerated by devscripts/update-version.py
2
2
 
3
- __version__ = '2025.12.06.232939'
3
+ __version__ = '2025.12.08'
4
4
 
5
- RELEASE_GIT_HEAD = '29e257037862f3b2ad65e6e8d2972f9ed89389e3'
5
+ RELEASE_GIT_HEAD = '7a52ff29d86efc8f3adeba977b2009ce40b8e52e'
6
6
 
7
7
  VARIANT = 'pip'
8
8
 
9
9
  UPDATE_HINT = 'You installed yt-dlp with pip or using the wheel from PyPi; Use that to update'
10
10
 
11
- CHANNEL = 'nightly'
11
+ CHANNEL = 'stable'
12
12
 
13
- ORIGIN = 'yt-dlp/yt-dlp-nightly-builds'
13
+ ORIGIN = 'yt-dlp/yt-dlp'
14
14
 
15
- _pkg_version = '2025.12.06.232939dev'
15
+ _pkg_version = '2025.12.08'
@@ -247,7 +247,8 @@ Python versions 3.10+ (CPython) and 3.11+ (PyPy) are supported. Other
247
247
  versions and implementations may or may not work correctly.
248
248
 
249
249
  While all the other dependencies are optional, ffmpeg, ffprobe,
250
- yt-dlp-ejs and a JavaScript runtime are highly recommended
250
+ yt-dlp-ejs and a supported JavaScript runtime/engine are highly
251
+ recommended
251
252
 
252
253
  Strongly recommended
253
254
 
@@ -267,8 +268,8 @@ Strongly recommended
267
268
  - yt-dlp-ejs - Required for deciphering YouTube n/sig values. Licensed
268
269
  under Unlicense, bundles MIT and ISC components.
269
270
 
270
- A JavaScript runtime like deno (recommended), node.js, bun, or
271
- QuickJS is also required to run yt-dlp-ejs. See the wiki.
271
+ A JavaScript runtime/engine like deno (recommended), node.js, bun,
272
+ or QuickJS is also required to run yt-dlp-ejs. See the wiki.
272
273
 
273
274
  Networking
274
275
 
@@ -289,7 +290,7 @@ may be required for some sites that employ TLS fingerprinting.
289
290
  - curl_cffi (recommended) - Python binding for curl-impersonate.
290
291
  Provides impersonation targets for Chrome, Edge and Safari. Licensed
291
292
  under MIT
292
- - Can be installed with the curl-cffi group, e.g.
293
+ - Can be installed with the curl-cffi extra, e.g.
293
294
  pip install "yt-dlp[default,curl-cffi]"
294
295
  - Currently included in most builds except yt-dlp (Unix zipimport
295
296
  binary), yt-dlp_x86 (Windows 32-bit) and
@@ -343,7 +344,7 @@ will be built for the same CPU architecture as the Python used.
343
344
 
344
345
  You can run the following commands:
345
346
 
346
- python devscripts/install_deps.py --include-group pyinstaller
347
+ python devscripts/install_deps.py --include-extra pyinstaller
347
348
  python devscripts/make_lazy_extractors.py
348
349
  python -m bundle.pyinstaller
349
350
 
@@ -408,7 +409,7 @@ General Options:
408
409
  --no-update Do not check for updates (default)
409
410
  --update-to [CHANNEL]@[TAG] Upgrade/downgrade to a specific version.
410
411
  CHANNEL can be a repository as well. CHANNEL
411
- and TAG default to "nightly" and "latest"
412
+ and TAG default to "stable" and "latest"
412
413
  respectively if omitted; See "UPDATE" for
413
414
  details. Supported channels: stable,
414
415
  nightly, master
@@ -580,7 +581,7 @@ Geo-restriction:
580
581
 
581
582
  Video Selection:
582
583
 
583
- -I, --playlist-items ITEM_SPEC Comma separated playlist_index of the items
584
+ -I, --playlist-items ITEM_SPEC Comma-separated playlist_index of the items
584
585
  to download. You can specify a range using
585
586
  "[START]:[STOP][:STEP]". For backward
586
587
  compatibility, START-STOP is also supported.
@@ -1481,7 +1482,7 @@ have some special formatting:
1481
1482
  7. More Conversions: In addition to the normal format types
1482
1483
  diouxXeEfFgGcrs, yt-dlp additionally supports converting to B =
1483
1484
  Bytes, j = json (flag # for pretty-printing, + for Unicode), h =
1484
- HTML escaping, l = a comma separated list (flag # for \n
1485
+ HTML escaping, l = a comma-separated list (flag # for \n
1485
1486
  newline-separated), q = a string quoted for the terminal (flag # to
1486
1487
  split a list into different arguments), D = add Decimal suffixes
1487
1488
  (e.g. 10M) (flag # to use 1024 as factor), and S = Sanitize as
@@ -2223,9 +2224,9 @@ metadata:
2223
2224
 
2224
2225
  composer composer or composers
2225
2226
 
2226
- genre genre or genres
2227
+ genre genre, genres, categories or tags
2227
2228
 
2228
- album album
2229
+ album album or series
2229
2230
 
2230
2231
  album_artist album_artist or album_artists
2231
2232
 
@@ -2297,7 +2298,7 @@ youtube
2297
2298
  available clients are web, web_safari, web_embedded, web_music,
2298
2299
  web_creator, mweb, ios, android, android_sdkless, android_vr, tv,
2299
2300
  tv_simply, tv_downgraded, and tv_embedded. By default,
2300
- tv,android_sdkless,web is used. If no JavaScript runtime is
2301
+ tv,android_sdkless,web is used. If no JavaScript runtime/engine is
2301
2302
  available, then android_sdkless,web_safari,web is used. If logged-in
2302
2303
  cookies are passed to yt-dlp, then tv_downgraded,web_safari,web is
2303
2304
  used for free accounts and tv_downgraded,web_creator,web is used for
@@ -2363,7 +2364,7 @@ youtube
2363
2364
  without cookies. Note: this may have adverse effects if used
2364
2365
  improperly. If a session from a browser is wanted, you should pass
2365
2366
  cookies instead (which contain the Visitor ID)
2366
- - po_token: Proof of Origin (PO) Token(s) to use. Comma seperated list
2367
+ - po_token: Proof of Origin (PO) Token(s) to use. Comma-separated list
2367
2368
  of PO Tokens in the format CLIENT.CONTEXT+PO_TOKEN, e.g.
2368
2369
  youtube:po_token=web.gvs+XXX,web.player=XXX,web_safari.gvs+YYY.
2369
2370
  Context can be any of gvs (Google Video Server URLs), player
@@ -2385,10 +2386,10 @@ youtube
2385
2386
 
2386
2387
  youtube-ejs
2387
2388
 
2388
- - jitless: Run suported Javascript engines in JIT-less mode. Supported
2389
- runtimes are deno, node and bun. Provides better security at the
2390
- cost of performance/speed. Do note that node and bun are still
2391
- considered unsecure. Either true or false (default)
2389
+ - jitless: Run supported Javascript engines in JIT-less mode.
2390
+ Supported runtimes are deno, node and bun. Provides better security
2391
+ at the cost of performance/speed. Do note that node and bun are
2392
+ still considered insecure. Either true or false (default)
2392
2393
 
2393
2394
  youtubepot-webpo
2394
2395
 
@@ -3,7 +3,7 @@ complete --command yt-dlp --long-option help --short-option h --description 'Pri
3
3
  complete --command yt-dlp --long-option version --description 'Print program version and exit'
4
4
  complete --command yt-dlp --long-option update --short-option U --description 'Check if updates are available. You installed yt-dlp from a manual build or with a package manager; Use that to update'
5
5
  complete --command yt-dlp --long-option no-update --description 'Do not check for updates (default)'
6
- complete --command yt-dlp --long-option update-to --description 'Upgrade/downgrade to a specific version. CHANNEL can be a repository as well. CHANNEL and TAG default to "nightly" and "latest" respectively if omitted; See "UPDATE" for details. Supported channels: stable, nightly, master'
6
+ complete --command yt-dlp --long-option update-to --description 'Upgrade/downgrade to a specific version. CHANNEL can be a repository as well. CHANNEL and TAG default to "stable" and "latest" respectively if omitted; See "UPDATE" for details. Supported channels: stable, nightly, master'
7
7
  complete --command yt-dlp --long-option ignore-errors --short-option i --description 'Ignore download and postprocessing errors. The download will be considered successful even if the postprocessing fails'
8
8
  complete --command yt-dlp --long-option no-abort-on-error --description 'Continue with next video on download errors; e.g. to skip unavailable videos in a playlist (default)'
9
9
  complete --command yt-dlp --long-option abort-on-error --description 'Abort downloading of further videos if an error occurs (Alias: --no-ignore-errors)'
@@ -50,7 +50,7 @@ complete --command yt-dlp --long-option geo-bypass-country
50
50
  complete --command yt-dlp --long-option geo-bypass-ip-block
51
51
  complete --command yt-dlp --long-option playlist-start
52
52
  complete --command yt-dlp --long-option playlist-end
53
- complete --command yt-dlp --long-option playlist-items --short-option I --description 'Comma separated playlist_index of the items to download. You can specify a range using "[START]:[STOP][:STEP]". For backward compatibility, START-STOP is also supported. Use negative indices to count from the right and negative STEP to download in reverse order. E.g. "-I 1:3,7,-5::2" used on a playlist of size 15 will download the items at index 1,2,3,7,11,13,15'
53
+ complete --command yt-dlp --long-option playlist-items --short-option I --description 'Comma-separated playlist_index of the items to download. You can specify a range using "[START]:[STOP][:STEP]". For backward compatibility, START-STOP is also supported. Use negative indices to count from the right and negative STEP to download in reverse order. E.g. "-I 1:3,7,-5::2" used on a playlist of size 15 will download the items at index 1,2,3,7,11,13,15'
54
54
  complete --command yt-dlp --long-option match-title
55
55
  complete --command yt-dlp --long-option reject-title
56
56
  complete --command yt-dlp --long-option min-filesize --description 'Abort download if filesize is smaller than SIZE, e.g. 50k or 44.6M'
@@ -48,7 +48,7 @@ Do not check for updates (default)
48
48
  --update-to \f[I][CHANNEL]\[at][TAG]\f[R]
49
49
  Upgrade/downgrade to a specific version.
50
50
  CHANNEL can be a repository as well.
51
- CHANNEL and TAG default to \[dq]nightly\[dq] and \[dq]latest\[dq]
51
+ CHANNEL and TAG default to \[dq]stable\[dq] and \[dq]latest\[dq]
52
52
  respectively if omitted; See \[dq]UPDATE\[dq] for details.
53
53
  Supported channels: stable, nightly, master
54
54
  .TP
@@ -265,7 +265,7 @@ One of \[dq]default\[dq] (only when known to be useful),
265
265
  .SS Video Selection:
266
266
  .TP
267
267
  -I, --playlist-items \f[I]ITEM_SPEC\f[R]
268
- Comma separated playlist_index of the items to download.
268
+ Comma-separated playlist_index of the items to download.
269
269
  You can specify a range using \[dq][START]:[STOP][:STEP]\[dq].
270
270
  For backward compatibility, START-STOP is also supported.
271
271
  Use negative indices to count from the right and negative STEP to
@@ -1513,7 +1513,7 @@ E.g.
1513
1513
  \f[V]diouxXeEfFgGcrs\f[R], yt-dlp additionally supports converting to
1514
1514
  \f[V]B\f[R] = \f[B]B\f[R]ytes, \f[V]j\f[R] = \f[B]j\f[R]son (flag
1515
1515
  \f[V]#\f[R] for pretty-printing, \f[V]+\f[R] for Unicode), \f[V]h\f[R] =
1516
- HTML escaping, \f[V]l\f[R] = a comma separated \f[B]l\f[R]ist (flag
1516
+ HTML escaping, \f[V]l\f[R] = a comma-separated \f[B]l\f[R]ist (flag
1517
1517
  \f[V]#\f[R] for \f[V]\[rs]n\f[R] newline-separated), \f[V]q\f[R] = a
1518
1518
  string \f[B]q\f[R]uoted for the terminal (flag \f[V]#\f[R] to split a
1519
1519
  list into different arguments), \f[V]D\f[R] = add \f[B]D\f[R]ecimal
@@ -2582,12 +2582,13 @@ T}
2582
2582
  T{
2583
2583
  \f[V]genre\f[R]
2584
2584
  T}@T{
2585
- \f[V]genre\f[R] or \f[V]genres\f[R]
2585
+ \f[V]genre\f[R], \f[V]genres\f[R], \f[V]categories\f[R] or
2586
+ \f[V]tags\f[R]
2586
2587
  T}
2587
2588
  T{
2588
2589
  \f[V]album\f[R]
2589
2590
  T}@T{
2590
- \f[V]album\f[R]
2591
+ \f[V]album\f[R] or \f[V]series\f[R]
2591
2592
  T}
2592
2593
  T{
2593
2594
  \f[V]album_artist\f[R]
@@ -2695,7 +2696,7 @@ The currently available clients are \f[V]web\f[R], \f[V]web_safari\f[R],
2695
2696
  \f[V]android_sdkless\f[R], \f[V]android_vr\f[R], \f[V]tv\f[R],
2696
2697
  \f[V]tv_simply\f[R], \f[V]tv_downgraded\f[R], and \f[V]tv_embedded\f[R].
2697
2698
  By default, \f[V]tv,android_sdkless,web\f[R] is used.
2698
- If no JavaScript runtime is available, then
2699
+ If no JavaScript runtime/engine is available, then
2699
2700
  \f[V]android_sdkless,web_safari,web\f[R] is used.
2700
2701
  If logged-in cookies are passed to yt-dlp, then
2701
2702
  \f[V]tv_downgraded,web_safari,web\f[R] is used for free accounts and
@@ -2801,7 +2802,7 @@ If a session from a browser is wanted, you should pass cookies instead
2801
2802
  (which contain the Visitor ID)
2802
2803
  .IP \[bu] 2
2803
2804
  \f[V]po_token\f[R]: Proof of Origin (PO) Token(s) to use.
2804
- Comma seperated list of PO Tokens in the format
2805
+ Comma-separated list of PO Tokens in the format
2805
2806
  \f[V]CLIENT.CONTEXT+PO_TOKEN\f[R], e.g.
2806
2807
  \f[V]youtube:po_token=web.gvs+XXX,web.player=XXX,web_safari.gvs+YYY\f[R].
2807
2808
  Context can be any of \f[V]gvs\f[R] (Google Video Server URLs),
@@ -2830,11 +2831,11 @@ Only effective with the \f[V]web\f[R], \f[V]web_safari\f[R],
2830
2831
  Either \f[V]true\f[R] or \f[V]false\f[R] (default)
2831
2832
  .SS youtube-ejs
2832
2833
  .IP \[bu] 2
2833
- \f[V]jitless\f[R]: Run suported Javascript engines in JIT-less mode.
2834
+ \f[V]jitless\f[R]: Run supported Javascript engines in JIT-less mode.
2834
2835
  Supported runtimes are \f[V]deno\f[R], \f[V]node\f[R] and \f[V]bun\f[R].
2835
2836
  Provides better security at the cost of performance/speed.
2836
2837
  Do note that \f[V]node\f[R] and \f[V]bun\f[R] are still considered
2837
- unsecure.
2838
+ insecure.
2838
2839
  Either \f[V]true\f[R] or \f[V]false\f[R] (default)
2839
2840
  .SS youtubepot-webpo
2840
2841
  .IP \[bu] 2
@@ -3164,8 +3165,8 @@ Python versions 3.10+ (CPython) and 3.11+ (PyPy) are supported.
3164
3165
  Other versions and implementations may or may not work correctly.
3165
3166
  .PP
3166
3167
  While all the other dependencies are optional, \f[V]ffmpeg\f[R],
3167
- \f[V]ffprobe\f[R], \f[V]yt-dlp-ejs\f[R] and a JavaScript runtime are
3168
- highly recommended
3168
+ \f[V]ffprobe\f[R], \f[V]yt-dlp-ejs\f[R] and a supported JavaScript
3169
+ runtime/engine are highly recommended
3169
3170
  .SS Strongly recommended
3170
3171
  .IP \[bu] 2
3171
3172
  \f[B]ffmpeg\f[R] and \f[B]ffprobe\f[R] (https://www.ffmpeg.org) -
@@ -3197,7 +3198,7 @@ ISC (https://github.com/meriyah/meriyah/blob/main/LICENSE.md)
3197
3198
  components.
3198
3199
  .RS 2
3199
3200
  .PP
3200
- A JavaScript runtime like \f[B]deno\f[R] (https://deno.land)
3201
+ A JavaScript runtime/engine like \f[B]deno\f[R] (https://deno.land)
3201
3202
  (recommended), \f[B]node.js\f[R] (https://nodejs.org),
3202
3203
  \f[B]bun\f[R] (https://bun.sh), or
3203
3204
  \f[B]QuickJS\f[R] (https://bellard.org/quickjs/) is also required to run
@@ -3240,7 +3241,7 @@ Licensed under
3240
3241
  MIT (https://github.com/lexiforest/curl_cffi/blob/main/LICENSE)
3241
3242
  .RS 2
3242
3243
  .IP \[bu] 2
3243
- Can be installed with the \f[V]curl-cffi\f[R] group, e.g.
3244
+ Can be installed with the \f[V]curl-cffi\f[R] extra, e.g.
3244
3245
  \f[V]pip install \[dq]yt-dlp[default,curl-cffi]\[dq]\f[R]
3245
3246
  .IP \[bu] 2
3246
3247
  Currently included in most builds \f[I]except\f[R] \f[V]yt-dlp\f[R]
@@ -3329,7 +3330,7 @@ You can run the following commands:
3329
3330
  .IP
3330
3331
  .nf
3331
3332
  \f[C]
3332
- python devscripts/install_deps.py --include-group pyinstaller
3333
+ python devscripts/install_deps.py --include-extra pyinstaller
3333
3334
  python devscripts/make_lazy_extractors.py
3334
3335
  python -m bundle.pyinstaller
3335
3336
  \f[R]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yt-dlp
3
- Version: 2025.12.6.232939.dev0
3
+ Version: 2025.12.8
4
4
  Summary: A feature-rich command-line audio/video downloader
5
5
  Project-URL: Documentation, https://github.com/yt-dlp/yt-dlp#readme
6
6
  Project-URL: Repository, https://github.com/yt-dlp/yt-dlp
@@ -43,7 +43,7 @@ Requires-Dist: pycryptodomex; extra == 'default'
43
43
  Requires-Dist: requests<3,>=2.32.2; extra == 'default'
44
44
  Requires-Dist: urllib3<3,>=2.0.2; extra == 'default'
45
45
  Requires-Dist: websockets>=13.0; extra == 'default'
46
- Requires-Dist: yt-dlp-ejs==0.3.1; extra == 'default'
46
+ Requires-Dist: yt-dlp-ejs==0.3.2; extra == 'default'
47
47
  Provides-Extra: dev
48
48
  Requires-Dist: autopep8~=2.0; extra == 'dev'
49
49
  Requires-Dist: pre-commit; extra == 'dev'
@@ -272,7 +272,7 @@ Python versions 3.10+ (CPython) and 3.11+ (PyPy) are supported. Other versions a
272
272
  On Windows, [Microsoft Visual C++ 2010 SP1 Redistributable Package (x86)](https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe) is also necessary to run yt-dlp. You probably already have this, but if the executable throws an error due to missing `MSVCR100.dll` you need to install it manually.
273
273
  -->
274
274
 
275
- While all the other dependencies are optional, `ffmpeg`, `ffprobe`, `yt-dlp-ejs` and a JavaScript runtime are highly recommended
275
+ While all the other dependencies are optional, `ffmpeg`, `ffprobe`, `yt-dlp-ejs` and a supported JavaScript runtime/engine are highly recommended
276
276
 
277
277
  ### Strongly recommended
278
278
 
@@ -284,7 +284,7 @@ While all the other dependencies are optional, `ffmpeg`, `ffprobe`, `yt-dlp-ejs`
284
284
 
285
285
  * [**yt-dlp-ejs**](https://github.com/yt-dlp/ejs) - Required for deciphering YouTube n/sig values. Licensed under [Unlicense](https://github.com/yt-dlp/ejs/blob/main/LICENSE), bundles [MIT](https://github.com/davidbonnet/astring/blob/main/LICENSE) and [ISC](https://github.com/meriyah/meriyah/blob/main/LICENSE.md) components.
286
286
 
287
- A JavaScript runtime like [**deno**](https://deno.land) (recommended), [**node.js**](https://nodejs.org), [**bun**](https://bun.sh), or [**QuickJS**](https://bellard.org/quickjs/) is also required to run yt-dlp-ejs. See [the wiki](https://github.com/yt-dlp/yt-dlp/wiki/EJS).
287
+ A JavaScript runtime/engine like [**deno**](https://deno.land) (recommended), [**node.js**](https://nodejs.org), [**bun**](https://bun.sh), or [**QuickJS**](https://bellard.org/quickjs/) is also required to run yt-dlp-ejs. See [the wiki](https://github.com/yt-dlp/yt-dlp/wiki/EJS).
288
288
 
289
289
  ### Networking
290
290
  * [**certifi**](https://github.com/certifi/python-certifi)\* - Provides Mozilla's root certificate bundle. Licensed under [MPLv2](https://github.com/certifi/python-certifi/blob/master/LICENSE)
@@ -297,7 +297,7 @@ While all the other dependencies are optional, `ffmpeg`, `ffprobe`, `yt-dlp-ejs`
297
297
  The following provide support for impersonating browser requests. This may be required for some sites that employ TLS fingerprinting.
298
298
 
299
299
  * [**curl_cffi**](https://github.com/lexiforest/curl_cffi) (recommended) - Python binding for [curl-impersonate](https://github.com/lexiforest/curl-impersonate). Provides impersonation targets for Chrome, Edge and Safari. Licensed under [MIT](https://github.com/lexiforest/curl_cffi/blob/main/LICENSE)
300
- * Can be installed with the `curl-cffi` group, e.g. `pip install "yt-dlp[default,curl-cffi]"`
300
+ * Can be installed with the `curl-cffi` extra, e.g. `pip install "yt-dlp[default,curl-cffi]"`
301
301
  * Currently included in most builds *except* `yt-dlp` (Unix zipimport binary), `yt-dlp_x86` (Windows 32-bit) and `yt-dlp_musllinux_aarch64`
302
302
 
303
303
 
@@ -334,7 +334,7 @@ To build the standalone executable, you must have Python and `pyinstaller` (plus
334
334
  You can run the following commands:
335
335
 
336
336
  ```
337
- python devscripts/install_deps.py --include-group pyinstaller
337
+ python devscripts/install_deps.py --include-extra pyinstaller
338
338
  python devscripts/make_lazy_extractors.py
339
339
  python -m bundle.pyinstaller
340
340
  ```
@@ -383,7 +383,7 @@ Tip: Use `CTRL`+`F` (or `Command`+`F`) to search by keywords
383
383
  --no-update Do not check for updates (default)
384
384
  --update-to [CHANNEL]@[TAG] Upgrade/downgrade to a specific version.
385
385
  CHANNEL can be a repository as well. CHANNEL
386
- and TAG default to "nightly" and "latest"
386
+ and TAG default to "stable" and "latest"
387
387
  respectively if omitted; See "UPDATE" for
388
388
  details. Supported channels: stable,
389
389
  nightly, master
@@ -552,7 +552,7 @@ Tip: Use `CTRL`+`F` (or `Command`+`F`) to search by keywords
552
552
  two-letter ISO 3166-2 country code
553
553
 
554
554
  ## Video Selection:
555
- -I, --playlist-items ITEM_SPEC Comma separated playlist_index of the items
555
+ -I, --playlist-items ITEM_SPEC Comma-separated playlist_index of the items
556
556
  to download. You can specify a range using
557
557
  "[START]:[STOP][:STEP]". For backward
558
558
  compatibility, START-STOP is also supported.
@@ -1368,7 +1368,7 @@ The field names themselves (the part inside the parenthesis) can also have some
1368
1368
 
1369
1369
  1. **Default**: A literal default value can be specified for when the field is empty using a `|` separator. This overrides `--output-na-placeholder`. E.g. `%(uploader|Unknown)s`
1370
1370
 
1371
- 1. **More Conversions**: In addition to the normal format types `diouxXeEfFgGcrs`, yt-dlp additionally supports converting to `B` = **B**ytes, `j` = **j**son (flag `#` for pretty-printing, `+` for Unicode), `h` = HTML escaping, `l` = a comma separated **l**ist (flag `#` for `\n` newline-separated), `q` = a string **q**uoted for the terminal (flag `#` to split a list into different arguments), `D` = add **D**ecimal suffixes (e.g. 10M) (flag `#` to use 1024 as factor), and `S` = **S**anitize as filename (flag `#` for restricted)
1371
+ 1. **More Conversions**: In addition to the normal format types `diouxXeEfFgGcrs`, yt-dlp additionally supports converting to `B` = **B**ytes, `j` = **j**son (flag `#` for pretty-printing, `+` for Unicode), `h` = HTML escaping, `l` = a comma-separated **l**ist (flag `#` for `\n` newline-separated), `q` = a string **q**uoted for the terminal (flag `#` to split a list into different arguments), `D` = add **D**ecimal suffixes (e.g. 10M) (flag `#` to use 1024 as factor), and `S` = **S**anitize as filename (flag `#` for restricted)
1372
1372
 
1373
1373
  1. **Unicode normalization**: The format type `U` can be used for NFC [Unicode normalization](https://docs.python.org/3/library/unicodedata.html#unicodedata.normalize). The alternate form flag (`#`) changes the normalization to NFD and the conversion flag `+` can be used for NFKC/NFKD compatibility equivalence normalization. E.g. `%(title)+.100U` is NFKC
1374
1374
 
@@ -1867,8 +1867,8 @@ Metadata fields | From
1867
1867
  `track` | `track_number`
1868
1868
  `artist` | `artist`, `artists`, `creator`, `creators`, `uploader` or `uploader_id`
1869
1869
  `composer` | `composer` or `composers`
1870
- `genre` | `genre` or `genres`
1871
- `album` | `album`
1870
+ `genre` | `genre`, `genres`, `categories` or `tags`
1871
+ `album` | `album` or `series`
1872
1872
  `album_artist` | `album_artist` or `album_artists`
1873
1873
  `disc` | `disc_number`
1874
1874
  `show` | `series`
@@ -1921,7 +1921,7 @@ The following extractors use this feature:
1921
1921
  #### youtube
1922
1922
  * `lang`: Prefer translated metadata (`title`, `description` etc) of this language code (case-sensitive). By default, the video primary language metadata is preferred, with a fallback to `en` translated. See [youtube/_base.py](https://github.com/yt-dlp/yt-dlp/blob/415b4c9f955b1a0391204bd24a7132590e7b3bdb/yt_dlp/extractor/youtube/_base.py#L402-L409) for the list of supported content language codes
1923
1923
  * `skip`: One or more of `hls`, `dash` or `translated_subs` to skip extraction of the m3u8 manifests, dash manifests and [auto-translated subtitles](https://github.com/yt-dlp/yt-dlp/issues/4090#issuecomment-1158102032) respectively
1924
- * `player_client`: Clients to extract video data from. The currently available clients are `web`, `web_safari`, `web_embedded`, `web_music`, `web_creator`, `mweb`, `ios`, `android`, `android_sdkless`, `android_vr`, `tv`, `tv_simply`, `tv_downgraded`, and `tv_embedded`. By default, `tv,android_sdkless,web` is used. If no JavaScript runtime is available, then `android_sdkless,web_safari,web` is used. If logged-in cookies are passed to yt-dlp, then `tv_downgraded,web_safari,web` is used for free accounts and `tv_downgraded,web_creator,web` is used for premium accounts. The `web_music` client is added for `music.youtube.com` URLs when logged-in cookies are used. The `web_embedded` client is added for age-restricted videos but only works if the video is embeddable. The `tv_embedded` and `web_creator` clients are added for age-restricted videos if account age-verification is required. Some clients, such as `web` and `web_music`, require a `po_token` for their formats to be downloadable. Some clients, such as `web_creator`, will only work with authentication. Not all clients support authentication via cookies. You can use `default` for the default clients, or you can use `all` for all clients (not recommended). You can prefix a client with `-` to exclude it, e.g. `youtube:player_client=default,-ios`
1924
+ * `player_client`: Clients to extract video data from. The currently available clients are `web`, `web_safari`, `web_embedded`, `web_music`, `web_creator`, `mweb`, `ios`, `android`, `android_sdkless`, `android_vr`, `tv`, `tv_simply`, `tv_downgraded`, and `tv_embedded`. By default, `tv,android_sdkless,web` is used. If no JavaScript runtime/engine is available, then `android_sdkless,web_safari,web` is used. If logged-in cookies are passed to yt-dlp, then `tv_downgraded,web_safari,web` is used for free accounts and `tv_downgraded,web_creator,web` is used for premium accounts. The `web_music` client is added for `music.youtube.com` URLs when logged-in cookies are used. The `web_embedded` client is added for age-restricted videos but only works if the video is embeddable. The `tv_embedded` and `web_creator` clients are added for age-restricted videos if account age-verification is required. Some clients, such as `web` and `web_music`, require a `po_token` for their formats to be downloadable. Some clients, such as `web_creator`, will only work with authentication. Not all clients support authentication via cookies. You can use `default` for the default clients, or you can use `all` for all clients (not recommended). You can prefix a client with `-` to exclude it, e.g. `youtube:player_client=default,-ios`
1925
1925
  * `player_skip`: Skip some network requests that are generally needed for robust extraction. One or more of `configs` (skip client configs), `webpage` (skip initial webpage), `js` (skip js player), `initial_data` (skip initial data/next ep request). While these options can help reduce the number of requests needed or avoid some rate-limiting, they could cause issues such as missing formats or metadata. See [#860](https://github.com/yt-dlp/yt-dlp/pull/860) and [#12826](https://github.com/yt-dlp/yt-dlp/issues/12826) for more details
1926
1926
  * `webpage_skip`: Skip extraction of embedded webpage data. One or both of `player_response`, `initial_data`. These options are for testing purposes and don't skip any network requests
1927
1927
  * `player_params`: YouTube player parameters to use for player requests. Will overwrite any default ones set by yt-dlp.
@@ -1936,14 +1936,14 @@ The following extractors use this feature:
1936
1936
  * `raise_incomplete_data`: `Incomplete Data Received` raises an error instead of reporting a warning
1937
1937
  * `data_sync_id`: Overrides the account Data Sync ID used in Innertube API requests. This may be needed if you are using an account with `youtube:player_skip=webpage,configs` or `youtubetab:skip=webpage`
1938
1938
  * `visitor_data`: Overrides the Visitor Data used in Innertube API requests. This should be used with `player_skip=webpage,configs` and without cookies. Note: this may have adverse effects if used improperly. If a session from a browser is wanted, you should pass cookies instead (which contain the Visitor ID)
1939
- * `po_token`: Proof of Origin (PO) Token(s) to use. Comma seperated list of PO Tokens in the format `CLIENT.CONTEXT+PO_TOKEN`, e.g. `youtube:po_token=web.gvs+XXX,web.player=XXX,web_safari.gvs+YYY`. Context can be any of `gvs` (Google Video Server URLs), `player` (Innertube player request) or `subs` (Subtitles)
1939
+ * `po_token`: Proof of Origin (PO) Token(s) to use. Comma-separated list of PO Tokens in the format `CLIENT.CONTEXT+PO_TOKEN`, e.g. `youtube:po_token=web.gvs+XXX,web.player=XXX,web_safari.gvs+YYY`. Context can be any of `gvs` (Google Video Server URLs), `player` (Innertube player request) or `subs` (Subtitles)
1940
1940
  * `pot_trace`: Enable debug logging for PO Token fetching. Either `true` or `false` (default)
1941
1941
  * `fetch_pot`: Policy to use for fetching a PO Token from providers. One of `always` (always try fetch a PO Token regardless if the client requires one for the given context), `never` (never fetch a PO Token), or `auto` (default; only fetch a PO Token if the client requires one for the given context)
1942
1942
  * `jsc_trace`: Enable debug logging for JS Challenge fetching. Either `true` or `false` (default)
1943
1943
  * `use_ad_playback_context`: Skip preroll ads to eliminate the mandatory wait period before download. Do NOT use this when passing premium account cookies to yt-dlp, as it will result in a loss of premium formats. Only effective with the `web`, `web_safari`, `web_music` and `mweb` player clients. Either `true` or `false` (default)
1944
1944
 
1945
1945
  #### youtube-ejs
1946
- * `jitless`: Run suported Javascript engines in JIT-less mode. Supported runtimes are `deno`, `node` and `bun`. Provides better security at the cost of performance/speed. Do note that `node` and `bun` are still considered unsecure. Either `true` or `false` (default)
1946
+ * `jitless`: Run supported Javascript engines in JIT-less mode. Supported runtimes are `deno`, `node` and `bun`. Provides better security at the cost of performance/speed. Do note that `node` and `bun` are still considered insecure. Either `true` or `false` (default)
1947
1947
 
1948
1948
  #### youtubepot-webpo
1949
1949
  * `bind_to_visitor_id`: Whether to use the Visitor ID instead of Visitor Data for caching WebPO tokens. Either `true` (default) or `false`
@@ -3,15 +3,15 @@ yt_dlp/__init__.py,sha256=Nyir0qVukv9-pdfRtHPVm3EDOYDvwa1AXHOIX9oR0ps,47897
3
3
  yt_dlp/__main__.py,sha256=DzqMhNY2y89eqs0Hnd4hOhjMfW9OhnhdhJdDH9yizmw,367
4
4
  yt_dlp/aes.py,sha256=OU2t7oHbaKSIT-evc75vU58XK20b6wqgJvNlG_fois0,22033
5
5
  yt_dlp/cache.py,sha256=npC-r6vd_HrsnTlGDvThz4D7nL4oEn06h3ABsYwk2iY,3370
6
- yt_dlp/cookies.py,sha256=JbdeudN50DDDiUXORRueozVgbvSoVRKpDbxmjInVN1E,57351
6
+ yt_dlp/cookies.py,sha256=82uis_3XUCryx5ymJD57Z41ujoHU6Sz1tpS0NZ_JOS0,57877
7
7
  yt_dlp/globals.py,sha256=zVr9imhoXcXHoCtV0VArT5--EGmjO1cfOxIKu4xCzSM,1259
8
8
  yt_dlp/jsinterp.py,sha256=GfZSNQlLG8l1dKcHA216DmIq9kszszqWClqHzEUd4sk,38770
9
9
  yt_dlp/minicurses.py,sha256=fDq7vdEn25qpZeEOdDk2YkEsckFMGAbrQaZcGNt4NUo,5328
10
- yt_dlp/options.py,sha256=Icc0JRiKOzITWoMujE_ihEmkCS-uCcie42XhIh8LvS4,100388
10
+ yt_dlp/options.py,sha256=cEALlBE-OokSe0xGY5pHsLozTJpw-yR9pSVBCNp2SqI,100388
11
11
  yt_dlp/plugins.py,sha256=EGmR0ydaahNspGrgszTNX4-YjHe93WOOhcw1gf6PZSs,8215
12
12
  yt_dlp/socks.py,sha256=oAuAfWM6jxI8A5hHDLEKq2U2-k9NyMB_z6nrKzNE9fg,8936
13
13
  yt_dlp/update.py,sha256=sY7gNFBQorzs7sEjRrqL5QOsTBNmGGa_FnpTtbxY1vA,25280
14
- yt_dlp/version.py,sha256=irYADNaJm7LkyPimXIZHF_9ankZcH-A7u1W_SN3Ih4k,360
14
+ yt_dlp/version.py,sha256=PxIDnEKZZm0N7E7r-srr04xkMUb7UcBk3s9j9L_JNW4,327
15
15
  yt_dlp/webvtt.py,sha256=ONkXaaNCZcX8pQhJn3iwIKyaQ34BtVDrMEdG6wRNZwM,11451
16
16
  yt_dlp/__pyinstaller/__init__.py,sha256=-c4Zo8nQGKAm8wc_LDscxMtK7zr_YhZwRnC9CMruUBE,72
17
17
  yt_dlp/__pyinstaller/hook-yt_dlp.py,sha256=5Rd0zV2pDskjY1KtT0wsjxv4hStx67sLCjUexsFvFus,1339
@@ -1067,7 +1067,7 @@ yt_dlp/extractor/youtube/_notifications.py,sha256=1nhavzW0e2QWFAWHkfbTU4sSXNp4vU
1067
1067
  yt_dlp/extractor/youtube/_redirect.py,sha256=WWWnGEkfSGBXpZFi_bWY4XcHZ8PDeK7UsndDaTYYhQg,9005
1068
1068
  yt_dlp/extractor/youtube/_search.py,sha256=E9raTPGjUD6mm81WBpT4AsaxyiTBHdNssgzeHwVeNOE,6552
1069
1069
  yt_dlp/extractor/youtube/_tab.py,sha256=NcbpPvJ4XiTDDNBtaLtCZQBKyo2HuNcq_V-AalY8zj8,115736
1070
- yt_dlp/extractor/youtube/_video.py,sha256=wn6218CML_rXttI4-0ZiyyOduPtomCFvMwpULs5QoLM,209768
1070
+ yt_dlp/extractor/youtube/_video.py,sha256=m7x1HtlqCmuQFaExYrKazSPzDxPSnYeVdEIRevrHbps,209795
1071
1071
  yt_dlp/extractor/youtube/jsc/__init__.py,sha256=HaVFP8ikrLaE-ClAh39-S28WCF4S2KTRaSu7QvA28E8,289
1072
1072
  yt_dlp/extractor/youtube/jsc/_director.py,sha256=92pB-KVSs6plmE5R8gpjkZL9aeoWNR0XTnGOBXMy9go,13167
1073
1073
  yt_dlp/extractor/youtube/jsc/_registry.py,sha256=Vg9GkHKHKKPeRfUQ-XSw01mfx_2Xyodh0SJpwjawYCA,102
@@ -1075,11 +1075,11 @@ yt_dlp/extractor/youtube/jsc/provider.py,sha256=1n0UQ0WvvvLbP_ORjo41PVX6hZplnue-
1075
1075
  yt_dlp/extractor/youtube/jsc/_builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1076
1076
  yt_dlp/extractor/youtube/jsc/_builtin/bun.py,sha256=_iWFaF3uXw2r_TObIpqM11cko75VwTmLzezr7RlPGhM,6065
1077
1077
  yt_dlp/extractor/youtube/jsc/_builtin/deno.py,sha256=d3bOY5t3-F6Ubbas0lpolBOWlL7OxLBhxJi035EeQQw,5549
1078
- yt_dlp/extractor/youtube/jsc/_builtin/ejs.py,sha256=JHrMYVFrVk-yI7yg4lS-zbHsSasVhMkZfScCG3birsU,13739
1078
+ yt_dlp/extractor/youtube/jsc/_builtin/ejs.py,sha256=88BQ63l7HuXNhzbyYsQWpzxALYvCuL8oSN5u-Zhbsc8,13915
1079
1079
  yt_dlp/extractor/youtube/jsc/_builtin/node.py,sha256=2D7mNEeWRVw2hD4rpydjWGHsOzccxDMwGJvx0eWNq3Q,2300
1080
1080
  yt_dlp/extractor/youtube/jsc/_builtin/quickjs.py,sha256=y1FSPGgrjcUbsiwC6rOcbOsK0BbLWlzfZwl8VjT7MdA,2233
1081
1081
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/__init__.py,sha256=aLGEcFSHt-ub1H21jHp52rJTDKZmWXV-PJd_0hVCcio,518
1082
- yt_dlp/extractor/youtube/jsc/_builtin/vendor/_info.py,sha256=JT5_Y3enCJXRah3sj9LujJXrzsL0vZ1RJvCTEn_axuU,1056
1082
+ yt_dlp/extractor/youtube/jsc/_builtin/vendor/_info.py,sha256=i5nCP-v40uoRQZ7WPlGMinuseXSffVqaiGmSSF197Is,1056
1083
1083
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.bun.lib.js,sha256=ZfLzSdQETBfPWniQsgtce3zyeYeBIr95s7M_f0v2LNQ,237
1084
1084
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.core.js,sha256=WM1Xb6fCNxVU_ELUONasGs5fPNHnHW5p9u1irRMRPyM,17016
1085
1085
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.deno.lib.js,sha256=6DFMNBXVnY31f9GSysXuQKziVjN-qfUZn0xwAv5Ozs8,245
@@ -1107,7 +1107,7 @@ yt_dlp/postprocessor/__init__.py,sha256=OWCnC8vk4BteCAIBVrnwMWr12Y6zy1PiBHmEnAZ9
1107
1107
  yt_dlp/postprocessor/common.py,sha256=TGv4iP7YWf__PmSSFWhrvshzZw3-yl8Urzoh0doSy-s,8424
1108
1108
  yt_dlp/postprocessor/embedthumbnail.py,sha256=WykLv12Jct9OX4SBPePT7HI8ykSMzaD4pyk8pGZYpMY,10530
1109
1109
  yt_dlp/postprocessor/exec.py,sha256=-Oz3sUph4mYQ-bbhT2nadLcHXS4LHiDDcaY83X6RJDs,1542
1110
- yt_dlp/postprocessor/ffmpeg.py,sha256=PiVBJj_zIx7QXHt-aWcQ-YnFl3pWBQ5GJWp69Sjr0pI,48208
1110
+ yt_dlp/postprocessor/ffmpeg.py,sha256=engqaUIAndaeuXvH5XXs-SdyWw6d4vT1Djh4VrS8PqA,48251
1111
1111
  yt_dlp/postprocessor/metadataparser.py,sha256=_tmPGbgQ95PBabSJBwqiuA00cpvq60AocKOYMKlmNKg,4381
1112
1112
  yt_dlp/postprocessor/modify_chapters.py,sha256=ehN1D-SGqGtY1F9vaWeGOWuBULnfPLvQ1QHtO58O3lU,17827
1113
1113
  yt_dlp/postprocessor/movefilesafterdownload.py,sha256=yfO2Waylcqrab0HJKY-PPTCYuxweSTKdEuGUq0fp2sI,1838
@@ -1115,21 +1115,21 @@ yt_dlp/postprocessor/sponsorblock.py,sha256=McDfxOTwAmtUnD9TxmRqm9Gyf6DRW4W6bBo5
1115
1115
  yt_dlp/postprocessor/xattrpp.py,sha256=PVKZpRXvWj3lHWU8GnyzZKnELjtO7vNYqZkbpJcqZBA,3305
1116
1116
  yt_dlp/utils/__init__.py,sha256=fktzbumix8bd9Xi288JebTYkxCuNhG21qkcSno-3g_s,283
1117
1117
  yt_dlp/utils/_deprecated.py,sha256=5KjqmcPW8uIc77xkhvz1gwxBb-jBF7cwG5nI6xxHebU,1300
1118
- yt_dlp/utils/_jsruntime.py,sha256=z4_Zx9UIvJMqUDOKPtJLwWKWUJ0JnrkwF8e77k7LI-Y,4477
1118
+ yt_dlp/utils/_jsruntime.py,sha256=cPLHquABqggAepWHIYlG9zgrnwjV4Le55mr8Fx71nCo,4319
1119
1119
  yt_dlp/utils/_legacy.py,sha256=hmczdkw5SELzsFcB2AUblAY9bw8gIBDuPFTBlYvXe_4,7858
1120
- yt_dlp/utils/_utils.py,sha256=i2Y4abakGQ1_0tl67yTcKvJ41S9OnDbTijMefNOPJAU,190785
1120
+ yt_dlp/utils/_utils.py,sha256=uPKu-EMJD14NgU7XXiZL0_gMicnnkl8hqXufEzfZY88,190861
1121
1121
  yt_dlp/utils/networking.py,sha256=2GeL1sPpEvQaj_E8J_3Xl-TkalawkmoPCZTwo5akU08,8651
1122
1122
  yt_dlp/utils/progress.py,sha256=t9kVvJ0oWuEqRzo9fdFbIhHUBtO_8mg348QwZ1faqLo,3261
1123
1123
  yt_dlp/utils/traversal.py,sha256=64E3RcZ56iSX50RI_HbKdDNftkETMLBaEPX791_b7yQ,18265
1124
1124
  yt_dlp/utils/jslib/__init__.py,sha256=CbdJiRA7Eh5PnjF2V4lDTcg0J0XjBMaaq0H4pCfq9Tk,87
1125
1125
  yt_dlp/utils/jslib/devalue.py,sha256=7DCGK_zUN0ZeV5hwPT06zaRMUxX_hyUyFWqs79rxw24,5621
1126
- yt_dlp-2025.12.6.232939.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1127
- yt_dlp-2025.12.6.232939.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=Bgx271dvWVM7TqhGKdrgqQGXSJmlvO678jfyNC6aCJA,164826
1128
- yt_dlp-2025.12.6.232939.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=hLa6lZnm7keENpNCjml9A88hbvefdsdoOpAiaNCVyHo,51488
1129
- yt_dlp-2025.12.6.232939.dev0.data/data/share/man/man1/yt-dlp.1,sha256=EfXpaxlohoxUn8X5ROJ0THnppGch3vy9bXOPsKPs3Bw,159331
1130
- yt_dlp-2025.12.6.232939.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1131
- yt_dlp-2025.12.6.232939.dev0.dist-info/METADATA,sha256=plcQMnWAO9HWYuhaxAU_lkght8I4rNDZjgxqFntBP0M,180215
1132
- yt_dlp-2025.12.6.232939.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1133
- yt_dlp-2025.12.6.232939.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1134
- yt_dlp-2025.12.6.232939.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1135
- yt_dlp-2025.12.6.232939.dev0.dist-info/RECORD,,
1126
+ yt_dlp-2025.12.8.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1127
+ yt_dlp-2025.12.8.data/data/share/doc/yt_dlp/README.txt,sha256=0jSXEocrRZu6D-cGk7g-sIg27eUJakwhFmX24eDa6No,164885
1128
+ yt_dlp-2025.12.8.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=5rUmfCOeb2nAYlsQohe9x05BeXyEi3AREXnpUXOPKbA,51487
1129
+ yt_dlp-2025.12.8.data/data/share/man/man1/yt-dlp.1,sha256=-AggAzgN4lXII3i5SabhWPQySb72BpCguchdmX2v-Ys,159420
1130
+ yt_dlp-2025.12.8.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1131
+ yt_dlp-2025.12.8.dist-info/METADATA,sha256=cneILaUO4spCPyAOLLj_U567CcA-5i4jT8e9GLG3DOA,180268
1132
+ yt_dlp-2025.12.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1133
+ yt_dlp-2025.12.8.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1134
+ yt_dlp-2025.12.8.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1135
+ yt_dlp-2025.12.8.dist-info/RECORD,,