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.
@@ -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}')
@@ -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
 
@@ -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
- 'uploader': ('user', 'username'),
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', 'ios_downgraded', 'web', 'web_safari')
149
- _DEFAULT_JSLESS_CLIENTS = ('android_vr', 'ios_downgraded')
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('tv_embedded', 'web_creator')
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.29.165626'
3
+ __version__ = '2026.01.31'
4
4
 
5
- RELEASE_GIT_HEAD = '8b275536d945c4b3d07b6c520677922c67a7c10f'
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 = 'nightly'
11
+ CHANNEL = 'stable'
12
12
 
13
- ORIGIN = 'yt-dlp/yt-dlp-nightly-builds'
13
+ ORIGIN = 'yt-dlp/yt-dlp'
14
14
 
15
- _pkg_version = '2026.01.29.165626dev'
15
+ _pkg_version = '2026.01.31'
@@ -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 "nightly" and "latest"
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, ios_downgraded, android, android_vr, tv,
2316
- tv_simply, tv_downgraded, and tv_embedded. By default,
2317
- android_vr,ios_downgraded,web,web_safari is used. If no JavaScript
2318
- runtime/engine is available, then android_vr,ios_downgraded is used.
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 if the video is embeddable. The
2325
- tv_embedded and web_creator clients are added for age-restricted
2326
- videos if account age-verification is required. Some clients, such
2327
- as web and web_music, require a po_token for their formats to be
2328
- downloadable. Some clients, such as web_creator, will only work with
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,-ios
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 "nightly" and "latest" respectively if omitted; See "UPDATE" for details. Supported channels: stable, nightly, master'
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]nightly\[dq] and \[dq]latest\[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]ios_downgraded\f[R],
2717
- \f[V]android\f[R], \f[V]android_vr\f[R], \f[V]tv\f[R],
2718
- \f[V]tv_simply\f[R], \f[V]tv_downgraded\f[R], and \f[V]tv_embedded\f[R].
2719
- By default, \f[V]android_vr,ios_downgraded,web,web_safari\f[R] is used.
2720
- If no JavaScript runtime/engine is available, then
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 if the video is embeddable.
2729
- The \f[V]tv_embedded\f[R] and \f[V]web_creator\f[R] clients are added
2730
- for age-restricted videos if account age-verification is required.
2731
- Some clients, such as \f[V]web\f[R] and \f[V]web_music\f[R], require a
2732
- \f[V]po_token\f[R] for their formats to be downloadable.
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,-ios\f[R]
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.29.165626.dev0
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 "nightly" and "latest"
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`, `ios_downgraded`, `android`, `android_vr`, `tv`, `tv_simply`, `tv_downgraded`, and `tv_embedded`. By default, `android_vr,ios_downgraded,web,web_safari` is used. If no JavaScript runtime/engine is available, then `android_vr,ios_downgraded` 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 works if the video is embeddable. The `tv_embedded` and `web_creator` clients are added for age-restricted videos if account age-verification is required. Some clients, such as `web` 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,-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=C2t8S3dwqjc1upr4DqKcq8qoBim7o6yi_RTxv1ZPF0Y,360
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=ymTbNmY6tgAWZJ9yTkIeX3khDViBcdQMPl23Fp36Sso,4518
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=6e0qYRnSaRtSkND4x77LUAj3bEggTc3-UHGaGMb40hA,18132
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=RrlhFa1Y5HshSi-y5QWDdlDBzp-Mj7Xjc8irDzIo8R8,815462
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=56DIvRBMpOI9fxstvEvNZAcIBk0hfO-_cwilPNSKjF0,10151
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=JPvShwyZVp318APJZ_3XpwoIjpZZscWmLubp05Qg4Ck,1933
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=X6-smdV2ww_L-C64UKVOCMJ0OVWkjKGlEMc9lCd-mpo,55635
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=w7S3fLYbrdOWu7m7JsdMRwfxTJb7EGALGMgAAkv-Lck,215219
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.29.165626.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=KKMwJ7JkH-B2rXIR9n4wAHTqn5waHyxzPtVmsMoYkDI,6009
1128
- yt_dlp-2026.1.29.165626.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=4T6_JYCi7J-bEo_VHyLoj8D2wr3RRjhzCxbY13qZrsI,166216
1129
- yt_dlp-2026.1.29.165626.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=L0JADRod-4ew2pvmYGiDUuXFgu1Ac8msk-ackiLYHCo,51632
1130
- yt_dlp-2026.1.29.165626.dev0.data/data/share/man/man1/yt-dlp.1,sha256=m1y5ya1IKD1_33TmVEpP3p1HYZH1KhKrJRVZ_3Ci54M,160877
1131
- yt_dlp-2026.1.29.165626.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=VsiR8Dn2RqbVSZHAqQyDtTfrc3BIBdzwgrcaJqux8kQ,6005
1132
- yt_dlp-2026.1.29.165626.dev0.dist-info/METADATA,sha256=n3GkVxGaKMMBOXhuLen5tHnqUPpqZCAhismW0zcvjGs,181977
1133
- yt_dlp-2026.1.29.165626.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1134
- yt_dlp-2026.1.29.165626.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1135
- yt_dlp-2026.1.29.165626.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1136
- yt_dlp-2026.1.29.165626.dev0.dist-info/RECORD,,
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,,