yt-dlp 2025.12.26.233056.dev0__py3-none-any.whl → 2025.12.29.233040.dev0__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.
@@ -821,13 +821,17 @@ class GenericIE(InfoExtractor):
821
821
  'Referer': smuggled_data.get('referer'),
822
822
  }), impersonate=impersonate)
823
823
  except ExtractorError as e:
824
- if not (isinstance(e.cause, HTTPError) and e.cause.status == 403
825
- and e.cause.response.get_header('cf-mitigated') == 'challenge'
826
- and e.cause.response.extensions.get('impersonate') is None):
824
+ if not isinstance(e.cause, HTTPError) or e.cause.status != 403:
825
+ raise
826
+ res = e.cause.response
827
+ already_impersonating = res.extensions.get('impersonate') is not None
828
+ if already_impersonating or (
829
+ res.get_header('cf-mitigated') != 'challenge'
830
+ and b'<title>Attention Required! | Cloudflare</title>' not in res.read()
831
+ ):
827
832
  raise
828
833
  cf_cookie_domain = traverse_obj(
829
- LenientSimpleCookie(e.cause.response.get_header('set-cookie')),
830
- ('__cf_bm', 'domain'))
834
+ LenientSimpleCookie(res.get_header('set-cookie')), ('__cf_bm', 'domain'))
831
835
  if cf_cookie_domain:
832
836
  self.write_debug(f'Clearing __cf_bm cookie for {cf_cookie_domain}')
833
837
  self.cookiejar.clear(domain=cf_cookie_domain, path='/', name='__cf_bm')
@@ -4,6 +4,7 @@ from .common import InfoExtractor
4
4
  from ..utils import (
5
5
  ExtractorError,
6
6
  str_or_none,
7
+ strip_or_none,
7
8
  traverse_obj,
8
9
  update_url,
9
10
  )
@@ -50,7 +51,6 @@ class PicartoIE(InfoExtractor):
50
51
 
51
52
  if metadata.get('online') == 0:
52
53
  raise ExtractorError('Stream is offline', expected=True)
53
- title = metadata['title']
54
54
 
