yt-dlp 2025.11.29.232949.dev0__py3-none-any.whl → 2025.12.1.10606.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.
yt_dlp/extractor/fc2.py CHANGED
@@ -5,6 +5,7 @@ from .common import InfoExtractor
5
5
  from ..networking import Request
6
6
  from ..utils import (
7
7
  ExtractorError,
8
+ UserNotLive,
8
9
  js_to_json,
9
10
  traverse_obj,
10
11
  update_url_query,
@@ -205,6 +206,9 @@ class FC2LiveIE(InfoExtractor):
205
206
  'client_app': 'browser_hls',
206
207
  'ipv6': '',
207
208
  }), headers={'X-Requested-With': 'XMLHttpRequest'})
209
+ # A non-zero 'status' indicates the stream is not live, so check truthiness
210
+ if traverse_obj(control_server, ('status', {int})) and 'control_token' not in control_server:
211
+ raise UserNotLive(video_id=video_id)
208
212
  self._set_cookie('live.fc2.com', 'l_ortkn', control_server['orz_raw'])
209
213
 
210
214
  ws_url = update_url_query(control_server['url'], {'control_token': control_server['control_token']})
@@ -598,7 +598,8 @@ class PatreonCampaignIE(PatreonBaseIE):
598
598
  'props', 'pageProps', 'bootstrapEnvelope', 'pageBootstrap', 'campaign', 'data', 'id', {str}))
599
599
  if not campaign_id:
600
600
  campaign_id = traverse_obj(self._search_nextjs_v13_data(webpage, vanity), (
601
- lambda _, v: v['type'] == 'campaign', 'id', {str}, any, {require('campaign ID')}))
601
+ ((..., 'value', 'campaign', 'data'), lambda _, v: v['type'] == 'campaign'),
602
+ 'id', {str}, any, {require('campaign ID')}))
602
603
 
603
604
  params = {
604
605
  'json-api-use-default-includes': 'false',
@@ -182,13 +182,13 @@ class TubiTvShowIE(InfoExtractor):
182
182
  webpage = self._download_webpage(show_url, playlist_id)
183
183
 
184
184
  data = self._search_json(
185
- r'window\.__data\s*=', webpage, 'data', playlist_id,
186
- transform_source=js_to_json)['video']
185
+ r'window\.__REACT_QUERY_STATE__\s*=', webpage, 'data', playlist_id,
186
+ transform_source=js_to_json)['queries'][0]['state']['data']
187
187
 
188
188
  # v['number'] is already a decimal string, but stringify to protect against API changes
189
189
  path = [lambda _, v: str(v['number']) == selected_season] if selected_season else [..., {dict}]
190
190
 
191
- for season in traverse_obj(data, ('byId', lambda _, v: v['type'] == 's', 'seasons', *path)):
191
+ for season in traverse_obj(data, ('seasons', *path)):
192
192
  season_number = int_or_none(season.get('number'))
193
193
  for episode in traverse_obj(season, ('episodes', lambda _, v: v['id'])):
194
194
  episode_id = episode['id']
@@ -2628,18 +2628,29 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
2628
2628
  def _get_checkok_params():
2629
2629
  return {'contentCheckOk': True, 'racyCheckOk': True}
2630
2630
 
2631
- @classmethod
2632
- def _generate_player_context(cls, sts=None):
2631
+ def _generate_player_context(self, sts=None):
2633
2632
  context = {
2634
2633
  'html5Preference': 'HTML5_PREF_WANTS',
2635
2634
  }
2636
2635
  if sts is not None:
2637
2636
  context['signatureTimestamp'] = sts
2637
+
2638
+ playback_context = {
2639
+ 'contentPlaybackContext': context,
2640
+ }
2641
+
2642
+ # The 'adPlaybackContext'/'request_no_ads' workaround results in a loss of premium formats.
2643
+ # Only default to 'true' if the user is unauthenticated, since we can't reliably detect all
2644
+ # types of premium accounts (e.g. YTMusic Premium), and since premium users don't have ads.
2645
+ default_arg_value = 'false' if self.is_authenticated else 'true'
2646
+ if self._configuration_arg('request_no_ads', [default_arg_value])[0] != 'false':
2647
+ playback_context['adPlaybackContext'] = {
2648
+ 'pyv': True,
2649
+ }
2650
+
2638
2651
  return {
2639
- 'playbackContext': {
2640
- 'contentPlaybackContext': context,
2641
- },
2642
- **cls._get_checkok_params(),
2652
+ 'playbackContext': playback_context,
2653
+ **self._get_checkok_params(),
2643
2654
  }
2644
2655
 
2645
2656
  def _get_config_po_token(self, client: str, context: _PoTokenContext):
