yt-dlp 2026.1.29.165626.dev0__py3-none-any.whl → 2026.1.31__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/downloader/__init__.py +2 -0
- yt_dlp/downloader/soop.py +61 -0
- yt_dlp/extractor/afreecatv.py +39 -1
- yt_dlp/extractor/lazy_extractors.py +1 -1
- yt_dlp/extractor/unsupported.py +5 -0
- yt_dlp/extractor/whyp.py +8 -2
- yt_dlp/extractor/youtube/_base.py +0 -42
- yt_dlp/extractor/youtube/_video.py +12 -9
- yt_dlp/version.py +5 -5
- {yt_dlp-2026.1.29.165626.dev0.data → yt_dlp-2026.1.31.data}/data/share/doc/yt_dlp/README.txt +13 -12
- {yt_dlp-2026.1.29.165626.dev0.data → yt_dlp-2026.1.31.data}/data/share/fish/vendor_completions.d/yt-dlp.fish +1 -1
- {yt_dlp-2026.1.29.165626.dev0.data → yt_dlp-2026.1.31.data}/data/share/man/man1/yt-dlp.1 +14 -13
- {yt_dlp-2026.1.29.165626.dev0.dist-info → yt_dlp-2026.1.31.dist-info}/METADATA +3 -3
- {yt_dlp-2026.1.29.165626.dev0.dist-info → yt_dlp-2026.1.31.dist-info}/RECORD +19 -18
- {yt_dlp-2026.1.29.165626.dev0.data → yt_dlp-2026.1.31.data}/data/share/bash-completion/completions/yt-dlp +0 -0
- {yt_dlp-2026.1.29.165626.dev0.data → yt_dlp-2026.1.31.data}/data/share/zsh/site-functions/_yt-dlp +0 -0
- {yt_dlp-2026.1.29.165626.dev0.dist-info → yt_dlp-2026.1.31.dist-info}/WHEEL +0 -0
- {yt_dlp-2026.1.29.165626.dev0.dist-info → yt_dlp-2026.1.31.dist-info}/entry_points.txt +0 -0
- {yt_dlp-2026.1.29.165626.dev0.dist-info → yt_dlp-2026.1.31.dist-info}/licenses/LICENSE +0 -0
yt_dlp/downloader/__init__.py
CHANGED
|
@@ -36,6 +36,7 @@ from .rtsp import RtspFD
|
|
|
36
36
|
from .websocket import WebSocketFragmentFD
|
|
37
37
|
from .youtube_live_chat import YoutubeLiveChatFD
|
|
38
38
|
from .bunnycdn import BunnyCdnFD
|
|
39
|
+
from .soop import SoopVodFD
|
|
39
40
|
|
|
40
41
|
PROTOCOL_MAP = {
|
|
41
42
|
'rtmp': RtmpFD,
|
|
@@ -56,6 +57,7 @@ PROTOCOL_MAP = {
|
|
|
56
57
|
'youtube_live_chat': YoutubeLiveChatFD,
|
|
57
58
|
'youtube_live_chat_replay': YoutubeLiveChatFD,
|
|
58
59
|
'bunnycdn': BunnyCdnFD,
|
|
60
|
+
'soopvod': SoopVodFD,
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import threading
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
from .common import FileDownloader
|
|
5
|
+
from . import HlsFD
|
|
6
|
+
from ..extractor.afreecatv import _cloudfront_auth_request
|
|
7
|
+
from ..networking.exceptions import network_exceptions
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class SoopVodFD(FileDownloader):
|
|
11
|
+
"""
|
|
12
|
+
Downloads Soop subscription VODs with required cookie refresh requests
|
|
13
|
+
Note, this is not a part of public API, and will be removed without notice.
|
|
14
|
+
DO NOT USE
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def real_download(self, filename, info_dict):
|
|
18
|
+
self.to_screen(f'[{self.FD_NAME}] Downloading Soop subscription VOD HLS')
|
|
19
|
+
fd = HlsFD(self.ydl, self.params)
|
|
20
|
+
refresh_params = info_dict['_cookie_refresh_params']
|
|
21
|
+
referer_url = info_dict['webpage_url']
|
|
22
|
+
|
|
23
|
+
stop_event = threading.Event()
|
|
24
|
+
refresh_thread = threading.Thread(
|
|
25
|
+
target=self._cookie_refresh_thread,
|
|
26
|
+
args=(stop_event, refresh_params, referer_url),
|
|
27
|
+
)
|
|
28
|
+
refresh_thread.start()
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
return fd.real_download(filename, info_dict)
|
|
32
|
+
finally:
|
|
33
|
+
stop_event.set()
|
|
34
|
+
|
|
35
|
+
def _cookie_refresh_thread(self, stop_event, refresh_params, referer_url):
|
|
36
|
+
m3u8_url = refresh_params['m3u8_url']
|
|
37
|
+
strm_id = refresh_params['strm_id']
|
|
38
|
+
video_id = refresh_params['video_id']
|
|
39
|
+
|
|
40
|
+
def _get_cloudfront_cookie_expiration(m3u8_url):
|
|
41
|
+
cookies = self.ydl.cookiejar.get_cookies_for_url(m3u8_url)
|
|
42
|
+
return min((cookie.expires for cookie in cookies if 'CloudFront' in cookie.name and cookie.expires), default=0)
|
|
43
|
+
|
|
44
|
+
while not stop_event.wait(5):
|
|
45
|
+
current_time = time.time()
|
|
46
|
+
expiration_time = _get_cloudfront_cookie_expiration(m3u8_url)
|
|
47
|
+
last_refresh_check = refresh_params.get('_last_refresh', 0)
|
|
48
|
+
|
|
49
|
+
# Cookie TTL is 90 seconds, but let's give ourselves a 15-second cushion
|
|
50
|
+
should_refresh = (
|
|
51
|
+
(expiration_time and current_time >= expiration_time - 15)
|
|
52
|
+
or (not expiration_time and current_time - last_refresh_check >= 75)
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
if should_refresh:
|
|
56
|
+
try:
|
|
57
|
+
self.ydl.urlopen(_cloudfront_auth_request(
|
|
58
|
+
m3u8_url, strm_id, video_id, referer_url)).read()
|
|
59
|
+
refresh_params['_last_refresh'] = current_time
|
|
60
|
+
except network_exceptions as e:
|
|
61
|
+
self.to_screen(f'[{self.FD_NAME}] Cookie refresh attempt failed: {e}')
|
yt_dlp/extractor/afreecatv.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import datetime as dt
|
|
2
2
|
import functools
|
|
3
|
+
import time
|
|
3
4
|
|
|
4
5
|
from .common import InfoExtractor
|
|
5
6
|
from ..networking import Request
|
|
@@ -16,7 +17,23 @@ from ..utils import (
|
|
|
16
17
|
urlencode_postdata,
|
|
17
18
|
urljoin,
|
|
18
19
|
)
|
|
19
|
-
from ..utils.traversal import traverse_obj
|
|
20
|
+
from ..utils.traversal import require, traverse_obj
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _cloudfront_auth_request(m3u8_url, strm_id, video_id, referer_url):
|
|
24
|
+
return Request(
|
|
25
|
+
'https://live.sooplive.co.kr/api/private_auth.php',
|
|
26
|
+
method='POST',
|
|
27
|
+
headers={
|
|
28
|
+
'Referer': referer_url,
|
|
29
|
+
'Origin': 'https://vod.sooplive.co.kr',
|
|
30
|
+
},
|
|
31
|
+
data=urlencode_postdata({
|
|
32
|
+
'type': 'vod',
|
|
33
|
+
'strm_id': strm_id,
|
|
34
|
+
'title_no': video_id,
|
|
35
|
+
'url': m3u8_url,
|
|
36
|
+
}))
|
|
20
37
|
|
|
21
38
|
|
|
22
39
|
class AfreecaTVBaseIE(InfoExtractor):
|
|
@@ -153,6 +170,13 @@ class AfreecaTVIE(AfreecaTVBaseIE):
|
|
|
153
170
|
'nApiLevel': 10,
|
|
154
171
|
}))['data']
|
|
155
172
|
|
|
173
|
+
initial_refresh_time = 0
|
|
174
|
+
strm_id = None
|
|
175
|
+
# For subscriber-only VODs, we need to call private_auth.php to get CloudFront cookies
|
|
176
|
+
needs_private_auth = traverse_obj(data, ('sub_upload_type', {str}))
|
|
177
|
+
if needs_private_auth:
|
|
178
|
+
strm_id = traverse_obj(data, ('bj_id', {str}, {require('stream ID')}))
|
|
179
|
+
|
|
156
180
|
error_code = traverse_obj(data, ('code', {int}))
|
|
157
181
|
if error_code == -6221:
|
|
158
182
|
raise ExtractorError('The VOD does not exist', expected=True)
|
|
@@ -172,9 +196,23 @@ class AfreecaTVIE(AfreecaTVBaseIE):
|
|
|
172
196
|
traverse_obj(data, ('files', lambda _, v: url_or_none(v['file']))), start=1):
|
|
173
197
|
file_url = file_element['file']
|
|
174
198
|
if determine_ext(file_url) == 'm3u8':
|
|
199
|
+
if needs_private_auth:
|
|
200
|
+
self._request_webpage(
|
|
201
|
+
_cloudfront_auth_request(file_url, strm_id, video_id, url),
|
|
202
|
+
video_id, 'Requesting CloudFront cookies', 'Failed to get CloudFront cookies')
|
|
203
|
+
initial_refresh_time = time.time()
|
|
175
204
|
formats = self._extract_m3u8_formats(
|
|
176
205
|
file_url, video_id, 'mp4', m3u8_id='hls',
|
|
177
206
|
note=f'Downloading part {file_num} m3u8 information')
|
|
207
|
+
if needs_private_auth:
|
|
208
|
+
for fmt in formats:
|
|
209
|
+
fmt['protocol'] = 'soopvod'
|
|
210
|
+
fmt['_cookie_refresh_params'] = {
|
|
211
|
+
'm3u8_url': file_url,
|
|
212
|
+
'strm_id': strm_id,
|
|
213
|
+
'video_id': video_id,
|
|
214
|
+
'_last_refresh': initial_refresh_time,
|
|
215
|
+
}
|
|
178
216
|
else:
|
|
179
217
|
formats = [{
|
|
180
218
|
'url': file_url,
|
|
@@ -5862,7 +5862,7 @@ class UnsupportedInfoExtractor(LazyLoadExtractor):
|
|
|
5862
5862
|
class KnownDRMIE(UnsupportedInfoExtractor):
|
|
5863
5863
|
_module = 'yt_dlp.extractor.unsupported'
|
|
5864
5864
|
IE_NAME = 'DRM'
|
|
5865
|
-
_VALID_URL = 'https?://(?:www\\.)?(?:play\\.hbomax\\.com|channel(?:4|5)\\.com|peacocktv\\.com|(?:[\\w.]+\\.)?disneyplus\\.com|open\\.spotify\\.com|tvnz\\.co\\.nz|oneplus\\.ch|artstation\\.com/learning/courses|philo\\.com|(?:[\\w.]+\\.)?mech-plus\\.com|aha\\.video|mubi\\.com|vootkids\\.com|nowtv\\.it/watch|tv\\.apple\\.com|primevideo\\.com|hulu\\.com|resource\\.inkryptvideos\\.com|joyn\\.de|amazon\\.(?:\\w{2}\\.)?\\w+/gp/video|music\\.amazon\\.(?:\\w{2}\\.)?\\w+|(?:watch|front)\\.njpwworld\\.com|qub\\.ca/vrai|(?:beta\\.)?crunchyroll\\.com|viki\\.com|deezer\\.com|b-ch\\.com|ctv\\.ca|noovo\\.ca|tsn\\.ca|paramountplus\\.com|(?:m\\.)?(?:sony)?crackle\\.com|cw(?:tv(?:pr)?|seed)\\.com|6play\\.fr|rtlplay\\.be|play\\.rtl\\.hr|rtlmost\\.hu|plus\\.rtl\\.de(?!/podcast/)|mediasetinfinity\\.es)'
|
|
5865
|
+
_VALID_URL = 'https?://(?:www\\.)?(?:play\\.hbomax\\.com|channel(?:4|5)\\.com|peacocktv\\.com|(?:[\\w.]+\\.)?disneyplus\\.com|open\\.spotify\\.com|tvnz\\.co\\.nz|oneplus\\.ch|artstation\\.com/learning/courses|philo\\.com|(?:[\\w.]+\\.)?mech-plus\\.com|aha\\.video|mubi\\.com|vootkids\\.com|nowtv\\.it/watch|tv\\.apple\\.com|primevideo\\.com|hulu\\.com|resource\\.inkryptvideos\\.com|joyn\\.de|amazon\\.(?:\\w{2}\\.)?\\w+/gp/video|music\\.amazon\\.(?:\\w{2}\\.)?\\w+|(?:watch|front)\\.njpwworld\\.com|qub\\.ca/vrai|(?:beta\\.)?crunchyroll\\.com|viki\\.com|deezer\\.com|b-ch\\.com|ctv\\.ca|noovo\\.ca|tsn\\.ca|paramountplus\\.com|(?:m\\.)?(?:sony)?crackle\\.com|cw(?:tv(?:pr)?|seed)\\.com|6play\\.fr|rtlplay\\.be|play\\.rtl\\.hr|rtlmost\\.hu|plus\\.rtl\\.de(?!/podcast/)|mediasetinfinity\\.es|tv5mondeplus\\.com)'
|
|
5866
5866
|
IE_DESC = False
|
|
5867
5867
|
|
|
5868
5868
|
|
yt_dlp/extractor/unsupported.py
CHANGED
|
@@ -66,6 +66,7 @@ class KnownDRMIE(UnsupportedInfoExtractor):
|
|
|
66
66
|
r'rtlmost\.hu',
|
|
67
67
|
r'plus\.rtl\.de(?!/podcast/)',
|
|
68
68
|
r'mediasetinfinity\.es',
|
|
69
|
+
r'tv5mondeplus\.com',
|
|
69
70
|
)
|
|
70
71
|
|
|
71
72
|
_TESTS = [{
|
|
@@ -226,6 +227,10 @@ class KnownDRMIE(UnsupportedInfoExtractor):
|
|
|
226
227
|
}, {
|
|
227
228
|
'url': 'https://www.mediasetinfinity.es/',
|
|
228
229
|
'only_matching': True,
|
|
230
|
+
}, {
|
|
231
|
+
# https://github.com/yt-dlp/yt-dlp/issues/14743
|
|
232
|
+
'url': 'https://www.tv5mondeplus.com/',
|
|
233
|
+
'only_matching': True,
|
|
229
234
|
}]
|
|
230
235
|
|
|
231
236
|
def _real_extract(self, url):
|
yt_dlp/extractor/whyp.py
CHANGED
|
@@ -2,6 +2,7 @@ from .common import InfoExtractor
|
|
|
2
2
|
from ..utils import (
|
|
3
3
|
float_or_none,
|
|
4
4
|
int_or_none,
|
|
5
|
+
parse_iso8601,
|
|
5
6
|
str_or_none,
|
|
6
7
|
traverse_obj,
|
|
7
8
|
url_or_none,
|
|
@@ -16,9 +17,12 @@ class WhypIE(InfoExtractor):
|
|
|
16
17
|
'info_dict': {
|
|
17
18
|
'id': '18337',
|
|
18
19
|
'title': 'Example Track',
|
|
20
|
+
'display_id': 'example-track',
|
|
19
21
|
'description': 'md5:e0b1bcf1d267dc1a0f15efff09c8f297',
|
|
20
22
|
'ext': 'flac',
|
|
21
23
|
'duration': 135.63,
|
|
24
|
+
'timestamp': 1643216583,
|
|
25
|
+
'upload_date': '20220126',
|
|
22
26
|
'uploader': 'Brad',
|
|
23
27
|
'uploader_id': '1',
|
|
24
28
|
'thumbnail': 'https://cdn.whyp.it/6ad0bbd9-577d-42bb-9b61-2a4f57f647eb.jpg',
|
|
@@ -44,10 +48,12 @@ class WhypIE(InfoExtractor):
|
|
|
44
48
|
'http_headers': {'Referer': 'https://whyp.it/'},
|
|
45
49
|
} for prefix in ('audio', 'lossy', 'lossless') if url_or_none(data.get(f'{prefix}_url'))],
|
|
46
50
|
**traverse_obj(data, {
|
|
47
|
-
'title': 'title',
|
|
51
|
+
'title': ('title', {str}),
|
|
52
|
+
'display_id': ('slug', {str}),
|
|
48
53
|
'description': 'description',
|
|
49
54
|
'duration': ('duration', {float_or_none}),
|
|
50
|
-
'
|
|
55
|
+
'timestamp': ('created_at', {parse_iso8601}),
|
|
56
|
+
'uploader': ('user', 'username', {str}),
|
|
51
57
|
'uploader_id': ('user', 'id', {str_or_none}),
|
|
52
58
|
'thumbnail': ('artwork_url', {url_or_none}),
|
|
53
59
|
}),
|
|
@@ -271,34 +271,6 @@ INNERTUBE_CLIENTS = {
|
|
|
271
271
|
'PLAYER_PO_TOKEN_POLICY': PlayerPoTokenPolicy(required=False, recommended=True),
|
|
272
272
|
'REQUIRE_JS_PLAYER': False,
|
|
273
273
|
},
|
|
274
|
-
'ios_downgraded': {
|
|
275
|
-
'INNERTUBE_CONTEXT': {
|
|
276
|
-
'client': {
|
|
277
|
-
'clientName': 'IOS',
|
|
278
|
-
'clientVersion': '19.49.7',
|
|
279
|
-
'deviceMake': 'Apple',
|
|
280
|
-
'deviceModel': 'iPhone16,2',
|
|
281
|
-
'userAgent': 'com.google.ios.youtube/19.49.7 (iPhone16,2; U; CPU iOS 17_5_1 like Mac OS X;)',
|
|
282
|
-
'osName': 'iPhone',
|
|
283
|
-
'osVersion': '17.5.1.21F90',
|
|
284
|
-
},
|
|
285
|
-
},
|
|
286
|
-
'INNERTUBE_CONTEXT_CLIENT_NAME': 5,
|
|
287
|
-
'GVS_PO_TOKEN_POLICY': {
|
|
288
|
-
StreamingProtocol.HTTPS: GvsPoTokenPolicy(
|
|
289
|
-
required=True,
|
|
290
|
-
recommended=True,
|
|
291
|
-
not_required_with_player_token=True,
|
|
292
|
-
),
|
|
293
|
-
StreamingProtocol.HLS: GvsPoTokenPolicy(
|
|
294
|
-
required=False,
|
|
295
|
-
recommended=True,
|
|
296
|
-
not_required_with_player_token=True,
|
|
297
|
-
),
|
|
298
|
-
},
|
|
299
|
-
'PLAYER_PO_TOKEN_POLICY': PlayerPoTokenPolicy(required=False, recommended=True),
|
|
300
|
-
'REQUIRE_JS_PLAYER': False,
|
|
301
|
-
},
|
|
302
274
|
# mweb has 'ultralow' formats
|
|
303
275
|
# See: https://github.com/yt-dlp/yt-dlp/pull/557
|
|
304
276
|
'mweb': {
|
|
@@ -379,20 +351,6 @@ INNERTUBE_CLIENTS = {
|
|
|
379
351
|
},
|
|
380
352
|
'INNERTUBE_CONTEXT_CLIENT_NAME': 75,
|
|
381
353
|
},
|
|
382
|
-
# This client now requires sign-in for every video
|
|
383
|
-
# It was previously an age-gate workaround for videos that were `playable_in_embed`
|
|
384
|
-
# It may still be useful if signed into an EU account that is not age-verified
|
|
385
|
-
'tv_embedded': {
|
|
386
|
-
'INNERTUBE_CONTEXT': {
|
|
387
|
-
'client': {
|
|
388
|
-
'clientName': 'TVHTML5_SIMPLY_EMBEDDED_PLAYER',
|
|
389
|
-
'clientVersion': '2.0',
|
|
390
|
-
},
|
|
391
|
-
},
|
|
392
|
-
'INNERTUBE_CONTEXT_CLIENT_NAME': 85,
|
|
393
|
-
'REQUIRE_AUTH': True,
|
|
394
|
-
'SUPPORTS_COOKIES': True,
|
|
395
|
-
},
|
|
396
354
|
}
|
|
397
355
|
|
|
398
356
|
|
|
@@ -145,8 +145,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
145
145
|
r'\b(?P<id>vfl[a-zA-Z0-9_-]+)\b.*?\.js$',
|
|
146
146
|
)
|
|
147
147
|
_SUBTITLE_FORMATS = ('json3', 'srv1', 'srv2', 'srv3', 'ttml', 'srt', 'vtt')
|
|
148
|
-
_DEFAULT_CLIENTS = ('android_vr', '
|
|
149
|
-
_DEFAULT_JSLESS_CLIENTS = ('android_vr',
|
|
148
|
+
_DEFAULT_CLIENTS = ('android_vr', 'web', 'web_safari')
|
|
149
|
+
_DEFAULT_JSLESS_CLIENTS = ('android_vr',)
|
|
150
150
|
_DEFAULT_AUTHED_CLIENTS = ('tv_downgraded', 'web', 'web_safari')
|
|
151
151
|
# Premium does not require POT (except for subtitles)
|
|
152
152
|
_DEFAULT_PREMIUM_CLIENTS = ('tv_downgraded', 'web_creator', 'web')
|
|
@@ -1443,7 +1443,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
1443
1443
|
'view_count': int,
|
|
1444
1444
|
},
|
|
1445
1445
|
'params': {
|
|
1446
|
-
'extractor_args': {'youtube': {'player_client': ['tv_embedded']}},
|
|
1447
1446
|
'format': '251-drc',
|
|
1448
1447
|
'skip_download': True,
|
|
1449
1448
|
},
|
|
@@ -3118,6 +3117,15 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
3118
3117
|
else:
|
|
3119
3118
|
prs.append(pr)
|
|
3120
3119
|
|
|
3120
|
+
if (
|
|
3121
|
+
# Is this a "made for kids" video that can't be downloaded with android_vr?
|
|
3122
|
+
client == 'android_vr' and self._is_unplayable(pr)
|
|
3123
|
+
and webpage and 'made for kids' in webpage
|
|
3124
|
+
# ...and is a JS runtime is available?
|
|
3125
|
+
and any(p.is_available() for p in self._jsc_director.providers.values())
|
|
3126
|
+
):
|
|
3127
|
+
append_client('web_embedded')
|
|
3128
|
+
|
|
3121
3129
|
# web_embedded can work around age-gate and age-verification for some embeddable videos
|
|
3122
3130
|
if self._is_agegated(pr) and variant != 'web_embedded':
|
|
3123
3131
|
append_client(f'web_embedded.{base_client}')
|
|
@@ -3134,9 +3142,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
3134
3142
|
self.to_screen(
|
|
3135
3143
|
f'{video_id}: This video is age-restricted and YouTube is requiring '
|
|
3136
3144
|
'account age-verification; some formats may be missing', only_once=True)
|
|
3137
|
-
# tv_embedded can work around the age-verification requirement for embeddable videos
|
|
3138
3145
|
# web_creator may work around age-verification for all videos but requires PO token
|
|
3139
|
-
append_client('
|
|
3146
|
+
append_client('web_creator')
|
|
3140
3147
|
|
|
3141
3148
|
status = traverse_obj(pr, ('playabilityStatus', 'status', {str}))
|
|
3142
3149
|
if status not in ('OK', 'LIVE_STREAM_OFFLINE', 'AGE_CHECK_REQUIRED', 'AGE_VERIFICATION_REQUIRED'):
|
|
@@ -3595,10 +3602,6 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
|
|
|
3595
3602
|
if client_name == 'web_safari' and proto == 'hls' and live_status != 'is_live':
|
|
3596
3603
|
f['source_preference'] -= 1
|
|
3597
3604
|
|
|
3598
|
-
# Safeguard against inevitable ios_downgraded client breakage
|
|
3599
|
-
if client_name == 'ios_downgraded' and proto == 'hls' and live_status != 'is_live':
|
|
3600
|
-
f['__needs_testing'] = True
|
|
3601
|
-
|
|
3602
3605
|
if missing_pot:
|
|
3603
3606
|
f['format_note'] = join_nonempty(f.get('format_note'), 'MISSING POT', delim=' ')
|
|
3604
3607
|
f['source_preference'] -= 20
|
yt_dlp/version.py
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# Autogenerated by devscripts/update-version.py
|
|
2
2
|
|
|
3
|
-
__version__ = '2026.01.
|
|
3
|
+
__version__ = '2026.01.31'
|
|
4
4
|
|
|
5
|
-
RELEASE_GIT_HEAD = '
|
|
5
|
+
RELEASE_GIT_HEAD = '9a9a6b6fe44a30458c1754ef064f354f04a84004'
|
|
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 = '
|
|
11
|
+
CHANNEL = 'stable'
|
|
12
12
|
|
|
13
|
-
ORIGIN = 'yt-dlp/yt-dlp
|
|
13
|
+
ORIGIN = 'yt-dlp/yt-dlp'
|
|
14
14
|
|
|
15
|
-
_pkg_version = '2026.01.
|
|
15
|
+
_pkg_version = '2026.01.31'
|
{yt_dlp-2026.1.29.165626.dev0.data → yt_dlp-2026.1.31.data}/data/share/doc/yt_dlp/README.txt
RENAMED
|
@@ -409,7 +409,7 @@ General Options:
|
|
|
409
409
|
--no-update Do not check for updates (default)
|
|
410
410
|
--update-to [CHANNEL]@[TAG] Upgrade/downgrade to a specific version.
|
|
411
411
|
CHANNEL can be a repository as well. CHANNEL
|
|
412
|
-
and TAG default to "
|
|
412
|
+
and TAG default to "stable" and "latest"
|
|
413
413
|
respectively if omitted; See "UPDATE" for
|
|
414
414
|
details. Supported channels: stable,
|
|
415
415
|
nightly, master
|
|
@@ -2312,24 +2312,25 @@ youtube
|
|
|
2312
2312
|
respectively
|
|
2313
2313
|
- player_client: Clients to extract video data from. The currently
|
|
2314
2314
|
available clients are web, web_safari, web_embedded, web_music,
|
|
2315
|
-
web_creator, mweb, ios,
|
|
2316
|
-
tv_simply,
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
If logged-in cookies are passed to yt-dlp, then
|
|
2315
|
+
web_creator, mweb, ios, android, android_vr, tv, tv_downgraded, and
|
|
2316
|
+
tv_simply. By default, android_vr,web,web_safari is used. If no
|
|
2317
|
+
JavaScript runtime/engine is available, then only android_vr is
|
|
2318
|
+
used. If logged-in cookies are passed to yt-dlp, then
|
|
2320
2319
|
tv_downgraded,web,web_safari is used for free accounts and
|
|
2321
2320
|
tv_downgraded,web_creator,web is used for premium accounts. The
|
|
2322
2321
|
web_music client is added for music.youtube.com URLs when logged-in
|
|
2323
2322
|
cookies are used. The web_embedded client is added for
|
|
2324
|
-
age-restricted videos but only works
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2323
|
+
age-restricted videos but only successfully works around the
|
|
2324
|
+
age-restriction sometimes (e.g. if the video is embeddable), and may
|
|
2325
|
+
be added as a fallback if android_vr is unable to access a video.
|
|
2326
|
+
The web_creator client is added for age-restricted videos if account
|
|
2327
|
+
age-verification is required. Some clients, such as web_creator and
|
|
2328
|
+
web_music, require a po_token for their formats to be downloadable.
|
|
2329
|
+
Some clients, such as web_creator, will only work with
|
|
2329
2330
|
authentication. Not all clients support authentication via cookies.
|
|
2330
2331
|
You can use default for the default clients, or you can use all for
|
|
2331
2332
|
all clients (not recommended). You can prefix a client with - to
|
|
2332
|
-
exclude it, e.g. youtube:player_client=default,-
|
|
2333
|
+
exclude it, e.g. youtube:player_client=default,-web
|
|
2333
2334
|
- player_skip: Skip some network requests that are generally needed
|
|
2334
2335
|
for robust extraction. One or more of configs (skip client configs),
|
|
2335
2336
|
webpage (skip initial webpage), js (skip js player), initial_data
|
|
@@ -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 "
|
|
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)'
|
|
@@ -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]
|
|
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
|
|
@@ -2713,30 +2713,31 @@ respectively
|
|
|
2713
2713
|
\f[V]player_client\f[R]: Clients to extract video data from.
|
|
2714
2714
|
The currently available clients are \f[V]web\f[R], \f[V]web_safari\f[R],
|
|
2715
2715
|
\f[V]web_embedded\f[R], \f[V]web_music\f[R], \f[V]web_creator\f[R],
|
|
2716
|
-
\f[V]mweb\f[R], \f[V]ios\f[R], \f[V]
|
|
2717
|
-
\f[V]
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
\f[V]android_vr,ios_downgraded\f[R] is used.
|
|
2716
|
+
\f[V]mweb\f[R], \f[V]ios\f[R], \f[V]android\f[R], \f[V]android_vr\f[R],
|
|
2717
|
+
\f[V]tv\f[R], \f[V]tv_downgraded\f[R], and \f[V]tv_simply\f[R].
|
|
2718
|
+
By default, \f[V]android_vr,web,web_safari\f[R] is used.
|
|
2719
|
+
If no JavaScript runtime/engine is available, then only
|
|
2720
|
+
\f[V]android_vr\f[R] is used.
|
|
2722
2721
|
If logged-in cookies are passed to yt-dlp, then
|
|
2723
2722
|
\f[V]tv_downgraded,web,web_safari\f[R] is used for free accounts and
|
|
2724
2723
|
\f[V]tv_downgraded,web_creator,web\f[R] is used for premium accounts.
|
|
2725
2724
|
The \f[V]web_music\f[R] client is added for \f[V]music.youtube.com\f[R]
|
|
2726
2725
|
URLs when logged-in cookies are used.
|
|
2727
2726
|
The \f[V]web_embedded\f[R] client is added for age-restricted videos but
|
|
2728
|
-
only works
|
|
2729
|
-
|
|
2730
|
-
|
|
2731
|
-
|
|
2732
|
-
|
|
2727
|
+
only successfully works around the age-restriction sometimes (e.g.
|
|
2728
|
+
if the video is embeddable), and may be added as a fallback if
|
|
2729
|
+
\f[V]android_vr\f[R] is unable to access a video.
|
|
2730
|
+
The \f[V]web_creator\f[R] client is added for age-restricted videos if
|
|
2731
|
+
account age-verification is required.
|
|
2732
|
+
Some clients, such as \f[V]web_creator\f[R] and \f[V]web_music\f[R],
|
|
2733
|
+
require a \f[V]po_token\f[R] for their formats to be downloadable.
|
|
2733
2734
|
Some clients, such as \f[V]web_creator\f[R], will only work with
|
|
2734
2735
|
authentication.
|
|
2735
2736
|
Not all clients support authentication via cookies.
|
|
2736
2737
|
You can use \f[V]default\f[R] for the default clients, or you can use
|
|
2737
2738
|
\f[V]all\f[R] for all clients (not recommended).
|
|
2738
2739
|
You can prefix a client with \f[V]-\f[R] to exclude it, e.g.
|
|
2739
|
-
\f[V]youtube:player_client=default,-
|
|
2740
|
+
\f[V]youtube:player_client=default,-web\f[R]
|
|
2740
2741
|
.IP \[bu] 2
|
|
2741
2742
|
\f[V]player_skip\f[R]: Skip some network requests that are generally
|
|
2742
2743
|
needed for robust extraction.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: yt-dlp
|
|
3
|
-
Version: 2026.1.
|
|
3
|
+
Version: 2026.1.31
|
|
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
|
|
@@ -388,7 +388,7 @@ Tip: Use `CTRL`+`F` (or `Command`+`F`) to search by keywords
|
|
|
388
388
|
--no-update Do not check for updates (default)
|
|
389
389
|
--update-to [CHANNEL]@[TAG] Upgrade/downgrade to a specific version.
|
|
390
390
|
CHANNEL can be a repository as well. CHANNEL
|
|
391
|
-
and TAG default to "
|
|
391
|
+
and TAG default to "stable" and "latest"
|
|
392
392
|
respectively if omitted; See "UPDATE" for
|
|
393
393
|
details. Supported channels: stable,
|
|
394
394
|
nightly, master
|
|
@@ -1934,7 +1934,7 @@ The following extractors use this feature:
|
|
|
1934
1934
|
#### youtube
|
|
1935
1935
|
* `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
|
|
1936
1936
|
* `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
|
|
1937
|
-
* `player_client`: Clients to extract video data from. The currently available clients are `web`, `web_safari`, `web_embedded`, `web_music`, `web_creator`, `mweb`, `ios`, `
|
|
1937
|
+
* `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_vr`, `tv`, `tv_downgraded`, and `tv_simply`. By default, `android_vr,web,web_safari` is used. If no JavaScript runtime/engine is available, then only `android_vr` is used. If logged-in cookies are passed to yt-dlp, then `tv_downgraded,web,web_safari` 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 successfully works around the age-restriction sometimes (e.g. if the video is embeddable), and may be added as a fallback if `android_vr` is unable to access a video. The `web_creator` client is added for age-restricted videos if account age-verification is required. Some clients, such as `web_creator` 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,-web`
|
|
1938
1938
|
* `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
|
|
1939
1939
|
* `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
|
|
1940
1940
|
* `player_params`: YouTube player parameters to use for player requests. Will overwrite any default ones set by yt-dlp.
|
|
@@ -11,7 +11,7 @@ yt_dlp/options.py,sha256=-PQ5DyRSIU9YBSG2oh0RTHC-eg4EewNt4zewTZTuERM,100632
|
|
|
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=hlGG8zZw6N6P2hxT8PCeWnpq6XuGTfPSI290iDlylqw,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
|
|
@@ -25,7 +25,7 @@ yt_dlp/compat/urllib/__init__.py,sha256=wKkvg7z1ICwYqtxp-Y8ACPYKvTAIv_y5nJMmjIYb
|
|
|
25
25
|
yt_dlp/compat/urllib/request.py,sha256=xNcTylKQDNwNTX-qWfbgg8j7GDsuLARYaPNhFjbvl6g,1481
|
|
26
26
|
yt_dlp/dependencies/Cryptodome.py,sha256=91_k5HjJ24XM03-Y6-3tWHNr6knebvNIROlbREgyjkY,1423
|
|
27
27
|
yt_dlp/dependencies/__init__.py,sha256=hjIc6wZyo9GVSte4KY-zVr0SGGXRKvUNwhjeHK8Ie3U,2277
|
|
28
|
-
yt_dlp/downloader/__init__.py,sha256=
|
|
28
|
+
yt_dlp/downloader/__init__.py,sha256=ElG-VDCd3dJroonzVQYCh9M5lvFvYtTUGwACAL_uhCI,4572
|
|
29
29
|
yt_dlp/downloader/bunnycdn.py,sha256=s18-DtSCtlRp1gyIo1B59AbEEeaX45rfWHHmJx0lLQM,1762
|
|
30
30
|
yt_dlp/downloader/common.py,sha256=7i5c15Wf88GSR-TO11eQN5Y-GjcodbxnoJe4h6YNRTs,20700
|
|
31
31
|
yt_dlp/downloader/dash.py,sha256=krbHwJRK8mIKH5WB3W4e8XcFlRm0gFgbmQBHtT8K5Kk,3936
|
|
@@ -40,6 +40,7 @@ yt_dlp/downloader/mhtml.py,sha256=sKp42SkxuuWVepGbia1jqhNFwtI5xt3KaMMucJ0J8Uk,57
|
|
|
40
40
|
yt_dlp/downloader/niconico.py,sha256=ECPStHiuMH8PfWiNKDQLxM7TTvkoQn281cIJ13n8WEk,3612
|
|
41
41
|
yt_dlp/downloader/rtmp.py,sha256=dJYJi9yaknOG74YIrfSFg2owchrGsouelx4MHEN0-hM,8851
|
|
42
42
|
yt_dlp/downloader/rtsp.py,sha256=LenaspFKHde5EkP52oU6jiHYxYferyyGgFPLfm6S5Hs,1477
|
|
43
|
+
yt_dlp/downloader/soop.py,sha256=LmLSk0UsYWWWX98o54NFljLagpTkJoT5GvNqbg3kJLs,2432
|
|
43
44
|
yt_dlp/downloader/websocket.py,sha256=G39SkXEIGtUEYaP1_ODXMiZGZgIrFeb3wqlfVypcHUM,1772
|
|
44
45
|
yt_dlp/downloader/youtube_live_chat.py,sha256=JLpGIUNNbuM7ZuZMY9A6X3xrRDfs3sWz4tzXLXpa1P4,10875
|
|
45
46
|
yt_dlp/extractor/__init__.py,sha256=XMV5BpSWbaDXGkkI2sim_iJk7y0BpCgrDcPjwenA1Y0,1764
|
|
@@ -58,7 +59,7 @@ yt_dlp/extractor/adobetv.py,sha256=-6CIu53D23xwWja-GLv7fY77GURSyjwcyGnMV4-IXUs,3
|
|
|
58
59
|
yt_dlp/extractor/adultswim.py,sha256=afgnmyHi5pfyd6L_tsLo9C4uelIKtUQcaZ0eZ0JUvpA,8394
|
|
59
60
|
yt_dlp/extractor/aenetworks.py,sha256=PRJ-vI1hUUBTUk8RenI_sMxtkzqiSEfe6Me60-rERrw,17309
|
|
60
61
|
yt_dlp/extractor/aeonco.py,sha256=uQgNce2UVzDiEnyG4Ns7QKebxCJvUO4d1fTKwasHB-4,3303
|
|
61
|
-
yt_dlp/extractor/afreecatv.py,sha256=
|
|
62
|
+
yt_dlp/extractor/afreecatv.py,sha256=j0rIuJA6xNVcLeRSFglmugaPsYjCBVT83AdABqNTDFs,19711
|
|
62
63
|
yt_dlp/extractor/agalega.py,sha256=0nSa07MrXYo-G2XFwkHjSbY48hDfkAiImtR4iNU1DL8,3714
|
|
63
64
|
yt_dlp/extractor/agora.py,sha256=gpmgLRRK6O-H5lk5Jqk12E1xOEsr89EFLH0uDe_VS50,9579
|
|
64
65
|
yt_dlp/extractor/airtv.py,sha256=t_LIp3kLNcUdBLQk_rUZmOlENUB5TIkEXy_EgA18JzM,4088
|
|
@@ -461,7 +462,7 @@ yt_dlp/extractor/la7.py,sha256=GShDLu1N0rS1bY4uIiUkznThvn7gNiwtSgmh7Rs7t08,9435
|
|
|
461
462
|
yt_dlp/extractor/laracasts.py,sha256=PzTqAbHXiUqog-mpp2qR_rpKa-sZel4mLyzWTPkbDuc,4587
|
|
462
463
|
yt_dlp/extractor/lastfm.py,sha256=OpmE-Y-2rcav2r2xaDQzX_EJiltmbbe6fO9VzkLqNWQ,4748
|
|
463
464
|
yt_dlp/extractor/laxarxames.py,sha256=-YyL-5y4t2L9ptTSLXhvK-SJwvXGqv5l1HfT129zF0c,2773
|
|
464
|
-
yt_dlp/extractor/lazy_extractors.py,sha256=
|
|
465
|
+
yt_dlp/extractor/lazy_extractors.py,sha256=RG7yAhhS02_X8SRsTxP11pWNAb-3JV665B0ZcNxDEoE,815481
|
|
465
466
|
yt_dlp/extractor/lbry.py,sha256=veeChelvfuFiNCeHhqYLEqR8X5mcmxevaekmZgoJk-Q,18112
|
|
466
467
|
yt_dlp/extractor/lci.py,sha256=_0XuoITIt_QFA-6eBNpDXZZfouwUWfcdHQlpAOuiLEs,2131
|
|
467
468
|
yt_dlp/extractor/lcp.py,sha256=edMA8L-eJZLquDvHcSY4oFWI0C8yGgjqW1tmhhLMJ5U,2279
|
|
@@ -951,7 +952,7 @@ yt_dlp/extractor/umg.py,sha256=FF2Wz1ay_f6hxPIq-8jaFKGqAtLUNPlBTLA-x0mkwI0,2240
|
|
|
951
952
|
yt_dlp/extractor/unistra.py,sha256=z1zkou5gHYyf9NQiALCcgtSQigbKicNlo-Xiq7G_pO0,2078
|
|
952
953
|
yt_dlp/extractor/unitednations.py,sha256=qFB_vRls1Sw5pJbQ16W6yKGy_IwbvgLwvcGsXm-D7BE,1289
|
|
953
954
|
yt_dlp/extractor/unity.py,sha256=huqyb02vbyBqiFR52bPtxV5b_YTK-PBwvKY8DR88JHo,1209
|
|
954
|
-
yt_dlp/extractor/unsupported.py,sha256=
|
|
955
|
+
yt_dlp/extractor/unsupported.py,sha256=rk93fV90msTF3aNf9wvw5OHNTXoYzXRqnIWifIHUXyA,10325
|
|
955
956
|
yt_dlp/extractor/uol.py,sha256=kWFdi9XLelDpc2bpooKYUIDchndGY4SJmkjPhyXEt6w,5307
|
|
956
957
|
yt_dlp/extractor/uplynk.py,sha256=cJLFlmC4nD8zv7gYBO61j65M4ntvs8NM4My4wxloRVA,3352
|
|
957
958
|
yt_dlp/extractor/urort.py,sha256=LSk-RJsTH03x-7whkdvNRRAGofARl4bKXeyIzzSqnBQ,2136
|
|
@@ -1014,7 +1015,7 @@ yt_dlp/extractor/weverse.py,sha256=zFFq7PJU3a6NWSBbMHcYXdqop0C2yCj0fPgk6iUeqC8,3
|
|
|
1014
1015
|
yt_dlp/extractor/wevidi.py,sha256=ylpKfJ1aEGDRYF0x9O2KgaeGeN_BxYN2phRvGao2nF8,4159
|
|
1015
1016
|
yt_dlp/extractor/weyyak.py,sha256=YlBPciN_7tMuQknRooSxKuhEiGLOiDUmVn6fBMgXc2A,3497
|
|
1016
1017
|
yt_dlp/extractor/whowatch.py,sha256=q0ZawsjFxkIbsIpnCL-RkwkMdJNgRD6-WDsJajyfVrY,3860
|
|
1017
|
-
yt_dlp/extractor/whyp.py,sha256=
|
|
1018
|
+
yt_dlp/extractor/whyp.py,sha256=qR1ZZPRUEm8ZTdztOPQi2Ff-IgYL7bTqFz0asK9Wax8,2196
|
|
1018
1019
|
yt_dlp/extractor/wikimedia.py,sha256=0FSysi1ciIjb7bF8LC_7-5w6IJUqiHmueVhZEVWamo0,2323
|
|
1019
1020
|
yt_dlp/extractor/wimbledon.py,sha256=cJ_VJ5CEvxOAIENTQETJJlXdyQqdozgRYWVJgtbvZqk,2285
|
|
1020
1021
|
yt_dlp/extractor/wimtv.py,sha256=K8HWMvB0uGcppnkMpzH9AGvl-wBnhuR8Izju0rBs7lo,5777
|
|
@@ -1061,14 +1062,14 @@ yt_dlp/extractor/zingmp3.py,sha256=KHD-f-1vUPy18Xk-_F_H_LfFR9N7-bONFYWeNRvJ1Z4,2
|
|
|
1061
1062
|
yt_dlp/extractor/zoom.py,sha256=7FwI0aJRG3evlKmCC97Ndc7oFRrFT3LHiHye__QZ7Do,7305
|
|
1062
1063
|
yt_dlp/extractor/zype.py,sha256=e3_07aMl65x-ziI5Ge_Ph_lCV4q67DnqeRq2PjIKZj4,5507
|
|
1063
1064
|
yt_dlp/extractor/youtube/__init__.py,sha256=3F72z6WHXlv41giIdmmVY7Fws-bAnkiWz8Eh3A19004,1454
|
|
1064
|
-
yt_dlp/extractor/youtube/_base.py,sha256=
|
|
1065
|
+
yt_dlp/extractor/youtube/_base.py,sha256=3gWKI_JBxG8jpiZBmtxqC6Z-NJfa8ouVNHIuMHpZT1w,54031
|
|
1065
1066
|
yt_dlp/extractor/youtube/_clip.py,sha256=__EJUrb6iUCIURupsaa-ixn51q4esfok09znrpvdD88,3073
|
|
1066
1067
|
yt_dlp/extractor/youtube/_mistakes.py,sha256=bLrxlAYqdR0mTuCLoMmJHh15BHuhxfHXeQFTVBRX9Lk,2142
|
|
1067
1068
|
yt_dlp/extractor/youtube/_notifications.py,sha256=1nhavzW0e2QWFAWHkfbTU4sSXNp4vUbGFygYNSgbxBE,4585
|
|
1068
1069
|
yt_dlp/extractor/youtube/_redirect.py,sha256=WWWnGEkfSGBXpZFi_bWY4XcHZ8PDeK7UsndDaTYYhQg,9005
|
|
1069
1070
|
yt_dlp/extractor/youtube/_search.py,sha256=E9raTPGjUD6mm81WBpT4AsaxyiTBHdNssgzeHwVeNOE,6552
|
|
1070
1071
|
yt_dlp/extractor/youtube/_tab.py,sha256=MiQGWZdHENOz8Ac-OAuAgqMWJ6gC-PZKJWPDG80QY6E,115490
|
|
1071
|
-
yt_dlp/extractor/youtube/_video.py,sha256=
|
|
1072
|
+
yt_dlp/extractor/youtube/_video.py,sha256=7m1I1E8HJzTpPlmpIbr_Gf5mH-Z7gJwSJ1KFCRTihfY,215203
|
|
1072
1073
|
yt_dlp/extractor/youtube/jsc/__init__.py,sha256=HaVFP8ikrLaE-ClAh39-S28WCF4S2KTRaSu7QvA28E8,289
|
|
1073
1074
|
yt_dlp/extractor/youtube/jsc/_director.py,sha256=92pB-KVSs6plmE5R8gpjkZL9aeoWNR0XTnGOBXMy9go,13167
|
|
1074
1075
|
yt_dlp/extractor/youtube/jsc/_registry.py,sha256=Vg9GkHKHKKPeRfUQ-XSw01mfx_2Xyodh0SJpwjawYCA,102
|
|
@@ -1124,13 +1125,13 @@ yt_dlp/utils/progress.py,sha256=t9kVvJ0oWuEqRzo9fdFbIhHUBtO_8mg348QwZ1faqLo,3261
|
|
|
1124
1125
|
yt_dlp/utils/traversal.py,sha256=64E3RcZ56iSX50RI_HbKdDNftkETMLBaEPX791_b7yQ,18265
|
|
1125
1126
|
yt_dlp/utils/jslib/__init__.py,sha256=CbdJiRA7Eh5PnjF2V4lDTcg0J0XjBMaaq0H4pCfq9Tk,87
|
|
1126
1127
|
yt_dlp/utils/jslib/devalue.py,sha256=UtcQ1IEzt6HWBjB9Z_6rJMb3y2pFrbHXDNu1rrxXF1c,5583
|
|
1127
|
-
yt_dlp-2026.1.
|
|
1128
|
-
yt_dlp-2026.1.
|
|
1129
|
-
yt_dlp-2026.1.
|
|
1130
|
-
yt_dlp-2026.1.
|
|
1131
|
-
yt_dlp-2026.1.
|
|
1132
|
-
yt_dlp-2026.1.
|
|
1133
|
-
yt_dlp-2026.1.
|
|
1134
|
-
yt_dlp-2026.1.
|
|
1135
|
-
yt_dlp-2026.1.
|
|
1136
|
-
yt_dlp-2026.1.
|
|
1128
|
+
yt_dlp-2026.1.31.data/data/share/bash-completion/completions/yt-dlp,sha256=KKMwJ7JkH-B2rXIR9n4wAHTqn5waHyxzPtVmsMoYkDI,6009
|
|
1129
|
+
yt_dlp-2026.1.31.data/data/share/doc/yt_dlp/README.txt,sha256=f2ggWFxMw81azto9tEBS2y0lHKja7y6lmf7HEicmfZM,166286
|
|
1130
|
+
yt_dlp-2026.1.31.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=8eiSHKyozebmNDndOk6fwJC3l5kAnZDWfK98lyo5pj4,51631
|
|
1131
|
+
yt_dlp-2026.1.31.data/data/share/man/man1/yt-dlp.1,sha256=JxaYcMoQ8bEHQ5BeQvZHwKM6exGD5KYblnMjBEVHa4g,160923
|
|
1132
|
+
yt_dlp-2026.1.31.data/data/share/zsh/site-functions/_yt-dlp,sha256=VsiR8Dn2RqbVSZHAqQyDtTfrc3BIBdzwgrcaJqux8kQ,6005
|
|
1133
|
+
yt_dlp-2026.1.31.dist-info/METADATA,sha256=JfYgHjGePllDo34C1O1XJm0GHaFlw4fhzHX7ZQIdbDo,182027
|
|
1134
|
+
yt_dlp-2026.1.31.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
1135
|
+
yt_dlp-2026.1.31.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
|
|
1136
|
+
yt_dlp-2026.1.31.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
|
|
1137
|
+
yt_dlp-2026.1.31.dist-info/RECORD,,
|
|
File without changes
|
{yt_dlp-2026.1.29.165626.dev0.data → yt_dlp-2026.1.31.data}/data/share/zsh/site-functions/_yt-dlp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|