55
55
  cdn_data = self._download_json(''.join((
56
56
  update_url(data['getLoadBalancerUrl']['url'], scheme='https'),
@@ -79,7 +79,7 @@ class PicartoIE(InfoExtractor):
79
79
 
80
80
  return {
81
81
  'id': channel_id,
82
- 'title': title.strip(),
82
+ 'title': strip_or_none(metadata.get('title')),
83
83
  'is_live': True,
84
84
  'channel': channel_id,
85
85
  'channel_id': metadata.get('id'),
@@ -159,7 +159,7 @@ class PicartoVodIE(InfoExtractor):
159
159
  'id': video_id,
160
160
  **traverse_obj(data, {
161
161
  'id': ('id', {str_or_none}),
162
- 'title': ('title', {str}),
162
+ 'title': ('title', {str.strip}),
163
163
  'thumbnail': 'video_recording_image_url',
164
164
  'channel': ('channel', 'name', {str}),
165
165
  'age_limit': ('adult', {lambda x: 18 if x else 0}),
@@ -1065,7 +1065,7 @@ class YoutubeBaseInfoExtractor(InfoExtractor):
1065
1065
  return next_continuation
1066
1066
 
1067
1067
  return traverse_obj(renderer, (
1068
- ('contents', 'items', 'rows'), ..., 'continuationItemRenderer',
1068
+ ('contents', 'items', 'rows', 'subThreads'), ..., 'continuationItemRenderer',
1069
1069
  ('continuationEndpoint', ('button', 'buttonRenderer', 'command')),
1070
1070
  ), get_all=False, expected_type=cls._extract_continuation_ep_data)
1071
1071
 
@@ -1660,6 +1660,41 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
1660
1660
  'live_status': 'not_live',
1661
1661
  },
1662
1662
  'params': {'skip_download': True},
1663
+ }, {
1664
+ # Threaded comments with 4 levels of depth
1665
+ 'url': 'https://www.youtube.com/watch?v=f6HNySwZV4c',
1666
+ 'info_dict': {
1667
+ 'id': 'f6HNySwZV4c',
1668
+ 'ext': 'mp4',
1669
+ 'title': 'dlptestvideo2',
1670
+ 'description': '',
1671
+ 'media_type': 'video',
1672
+ 'uploader': 'cole-dlp-test-acc',
1673
+ 'uploader_id': '@coletdjnz',
1674
+ 'uploader_url': 'https://www.youtube.com/@coletdjnz',
1675
+ 'channel': 'cole-dlp-test-acc',
1676
+ 'channel_id': 'UCiu-3thuViMebBjw_5nWYrA',
1677
+ 'channel_url': 'https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA',
1678
+ 'view_count': int,
1679
+ 'like_count': int,
1680
+ 'age_limit': 0,
1681
+ 'duration': 5,
1682
+ 'thumbnail': 'https://i.ytimg.com/vi/f6HNySwZV4c/maxresdefault.jpg',
1683
+ 'categories': ['People & Blogs'],
1684
+ 'tags': [],
1685
+ 'timestamp': 1709856007,
1686
+ 'upload_date': '20240308',
1687
+ 'release_timestamp': 1709856007,
1688
+ 'release_date': '20240308',
1689
+ 'playable_in_embed': True,
1690
+ 'availability': 'public',
1691
+ 'live_status': 'not_live',
1692
+ 'comment_count': 15,
1693
+ },
1694
+ 'params': {
1695
+ 'skip_download': True,
1696
+ 'getcomments': True,
1697
+ },
1663
1698
  }]
1664
1699
  _WEBPAGE_TESTS = [{
1665
1700
  # <object>
@@ -2437,6 +2472,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2437
2472
  def extract_thread(contents, entity_payloads):
2438
2473
  if not parent:
2439
2474
  tracker['current_page_thread'] = 0
2475
+
2476
+ if max_depth < tracker['current_depth']:
2477
+ return
2478
+
2440
2479
  for content in contents:
2441
2480
  if not parent and tracker['total_parent_comments'] >= max_parents:
2442
2481
  yield
@@ -2480,6 +2519,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2480
2519
  'Detected YouTube comments looping. Stopping comment extraction '
2481
2520
  f'{"for this thread" if parent else ""} as we probably cannot get any more.')
2482
2521
  yield
2522
+ break # Safeguard for recursive call in subthreads code path below
2483
2523
  else:
2484
2524
  tracker['seen_comment_ids'].add(comment['id'])
2485
2525
 
@@ -2492,12 +2532,28 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2492
2532
  comment_thread_renderer, lambda x: x['replies']['commentRepliesRenderer'], dict)
2493
2533
 
2494
2534
  if comment_replies_renderer:
2535
+ subthreads = traverse_obj(comment_replies_renderer, (
2536
+ 'subThreads', lambda _, v: v['commentThreadRenderer']))
2537
+ # Recursively extract from `commentThreadRenderer`s in `subThreads`
2538
+ if subthreads:
2539
+ tracker['current_depth'] += 1
2540
+ for entry in extract_thread(subthreads, entity_payloads):
2541
+ if entry:
2542
+ yield entry
2543
+ tracker['current_depth'] -= 1
2544
+ # All of the subThreads' `continuationItemRenderer`s were within the nested
2545
+ # `commentThreadRenderer`s and are now exhausted, so avoid unnecessary recursion below
2546
+ continue
2547
+
2495
2548
  tracker['current_page_thread'] += 1
2549
+ tracker['current_depth'] += 1
2550
+ # Recursively extract from `continuationItemRenderer`s in `subThreads`
2496
2551
  comment_entries_iter = self._comment_entries(
2497
2552
  comment_replies_renderer, ytcfg, video_id,
2498
- parent=comment.get('id'), tracker=tracker)
2553
+ parent=comment_id, tracker=tracker)
2499
2554
  yield from itertools.islice(comment_entries_iter, min(
2500
2555
  max_replies_per_thread, max(0, max_replies - tracker['total_reply_comments'])))
2556
+ tracker['current_depth'] -= 1
2501
2557
 
2502
2558
  # Keeps track of counts across recursive calls
2503
2559
  if not tracker:
@@ -2509,19 +2565,14 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2509
2565
  'total_reply_comments': 0,
2510
2566
  'seen_comment_ids': set(),
2511
2567
  'pinned_comment_ids': set(),
2568
+ 'current_depth': 1,
2512
2569
  }
2513
2570
 
2514
- # TODO: Deprecated
2515
- # YouTube comments have a max depth of 2
2516
- max_depth = int_or_none(get_single_config_arg('max_comment_depth'))
2517
- if max_depth:
2518
- self._downloader.deprecated_feature('[youtube] max_comment_depth extractor argument is deprecated. '
2519
- 'Set max replies in the max-comments extractor argument instead')
2520
- if max_depth == 1 and parent:
2521
- return
2571
+ _max_comments, max_parents, max_replies, max_replies_per_thread, max_depth, *_ = (
2572
+ int_or_none(p, default=sys.maxsize) for p in self._configuration_arg('max_comments') + [''] * 5)
2522
2573
 
2523
- _max_comments, max_parents, max_replies, max_replies_per_thread, *_ = (
2524
- int_or_none(p, default=sys.maxsize) for p in self._configuration_arg('max_comments') + [''] * 4)
2574
+ if max_depth < tracker['current_depth']:
2575
+ return
2525
2576
 
2526
2577
  continuation = self._extract_continuation(root_continuation_data)
2527
2578
 
@@ -2550,6 +2601,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2550
2601
  note_prefix = ' Downloading comment API JSON reply thread %d %s' % (
2551
2602
  tracker['current_page_thread'], comment_prog_str)
2552
2603
  else:
2604
+ # TODO: `parent` is only truthy in this code path with YT's legacy (non-threaded) comment view
2553
2605
  note_prefix = '{}Downloading comment{} API JSON page {} {}'.format(
2554
2606
  ' ' if parent else '', ' replies' if parent else '',
2555
2607
  page_num, comment_prog_str)
@@ -2566,6 +2618,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2566
2618
  ep='next', ytcfg=ytcfg, headers=headers, note=note_prefix,
2567
2619
  check_get_keys=check_get_keys)
