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 +4 -0
- yt_dlp/extractor/patreon.py +2 -1
- yt_dlp/extractor/tubitv.py +3 -3
- yt_dlp/extractor/youtube/_video.py +24 -5
- yt_dlp/version.py +3 -3
- {yt_dlp-2025.11.29.232949.dev0.dist-info → yt_dlp-2025.12.1.51642.dev0.dist-info}/METADATA +1 -1
- {yt_dlp-2025.11.29.232949.dev0.dist-info → yt_dlp-2025.12.1.51642.dev0.dist-info}/RECORD +15 -15
- {yt_dlp-2025.11.29.232949.dev0.data → yt_dlp-2025.12.1.51642.dev0.data}/data/share/bash-completion/completions/yt-dlp +0 -0
- {yt_dlp-2025.11.29.232949.dev0.data → yt_dlp-2025.12.1.51642.dev0.data}/data/share/doc/yt_dlp/README.txt +0 -0
- {yt_dlp-2025.11.29.232949.dev0.data → yt_dlp-2025.12.1.51642.dev0.data}/data/share/fish/vendor_completions.d/yt-dlp.fish +0 -0
- {yt_dlp-2025.11.29.232949.dev0.data → yt_dlp-2025.12.1.51642.dev0.data}/data/share/man/man1/yt-dlp.1 +0 -0
- {yt_dlp-2025.11.29.232949.dev0.data → yt_dlp-2025.12.1.51642.dev0.data}/data/share/zsh/site-functions/_yt-dlp +0 -0
- {yt_dlp-2025.11.29.232949.dev0.dist-info → yt_dlp-2025.12.1.51642.dev0.dist-info}/WHEEL +0 -0
- {yt_dlp-2025.11.29.232949.dev0.dist-info → yt_dlp-2025.12.1.51642.dev0.dist-info}/entry_points.txt +0 -0
- {yt_dlp-2025.11.29.232949.dev0.dist-info → yt_dlp-2025.12.1.51642.dev0.dist-info}/licenses/LICENSE +0 -0
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']})
|
yt_dlp/extractor/patreon.py
CHANGED
|
@@ -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',
|
|
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',
|
yt_dlp/extractor/tubitv.py
CHANGED
|
@@ -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\.
|
|
186
|
-
transform_source=js_to_json)['
|
|
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, ('
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
3
|
+
__version__ = '2025.12.01.051642'
|
|
4
4
|
|
|
5
|
-
RELEASE_GIT_HEAD = '
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
1126
|
-
yt_dlp-2025.
|
|
1127
|
-
yt_dlp-2025.
|
|
1128
|
-
yt_dlp-2025.
|
|
1129
|
-
yt_dlp-2025.
|
|
1130
|
-
yt_dlp-2025.
|
|
1131
|
-
yt_dlp-2025.
|
|
1132
|
-
yt_dlp-2025.
|
|
1133
|
-
yt_dlp-2025.
|
|
1134
|
-
yt_dlp-2025.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{yt_dlp-2025.11.29.232949.dev0.data → yt_dlp-2025.12.1.51642.dev0.data}/data/share/man/man1/yt-dlp.1
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{yt_dlp-2025.11.29.232949.dev0.dist-info → yt_dlp-2025.12.1.51642.dev0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{yt_dlp-2025.11.29.232949.dev0.dist-info → yt_dlp-2025.12.1.51642.dev0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|