@@ -4029,6 +4040,11 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4029
4040
  STREAMING_DATA_CLIENT_NAME: client_name,
4030
4041
  })
4031
4042
 
4043
+ def set_audio_lang_from_orig_subs_lang(lang_code):
4044
+ for f in formats:
4045
+ if f.get('acodec') != 'none' and not f.get('language'):
4046
+ f['language'] = lang_code
4047
+
4032
4048
  subtitles = {}
4033
4049
  skipped_subs_clients = set()
4034
4050
 
@@ -4088,7 +4104,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4088
4104
 
4089
4105
  orig_lang = qs.get('lang', [None])[-1]
4090
4106
  lang_name = self._get_text(caption_track, 'name', max_runs=1)
4091
- if caption_track.get('kind') != 'asr':
4107
+ is_manual_subs = caption_track.get('kind') != 'asr'
4108
+ if is_manual_subs:
4092
4109
  if not lang_code:
4093
4110
  continue
4094
4111
  process_language(
@@ -4099,16 +4116,14 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4099
4116
  if not trans_code:
4100
4117
  continue
4101
4118
  orig_trans_code = trans_code
4102
- if caption_track.get('kind') != 'asr' and trans_code != 'und':
4119
+ if is_manual_subs and trans_code != 'und':
4103
4120
  if not get_translated_subs:
4104
4121
  continue
4105
4122
  trans_code += f'-{lang_code}'
4106
4123
  trans_name += format_field(lang_name, None, ' from %s')
4107
4124
  if lang_code == f'a-{orig_trans_code}':
4108
4125
  # Set audio language based on original subtitles
4109
- for f in formats:
4110
- if f.get('acodec') != 'none' and not f.get('language'):
4111
- f['language'] = orig_trans_code
4126
+ set_audio_lang_from_orig_subs_lang(orig_trans_code)
4112
4127
  # Add an "-orig" label to the original language so that it can be distinguished.
4113
4128
  # The subs are returned without "-orig" as well for compatibility
4114
4129
  process_language(
@@ -4119,6 +4134,21 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4119
4134
  automatic_captions, base_url, trans_code, trans_name, client_name,
4120
4135
  pot_params if orig_lang == orig_trans_code else {'tlang': trans_code, **pot_params})
4121
4136
 
4137
+ # Extract automatic captions when the language is not in 'translationLanguages'
4138
+ # e.g. Cantonese [yue], see https://github.com/yt-dlp/yt-dlp/issues/14889
4139
+ lang_code = remove_start(lang_code, 'a-')
4140
+ if is_manual_subs or not lang_code or lang_code in automatic_captions:
4141
+ continue
4142
+ lang_name = remove_end(lang_name, ' (auto-generated)')
4143
+ if caption_track.get('isTranslatable'):
4144
+ # We can assume this is the original audio language
4145
+ set_audio_lang_from_orig_subs_lang(lang_code)
4146
+ process_language(
4147
+ automatic_captions, base_url, f'{lang_code}-orig',
4148
+ f'{lang_name} (Original)', client_name, pot_params)
4149
+ process_language(
4150
+ automatic_captions, base_url, lang_code, lang_name, client_name, pot_params)
4151
+
4122
4152
  # Avoid duplication if we've already got everything we need
4123
4153
  need_subs_langs.difference_update(subtitles)
4124
4154
  need_caps_langs.difference_update(automatic_captions)
yt_dlp/version.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # Autogenerated by devscripts/update-version.py
2
2
 
3
- __version__ = '2025.11.29.232949'
3
+ __version__ = '2025.12.01.010606'
4
4
 
5
- RELEASE_GIT_HEAD = '280165026886a1f1614ab527c34c66d71faa5d69'
5
+ RELEASE_GIT_HEAD = '56ea3a00eabb45d926a6b993708acf1b9951e23a'
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.11.29.232949dev'
15
+ _pkg_version = '2025.12.01.010606dev'
@@ -2377,6 +2377,11 @@ youtube
2377
2377
  for the given context)
2378
2378
  - jsc_trace: Enable debug logging for JS Challenge fetching. Either
2379
2379
  true or false (default)
2380
+ - request_no_ads: Skip preroll ads to eliminate the mandatory wait
2381
+ period before download. Either true (the default if unauthenticated)
2382
+ or false. The default is false when logged-in cookies have been
2383
+ passed to yt-dlp, since true will result in a loss of premium
2384
+ formats
2380
2385
 
2381
2386
  youtube-ejs
2382
2387
 
@@ -2820,6 +2820,13 @@ client requires one for the given context)
2820
2820
  .IP \[bu] 2
2821
2821
  \f[V]jsc_trace\f[R]: Enable debug logging for JS Challenge fetching.
2822
2822
  Either \f[V]true\f[R] or \f[V]false\f[R] (default)