2568
2620
  except ExtractorError as e:
2621
+ # TODO: This code path is not reached since eb5bdbfa70126c7d5355cc0954b63720522e462c
2569
2622
  # Ignore incomplete data error for replies if retries didn't work.
2570
2623
  # This is to allow any other parent comments and comment threads to be downloaded.
2571
2624
  # See: https://github.com/yt-dlp/yt-dlp/issues/4669
@@ -3307,6 +3360,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
3307
3360
  def process_https_formats():
3308
3361
  proto = 'https'
3309
3362
  https_fmts = []
3363
+ skip_player_js = 'js' in self._configuration_arg('player_skip')
3364
+
3310
3365
  for fmt_stream in streaming_formats:
3311
3366
  if fmt_stream.get('targetDurationSec'):
3312
3367
  continue
@@ -3344,13 +3399,13 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
3344
3399
  sc = urllib.parse.parse_qs(fmt_stream.get('signatureCipher'))
3345
3400
  fmt_url = url_or_none(try_get(sc, lambda x: x['url'][0]))
3346
3401
  encrypted_sig = try_get(sc, lambda x: x['s'][0])
3347
- if not all((sc, fmt_url, player_url, encrypted_sig)):
3348
- msg = f'Some {client_name} client https formats have been skipped as they are missing a url. '
3402
+ if not all((sc, fmt_url, skip_player_js or player_url, encrypted_sig)):
3403
+ msg = f'Some {client_name} client https formats have been skipped as they are missing a URL. '
3349
3404
  if client_name in ('web', 'web_safari'):
3350
3405
  msg += 'YouTube is forcing SABR streaming for this client. '
3351
3406
  else:
3352
3407
  msg += (
3353
- f'YouTube may have enabled the SABR-only or Server-Side Ad Placement experiment for '
3408
+ f'YouTube may have enabled the SABR-only streaming experiment for '
3354
3409
  f'{"your account" if self.is_authenticated else "the current session"}. '
3355
3410
  )
3356
3411
  msg += 'See https://github.com/yt-dlp/yt-dlp/issues/12482 for more details'
@@ -3366,6 +3421,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
3366
3421
  # signature
3367
3422
  # Attempt to load sig spec from cache
3368
3423
  if encrypted_sig:
3424
+ if skip_player_js:
3425
+ continue
3369
3426
  spec_cache_id = self._sig_spec_cache_id(player_url, len(encrypted_sig))
