yt-dlp 2025.12.9.233030.dev0__py3-none-any.whl → 2025.12.12.233036.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.
@@ -24,6 +24,7 @@ from ..utils import (
24
24
  url_or_none,
25
25
  urlencode_postdata,
26
26
  )
27
+ from ..utils.traversal import find_elements, traverse_obj
27
28
 
28
29
 
29
30
  class PornHubBaseIE(InfoExtractor):
@@ -137,23 +138,24 @@ class PornHubIE(PornHubBaseIE):
137
138
  _EMBED_REGEX = [r'<iframe[^>]+?src=["\'](?P<url>(?:https?:)?//(?:www\.)?pornhub(?:premium)?\.(?:com|net|org)/embed/[\da-z]+)']
138
139
  _TESTS = [{
139
140
  'url': 'http://www.pornhub.com/view_video.php?viewkey=648719015',
140
- 'md5': 'a6391306d050e4547f62b3f485dd9ba9',
141
+ 'md5': '4d4a4e9178b655776f86cf89ecaf0edf',
141
142
  'info_dict': {
142
143
  'id': '648719015',
143
144
  'ext': 'mp4',
144
145
  'title': 'Seductive Indian beauty strips down and fingers her pink pussy',
145
- 'uploader': 'Babes',
146
+ 'uploader': 'BABES-COM',
147
+ 'uploader_id': '/users/babes-com',
146
148
  'upload_date': '20130628',
147
149
  'timestamp': 1372447216,
148
150
  'duration': 361,
149
151
  'view_count': int,
150
152
  'like_count': int,
151
- 'dislike_count': int,
152
153
  'comment_count': int,
153
154
  'age_limit': 18,
154
155
  'tags': list,
155
156
  'categories': list,
156
157
  'cast': list,
158
+ 'thumbnail': r're:https?://.+',
157
159
  },
158
160
  }, {
159
161
  # non-ASCII title
@@ -480,13 +482,6 @@ class PornHubIE(PornHubBaseIE):
480
482
  comment_count = self._extract_count(
481
483
  r'All Comments\s*<span>\(([\d,.]+)\)', webpage, 'comment')
482
484
 
483
- def extract_list(meta_key):
484
- div = self._search_regex(
485
- rf'(?s)<div[^>]+\bclass=["\'].*?\b{meta_key}Wrapper[^>]*>(.+?)</div>',
486
- webpage, meta_key, default=None)
487
- if div:
488
- return [clean_html(x).strip() for x in re.findall(r'(?s)<a[^>]+\bhref=[^>]+>.+?</a>', div)]
489
-
490
485
  info = self._search_json_ld(webpage, video_id, default={})
491
486
  # description provided in JSON-LD is irrelevant
492
487
  info['description'] = None
@@ -505,9 +500,11 @@ class PornHubIE(PornHubBaseIE):
505
500
  'comment_count': comment_count,
506
501
  'formats': formats,
507
502
  'age_limit': 18,
508
- 'tags': extract_list('tags'),
509
- 'categories': extract_list('categories'),
510
- 'cast': extract_list('pornstars'),
503
+ **traverse_obj(webpage, {
504
+ 'tags': ({find_elements(attr='data-label', value='tag')}, ..., {clean_html}),
505
+ 'categories': ({find_elements(attr='data-label', value='category')}, ..., {clean_html}),
506
+ 'cast': ({find_elements(attr='data-label', value='pornstar')}, ..., {clean_html}),
507
+ }),
511
508
  'subtitles': subtitles,
512
509
  }, info)
513
510
 
@@ -6,20 +6,21 @@ from ..networking.exceptions import HTTPError
6
6
  from ..utils import (
7
7
  ExtractorError,
8
8
  clean_html,
9
+ extract_attributes,
9
10
  int_or_none,
10
11
  join_nonempty,
11
12
  str_or_none,
12
- traverse_obj,
13
13
  update_url,
14
14
  url_or_none,
15
15
  )
16
+ from ..utils.traversal import traverse_obj
16
17
 
17
18
 
18
19
  class TelecincoBaseIE(InfoExtractor):
19
20
  def _parse_content(self, content, url):