2823
+ .IP \[bu] 2
2824
+ \f[V]request_no_ads\f[R]: Skip preroll ads to eliminate the mandatory
2825
+ wait period before download.
2826
+ Either \f[V]true\f[R] (the default if unauthenticated) or
2827
+ \f[V]false\f[R].
2828
+ The default is \f[V]false\f[R] when logged-in cookies have been passed
2829
+ to yt-dlp, since \f[V]true\f[R] will result in a loss of premium formats
2823
2830
  .SS youtube-ejs
2824
2831
  .IP \[bu] 2
2825
2832
  \f[V]jitless\f[R]: Run suported Javascript engines in JIT-less mode.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yt-dlp
3
- Version: 2025.11.29.232949.dev0
3
+ Version: 2025.12.1.10606.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
@@ -1940,6 +1940,7 @@ The following extractors use this feature:
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
+ * `request_no_ads`: Skip preroll ads to eliminate the mandatory wait period before download. Either `true` (the default if unauthenticated) or `false`. The default is `false` when logged-in cookies have been passed to yt-dlp, since `true` will result in a loss of premium formats
1943
1944
 
1944
1945
  #### youtube-ejs
1945
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)
@@ -11,7 +11,7 @@ yt_dlp/options.py,sha256=Icc0JRiKOzITWoMujE_ihEmkCS-uCcie42XhIh8LvS4,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=gTOf3fxzA59XCHtNJc5RZ0gaTHW-Jn-VkcajL9EMO-Q,360
14
+ yt_dlp/version.py,sha256=gRQ7MhWbDgmeRbfdUEVJyE03EyVUxAYDO2eD1QFfQMc,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
@@ -297,7 +297,7 @@ yt_dlp/extractor/fancode.py,sha256=5g9vL3uSFkJuOGu9jA7RvNMa_JJOdsTY9tJK7MelTLI,7
297
297
  yt_dlp/extractor/fathom.py,sha256=Zen0ODNNDno65GzB4VfDsarmYDb3vrMgXCQeRBSneoI,1836
298
298
  yt_dlp/extractor/faulio.py,sha256=L_qcU0nW5PtQTi8grW6chqt_qaOJsClbR-XR2fQniYQ,8606
299
299
  yt_dlp/extractor/faz.py,sha256=51DGSc2XTaSl2ulbuyS-kWpz3G-OFD5hOMvHc-NIeeI,3493
300
- yt_dlp/extractor/fc2.py,sha256=Zb-dL9h72WAtfXKcWvzfynvBinbu66__Gg4wEE843zc,11241
300
+ yt_dlp/extractor/fc2.py,sha256=8B6xh1aU_r7WTBZrcpk-dYChaXPjVWx67zM1WQDjoEw,11493
301
301
  yt_dlp/extractor/fczenit.py,sha256=sXcb-FuTW3c34AeIoWa_Jz5tjVW--qr0hbQ-Tu8HmFI,1666
302
302
  yt_dlp/extractor/fifa.py,sha256=pHwgFhsj1YfvSAx9TeIJMDMD2n0i-WQhGFjppOW481k,3795
303
303
  yt_dlp/extractor/filmon.py,sha256=h0knvwSSFBZyNfCVTeTXrCASko39dlNXZTP-_aB25kc,5840
@@ -647,7 +647,7 @@ yt_dlp/extractor/panopto.py,sha256=RvBX5WEjCAl71v28-gRNSEWHv3aAArT4_kVVUne1LXk,2
647
647
  yt_dlp/extractor/parler.py,sha256=QtII2_JqjExBdkECl7RUZh5PE1uylOf7HJ4Vkmn9Yu0,3766
648
648
  yt_dlp/extractor/parlview.py,sha256=ItmCcfd6_045TwkrkqnEAYlf18-LcfpdpFBZIqdneBI,2611
649
649
  yt_dlp/extractor/parti.py,sha256=I2_rksoMUYE67uU486xZb1-w76jZTfeJC8U9gTin8gk,3974
650
- yt_dlp/extractor/patreon.py,sha256=aDN2kQwe25MR_Wg0dgSCTb8MCkdZWu-08p3qSu7eKso,28362
650
+ yt_dlp/extractor/patreon.py,sha256=SMpRPkkHzsP2otsV0rOyGQmFVfGb_hlNk3xiFff_qN8,28420
651
651
  yt_dlp/extractor/pbs.py,sha256=PRoWH-vjD0B4d-txY8qt4AijhzVowQ6IbTDu6iePGxU,40932
652
652
  yt_dlp/extractor/pearvideo.py,sha256=nrJKNV91R2gMfd65vH-i4LmrVCrVCarXxnXOHFW1RDs,2494