3370
3427
  spec = self._load_sig_spec_from_cache(spec_cache_id)
3371
3428
  if spec:
@@ -3379,6 +3436,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
3379
3436
  # n challenge
3380
3437
  query = parse_qs(fmt_url)
3381
3438
  if query.get('n'):
3439
+ if skip_player_js:
3440
+ continue
3382
3441
  n_challenge = query['n'][0]
3383
3442
  if n_challenge in self._player_cache:
3384
3443
  fmt_url = update_url_query(fmt_url, {'n': self._player_cache[n_challenge]})
yt_dlp/version.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # Autogenerated by devscripts/update-version.py
2
2
 
3
- __version__ = '2025.12.26.233056'
3
+ __version__ = '2025.12.29.233040'
4
4
 
5
- RELEASE_GIT_HEAD = 'c0a7c594a9e67ac2ee4cde38fa4842a0b2d675e8'
5
+ RELEASE_GIT_HEAD = 'd22436e5dc7c6808d931e27cbb967b1b2a33c17c'
6
6
 
7
7
  VARIANT = 'pip'
8
8
 
@@ -12,4 +12,4 @@ CHANNEL = 'nightly'
12
12
 
13
13
  ORIGIN = 'yt-dlp/yt-dlp-nightly-builds'
14
14
 
15
- _pkg_version = '2025.12.26.233056dev'
15
+ _pkg_version = '2025.12.29.233040dev'
@@ -2339,11 +2339,15 @@ youtube
2339
2339
  YouTube's side)
2340
2340
  - max_comments: Limit the amount of comments to gather.
2341
2341
  Comma-separated list of integers representing