20
- video_id = content['dataMediaId']
21
+ video_id = content['dataMediaId'][1]
21
22
  config = self._download_json(
22
- content['dataConfig'], video_id, 'Downloading config JSON')
23
+ content['dataConfig'][1], video_id, 'Downloading config JSON')
23
24
  services = config['services']
24
25
  caronte = self._download_json(services['caronte'], video_id)
25
26
  if traverse_obj(caronte, ('dls', 0, 'drm', {bool})):
@@ -57,9 +58,9 @@ class TelecincoBaseIE(InfoExtractor):
57
58
  'id': video_id,
58
59
  'title': traverse_obj(config, ('info', 'title', {str})),
59
60
  'formats': formats,
60
- 'thumbnail': (traverse_obj(content, ('dataPoster', {url_or_none}))
61
+ 'thumbnail': (traverse_obj(content, ('dataPoster', 1, {url_or_none}))
61
62
  or traverse_obj(config, 'poster', 'imageUrl', expected_type=url_or_none)),
62
- 'duration': traverse_obj(content, ('dataDuration', {int_or_none})),
63
+ 'duration': traverse_obj(content, ('dataDuration', 1, {int_or_none})),
63
64
  'http_headers': headers,
64
65
  }
65
66
 
@@ -137,30 +138,45 @@ class TelecincoIE(TelecincoBaseIE):
137
138
  'url': 'http://www.cuatro.com/chesterinlove/a-carta/chester-chester_in_love-chester_edu_2_2331030022.html',
138
139
  'only_matching': True,
139
140
  }]
141
+ _ASTRO_ISLAND_RE = re.compile(r'<astro-island\b[^>]+>')
140
142
 
141
143
  def _real_extract(self, url):
142
144
  display_id = self._match_id(url)
143
145
  webpage = self._download_webpage(url, display_id, impersonate=True)
144
- article = self._search_json(
145
- r'window\.\$REACTBASE_STATE\.article(?:_multisite)?\s*=',
146
- webpage, 'article', display_id)['article']
147
- description = traverse_obj(article, ('leadParagraph', {clean_html}, filter))
148
146
 
149
- if article.get('editorialType') != 'VID':
147
+ props_list = traverse_obj(webpage, (
148
+ {self._ASTRO_ISLAND_RE.findall}, ...,
149
+ {extract_attributes}, 'props', {json.loads}))
150
+
151
+ description = traverse_obj(props_list, (..., 'leadParagraph', 1, {clean_html}, any, filter))
152
+ main_content = traverse_obj(props_list, (..., ('content', ('articleData', 1, 'opening')), 1, {dict}, any))
153
+
154
+ if traverse_obj(props_list, (..., 'editorialType', 1, {str}, any)) != 'VID': # e.g. 'ART'
150
155
  entries = []
151
156
 
152
- for p in traverse_obj(article, ((('opening', all), 'body'), lambda _, v: v['content'])):
153
- content = p['content']
154
- type_ = p.get('type')
155
- if type_ == 'paragraph' and isinstance(content, str):
157
+ for p in traverse_obj(props_list, (..., 'articleData', 1, ('opening', ('body', 1, ...)), 1, {dict})):
158
+ type_ = traverse_obj(p, ('type', 1, {str}))
159
+ content = traverse_obj(p, ('content', 1, {str} if type_ == 'paragraph' else {dict}))
160
+ if not content:
161
+ continue
162
+ if type_ == 'paragraph':
156
163
  description = join_nonempty(description, content, delim='')
157
- elif type_ == 'video' and isinstance(content, dict):
164
+ elif type_ == 'video':
158
165
  entries.append(self._parse_content(content, url))
166
+ else:
167
+ self.report_warning(
168
+ f'Skipping unsupported content type "{type_}"', display_id, only_once=True)
159
169
 
160
170
  return self.playlist_result(
161
- entries, str_or_none(article.get('id')),
162
- traverse_obj(article, ('title', {str})), clean_html(description))
171
+ entries,
172
+ traverse_obj(props_list, (..., 'id', 1, {int}, {str_or_none}, any)) or display_id,
173
+ traverse_obj(main_content, ('dataTitle', 1, {str})),
174
+ clean_html(description))
163
175
 
164
- info = self._parse_content(article['opening']['content'], url)
176
+ if not main_content:
177
+ raise ExtractorError('Unable to extract main content from webpage')
178
+
179
+ info = self._parse_content(main_content, url)
165
180
  info['description'] = description