653
653
  yt_dlp/extractor/peekvids.py,sha256=0HMQHpXFAJsW4HSCgS7Td9RECyO0kHuOQqX2VDU5Xf0,7214
@@ -908,7 +908,7 @@ yt_dlp/extractor/trunews.py,sha256=T_9ovvOwqtPHjCb6kR5ZDxvEXRR3T7tcGvPsc9l-4eE,1
908
908
  yt_dlp/extractor/truth.py,sha256=zND7u4eWsBg8wZDIuxQiloZIOl5bwJv2y9B5eWOmugw,2790
909
909
  yt_dlp/extractor/tube8.py,sha256=0CEsgUAnxqb70TkM4tBSH5TpII3rLem_HRUQS1dptPI,6248
910
910
  yt_dlp/extractor/tubetugraz.py,sha256=rEWNBA469DS-r8hXXmtk-pdRlvD_ZgZyZhlZgvgdTfI,11143
911
- yt_dlp/extractor/tubitv.py,sha256=Fiko-DtWKetvD09SrsafLgCMsia0wubBWXhumq4PO1s,8599
911
+ yt_dlp/extractor/tubitv.py,sha256=VsUGSym5YoQwppfhvIGrBtkHzJuQIAxllmIJX7qFBlk,8597
912
912
  yt_dlp/extractor/tumblr.py,sha256=wlLpSdyQCZ-URyDrEcPb4bCJj35CUJFRnY8sEGT-nBM,24113
913
913
  yt_dlp/extractor/tunein.py,sha256=Db7maeI5BaLpPbtAlXRLKJCkOKnwg-HFy4MoW1f0Dro,12542
914
914
  yt_dlp/extractor/turner.py,sha256=DH8l6_U3NJ-eu2tmTGuHQt4-joNBcJ2IT9H1WIpghhU,11459
@@ -1066,7 +1066,7 @@ yt_dlp/extractor/youtube/_notifications.py,sha256=1nhavzW0e2QWFAWHkfbTU4sSXNp4vU
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=NcbpPvJ4XiTDDNBtaLtCZQBKyo2HuNcq_V-AalY8zj8,115736
1069
- yt_dlp/extractor/youtube/_video.py,sha256=cMwrTnCHthcP92N_lH1O0epFR5WC8UhPeHw6Z2cgpPk,208247
1069
+ yt_dlp/extractor/youtube/_video.py,sha256=YxJyPO--Mi87mROriz2ivHOvShaEuc0dvcdxS_sAjG8,209898
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.11.29.232949.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1126
- yt_dlp-2025.11.29.232949.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=aO1yTJrp0tKhrdUa5fWmMnVxkrpUi0u3FoYo2uE2rVo,164489
1127
- yt_dlp-2025.11.29.232949.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=hLa6lZnm7keENpNCjml9A88hbvefdsdoOpAiaNCVyHo,51488
1128
- yt_dlp-2025.11.29.232949.dev0.data/data/share/man/man1/yt-dlp.1,sha256=YyGTf0wqbKUSsZigQ_6pOsAvxMyXNv_pd-6KmDBOrIY,158932
1129
- yt_dlp-2025.11.29.232949.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1130
- yt_dlp-2025.11.29.232949.dev0.dist-info/METADATA,sha256=ymuqVsabLW8vYS6LZL1Por-U6bgR2h0MXHIK5zM16BM,179883
1131
- yt_dlp-2025.11.29.232949.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1132
- yt_dlp-2025.11.29.232949.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1133
- yt_dlp-2025.11.29.232949.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1134
- yt_dlp-2025.11.29.232949.dev0.dist-info/RECORD,,
1125
+ yt_dlp-2025.12.1.10606.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1126
+ yt_dlp-2025.12.1.10606.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=K2YvExtahn7ZnFDmKGGIAeak6EwnNJUqtR8JxfvjISo,164777
1127
+ yt_dlp-2025.12.1.10606.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=hLa6lZnm7keENpNCjml9A88hbvefdsdoOpAiaNCVyHo,51488
1128
+ yt_dlp-2025.12.1.10606.dev0.data/data/share/man/man1/yt-dlp.1,sha256=p4fIebSfwPwI_Y5nVa5Emw2vJ6EI2G2rvHWn-iiICvs,159262
1129
+ yt_dlp-2025.12.1.10606.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1130
+ yt_dlp-2025.12.1.10606.dev0.dist-info/METADATA,sha256=GdHw-AOlr1gIwKpUAwCCxKzxLr1pSxkAoKeiESqwMS0,180161
1131
+ yt_dlp-2025.12.1.10606.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1132
+ yt_dlp-2025.12.1.10606.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1133
+ yt_dlp-2025.12.1.10606.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1134
+ yt_dlp-2025.12.1.10606.dev0.dist-info/RECORD,,