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.
- yt_dlp/extractor/goplay.py +7 -5
- yt_dlp/extractor/lazy_extractors.py +4 -3
- yt_dlp/extractor/ntvru.py +94 -57
- yt_dlp/extractor/xhamster.py +31 -0
- yt_dlp/extractor/youtube/_video.py +72 -2
- yt_dlp/extractor/youtube/jsc/_builtin/vendor/_info.py +1 -1
- yt_dlp/networking/_curlcffi.py +4 -1
- yt_dlp/networking/_requests.py +14 -9
- yt_dlp/networking/_urllib.py +19 -1
- yt_dlp/networking/common.py +6 -2
- yt_dlp/version.py +3 -3
- {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/METADATA +2 -2
- {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/RECORD +21 -21
- {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
- {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
- {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
- {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
- {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
- {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/WHEEL +0 -0
- {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/entry_points.txt +0 -0
- {yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/licenses/LICENSE +0 -0
yt_dlp/extractor/goplay.py
CHANGED
|
@@ -13,12 +13,14 @@ from ..utils.traversal import get_first, traverse_obj
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class GoPlayIE(InfoExtractor):
|
|
16
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 = '
|
|
4382
|
-
_VALID_URL = 'https?://(www\\.)?
|
|
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/(?:[
|
|
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
|
-
|
|
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/(?:[
|
|
14
|
+
_VALID_URL = r'https?://(?:www\.)?ntv\.ru/(?:[^/#?]+/)*(?P<id>[^/?#&]+)'
|
|
13
15
|
|
|
14
16
|
_TESTS = [{
|
|
15
|
-
|
|
16
|
-
'
|
|
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': '
|
|
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':
|
|
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/
|
|
28
|
-
'md5': '
|
|
38
|
+
'url': 'http://www.ntv.ru/novosti/863142/',
|
|
39
|
+
'md5': 'ba7ea172a91cb83eb734cad18c10e723',
|
|
29
40
|
'info_dict': {
|
|
30
|
-
'id': '
|
|
41
|
+
'id': '746000',
|
|
31
42
|
'ext': 'mp4',
|
|
32
|
-
'title': '
|
|
33
|
-
'description': '
|
|
43
|
+
'title': 'Командующий Черноморским флотом провел переговоры в штабе ВМС Украины',
|
|
44
|
+
'description': 'Командующий Черноморским флотом провел переговоры в штабе ВМС Украины',
|
|
34
45
|
'thumbnail': r're:^http://.*\.jpg',
|
|
35
|
-
'duration':
|
|
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': '
|
|
46
|
-
'description': '
|
|
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':
|
|
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
|
-
|
|
125
|
+
display_id = self._match_id(url)
|
|
126
|
+
webpage = self._download_webpage(url, display_id)
|
|
90
127
|
|
|
91
|
-
|
|
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
|
-
|
|
115
|
-
if not
|
|
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':
|
|
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':
|
|
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
|
}
|
yt_dlp/extractor/xhamster.py
CHANGED
|
@@ -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.
|
|
3
|
+
VERSION = '0.3.1'
|
|
4
4
|
HASHES = {
|
|
5
5
|
'yt.solver.bun.lib.js': '6ff45e94de9f0ea936a183c48173cfa9ce526ee4b7544cd556428427c1dd53c8073ef0174e79b320252bf0e7c64b0032cc1cf9c4358f3fda59033b7caa01c241',
|
|
6
6
|
'yt.solver.core.js': '0cd96b2d3f319dfa62cae689efa7d930ef1706e95f5921794db5089b2262957ec0a17d73938d8975ea35d0309cbfb4c8e4418d5e219837215eee242890c8b64d',
|
yt_dlp/networking/_curlcffi.py
CHANGED
|
@@ -96,7 +96,10 @@ class CurlCFFIResponseAdapter(Response):
|
|
|
96
96
|
|
|
97
97
|
def read(self, amt=None):
|
|
98
98
|
try:
|
|
99
|
-
|
|
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'))
|
yt_dlp/networking/_requests.py
CHANGED
|
@@ -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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
yt_dlp/networking/_urllib.py
CHANGED
|
@@ -306,7 +306,25 @@ class UrllibResponseAdapter(Response):
|
|
|
306
306
|
|
|
307
307
|
def read(self, amt=None):
|
|
308
308
|
try:
|
|
309
|
-
|
|
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
|
yt_dlp/networking/common.py
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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.
|
|
3
|
+
__version__ = '2025.11.08.232845'
|
|
4
4
|
|
|
5
|
-
RELEASE_GIT_HEAD = '
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
1092
|
-
yt_dlp/networking/_urllib.py,sha256=
|
|
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=
|
|
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.
|
|
1119
|
-
yt_dlp-2025.11.
|
|
1120
|
-
yt_dlp-2025.11.
|
|
1121
|
-
yt_dlp-2025.11.
|
|
1122
|
-
yt_dlp-2025.11.
|
|
1123
|
-
yt_dlp-2025.11.
|
|
1124
|
-
yt_dlp-2025.11.
|
|
1125
|
-
yt_dlp-2025.11.
|
|
1126
|
-
yt_dlp-2025.11.
|
|
1127
|
-
yt_dlp-2025.11.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{yt_dlp-2025.11.5.232946.dev0.data → yt_dlp-2025.11.8.232845.dev0.data}/data/share/man/man1/yt-dlp.1
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{yt_dlp-2025.11.5.232946.dev0.dist-info → yt_dlp-2025.11.8.232845.dev0.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|