181
+
166
182
  return info
yt_dlp/version.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # Autogenerated by devscripts/update-version.py
2
2
 
3
- __version__ = '2025.12.09.233030'
3
+ __version__ = '2025.12.12.233036'
4
4
 
5
- RELEASE_GIT_HEAD = '5f37f67d37b54bf9bd6fe7fa3083492d42f7a20a'
5
+ RELEASE_GIT_HEAD = 'b6f24745bfb89ec0eaaa181a68203c2e81e58802'
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.12.09.233030dev'
15
+ _pkg_version = '2025.12.12.233036dev'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yt-dlp
3
- Version: 2025.12.9.233030.dev0
3
+ Version: 2025.12.12.233036.dev0
4
4
  Summary: A feature-rich command-line audio/video downloader
5
5
  Project-URL: Documentation, https://github.com/yt-dlp/yt-dlp#readme
6
6
  Project-URL: Repository, https://github.com/yt-dlp/yt-dlp
@@ -11,7 +11,7 @@ yt_dlp/options.py,sha256=cEALlBE-OokSe0xGY5pHsLozTJpw-yR9pSVBCNp2SqI,100388
11
11
  yt_dlp/plugins.py,sha256=EGmR0ydaahNspGrgszTNX4-YjHe93WOOhcw1gf6PZSs,8215
12
12
  yt_dlp/socks.py,sha256=oAuAfWM6jxI8A5hHDLEKq2U2-k9NyMB_z6nrKzNE9fg,8936
13
13
  yt_dlp/update.py,sha256=sY7gNFBQorzs7sEjRrqL5QOsTBNmGGa_FnpTtbxY1vA,25280
14
- yt_dlp/version.py,sha256=H_Pdnw5dg6CLIV3yGzfXXD8C4Jd2utrmHA3jKSbeRcw,360
14
+ yt_dlp/version.py,sha256=YpXXmdnDZPr_-nFkSKPLv-mE36TxCX2fWPQseoi37eg,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
@@ -689,7 +689,7 @@ yt_dlp/extractor/popcorntimes.py,sha256=IiZFqRqTnWInu3uO0xTtYTvM9z9il1Pv3I4ZP7ik
689
689
  yt_dlp/extractor/popcorntv.py,sha256=KL_ld6fHQtrlO_sBy4U6pCkRVkBS5UKtmLCpuBwHJIk,2631
690
690
  yt_dlp/extractor/pornbox.py,sha256=ZXOOZNOPSpwV-G9u2P0gSY3uiTLGsvcNdpmd4oaf6o8,4447
691
691
  yt_dlp/extractor/pornflip.py,sha256=KHwqkqwFizVo1O_yb2aNwqU-uiAMTVLWKM7vlxbJgs4,3474
692
- yt_dlp/extractor/pornhub.py,sha256=wo7-FVw7ak7DdHNNmEXn45fENS4JScNYyZmWl-L_6SA,31392
692
+ yt_dlp/extractor/pornhub.py,sha256=w076D8MWcN_zupVLVXJYvKo8chOjoYyZxHah_7uOp6M,31381
693
693
  yt_dlp/extractor/pornotube.py,sha256=fkP_0h8qUsgzwti5n6-uAPuHOfdg_2bR4BBcx11_thQ,3098
694
694
  yt_dlp/extractor/pornovoisines.py,sha256=4YdPaap3C9KYqt3MyLooJF4G67gIniA2Xqn6ciIw3FA,3916
695
695
  yt_dlp/extractor/pornoxo.py,sha256=WLA5dp47hREQNTxD7wfOCzU_hbzHU9ZtyrXEQajpehg,1905
@@ -861,7 +861,7 @@ yt_dlp/extractor/tele13.py,sha256=qtTKlUExoVtfetaDbiT9g5Q7klGs0qXgUW4RgGUvPp4,32
861
861
  yt_dlp/extractor/tele5.py,sha256=ZhYDGTqS8TkiUV1-z3qOwxOX_atHEin_NwtezlZ9BCg,3012
862
862
  yt_dlp/extractor/telebruxelles.py,sha256=zio3F4tgcRYJFdC3nXDaiCF1VxySMOWf1XJTjgGwuyA,2816
