yt-dlp 2025.11.29.232949.dev0__py3-none-any.whl → 2025.12.1.51642.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']
@@ -4029,6 +4029,11 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4029
4029
  STREAMING_DATA_CLIENT_NAME: client_name,
4030
4030
  })
4031
4031
 
4032
+ def set_audio_lang_from_orig_subs_lang(lang_code):
4033
+ for f in formats:
4034
+ if f.get('acodec') != 'none' and not f.get('language'):
4035
+ f['language'] = lang_code
4036
+
4032
4037
  subtitles = {}
4033
4038
  skipped_subs_clients = set()
4034
4039
 
@@ -4088,7 +4093,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4088
4093
 
4089
4094
  orig_lang = qs.get('lang', [None])[-1]
4090
4095
  lang_name = self._get_text(caption_track, 'name', max_runs=1)
4091
- if caption_track.get('kind') != 'asr':
4096
+ is_manual_subs = caption_track.get('kind') != 'asr'
4097
+ if is_manual_subs:
4092
4098
  if not lang_code:
4093
4099
  continue
4094
4100
  process_language(
@@ -4099,16 +4105,14 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4099
4105
  if not trans_code:
4100
4106
  continue
4101
4107
  orig_trans_code = trans_code
4102
- if caption_track.get('kind') != 'asr' and trans_code != 'und':
4108
+ if is_manual_subs and trans_code != 'und':
4103
4109
  if not get_translated_subs:
4104
4110
  continue
4105
4111
  trans_code += f'-{lang_code}'
4106
4112
  trans_name += format_field(lang_name, None, ' from %s')
4107
4113
  if lang_code == f'a-{orig_trans_code}':
4108
4114
  # 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
4115
+ set_audio_lang_from_orig_subs_lang(orig_trans_code)
4112
4116
  # Add an "-orig" label to the original language so that it can be distinguished.
4113
4117
  # The subs are returned without "-orig" as well for compatibility
4114
4118
  process_language(
@@ -4119,6 +4123,21 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4119
4123
  automatic_captions, base_url, trans_code, trans_name, client_name,
4120
4124
  pot_params if orig_lang == orig_trans_code else {'tlang': trans_code, **pot_params})
4121
4125
 
4126
+ # Extract automatic captions when the language is not in 'translationLanguages'
4127
+ # e.g. Cantonese [yue], see https://github.com/yt-dlp/yt-dlp/issues/14889
4128
+ lang_code = remove_start(lang_code, 'a-')
4129
+ if is_manual_subs or not lang_code or lang_code in automatic_captions:
4130
+ continue
4131
+ lang_name = remove_end(lang_name, ' (auto-generated)')
4132
+ if caption_track.get('isTranslatable'):
4133
+ # We can assume this is the original audio language
4134
+ set_audio_lang_from_orig_subs_lang(lang_code)
4135
+ process_language(
4136
+ automatic_captions, base_url, f'{lang_code}-orig',
4137
+ f'{lang_name} (Original)', client_name, pot_params)
4138
+ process_language(
4139
+ automatic_captions, base_url, lang_code, lang_name, client_name, pot_params)
4140
+
4122
4141
  # Avoid duplication if we've already got everything we need
4123
4142
  need_subs_langs.difference_update(subtitles)
4124
4143
  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.051642'
4
4
 
5
- RELEASE_GIT_HEAD = '280165026886a1f1614ab527c34c66d71faa5d69'
5
+ RELEASE_GIT_HEAD = '017d76edcf05186df2073bdb5b8351a87f596f4c'
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.051642dev'
@@ -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.51642.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
@@ -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=rZNeUurOzAeBGPkK-zPA9_8Fypg5qfvVePlMoPRUDyo,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=6XuGJoXMZiP9ni3xKamfL9QkRmsiMCbisFHbCFDP19k,209315
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.51642.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1126
+ yt_dlp-2025.12.1.51642.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=aO1yTJrp0tKhrdUa5fWmMnVxkrpUi0u3FoYo2uE2rVo,164489
1127
+ yt_dlp-2025.12.1.51642.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=hLa6lZnm7keENpNCjml9A88hbvefdsdoOpAiaNCVyHo,51488
1128
+ yt_dlp-2025.12.1.51642.dev0.data/data/share/man/man1/yt-dlp.1,sha256=YyGTf0wqbKUSsZigQ_6pOsAvxMyXNv_pd-6KmDBOrIY,158932
1129
+ yt_dlp-2025.12.1.51642.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1130
+ yt_dlp-2025.12.1.51642.dev0.dist-info/METADATA,sha256=7IlGln3-h4ZWileIScKeRT3ac9dHgJ_KO3GhwYsGh3k,179881
1131
+ yt_dlp-2025.12.1.51642.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1132
+ yt_dlp-2025.12.1.51642.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1133
+ yt_dlp-2025.12.1.51642.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1134
+ yt_dlp-2025.12.1.51642.dev0.dist-info/RECORD,,