2342
- max-comments,max-parents,max-replies,max-replies-per-thread. Default
2343
- is all,all,all,all
2344
- - E.g. all,all,1000,10 will get a maximum of 1000 replies total,
2345
- with up to 10 replies per thread. 1000,all,100 will get a
2346
- maximum of 1000 comments, with a maximum of 100 replies total
2342
+ max-comments,max-parents,max-replies,max-replies-per-thread,max-depth.
2343
+ Default is all,all,all,all,all
2344
+ - A max-depth value of 1 will discard all replies, regardless of
2345
+ the max-replies or max-replies-per-thread values given
2346
+ - E.g. all,all,1000,10,2 will get a maximum of 1000 replies total,
2347
+ with up to 10 replies per thread, and only 2 levels of depth
2348
+ (i.e. top-level comments plus their immediate replies).
2349
+ 1000,all,100 will get a maximum of 1000 comments, with a maximum
2350
+ of 100 replies total
2347
2351
  - formats: Change the types of formats to return. dashy (convert HTTP
2348
2352
  to DASH), duplicate (identical content but different URLs or
2349
2353
  protocol; includes dashy), incomplete (cannot be downloaded
@@ -2758,13 +2758,18 @@ choose comment sorting mode (on YouTube\[aq]s side)
2758
2758
  .IP \[bu] 2
2759
2759
  \f[V]max_comments\f[R]: Limit the amount of comments to gather.
2760
2760
  Comma-separated list of integers representing
2761
- \f[V]max-comments,max-parents,max-replies,max-replies-per-thread\f[R].
2762
- Default is \f[V]all,all,all,all\f[R]
2761
+ \f[V]max-comments,max-parents,max-replies,max-replies-per-thread,max-depth\f[R].
2762
+ Default is \f[V]all,all,all,all,all\f[R]
2763
2763
  .RS 2
2764
2764
  .IP \[bu] 2
2765
+ A \f[V]max-depth\f[R] value of \f[V]1\f[R] will discard all replies,
2766
+ regardless of the \f[V]max-replies\f[R] or
2767
+ \f[V]max-replies-per-thread\f[R] values given
2768
+ .IP \[bu] 2
2765
2769
  E.g.
2766
- \f[V]all,all,1000,10\f[R] will get a maximum of 1000 replies total, with
2767
- up to 10 replies per thread.
2770
+ \f[V]all,all,1000,10,2\f[R] will get a maximum of 1000 replies total,
2771
+ with up to 10 replies per thread, and only 2 levels of depth (i.e.
2772
+ top-level comments plus their immediate replies).
2768
2773
  \f[V]1000,all,100\f[R] will get a maximum of 1000 comments, with a
2769
2774
  maximum of 100 replies total
2770
2775
  .RE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yt-dlp
3
- Version: 2025.12.26.233056.dev0
3
+ Version: 2025.12.29.233040.dev0
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
@@ -1928,8 +1928,9 @@ The following extractors use this feature:
1928
1928
  * `player_js_variant`: The player javascript variant to use for n/sig deciphering. The known variants are: `main`, `tcc`, `tce`, `es5`, `es6`, `tv`, `tv_es6`, `phone`, `tablet`. The default is `main`, and the others are for debugging purposes. You can use `actual` to go with what is prescribed by the site
1929
1929
  * `player_js_version`: The player javascript version to use for n/sig deciphering, in the format of `signature_timestamp@hash` (e.g. `20348@0004de42`). The default is to use what is prescribed by the site, and can be selected with `actual`
1930
1930
  * `comment_sort`: `top` or `new` (default) - choose comment sorting mode (on YouTube's side)
1931
- * `max_comments`: Limit the amount of comments to gather. Comma-separated list of integers representing `max-comments,max-parents,max-replies,max-replies-per-thread`. Default is `all,all,all,all`
1932
- * E.g. `all,all,1000,10` will get a maximum of 1000 replies total, with up to 10 replies per thread. `1000,all,100` will get a maximum of 1000 comments, with a maximum of 100 replies total
1931
+ * `max_comments`: Limit the amount of comments to gather. Comma-separated list of integers representing `max-comments,max-parents,max-replies,max-replies-per-thread,max-depth`. Default is `all,all,all,all,all`
1932
+ * A `max-depth` value of `1` will discard all replies, regardless of the `max-replies` or `max-replies-per-thread` values given
1933
+ * E.g. `all,all,1000,10,2` will get a maximum of 1000 replies total, with up to 10 replies per thread, and only 2 levels of depth (i.e. top-level comments plus their immediate replies). `1000,all,100` will get a maximum of 1000 comments, with a maximum of 100 replies total
1933
1934
  * `formats`: Change the types of formats to return. `dashy` (convert HTTP to DASH), `duplicate` (identical content but different URLs or protocol; includes `dashy`), `incomplete` (cannot be downloaded completely - live dash and post-live m3u8), `missing_pot` (include formats that require a PO Token but are missing one)
1934
1935
  * `innertube_host`: Innertube API host to use for all API requests; e.g. `studio.youtube.com`, `youtubei.googleapis.com`. Note that cookies exported from one subdomain will not work on others
1935
1936
  * `innertube_key`: Innertube API key to use for all API requests. By default, no API key is used
@@ -11,7 +11,7 @@ yt_dlp/options.py,sha256=72Qipr6jhFUO4gUPTIJsqYeHujnZi1L1GYx1Vn5qtiM,100390
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=lcPi5vYOUFVd30bH7wWoyQeIMg1NeLa-MLTOiZZBMg4,360
14
+ yt_dlp/version.py,sha256=wDYRUMT_zumtcfgpBv8NwMcW6QWrtS7QQag9OYmtWyM,360
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
@@ -341,7 +341,7 @@ yt_dlp/extractor/gazeta.py,sha256=TPAyAUT6wPWrPABDdy8BEBPqriPhJzV5CfEfzo2JSZ8,19
341
341
  yt_dlp/extractor/gbnews.py,sha256=I8btFYZMP8IHM72NxbQ4bcLRCUisjL9DBXv6lSn3BHk,4514
342
342
  yt_dlp/extractor/gdcvault.py,sha256=XjqbEYm0emjlE-iP8aXmWjZ17D0dV6Bdv51idUGQaQw,8542
343
343
  yt_dlp/extractor/gedidigital.py,sha256=XGeRNC7LmNIBe4tLVgeGQTYyykcgHjFu_BFi_0lAS4s,8521
344
- yt_dlp/extractor/generic.py,sha256=_pFFQoycduijAG554wZNRS3Z7exAAt54Zyock9bYp9A,58827
344
+ yt_dlp/extractor/generic.py,sha256=FqFg2G4TeLNrtR-0O8TeZMAF4HAKfrBmjnbExwraA3w,58980
345
345
  yt_dlp/extractor/genericembeds.py,sha256=6vVNdeCccZ5JcdZxsLSAHPfhG1kjXOAelHWCXax8LHY,4613
346
346
  yt_dlp/extractor/genius.py,sha256=BgRpIRyVrjqZ9b4SvrRTIkQgtzE6L5kke7l5OW3AMv8,6103
347
347
  yt_dlp/extractor/germanupa.py,sha256=FMmWu0zhSbbGdrTa86r1AtvqG-MtR3dYsmCn6YdVBo4,4051
@@ -662,7 +662,7 @@ yt_dlp/extractor/phoenix.py,sha256=RimZJ_CZ2u8CXWzWzsRxyz8j2h1pX8aoPEcxcCg2elQ,3
662
662
  yt_dlp/extractor/photobucket.py,sha256=OZRZ1ke878NTqNneGp9a0yeIA-_llUy7WDOE2AexKWw,1698
663
663
  yt_dlp/extractor/pialive.py,sha256=ZeLC8rpWYJEHDul5YYRGZcCJ3VfaDLZ1bilD50Rtxv0,5522
664
664
  yt_dlp/extractor/piapro.py,sha256=QCSnxf60IA1lDV28W1RKQyywcfaaLzH35z--SEMbZwc,4302
665
- yt_dlp/extractor/picarto.py,sha256=tm4KLjLNsGwRdiHRabsftJgLFKtCH1IfRmQtqC9rYs4,5281
665
+ yt_dlp/extractor/picarto.py,sha256=L9rRki5u6_UKST9zQ20h9PrVhxsmPlw7wMXRJzQ1ss0,5295
666
666
  yt_dlp/extractor/piksel.py,sha256=GIhsNtq7l1zm5vsegeOsZ-DPT8vV0eFVCj0T3Wx4M1o,7206
667
667
  yt_dlp/extractor/pinkbike.py,sha256=J1XybWVHfXfNnzz4qPralPMd7hFLe1r6XliPxM3uJCM,3351
668
668
  yt_dlp/extractor/pinterest.py,sha256=454P1Mvxej66jOsGgUYSveIC_kMZCnSUOvOz4jdDr44,10545
@@ -1059,14 +1059,14 @@ yt_dlp/extractor/zingmp3.py,sha256=KHD-f-1vUPy18Xk-_F_H_LfFR9N7-bONFYWeNRvJ1Z4,2
1059
1059
  yt_dlp/extractor/zoom.py,sha256=DW5TmRR4GWWWloSysqYqN-R5jvDkLTMdsOzsyIWcltk,7090
1060
1060
  yt_dlp/extractor/zype.py,sha256=e3_07aMl65x-ziI5Ge_Ph_lCV4q67DnqeRq2PjIKZj4,5507
1061
1061
  yt_dlp/extractor/youtube/__init__.py,sha256=3F72z6WHXlv41giIdmmVY7Fws-bAnkiWz8Eh3A19004,1454
1062
- yt_dlp/extractor/youtube/_base.py,sha256=jQy0mec1bolH7f00ZWKfVy8WGmqW-TVo76ivzCcLlWo,55537
1062
+ yt_dlp/extractor/youtube/_base.py,sha256=HlC-OeuoGS8gJhiErGJ8My_wpjYL5iCJnQpgWjrpYXI,55551
1063
1063
  yt_dlp/extractor/youtube/_clip.py,sha256=__EJUrb6iUCIURupsaa-ixn51q4esfok09znrpvdD88,3073
1064
1064
  yt_dlp/extractor/youtube/_mistakes.py,sha256=bLrxlAYqdR0mTuCLoMmJHh15BHuhxfHXeQFTVBRX9Lk,2142
1065
1065
  yt_dlp/extractor/youtube/_notifications.py,sha256=1nhavzW0e2QWFAWHkfbTU4sSXNp4vUbGFygYNSgbxBE,4585
1066
1066
  yt_dlp/extractor/youtube/_redirect.py,sha256=WWWnGEkfSGBXpZFi_bWY4XcHZ8PDeK7UsndDaTYYhQg,9005
1067
1067
  yt_dlp/extractor/youtube/_search.py,sha256=E9raTPGjUD6mm81WBpT4AsaxyiTBHdNssgzeHwVeNOE,6552
1068
1068
  yt_dlp/extractor/youtube/_tab.py,sha256=MiQGWZdHENOz8Ac-OAuAgqMWJ6gC-PZKJWPDG80QY6E,115490
1069
- yt_dlp/extractor/youtube/_video.py,sha256=m7x1HtlqCmuQFaExYrKazSPzDxPSnYeVdEIRevrHbps,209795
1069
+ yt_dlp/extractor/youtube/_video.py,sha256=gsgpDffY8iV4p8ipF0KWyiWUTKO2zXCWv29O5mAo-Ec,212382
1070
1070
  yt_dlp/extractor/youtube/jsc/__init__.py,sha256=HaVFP8ikrLaE-ClAh39-S28WCF4S2KTRaSu7QvA28E8,289
1071
1071
  yt_dlp/extractor/youtube/jsc/_director.py,sha256=92pB-KVSs6plmE5R8gpjkZL9aeoWNR0XTnGOBXMy9go,13167
1072
1072
  yt_dlp/extractor/youtube/jsc/_registry.py,sha256=Vg9GkHKHKKPeRfUQ-XSw01mfx_2Xyodh0SJpwjawYCA,102
@@ -1122,13 +1122,13 @@ yt_dlp/utils/progress.py,sha256=t9kVvJ0oWuEqRzo9fdFbIhHUBtO_8mg348QwZ1faqLo,3261
1122
1122
  yt_dlp/utils/traversal.py,sha256=64E3RcZ56iSX50RI_HbKdDNftkETMLBaEPX791_b7yQ,18265
1123
1123
  yt_dlp/utils/jslib/__init__.py,sha256=CbdJiRA7Eh5PnjF2V4lDTcg0J0XjBMaaq0H4pCfq9Tk,87
1124
1124
  yt_dlp/utils/jslib/devalue.py,sha256=7DCGK_zUN0ZeV5hwPT06zaRMUxX_hyUyFWqs79rxw24,5621
1125
- yt_dlp-2025.12.26.233056.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1126
- yt_dlp-2025.12.26.233056.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=wmrt5znP_AlvkrvysScvz2QYyjT2kZ1y2RRmx0Qvy_U,164886
1127
- yt_dlp-2025.12.26.233056.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=v2WQvWvk4qKpp2-97z2ULb5Msj5dgzU6nMkS-FwSmbM,51488
1128
- yt_dlp-2025.12.26.233056.dev0.data/data/share/man/man1/yt-dlp.1,sha256=9Ll8XNcxtpdL-FmhXtOrDy3OuGmOCatIKNDzmwxzqxo,159421
1129
- yt_dlp-2025.12.26.233056.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1130
- yt_dlp-2025.12.26.233056.dev0.dist-info/METADATA,sha256=8NCk3ZyS9S3ce9-oIjjYYskmE7iouCH6VwzBZQpi3PE,180282
1131
- yt_dlp-2025.12.26.233056.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1132
- yt_dlp-2025.12.26.233056.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1133
- yt_dlp-2025.12.26.233056.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1134
- yt_dlp-2025.12.26.233056.dev0.dist-info/RECORD,,
1125
+ yt_dlp-2025.12.29.233040.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1126
+ yt_dlp-2025.12.29.233040.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=cPx4ZehhabGCBTYTosfKHInDIeDasDSR2Xtxtl-xo58,165135
1127
+ yt_dlp-2025.12.29.233040.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=v2WQvWvk4qKpp2-97z2ULb5Msj5dgzU6nMkS-FwSmbM,51488
1128
+ yt_dlp-2025.12.29.233040.dev0.data/data/share/man/man1/yt-dlp.1,sha256=yyBAVJTtg0xPpkUsET4pkWywEepOaZ5Pap5UnleI85M,159690
1129
+ yt_dlp-2025.12.29.233040.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1130
+ yt_dlp-2025.12.29.233040.dev0.dist-info/METADATA,sha256=bJp7Q2yX-pJAMGAucvtPrzJUNg1N1d5aSOHio7MORjc,180513
1131
+ yt_dlp-2025.12.29.233040.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1132
+ yt_dlp-2025.12.29.233040.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1133
+ yt_dlp-2025.12.29.233040.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1134
+ yt_dlp-2025.12.29.233040.dev0.dist-info/RECORD,,