863
863
  yt_dlp/extractor/telecaribe.py,sha256=eFZdDHXdg2coKqI6h4DBpbu681hRmwBa_HjltmANptY,3118
864
- yt_dlp/extractor/telecinco.py,sha256=lyAPbBsTE-r6fyMZ5ain_jQTDiAuzOoepjxFnl1k6Sk,7077
864
+ yt_dlp/extractor/telecinco.py,sha256=ZI59_ohTRmLb2qL_niNYDyb1sZSjbZXVetVydmhWXIk,7822
865
865
  yt_dlp/extractor/telegraaf.py,sha256=5zDBAos21WtRNOxB2VGcWbGBNmh21KZ_PHwyuDzd3fc,3001
866
866
  yt_dlp/extractor/telegram.py,sha256=-5SvQ4C2URbpa24VvdTQM9OcxRLRenmv3iISp4J12hg,5086
867
867
  yt_dlp/extractor/telemb.py,sha256=d8suz72OIpAiaulwMy1353ctIXfmOI6mSjba7d1rm4s,2894
@@ -1123,13 +1123,13 @@ yt_dlp/utils/progress.py,sha256=t9kVvJ0oWuEqRzo9fdFbIhHUBtO_8mg348QwZ1faqLo,3261
1123
1123
  yt_dlp/utils/traversal.py,sha256=64E3RcZ56iSX50RI_HbKdDNftkETMLBaEPX791_b7yQ,18265
1124
1124
  yt_dlp/utils/jslib/__init__.py,sha256=CbdJiRA7Eh5PnjF2V4lDTcg0J0XjBMaaq0H4pCfq9Tk,87
1125
1125
  yt_dlp/utils/jslib/devalue.py,sha256=7DCGK_zUN0ZeV5hwPT06zaRMUxX_hyUyFWqs79rxw24,5621
1126
- yt_dlp-2025.12.9.233030.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1127
- yt_dlp-2025.12.9.233030.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=wmrt5znP_AlvkrvysScvz2QYyjT2kZ1y2RRmx0Qvy_U,164886
1128
- yt_dlp-2025.12.9.233030.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=v2WQvWvk4qKpp2-97z2ULb5Msj5dgzU6nMkS-FwSmbM,51488
1129
- yt_dlp-2025.12.9.233030.dev0.data/data/share/man/man1/yt-dlp.1,sha256=9Ll8XNcxtpdL-FmhXtOrDy3OuGmOCatIKNDzmwxzqxo,159421
1130
- yt_dlp-2025.12.9.233030.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1131
- yt_dlp-2025.12.9.233030.dev0.dist-info/METADATA,sha256=M3ZQcFl7f8U5fEhKTldM3VV10qrYZLgAr45YR1hIIxk,180281
1132
- yt_dlp-2025.12.9.233030.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1133
- yt_dlp-2025.12.9.233030.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1134
- yt_dlp-2025.12.9.233030.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1135
- yt_dlp-2025.12.9.233030.dev0.dist-info/RECORD,,
1126
+ yt_dlp-2025.12.12.233036.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1127
+ yt_dlp-2025.12.12.233036.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=wmrt5znP_AlvkrvysScvz2QYyjT2kZ1y2RRmx0Qvy_U,164886
1128
+ yt_dlp-2025.12.12.233036.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=v2WQvWvk4qKpp2-97z2ULb5Msj5dgzU6nMkS-FwSmbM,51488
1129
+ yt_dlp-2025.12.12.233036.dev0.data/data/share/man/man1/yt-dlp.1,sha256=9Ll8XNcxtpdL-FmhXtOrDy3OuGmOCatIKNDzmwxzqxo,159421
1130
+ yt_dlp-2025.12.12.233036.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1131
+ yt_dlp-2025.12.12.233036.dev0.dist-info/METADATA,sha256=_sU604v_APZ75K6fHKTArtQc8cjX8IqwW8YgGC1cZVU,180282
1132
+ yt_dlp-2025.12.12.233036.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1133
+ yt_dlp-2025.12.12.233036.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1134
+ yt_dlp-2025.12.12.233036.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1135
+ yt_dlp-2025.12.12.233036.dev0.dist-info/RECORD,,