yt-dlp 2025.11.5.232946.dev0__py3-none-any.whl → 2025.11.8.232845.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.
Files changed (21) hide show
  1. yt_dlp/extractor/goplay.py +7 -5
  2. yt_dlp/extractor/lazy_extractors.py +4 -3
  3. yt_dlp/extractor/ntvru.py +94 -57
  4. yt_dlp/extractor/xhamster.py +31 -0
  5. yt_dlp/extractor/youtube/_video.py +72 -2
  6. yt_dlp/extractor/youtube/jsc/_builtin/vendor/_info.py +1 -1
  7. yt_dlp/networking/_curlcffi.py +4 -1
  8. yt_dlp/networking/_requests.py +14 -9
  9. yt_dlp/networking/_urllib.py +19 -1
  10. yt_dlp/networking/common.py +6 -2
  11. yt_dlp/version.py +3 -3
  12. {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/METADATA +2 -2
  13. {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/RECORD +21 -21
  14. {yt_dlp-2025.11.5.232946.dev0.data → yt_dlp-2025.11.8.232845.dev0.data}/data/share/bash-completion/completions/yt-dlp +0 -0
  15. {yt_dlp-2025.11.5.232946.dev0.data → yt_dlp-2025.11.8.232845.dev0.data}/data/share/doc/yt_dlp/README.txt +0 -0
  16. {yt_dlp-2025.11.5.232946.dev0.data → yt_dlp-2025.11.8.232845.dev0.data}/data/share/fish/vendor_completions.d/yt-dlp.fish +0 -0
  17. {yt_dlp-2025.11.5.232946.dev0.data → yt_dlp-2025.11.8.232845.dev0.data}/data/share/man/man1/yt-dlp.1 +0 -0
  18. {yt_dlp-2025.11.5.232946.dev0.data → yt_dlp-2025.11.8.232845.dev0.data}/data/share/zsh/site-functions/_yt-dlp +0 -0
  19. {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/WHEEL +0 -0
  20. {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/entry_points.txt +0 -0
  21. {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/licenses/LICENSE +0 -0
@@ -13,12 +13,14 @@ from ..utils.traversal import get_first, traverse_obj
13
13
 
14
14
 
15
15
  class GoPlayIE(InfoExtractor):
16
- _VALID_URL = r'https?://(www\.)?goplay\.be/video/([^/?#]+/[^/?#]+/|)(?P<id>[^/#]+)'
16
+ IE_NAME = 'play.tv'
17
+ IE_DESC = 'PLAY (formerly goplay.be)'
18
+ _VALID_URL = r'https?://(www\.)?play\.tv/video/([^/?#]+/[^/?#]+/|)(?P<id>[^/#]+)'
17
19
 
18
20
  _NETRC_MACHINE = 'goplay'
19
21
 
20
22
  _TESTS = [{
21
- 'url': 'https://www.goplay.be/video/de-slimste-mens-ter-wereld/de-slimste-mens-ter-wereld-s22/de-slimste-mens-ter-wereld-s22-aflevering-1',
23
+ 'url': 'https://www.play.tv/video/de-slimste-mens-ter-wereld/de-slimste-mens-ter-wereld-s22/de-slimste-mens-ter-wereld-s22-aflevering-1',
22
24
  'info_dict': {
23
25
  'id': '2baa4560-87a0-421b-bffc-359914e3c387',
24
26
  'ext': 'mp4',
@@ -33,7 +35,7 @@ class GoPlayIE(InfoExtractor):
33
35
  'params': {'skip_download': True},
34
36
  'skip': 'This video is only available for registered users',
35
37
  }, {
36
- 'url': 'https://www.goplay.be/video/1917',
38
+ 'url': 'https://www.play.tv/video/1917',
37
39
  'info_dict': {
38
40
  'id': '40cac41d-8d29-4ef5-aa11-75047b9f0907',
39
41
  'ext': 'mp4',
@@ -43,7 +45,7 @@ class GoPlayIE(InfoExtractor):
43
45
  'params': {'skip_download': True},
44
46
  'skip': 'This video is only available for registered users',
45
47
  }, {
46
- 'url': 'https://www.goplay.be/video/de-mol/de-mol-s11/de-mol-s11-aflevering-1#autoplay',
48
+ 'url': 'https://www.play.tv/video/de-mol/de-mol-s11/de-mol-s11-aflevering-1#autoplay',
47
49
  'info_dict': {
48
50
  'id': 'ecb79672-92b9-4cd9-a0d7-e2f0250681ee',
49
51
  'ext': 'mp4',
@@ -101,7 +103,7 @@ class GoPlayIE(InfoExtractor):
101
103
  break
102
104
 
103
105
  api = self._download_json(
104
- f'https://api.goplay.be/web/v1/videos/long-form/{video_id}',
106
+ f'https://api.play.tv/web/v1/videos/long-form/{video_id}',
105
107
  video_id, headers={
106
108
  'Authorization': f'Bearer {self._id_token}',
107
109
  **self.geo_verification_headers(),
@@ -4378,8 +4378,9 @@ class GoIE(AdobePassIE):
4378
4378
 
4379
4379
  class GoPlayIE(LazyLoadExtractor):
4380
4380
  _module = 'yt_dlp.extractor.goplay'
4381
- IE_NAME = 'GoPlay'
4382
- _VALID_URL = 'https?://(www\\.)?goplay\\.be/video/([^/?#]+/[^/?#]+/|)(?P<id>[^/#]+)'
4381
+ IE_NAME = 'play.tv'
4382
+ _VALID_URL = 'https?://(www\\.)?play\\.tv/video/([^/?#]+/[^/?#]+/|)(?P<id>[^/#]+)'
4383
+ IE_DESC = 'PLAY (formerly goplay.be)'
4383
4384
  _NETRC_MACHINE = 'goplay'
4384
4385
  _RETURN_TYPE = 'video'
4385
4386
 
@@ -7590,7 +7591,7 @@ class NTVDeIE(LazyLoadExtractor):
7590
7591
  class NTVRuIE(LazyLoadExtractor):
7591
7592
  _module = 'yt_dlp.extractor.ntvru'
7592
7593
  IE_NAME = 'ntv.ru'
7593
- _VALID_URL = 'https?://(?:www\\.)?ntv\\.ru/(?:[^/]+/)*(?P<id>[^/?#&]+)'
7594
+ _VALID_URL = 'https?://(?:www\\.)?ntv\\.ru/(?:[^/#?]+/)*(?P<id>[^/?#&]+)'
7594
7595
  _RETURN_TYPE = 'video'
7595
7596
 
7596
7597
 
yt_dlp/extractor/ntvru.py CHANGED
@@ -1,52 +1,79 @@
1
1
  from .common import InfoExtractor
2
2
  from ..utils import (
3
3
  int_or_none,
4
- strip_or_none,
4
+ parse_iso8601,
5
5
  unescapeHTML,
6
+ url_or_none,
6
7
  xpath_text,
7
8
  )
9
+ from ..utils.traversal import traverse_obj
8
10
 
9
11
 
10
12
  class NTVRuIE(InfoExtractor):
11
13
  IE_NAME = 'ntv.ru'
12
- _VALID_URL = r'https?://(?:www\.)?ntv\.ru/(?:[^/]+/)*(?P<id>[^/?#&]+)'
14
+ _VALID_URL = r'https?://(?:www\.)?ntv\.ru/(?:[^/#?]+/)*(?P<id>[^/?#&]+)'
13
15
 
14
16
  _TESTS = [{
15
- 'url': 'http://www.ntv.ru/novosti/863142/',
16
- 'md5': 'ba7ea172a91cb83eb734cad18c10e723',
17
+ # JSON Api is geo restricted
18
+ 'url': 'https://www.ntv.ru/peredacha/svoya_igra/m58980/o818800',
19
+ 'md5': '818962a1b52747d446db7cd5be43e142',
17
20
  'info_dict': {
18
- 'id': '746000',
21
+ 'id': '2520563',
19
22
  'ext': 'mp4',
20
- 'title': 'Командующий Черноморским флотом провел переговоры в штабе ВМС Украины',
21
- 'description': 'Командующий Черноморским флотом провел переговоры в штабе ВМС Украины',
23
+ 'title': 'Участники: Ирина Петрова, Сергей Коновалов, Кристина Кораблина',
24
+ 'description': 'md5:fcbd21cd45238a940b95550f9e178e3e',
22
25
  'thumbnail': r're:^http://.*\.jpg',
23
- 'duration': 136,
26
+ 'duration': 2462,
24
27
  'view_count': int,
28
+ 'comment_count': int,
29
+ 'tags': ['игры и игрушки'],
30
+ 'timestamp': 1761821096,
31
+ 'upload_date': '20251030',
32
+ 'release_timestamp': 1761821096,
33
+ 'release_date': '20251030',
34
+ 'modified_timestamp': 1761821096,
35
+ 'modified_date': '20251030',
25
36
  },
26
37
  }, {
27
- 'url': 'http://www.ntv.ru/video/novosti/750370/',
28
- 'md5': 'adecff79691b4d71e25220a191477124',
38
+ 'url': 'http://www.ntv.ru/novosti/863142/',
39
+ 'md5': 'ba7ea172a91cb83eb734cad18c10e723',
29
40
  'info_dict': {
30
- 'id': '750370',
41
+ 'id': '746000',
31
42
  'ext': 'mp4',
32
- 'title': 'Родные пассажиров пропавшего Boeing не верят в трагический исход',
33
- 'description': 'Родные пассажиров пропавшего Boeing не верят в трагический исход',
43
+ 'title': 'Командующий Черноморским флотом провел переговоры в штабе ВМС Украины',
44
+ 'description': 'Командующий Черноморским флотом провел переговоры в штабе ВМС Украины',
34
45
  'thumbnail': r're:^http://.*\.jpg',
35
- 'duration': 172,
46
+ 'duration': 136,
36
47
  'view_count': int,
48
+ 'comment_count': int,
49
+ 'tags': ['ВМС', 'захват', 'митинги', 'Севастополь', 'Украина'],
50
+ 'timestamp': 1395222013,
51
+ 'upload_date': '20140319',
52
+ 'release_timestamp': 1395222013,
53
+ 'release_date': '20140319',
54
+ 'modified_timestamp': 1395222013,
55
+ 'modified_date': '20140319',
37
56
  },
38
- 'skip': '404 Not Found',
39
57
  }, {
58
+ # Requires unescapeHTML
40
59
  'url': 'http://www.ntv.ru/peredacha/segodnya/m23700/o232416',
41
60
  'md5': '82dbd49b38e3af1d00df16acbeab260c',
42
61
  'info_dict': {
43
62
  'id': '747480',
44
63
  'ext': 'mp4',
45
- 'title': '«Сегодня». 21 марта 2014 года. 16:00',
46
- 'description': '«Сегодня». 21 марта 2014 года. 16:00',
64
+ 'title': '"Сегодня". 21 марта 2014 года. 16:00 ',
65
+ 'description': 'md5:bed80745ca72af557433195f51a02785',
47
66
  'thumbnail': r're:^http://.*\.jpg',
48
67
  'duration': 1496,
49
68
  'view_count': int,
69
+ 'comment_count': int,
70
+ 'tags': ['Брюссель', 'гражданство', 'ЕС', 'Крым', 'ОСАГО', 'саммит', 'санкции', 'события', 'чиновники', 'рейтинг'],
71
+ 'timestamp': 1395406951,
72
+ 'upload_date': '20140321',
73
+ 'release_timestamp': 1395406951,
74
+ 'release_date': '20140321',
75
+ 'modified_timestamp': 1395406951,
76
+ 'modified_date': '20140321',
50
77
  },
51
78
  }, {
52
79
  'url': 'https://www.ntv.ru/kino/Koma_film/m70281/o336036/video/',
@@ -54,11 +81,19 @@ class NTVRuIE(InfoExtractor):
54
81
  'info_dict': {
55
82
  'id': '1126480',
56
83
  'ext': 'mp4',
57
- 'title': 'Остросюжетный фильм «Кома»',
58
- 'description': 'Остросюжетный фильм «Кома»',
84
+ 'title': 'Остросюжетный фильм "Кома"',
85
+ 'description': 'md5:e79ffd0887425a0f05a58885c408d7d8',
59
86
  'thumbnail': r're:^http://.*\.jpg',
60
- 'duration': 5592,
87
+ 'duration': 5608,
61
88
  'view_count': int,
89
+ 'comment_count': int,
90
+ 'tags': ['кино'],
91
+ 'timestamp': 1432868572,
92
+ 'upload_date': '20150529',
93
+ 'release_timestamp': 1432868572,
94
+ 'release_date': '20150529',
95
+ 'modified_timestamp': 1432868572,
96
+ 'modified_date': '20150529',
62
97
  },
63
98
  }, {
64
99
  'url': 'http://www.ntv.ru/serial/Delo_vrachey/m31760/o233916/',
@@ -66,11 +101,19 @@ class NTVRuIE(InfoExtractor):
66
101
  'info_dict': {
67
102
  'id': '751482',
68
103
  'ext': 'mp4',
69
- 'title': '«Дело врачей»: «Деревце жизни»',
70
- 'description': '«Дело врачей»: «Деревце жизни»',
104
+ 'title': '"Дело врачей": "Деревце жизни"',
105
+ 'description': 'md5:d6fbf9193f880f50d9cbfbcc954161c1',
71
106
  'thumbnail': r're:^http://.*\.jpg',
72
107
  'duration': 2590,
73
108
  'view_count': int,
109
+ 'comment_count': int,
110
+ 'tags': ['врачи', 'больницы'],
111
+ 'timestamp': 1395882300,
112
+ 'upload_date': '20140327',
113
+ 'release_timestamp': 1395882300,
114
+ 'release_date': '20140327',
115
+ 'modified_timestamp': 1395882300,
116
+ 'modified_date': '20140327',
74
117
  },
75
118
  }, {
76
119
  # Schemeless file URL
@@ -78,48 +121,26 @@ class NTVRuIE(InfoExtractor):
78
121
  'only_matching': True,
79
122
  }]
80
123
 
81
- _VIDEO_ID_REGEXES = [
82
- r'<meta property="og:url" content="https?://www\.ntv\.ru/video/(\d+)',
83
- r'<meta property="og:video:(?:url|iframe)" content="https?://www\.ntv\.ru/embed/(\d+)',
84
- r'<video embed=[^>]+><id>(\d+)</id>',
85
- r'<video restriction[^>]+><key>(\d+)</key>',
86
- ]
87
-
88
124
  def _real_extract(self, url):
89
- video_id = self._match_id(url)
125
+ display_id = self._match_id(url)
126
+ webpage = self._download_webpage(url, display_id)
90
127
 
91
- webpage = self._download_webpage(url, video_id)
92
-
93
- video_url = self._og_search_property(
94
- ('video', 'video:iframe'), webpage, default=None)
95
- if video_url:
96
- video_id = self._search_regex(
97
- r'https?://(?:www\.)?ntv\.ru/video/(?:embed/)?(\d+)',
98
- video_url, 'video id', default=None)
99
-
100
- if not video_id:
101
- video_id = self._html_search_regex(
102
- self._VIDEO_ID_REGEXES, webpage, 'video id')
128
+ video_id = self._html_search_regex(
129
+ r'<meta property="ya:ovs:feed_url" content="https?://www\.ntv\.ru/(?:exp/)?video/(\d+)', webpage, 'video id')
103
130
 
104
131
  player = self._download_xml(
105
132
  f'http://www.ntv.ru/vi{video_id}/',
106
133
  video_id, 'Downloading video XML')
107
134
 
108
- title = strip_or_none(unescapeHTML(xpath_text(player, './data/title', 'title', fatal=True)))
109
-
110
135
  video = player.find('./data/video')
111
136
 
112
137
  formats = []
113
138
  for format_id in ['', 'hi', 'webm']:
114
- file_ = xpath_text(video, f'./{format_id}file')
115
- if not file_:
139
+ video_url = url_or_none(xpath_text(video, f'./{format_id}file'))
140
+ if not video_url:
116
141
  continue
117
- if file_.startswith('//'):
118
- file_ = self._proto_relative_url(file_)
119
- elif not file_.startswith('http'):
120
- file_ = 'http://media.ntv.ru/vod/' + file_
121
142
  formats.append({
122
- 'url': file_,
143
+ 'url': video_url,
123
144
  'filesize': int_or_none(xpath_text(video, f'./{format_id}size')),
124
145
  })
125
146
  hls_manifest = xpath_text(video, './playback/hls')
@@ -131,12 +152,28 @@ class NTVRuIE(InfoExtractor):
131
152
  formats.extend(self._extract_mpd_formats(
132
153
  dash_manifest, video_id, mpd_id='dash', fatal=False))
133
154
 
155
+ metadata = self._download_xml(
156
+ f'https://www.ntv.ru/exp/video/{video_id}', video_id, 'Downloading XML metadata', fatal=False)
157
+
134
158
  return {
135
- 'id': xpath_text(video, './id'),
136
- 'title': title,
137
- 'description': strip_or_none(unescapeHTML(xpath_text(player, './data/description'))),
138
- 'thumbnail': xpath_text(video, './splash'),
139
- 'duration': int_or_none(xpath_text(video, './totaltime')),
140
- 'view_count': int_or_none(xpath_text(video, './views')),
159
+ 'id': video_id,
141
160
  'formats': formats,
161
+ **traverse_obj(player, {
162
+ 'title': ('data/title/text()', ..., {str}, {unescapeHTML}, any),
163
+ 'description': ('data/description/text()', ..., {str}, {unescapeHTML}, any),
164
+ 'duration': ('data/video/totaltime/text()', ..., {int_or_none}, any),
165
+ 'view_count': ('data/video/views/text()', ..., {int_or_none}, any),
166
+ 'thumbnail': ('data/video/splash/text()', ..., {url_or_none}, any),
167
+ }),
168
+ **traverse_obj(metadata, {
169
+ 'title': ('{*}title/text()', ..., {str}, {unescapeHTML}, any),
170
+ 'description': ('{*}description/text()', ..., {str}, {unescapeHTML}, any),
171
+ 'duration': ('{*}duration/text()', ..., {int_or_none}, any),
172
+ 'timestamp': ('{*}create_date/text()', ..., {parse_iso8601}, any),
173
+ 'release_timestamp': ('{*}upload_date/text()', ..., {parse_iso8601}, any),
174
+ 'modified_timestamp': ('{*}modify_date/text()', ..., {parse_iso8601}, any),
175
+ 'tags': ('{*}tag/text()', ..., {str}, {lambda x: x.split(',')}, ..., {str.strip}, filter),
176
+ 'view_count': ('{*}stats/views_total/text()', ..., {int_or_none}, any),
177
+ 'comment_count': ('{*}stats/comments/text()', ..., {int_or_none}, any),
178
+ }),
142
179
  }
@@ -60,6 +60,37 @@ class _ByteGenerator:
60
60
  s = to_signed_32(s * to_signed_32(0xc2b2ae3d))
61
61
  return to_signed_32(s ^ ((s & 0xFFFFFFFF) >> 16))
62
62
 
63
+ def _algo4(self, s):
64
+ # Custom scrambling function involving a left rotation (ROL)
65
+ s = self._s = to_signed_32(s + 0x6d2b79f5)
66
+ s = to_signed_32((s << 7) | ((s & 0xFFFFFFFF) >> 25)) # ROL 7
67
+ s = to_signed_32(s + 0x9e3779b9)
68
+ s = to_signed_32(s ^ ((s & 0xFFFFFFFF) >> 11))
69
+ return to_signed_32(s * 0x27d4eb2d)
70
+
71
+ def _algo5(self, s):
72
+ # xorshift variant with a final addition
73
+ s = to_signed_32(s ^ (s << 7))
74
+ s = to_signed_32(s ^ ((s & 0xFFFFFFFF) >> 9))
75
+ s = to_signed_32(s ^ (s << 8))
76
+ s = self._s = to_signed_32(s + 0xa5a5a5a5)
77
+ return s
78
+
79
+ def _algo6(self, s):
80
+ # LCG (a=0x2c9277b5, c=0xac564b05) with a variable right shift scrambler
81
+ s = self._s = to_signed_32(s * to_signed_32(0x2c9277b5) + to_signed_32(0xac564b05))
82
+ s2 = to_signed_32(s ^ ((s & 0xFFFFFFFF) >> 18))
83
+ shift = (s & 0xFFFFFFFF) >> 27 & 31
84
+ return to_signed_32((s2 & 0xFFFFFFFF) >> shift)
85
+
86
+ def _algo7(self, s):
87
+ # Weyl Sequence (k=0x9e3779b9) + custom multiply-xor-shift mixing function
88
+ s = self._s = to_signed_32(s + to_signed_32(0x9e3779b9))
89
+ e = to_signed_32(s ^ (s << 5))
90
+ e = to_signed_32(e * to_signed_32(0x7feb352d))
91
+ e = to_signed_32(e ^ ((e & 0xFFFFFFFF) >> 15))
92
+ return to_signed_32(e * to_signed_32(0x846ca68b))
93
+
63
94
  def __next__(self):
64
95
  return self._algorithm(self._s) & 0xFF
65
96
 
@@ -1596,6 +1596,70 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
1596
1596
  'params': {
1597
1597
  'skip_download': True,
1598
1598
  },
1599
+ }, {
1600
+ # Video with two collaborators
1601
+ 'url': 'https://www.youtube.com/watch?v=brhfDfLdDZ8',
1602
+ 'info_dict': {
1603
+ 'id': 'brhfDfLdDZ8',
1604
+ 'ext': 'mp4',
1605
+ 'title': 'This is the WORST Movie Science We\'ve Ever Seen',
1606
+ 'description': 'md5:8afd0a3cd69ec63438fc573580436f92',
1607
+ 'media_type': 'video',
1608
+ 'uploader': 'Open Sauce',
1609
+ 'uploader_id': '@opensaucelive',
1610
+ 'uploader_url': 'https://www.youtube.com/@opensaucelive',
1611
+ 'channel': 'Open Sauce',
1612
+ 'channel_id': 'UC2EiGVmCeD79l_vZ204DUSw',
1613
+ 'channel_url': 'https://www.youtube.com/channel/UC2EiGVmCeD79l_vZ204DUSw',
1614
+ 'comment_count': int,
1615
+ 'view_count': int,
1616
+ 'like_count': int,
1617
+ 'age_limit': 0,
1618
+ 'duration': 1664,
1619
+ 'thumbnail': 'https://i.ytimg.com/vi/brhfDfLdDZ8/hqdefault.jpg',
1620
+ 'categories': ['Entertainment'],
1621
+ 'tags': ['Moonfall', 'Bad Science', 'Open Sauce', 'Sauce+', 'The Backyard Scientist', 'William Osman', 'Allen Pan'],
1622
+ 'creators': ['Open Sauce', 'William Osman 2'],
1623
+ 'timestamp': 1759452918,
1624
+ 'upload_date': '20251003',
1625
+ 'playable_in_embed': True,
1626
+ 'availability': 'public',
1627
+ 'live_status': 'not_live',
1628
+ },
1629
+ 'params': {'skip_download': True},
1630
+ }, {
1631
+ # Video with five collaborators
1632
+ 'url': 'https://www.youtube.com/watch?v=_A9KsMbWh4E',
1633
+ 'info_dict': {
1634
+ 'id': '_A9KsMbWh4E',
1635
+ 'ext': 'mp4',
1636
+ 'title': '【MV】薫習 - LIVE UNION【RK Music】',
1637
+ 'description': 'md5:9b3dc2b91103f303fcc0dac8617e7938',
1638
+ 'media_type': 'video',
1639
+ 'uploader': 'RK Music',
1640
+ 'uploader_id': '@RKMusic_inc',
1641
+ 'uploader_url': 'https://www.youtube.com/@RKMusic_inc',
1642
+ 'channel': 'RK Music',
1643
+ 'channel_id': 'UCiLhMk-gmE2zgF7KGVyqvFw',
1644
+ 'channel_url': 'https://www.youtube.com/channel/UCiLhMk-gmE2zgF7KGVyqvFw',
1645
+ 'comment_count': int,
1646
+ 'view_count': int,
1647
+ 'like_count': int,
1648
+ 'age_limit': 0,
1649
+ 'duration': 193,
1650
+ 'thumbnail': 'https://i.ytimg.com/vi_webp/_A9KsMbWh4E/maxresdefault.webp',
1651
+ 'categories': ['Music'],
1652
+ 'tags': [],
1653
+ 'creators': ['RK Music', 'HACHI', '焔魔るり CH. / Ruri Enma', '瀬戸乃とと', '水瀬 凪/MINASE Nagi'],
1654
+ 'timestamp': 1761908406,
1655
+ 'upload_date': '20251031',
1656
+ 'release_timestamp': 1761908406,
1657
+ 'release_date': '20251031',
1658
+ 'playable_in_embed': True,
1659
+ 'availability': 'public',
1660
+ 'live_status': 'not_live',
1661
+ },
1662
+ 'params': {'skip_download': True},
1599
1663
  }]
1600
1664
  _WEBPAGE_TESTS = [{
1601
1665
  # <object>
@@ -4166,9 +4230,15 @@ class YoutubeIE(YoutubeBaseInfoExtractor):
4166
4230
  vsir = get_first(contents, 'videoSecondaryInfoRenderer')
4167
4231
  if vsir:
4168
4232
  vor = traverse_obj(vsir, ('owner', 'videoOwnerRenderer'))
4233
+ collaborators = traverse_obj(vor, (
4234
+ 'attributedTitle', 'commandRuns', ..., 'onTap', 'innertubeCommand', 'showDialogCommand',
4235
+ 'panelLoadingStrategy', 'inlineContent', 'dialogViewModel', 'customContent', 'listViewModel',
4236
+ 'listItems', ..., 'listItemViewModel', 'title', 'content', {str}))
4169
4237
  info.update({
4170
- 'channel': self._get_text(vor, 'title'),
4171
- 'channel_follower_count': self._get_count(vor, 'subscriberCountText')})
4238
+ 'channel': self._get_text(vor, 'title') or (collaborators[0] if collaborators else None),
4239
+ 'channel_follower_count': self._get_count(vor, 'subscriberCountText'),
4240
+ 'creators': collaborators if collaborators else None,
4241
+ })
4172
4242
 
4173
4243
  if not channel_handle:
4174
4244
  channel_handle = self.handle_from_url(
@@ -1,6 +1,6 @@
1
1
  # This file is generated by devscripts/update_ejs.py. DO NOT MODIFY!
2
2
 
3
- VERSION = '0.3.0'
3
+ VERSION = '0.3.1'
4
4
  HASHES = {
5
5
  'yt.solver.bun.lib.js': '6ff45e94de9f0ea936a183c48173cfa9ce526ee4b7544cd556428427c1dd53c8073ef0174e79b320252bf0e7c64b0032cc1cf9c4358f3fda59033b7caa01c241',
6
6
  'yt.solver.core.js': '0cd96b2d3f319dfa62cae689efa7d930ef1706e95f5921794db5089b2262957ec0a17d73938d8975ea35d0309cbfb4c8e4418d5e219837215eee242890c8b64d',
@@ -96,7 +96,10 @@ class CurlCFFIResponseAdapter(Response):
96
96
 
97
97
  def read(self, amt=None):
98
98
  try:
99
- return self.fp.read(amt)
99
+ res = self.fp.read(amt)
100
+ if self.fp.closed:
101
+ self.close()
102
+ return res
100
103
  except curl_cffi.requests.errors.RequestsError as e:
101
104
  if e.code == CurlECode.PARTIAL_FILE:
102
105
  content_length = e.response and int_or_none(e.response.headers.get('Content-Length'))
@@ -119,17 +119,22 @@ class RequestsResponseAdapter(Response):
119
119
 
120
120
  self._requests_response = res
121
121
 
122
+ def _real_read(self, amt: int | None = None) -> bytes:
123
+ # Work around issue with `.read(amt)` then `.read()`
124
+ # See: https://github.com/urllib3/urllib3/issues/3636
125
+ if amt is None:
126
+ # compat: py3.9: Python 3.9 preallocates the whole read buffer, read in chunks
127
+ read_chunk = functools.partial(self.fp.read, 1 << 20, decode_content=True)
128
+ return b''.join(iter(read_chunk, b''))
129
+ # Interact with urllib3 response directly.
130
+ return self.fp.read(amt, decode_content=True)
131
+
122
132
  def read(self, amt: int | None = None):
123
133
  try:
124
- # Work around issue with `.read(amt)` then `.read()`
125
- # See: https://github.com/urllib3/urllib3/issues/3636
126
- if amt is None:
127
- # compat: py3.9: Python 3.9 preallocates the whole read buffer, read in chunks
128
- read_chunk = functools.partial(self.fp.read, 1 << 20, decode_content=True)
129
- return b''.join(iter(read_chunk, b''))
130
- # Interact with urllib3 response directly.
131
- return self.fp.read(amt, decode_content=True)
132
-
134
+ data = self._real_read(amt)
135
+ if self.fp.closed:
136
+ self.close()
137
+ return data
133
138
  # See urllib3.response.HTTPResponse.read() for exceptions raised on read
134
139
  except urllib3.exceptions.SSLError as e:
135
140
  raise SSLError(cause=e) from e
@@ -306,7 +306,25 @@ class UrllibResponseAdapter(Response):
306
306
 
307
307
  def read(self, amt=None):
308
308
  try:
309
- return self.fp.read(amt)
309
+ data = self.fp.read(amt)
310
+ underlying = getattr(self.fp, 'fp', None)
311
+ if isinstance(self.fp, http.client.HTTPResponse) and underlying is None:
312
+ # http.client.HTTPResponse automatically closes itself when fully read
313
+ self.close()
314
+ elif isinstance(self.fp, urllib.response.addinfourl) and underlying is not None:
315
+ # urllib's addinfourl does not close the underlying fp automatically when fully read
316
+ if isinstance(underlying, io.BytesIO):
317
+ # data URLs or in-memory responses (e.g. gzip/deflate/brotli decoded)
318
+ if underlying.tell() >= len(underlying.getbuffer()):
319
+ self.close()
320
+ elif isinstance(underlying, io.BufferedReader) and amt is None:
321
+ # file URLs.
322
+ # XXX: this will not mark the response as closed if it was fully read with amt.
323
+ self.close()
324
+ elif underlying is not None and underlying.closed:
325
+ # Catch-all for any cases where underlying file is closed
326
+ self.close()
327
+ return data
310
328
  except Exception as e:
311
329
  handle_response_read_exceptions(e)
312
330
  raise e
@@ -554,12 +554,16 @@ class Response(io.IOBase):
554
554
  # Expected errors raised here should be of type RequestError or subclasses.
555
555
  # Subclasses should redefine this method with more precise error handling.
556
556
  try:
557
- return self.fp.read(amt)
557
+ res = self.fp.read(amt)
558
+ if self.fp.closed:
559
+ self.close()
560
+ return res
558
561
  except Exception as e:
559
562
  raise TransportError(cause=e) from e
560
563
 
561
564
  def close(self):
562
- self.fp.close()
565
+ if not self.fp.closed:
566
+ self.fp.close()
563
567
  return super().close()
564
568
 
565
569
  def get_header(self, name, default=None):
yt_dlp/version.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # Autogenerated by devscripts/update-version.py
2
2
 
3
- __version__ = '2025.11.05.232946'
3
+ __version__ = '2025.11.08.232845'
4
4
 
5
- RELEASE_GIT_HEAD = '7af6d81f35aea8832023daa30ada10e6673a0529'
5
+ RELEASE_GIT_HEAD = 'f87cfadb5c3cba8e9dc4231c9554548e9edb3882'
6
6
 
7
7
  VARIANT = 'pip'
8
8
 
@@ -12,4 +12,4 @@ CHANNEL = 'nightly'
12
12
 
13
13
  ORIGIN = 'yt-dlp/yt-dlp-nightly-builds'
14
14
 
15
- _pkg_version = '2025.11.05.232946dev'
15
+ _pkg_version = '2025.11.08.232845dev'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yt-dlp
3
- Version: 2025.11.5.232946.dev0
3
+ Version: 2025.11.8.232845.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
@@ -43,7 +43,7 @@ Requires-Dist: pycryptodomex; extra == 'default'
43
43
  Requires-Dist: requests<3,>=2.32.2; extra == 'default'
44
44
  Requires-Dist: urllib3<3,>=2.0.2; extra == 'default'
45
45
  Requires-Dist: websockets>=13.0; extra == 'default'
46
- Requires-Dist: yt-dlp-ejs==0.3.0; extra == 'default'
46
+ Requires-Dist: yt-dlp-ejs==0.3.1; extra == 'default'
47
47
  Provides-Extra: dev
48
48
  Requires-Dist: autopep8~=2.0; extra == 'dev'
49
49
  Requires-Dist: pre-commit; extra == 'dev'
@@ -11,7 +11,7 @@ yt_dlp/options.py,sha256=eXsRQXXLA0p_7Zr22GF6W_AE8Qq-3lTGhW18XGt0vPA,99832
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=ZyJFwEdAxfTw_0RidnuCm4UqjNGn0fUJ0lKxKaEO4LM,360
14
+ yt_dlp/version.py,sha256=45TLaJGH-3zFVWyLMc3RM5SjzwWQWJlm6i2ubtiDO6A,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
@@ -357,7 +357,7 @@ yt_dlp/extractor/goodgame.py,sha256=NM_gK4bXeL-vmEAUiNXnljTFubc736nWRyo4pvieWiQ,
357
357
  yt_dlp/extractor/googledrive.py,sha256=6rfwm4IsOtrBn5plrGDHCh86jvLWqsQagqwzFarNBVs,13549
358
358
  yt_dlp/extractor/googlepodcasts.py,sha256=uQyG3G-eVgEQkMmOYYoib42wHD59MZKa_90MWfhv2sw,3342
359
359
  yt_dlp/extractor/googlesearch.py,sha256=JlJhgB3y272gmaD7mrd311oY2d14d7lpnZRpoKiUxtM,1163
360
- yt_dlp/extractor/goplay.py,sha256=iHjtRn8bu-627o4G5wu-3_pFPeV_0Gzilxulu8AkOSg,17394
360
+ yt_dlp/extractor/goplay.py,sha256=AqBG6YQoXvLEYXEEmYjTIy5TCrDGssGGVfSIDp1slho,17450
361
361
  yt_dlp/extractor/gopro.py,sha256=NrOOYIbGS4MzJaPxUPd5Crb26hfEW1BeGiEgvTQDuOs,3777
362
362
  yt_dlp/extractor/goshgay.py,sha256=fGkTFMml__ZjijEiRv9W1HJH-9JeqJFsgA6_P-wt-Sc,1467
363
363
  yt_dlp/extractor/gotostage.py,sha256=NRnycE--LC7PM0MWTfukjqX-sVKeWsZDl0FNqsnM6Kk,2662
@@ -455,7 +455,7 @@ yt_dlp/extractor/la7.py,sha256=GShDLu1N0rS1bY4uIiUkznThvn7gNiwtSgmh7Rs7t08,9435
455
455
  yt_dlp/extractor/laracasts.py,sha256=PzTqAbHXiUqog-mpp2qR_rpKa-sZel4mLyzWTPkbDuc,4587
456
456
  yt_dlp/extractor/lastfm.py,sha256=OpmE-Y-2rcav2r2xaDQzX_EJiltmbbe6fO9VzkLqNWQ,4748
457
457
  yt_dlp/extractor/laxarxames.py,sha256=-YyL-5y4t2L9ptTSLXhvK-SJwvXGqv5l1HfT129zF0c,2773
458
- yt_dlp/extractor/lazy_extractors.py,sha256=cM53rRrIAG0UmYsopo-n7roJq9fW06Lb6x7UKQttZ9M,811425
458
+ yt_dlp/extractor/lazy_extractors.py,sha256=UiuinZlqEZSGvB64NMD0W5iImT-urssGjFVePuza1GQ,811468
459
459
  yt_dlp/extractor/lbry.py,sha256=gC9jRRo8wSXc1-6somhW13brAtmWGlJ5_Q0NMhZpKwk,18078
460
460
  yt_dlp/extractor/lci.py,sha256=_0XuoITIt_QFA-6eBNpDXZZfouwUWfcdHQlpAOuiLEs,2131
461
461
  yt_dlp/extractor/lcp.py,sha256=edMA8L-eJZLquDvHcSY4oFWI0C8yGgjqW1tmhhLMJ5U,2279
@@ -606,7 +606,7 @@ yt_dlp/extractor/nrl.py,sha256=2vnKVvRBd3M0lr2P8xnhXrqel-4AASlLyX40oxw5V9Q,953
606
606
  yt_dlp/extractor/nts.py,sha256=QDsXBuRe7AcAtSg61U7D1gCcZTL4pWiydoKFUVDxaE0,3290
607
607
  yt_dlp/extractor/ntvcojp.py,sha256=3u63YaDIKn0taTdY918Qs3Ow3wEec3HLA8RBtjoDzMU,3474
608
608
  yt_dlp/extractor/ntvde.py,sha256=QHMEI9fHzuVhC0i1RzTiqD9rxBVeWQC0GvhDaYh17eA,3711
609
- yt_dlp/extractor/ntvru.py,sha256=fSzQVuludrbVIAoDcJ7tZN2ogCFSsd1H6ajrAheJgwQ,5660
609
+ yt_dlp/extractor/ntvru.py,sha256=wBsPTLkhPvOG8-ZUVj7MYx9Ycl7b6RBYom1V0WqIx4w,7784
610
610
  yt_dlp/extractor/nubilesporn.py,sha256=p5o0zAddrF3HI1eL1vsh0tcbK046rXYVIx_cGyZJhb0,4529
611
611
  yt_dlp/extractor/nuevo.py,sha256=0pHAwqMQnl0409Yjlvwz47eNsostCAT2upQt4IUBCFo,1140
612
612
  yt_dlp/extractor/nuum.py,sha256=DhKkBUzmwc5vPfLhE6lFhNjmEGS16U3L5GlsduzUOWo,7415
@@ -1019,7 +1019,7 @@ yt_dlp/extractor/wsj.py,sha256=oAzvhE754nxtWG7vNTu2fOi33nSK5fWUT4M4NiMfgeU,5096
1019
1019
  yt_dlp/extractor/wwe.py,sha256=Zo1kXvhg4Uiu58H9EPXogeoxFVMq53GLCDI4rG_vsW4,4435
1020
1020
  yt_dlp/extractor/wykop.py,sha256=iHGlLoAsAa5UCkc2WHDRLWKTttFeSMFH5yn83lCslYs,10729
1021
1021
  yt_dlp/extractor/xboxclips.py,sha256=aBf2sQ946VmLuHVLSLE6068NgXxWmYfqpnRwu4e1Sao,2320
1022
- yt_dlp/extractor/xhamster.py,sha256=4pJSS6viWj2GOCRIr-_8t6779a8GkTK8C0zKuxtzjmQ,24678
1022
+ yt_dlp/extractor/xhamster.py,sha256=sXDgJD9JdYnNIZUIbpqtRxPoWhJBEjI0YwxZQ5tnrEk,26046
1023
1023
  yt_dlp/extractor/xiaohongshu.py,sha256=I3CnjjMKDzoGdM5_HqZ6iGYKYDSgIf05udz3N3eutO0,5018
1024
1024
  yt_dlp/extractor/ximalaya.py,sha256=W5mk-44n4ovSpLKbQftoZZtzJKFtlpQzxcJ6GW_PilA,9585
1025
1025
  yt_dlp/extractor/xinpianchang.py,sha256=KulN8sMEXB18E2te_qC-6p8XbYsgD13roSAXDmgFLEY,3882
@@ -1059,7 +1059,7 @@ yt_dlp/extractor/youtube/_notifications.py,sha256=1nhavzW0e2QWFAWHkfbTU4sSXNp4vU
1059
1059
  yt_dlp/extractor/youtube/_redirect.py,sha256=WWWnGEkfSGBXpZFi_bWY4XcHZ8PDeK7UsndDaTYYhQg,9005
1060
1060
  yt_dlp/extractor/youtube/_search.py,sha256=E9raTPGjUD6mm81WBpT4AsaxyiTBHdNssgzeHwVeNOE,6552
1061
1061
  yt_dlp/extractor/youtube/_tab.py,sha256=NcbpPvJ4XiTDDNBtaLtCZQBKyo2HuNcq_V-AalY8zj8,115736
1062
- yt_dlp/extractor/youtube/_video.py,sha256=15lGME8XHlvi_HzWF7h3mvsKcEuQbiSsno-YNAxP1Dg,203159
1062
+ yt_dlp/extractor/youtube/_video.py,sha256=UuhqWh6d1D4eHyt7Cj6oz6REMoSBSdfen2xVppjdbYc,206486
1063
1063
  yt_dlp/extractor/youtube/jsc/__init__.py,sha256=HaVFP8ikrLaE-ClAh39-S28WCF4S2KTRaSu7QvA28E8,289
1064
1064
  yt_dlp/extractor/youtube/jsc/_director.py,sha256=92pB-KVSs6plmE5R8gpjkZL9aeoWNR0XTnGOBXMy9go,13167
1065
1065
  yt_dlp/extractor/youtube/jsc/_registry.py,sha256=Vg9GkHKHKKPeRfUQ-XSw01mfx_2Xyodh0SJpwjawYCA,102
@@ -1071,7 +1071,7 @@ yt_dlp/extractor/youtube/jsc/_builtin/ejs.py,sha256=JHrMYVFrVk-yI7yg4lS-zbHsSasV
1071
1071
  yt_dlp/extractor/youtube/jsc/_builtin/node.py,sha256=2D7mNEeWRVw2hD4rpydjWGHsOzccxDMwGJvx0eWNq3Q,2300
1072
1072
  yt_dlp/extractor/youtube/jsc/_builtin/quickjs.py,sha256=y1FSPGgrjcUbsiwC6rOcbOsK0BbLWlzfZwl8VjT7MdA,2233
1073
1073
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/__init__.py,sha256=aLGEcFSHt-ub1H21jHp52rJTDKZmWXV-PJd_0hVCcio,518
1074
- yt_dlp/extractor/youtube/jsc/_builtin/vendor/_info.py,sha256=zR-XXX_3N5IOzMWC_aIHF2t7FgitmHSy_2S4ddfzeSU,1056
1074
+ yt_dlp/extractor/youtube/jsc/_builtin/vendor/_info.py,sha256=JT5_Y3enCJXRah3sj9LujJXrzsL0vZ1RJvCTEn_axuU,1056
1075
1075
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.bun.lib.js,sha256=ZfLzSdQETBfPWniQsgtce3zyeYeBIr95s7M_f0v2LNQ,237
1076
1076
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.core.js,sha256=WM1Xb6fCNxVU_ELUONasGs5fPNHnHW5p9u1irRMRPyM,17016
1077
1077
  yt_dlp/extractor/youtube/jsc/_builtin/vendor/yt.solver.deno.lib.js,sha256=6DFMNBXVnY31f9GSysXuQKziVjN-qfUZn0xwAv5Ozs8,245
@@ -1086,12 +1086,12 @@ yt_dlp/extractor/youtube/pot/_builtin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
1086
1086
  yt_dlp/extractor/youtube/pot/_builtin/memory_cache.py,sha256=wlTaCbealxjIyqBAVHmHxEOWgxiKAgv5h4nAuesh_Iw,2496
1087
1087
  yt_dlp/extractor/youtube/pot/_builtin/webpo_cachespec.py,sha256=PARR0jecAen1VX7A-W_6-JojpB-iL-7jPBi84BafjQo,1811
1088
1088
  yt_dlp/networking/__init__.py,sha256=s8pdgISu2hNJr2EPUy1JIiWzmQJF6024jQhOyiZny08,862
1089
- yt_dlp/networking/_curlcffi.py,sha256=YqZ-dI_c5E40FpbK0vcUdhRUmKx0omTPnxZc4FSB51c,13161
1089
+ yt_dlp/networking/_curlcffi.py,sha256=hL5oSB3oqAL9d_uZlq_cfrrAPoJaZxtKnW82bFqC4sw,13243
1090
1090
  yt_dlp/networking/_helper.py,sha256=98BkGEycv76zwiv0EhgASzDmAtFoZZn7qoL-8eDGB5k,10019
1091
- yt_dlp/networking/_requests.py,sha256=-3lxQIj6pXTohu-crrKMJsIzHqmEnj6c33TJszrbdeE,15543
1092
- yt_dlp/networking/_urllib.py,sha256=MvGvG8avflCmuftl48tUQUZRplKxsQykG5QMXoLVqRU,15941
1091
+ yt_dlp/networking/_requests.py,sha256=TXNODiGKizkUelCI3YVNrc5xX5jMA2teyfhddj-I0QI,15694
1092
+ yt_dlp/networking/_urllib.py,sha256=gFnEvZ5y7982xZHE1bfm3pFqDXrNn8uwZfuccvYEwBY,17081
1093
1093
  yt_dlp/networking/_websockets.py,sha256=ogM0RSGHu9FDyZhB87bCTXWr_JgdIeCph3T6fd7T8Kw,7483
1094
- yt_dlp/networking/common.py,sha256=rMbNKPBF6ObfV6_FK8y740iSaB0DUwfhdZxfpkjIhnE,22769
1094
+ yt_dlp/networking/common.py,sha256=JkcnXIqMSdxh42s3G-HReU1jnAFcpzvZg31xAEX_e_k,22886
1095
1095
  yt_dlp/networking/exceptions.py,sha256=vaQvsWNksyg2kgsmljrbLs9FSOrQphxBYEZQUSEzlAk,2846
1096
1096
  yt_dlp/networking/impersonate.py,sha256=jrpxgAxhSxqe9zFadhq2X6aAfeZ_JetBQdoB_mQpFYw,6242
1097
1097
  yt_dlp/networking/websocket.py,sha256=2VvfNm1zy4gHJ-JkUvvo82beNDAK__dDhf6fltqUD4I,510
@@ -1115,13 +1115,13 @@ yt_dlp/utils/progress.py,sha256=t9kVvJ0oWuEqRzo9fdFbIhHUBtO_8mg348QwZ1faqLo,3261
1115
1115
  yt_dlp/utils/traversal.py,sha256=64E3RcZ56iSX50RI_HbKdDNftkETMLBaEPX791_b7yQ,18265
1116
1116
  yt_dlp/utils/jslib/__init__.py,sha256=CbdJiRA7Eh5PnjF2V4lDTcg0J0XjBMaaq0H4pCfq9Tk,87
1117
1117
  yt_dlp/utils/jslib/devalue.py,sha256=7DCGK_zUN0ZeV5hwPT06zaRMUxX_hyUyFWqs79rxw24,5621
1118
- yt_dlp-2025.11.5.232946.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1119
- yt_dlp-2025.11.5.232946.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=Q9Y_PAs_7DwBqcDU4bSwzZKsKicNlY5mulB37A-rkSY,163810
1120
- yt_dlp-2025.11.5.232946.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=jhLFd3hs1AzICVAoXZNdctzarLYvENqNDLcSnbf3mx8,51036
1121
- yt_dlp-2025.11.5.232946.dev0.data/data/share/man/man1/yt-dlp.1,sha256=YMYNqJr0lrMNCJlLt3DPrgTOhnUxHetvJ6-B44ZUwf0,158662
1122
- yt_dlp-2025.11.5.232946.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=20YsrYzD08fZ-N7a7zp0vUa0Km-7OnVA_nik--Z53rs,5917
1123
- yt_dlp-2025.11.5.232946.dev0.dist-info/METADATA,sha256=bYIKtQbNuwkq1nhglaOBojVUdDPUxGmxCxgkLyirVg4,179201
1124
- yt_dlp-2025.11.5.232946.dev0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1125
- yt_dlp-2025.11.5.232946.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1126
- yt_dlp-2025.11.5.232946.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1127
- yt_dlp-2025.11.5.232946.dev0.dist-info/RECORD,,
1118
+ yt_dlp-2025.11.8.232845.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1119
+ yt_dlp-2025.11.8.232845.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=Q9Y_PAs_7DwBqcDU4bSwzZKsKicNlY5mulB37A-rkSY,163810
1120
+ yt_dlp-2025.11.8.232845.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=jhLFd3hs1AzICVAoXZNdctzarLYvENqNDLcSnbf3mx8,51036
1121
+ yt_dlp-2025.11.8.232845.dev0.data/data/share/man/man1/yt-dlp.1,sha256=YMYNqJr0lrMNCJlLt3DPrgTOhnUxHetvJ6-B44ZUwf0,158662
1122
+ yt_dlp-2025.11.8.232845.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=20YsrYzD08fZ-N7a7zp0vUa0Km-7OnVA_nik--Z53rs,5917
1123
+ yt_dlp-2025.11.8.232845.dev0.dist-info/METADATA,sha256=HM5egDdC7utBB7ODrqc0-snd2JWMD1NkSoA-XreUCh8,179201
1124
+ yt_dlp-2025.11.8.232845.dev0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
1125
+ yt_dlp-2025.11.8.232845.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1126
+ yt_dlp-2025.11.8.232845.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1127
+ yt_dlp-2025.11.8.232845.dev0.dist-info/RECORD,,