yt-dlp 2026.1.4.233103.dev0__py3-none-any.whl → 2026.1.6.233142.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.
@@ -15575,7 +15575,7 @@ class ZDFChannelIE(ZDFBaseIE):
15575
15575
  class ZDFIE(ZDFBaseIE):
15576
15576
  _module = 'yt_dlp.extractor.zdf'
15577
15577
  IE_NAME = 'zdf'
15578
- _VALID_URL = ['https?://(?:www\\.)?zdf\\.de/(?:video|play)/(?:[^/?#]+/)*(?P<id>[^/?#]+)', 'https?://(?:www\\.)?zdf\\.de/(?:[^/?#]+/)*(?P<id>[^/?#]+)\\.html']
15578
+ _VALID_URL = ['https?://(?:www\\.)?zdf\\.de/(?:video|play)/(?:[^/?#]+/)*(?P<id>[^/?#]+)', 'https?://(?:www\\.)?zdf\\.de/(?:[^/?#]+/)*(?P<id>[^/?#]+)\\.html', 'https?://(?:www\\.)?(?:zdfheute|logo)\\.de/(?:[^/?#]+/)*(?P<id>[^/?#]+)\\.html']
15579
15579
  _RETURN_TYPE = 'video'
15580
15580
 
15581
15581
 
@@ -2,6 +2,7 @@ import base64
2
2
  import binascii
3
3
  import functools
4
4
  import re
5
+ import urllib.parse
5
6
 
6
7
  from .common import InfoExtractor
7
8
  from ..dependencies import Cryptodome
@@ -36,7 +37,7 @@ class TarangPlusVideoIE(TarangPlusBaseIE):
36
37
  'ext': 'mp4',
37
38
  'title': 'Khitpit Ep-10',
38
39
  'description': 'md5:a45b805cb628e15c853d78b0406eab48',
39
- 'thumbnail': r're:https?://.*\.jpg',
40
+ 'thumbnail': r're:https?://.+/.+\.jpg',
40
41
  'duration': 756.0,
41
42
  'timestamp': 1740355200,
42
43
  'upload_date': '20250224',
@@ -52,13 +53,30 @@ class TarangPlusVideoIE(TarangPlusBaseIE):
52
53
  'ext': 'mp4',
53
54
  'title': 'Bada Bohu | Ep -233',
54
55
  'description': 'md5:e6b8e7edc9e60b92c1b390f8789ecd69',
55
- 'thumbnail': r're:https?://.*\.jpg',
56
+ 'thumbnail': r're:https?://.+/.+\.jpg',
56
57
  'duration': 1392.0,
57
58
  'timestamp': 1745539200,
58
59
  'upload_date': '20250425',
59
60
  'media_type': 'episode',
60
61
  'categories': ['Prime'],
61
62
  },
63
+ }, {
64
+ # Decrypted m3u8 URL has trailing control characters that need to be stripped
65
+ 'url': 'https://tarangplus.in/tarangaplus-originals/ichha/ichha-teaser-1',
66
+ 'md5': '16ee43fe21ad8b6e652ec65eba38a64e',
67
+ 'info_dict': {
68
+ 'id': '5f0f252d3326af0720000342',
69
+ 'ext': 'mp4',
70
+ 'display_id': 'ichha-teaser-1',
71
+ 'title': 'Ichha Teaser',
72
+ 'description': 'md5:c724b0b0669a2cefdada3711cec792e6',
73
+ 'media_type': 'episode',
74
+ 'duration': 21.0,
75
+ 'thumbnail': r're:https?://.+/.+\.jpg',
76
+ 'categories': ['Originals'],
77
+ 'timestamp': 1758153600,
78
+ 'upload_date': '20250918',
79
+ },
62
80
  }, {
63
81
  'url': 'https://tarangplus.in/short/ai-maa/ai-maa',
64
82
  'only_matching': True,
@@ -100,7 +118,8 @@ class TarangPlusVideoIE(TarangPlusBaseIE):
100
118
  m.group('k'): m.group('v')
101
119
  for m in re.finditer(r'(?:^|\|)(?P<k>[a-z_]+)=(?P<v>(?:(?!\|[a-z_]+=).)+)', attrs)
102
120
  }
103
- m3u8_url = self.decrypt(encrypted_data, metadata['key'])
121
+ m3u8_url = urllib.parse.unquote(
122
+ self.decrypt(encrypted_data, metadata['key'])).rstrip('\x0e\x0f')
104
123
 
105
124
  return {
106
125
  'id': display_id, # Fallback
yt_dlp/extractor/zdf.py CHANGED
@@ -127,6 +127,7 @@ class ZDFBaseIE(InfoExtractor):
127
127
  **parse_codecs(quality.get('mimeCodec')),
128
128
  'height': height,
129
129
  'width': width,
130
+ 'filesize': int_or_none(variant.get('filesize')),
130
131
  'format_id': join_nonempty('http', stream.get('type')),
131
132
  'tbr': int_or_none(self._search_regex(r'_(\d+)k_', format_url, 'tbr', default=None)),
132
133
  }]
@@ -193,8 +194,10 @@ class ZDFBaseIE(InfoExtractor):
193
194
  class ZDFIE(ZDFBaseIE):
194
195
  _VALID_URL = [
195
196
  r'https?://(?:www\.)?zdf\.de/(?:video|play)/(?:[^/?#]+/)*(?P<id>[^/?#]+)',
196
- # /nachrichten/ sub-site URLs and legacy redirects from before the redesign in 2025-03
197
+ # Legacy redirects from before the redesign in 2025-03 or from before sister sites moved to their own domains
197
198
  r'https?://(?:www\.)?zdf\.de/(?:[^/?#]+/)*(?P<id>[^/?#]+)\.html',
199
+ # Sister sites
200
+ r'https?://(?:www\.)?(?:zdfheute|logo)\.de/(?:[^/?#]+/)*(?P<id>[^/?#]+)\.html',
198
201
  ]
199
202
  IE_NAME = 'zdf'
200
203
  _TESTS = [{
@@ -206,7 +209,7 @@ class ZDFIE(ZDFBaseIE):
206
209
  'title': 'Sylt - Deutschlands edles Nordlicht',
207
210
  'description': 'md5:35407b810c2e1e33efbe15ef6e4c06c3',
208
211
  'duration': 810.0,
209
- 'thumbnail': 'https://www.zdf.de/assets/sylt-118~original?cb=1613992485011',
212
+ 'thumbnail': r're:https://www\.zdf\.de/assets/sylt-118~original\?cb=\d+',
210
213
  'series': 'Sylt - Deutschlands edles Nordlicht',
211
214
  'series_id': 'sylt---deutschlands-edles-nordlicht-movie-100',
212
215
  'timestamp': 1612462500,
@@ -222,7 +225,7 @@ class ZDFIE(ZDFBaseIE):
222
225
  'title': 'Sylt - Deutschlands edles Nordlicht',
223
226
  'description': 'md5:35407b810c2e1e33efbe15ef6e4c06c3',
224
227
  'duration': 810.0,
225
- 'thumbnail': 'https://www.zdf.de/assets/sylt-118~original?cb=1613992485011',
228
+ 'thumbnail': r're:https://www\.zdf\.de/assets/sylt-118~original\?cb=\d+',
226
229
  'series': 'Sylt - Deutschlands edles Nordlicht',
227
230
  'series_id': 'sylt---deutschlands-edles-nordlicht-movie-100',
228
231
  'timestamp': 1612462500,
@@ -239,7 +242,7 @@ class ZDFIE(ZDFBaseIE):
239
242
  'title': 'Sylt - Deutschlands edles Nordlicht',
240
243
  'description': 'md5:35407b810c2e1e33efbe15ef6e4c06c3',
241
244
  'duration': 810.0,
242
- 'thumbnail': 'https://www.zdf.de/assets/sylt-118~original?cb=1613992485011',
245
+ 'thumbnail': r're:https://www\.zdf\.de/assets/sylt-118~original\?cb=\d+',
243
246
  'series': 'Sylt - Deutschlands edles Nordlicht',
244
247
  'series_id': 'sylt---deutschlands-edles-nordlicht-movie-100',
245
248
  'timestamp': 1612462500,
@@ -249,67 +252,66 @@ class ZDFIE(ZDFBaseIE):
249
252
  'params': {'skip_download': True},
250
253
  }, {
251
254
  # Video belongs to a playlist, video URL
252
- 'url': 'https://www.zdf.de/video/dokus/die-magie-der-farben-116/die-magie-der-farben-von-koenigspurpur-und-jeansblau-100',
253
- 'md5': '1eda17eb40a9ead3046326e10b9c5973',
255
+ # Also: video mirrored from ARD Mediathek
256
+ 'url': 'https://www.zdf.de/video/dokus/collection-index-page-ard-collection-ard-dxjuomfyzdpzag93ojy2mzhhmmq3mzk2ztq4nda-132/page-video-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102',
257
+ 'md5': '84980c1a0148da6cd94de58333d7e1ee',
254
258
  'info_dict': {
255
- 'id': 'die-magie-der-farben-von-koenigspurpur-und-jeansblau-100',
259
+ 'id': 'page-video-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102',
256
260
  'ext': 'mp4',
257
- 'title': 'Von Königspurpur bis Jeansblau',
258
- 'description': 'md5:a89da10c928c6235401066b60a6d5c1a',
259
- 'duration': 2615.0,
260
- 'thumbnail': 'https://www.zdf.de/assets/koenigspurpur-bis-jeansblau-100~original?cb=1741857765971',
261
+ 'title': 'Gelb: Vom hellen Glanz zu finsteren Abgründen',
262
+ 'description': 'md5:9aad4806b4c8ea152ab21e70c9d516be',
263
+ 'duration': 895.0,
264
+ 'thumbnail': r're:https://www\.zdf\.de/assets/image-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102~original\?cb=\d+',
261
265
  'series': 'Die Magie der Farben',
262
- 'series_id': 'die-magie-der-farben-116',
263
- 'season': 'Season 1',
264
- 'season_number': 1,
265
- 'episode': 'Episode 2',
266
- 'episode_number': 2,
267
- 'timestamp': 1445797800,
268
- 'upload_date': '20151025',
269
- '_old_archive_ids': ['zdf 151025_magie_farben2_tex'],
266
+ 'series_id': 'collection-index-page-ard-collection-ard-dxjuomfyzdpzag93ojy2mzhhmmq3mzk2ztq4nda-132',
267
+ 'season': 'Season 2023',
268
+ 'season_number': 2023,
269
+ 'episode': 'Episode 5',
270
+ 'episode_number': 5,
271
+ 'timestamp': 1690902120,
272
+ 'upload_date': '20230801',
273
+ '_old_archive_ids': ['zdf video_ard_dXJuOmFyZDpwdWJsaWNhdGlvbjo0YTYyOTJjM2Q0ZThlNmY1'],
270
274
  },
271
275
  }, {
272
276
  # Video belongs to a playlist, play URL
273
- 'url': 'https://www.zdf.de/play/dokus/die-magie-der-farben-116/die-magie-der-farben-von-koenigspurpur-und-jeansblau-100',
274
- 'md5': '1eda17eb40a9ead3046326e10b9c5973',
277
+ 'url': 'https://www.zdf.de/play/dokus/collection-index-page-ard-collection-ard-dxjuomfyzdpzag93ojy2mzhhmmq3mzk2ztq4nda-132/page-video-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102',
275
278
  'info_dict': {
276
- 'id': 'die-magie-der-farben-von-koenigspurpur-und-jeansblau-100',
279
+ 'id': 'page-video-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102',
277
280
  'ext': 'mp4',
278
- 'title': 'Von Königspurpur bis Jeansblau',
279
- 'description': 'md5:a89da10c928c6235401066b60a6d5c1a',
280
- 'duration': 2615.0,
281
- 'thumbnail': 'https://www.zdf.de/assets/koenigspurpur-bis-jeansblau-100~original?cb=1741857765971',
281
+ 'title': 'Gelb: Vom hellen Glanz zu finsteren Abgründen',
282
+ 'description': 'md5:9aad4806b4c8ea152ab21e70c9d516be',
283
+ 'duration': 895.0,
284
+ 'thumbnail': r're:https://www\.zdf\.de/assets/image-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102~original\?cb=\d+',
282
285
  'series': 'Die Magie der Farben',
283
- 'series_id': 'die-magie-der-farben-116',
284
- 'season': 'Season 1',
285
- 'season_number': 1,
286
- 'episode': 'Episode 2',
287
- 'episode_number': 2,
288
- 'timestamp': 1445797800,
289
- 'upload_date': '20151025',
290
- '_old_archive_ids': ['zdf 151025_magie_farben2_tex'],
286
+ 'series_id': 'collection-index-page-ard-collection-ard-dxjuomfyzdpzag93ojy2mzhhmmq3mzk2ztq4nda-132',
287
+ 'season': 'Season 2023',
288
+ 'season_number': 2023,
289
+ 'episode': 'Episode 5',
290
+ 'episode_number': 5,
291
+ 'timestamp': 1690902120,
292
+ 'upload_date': '20230801',
293
+ '_old_archive_ids': ['zdf video_ard_dXJuOmFyZDpwdWJsaWNhdGlvbjo0YTYyOTJjM2Q0ZThlNmY1'],
291
294
  },
292
295
  'params': {'skip_download': True},
293
296
  }, {
294
297
  # Video belongs to a playlist, legacy URL before website redesign in 2025-03
295
- 'url': 'https://www.zdf.de/dokumentation/terra-x/die-magie-der-farben-von-koenigspurpur-und-jeansblau-100.html',
296
- 'md5': '1eda17eb40a9ead3046326e10b9c5973',
298
+ 'url': 'https://www.zdf.de/dokus/collection-index-page-ard-collection-ard-dxjuomfyzdpzag93ojy2mzhhmmq3mzk2ztq4nda-132/page-video-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102.html',
297
299
  'info_dict': {
298
- 'id': 'die-magie-der-farben-von-koenigspurpur-und-jeansblau-100',
300
+ 'id': 'page-video-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102',
299
301
  'ext': 'mp4',
300
- 'title': 'Von Königspurpur bis Jeansblau',
301
- 'description': 'md5:a89da10c928c6235401066b60a6d5c1a',
302
- 'duration': 2615.0,
303
- 'thumbnail': 'https://www.zdf.de/assets/koenigspurpur-bis-jeansblau-100~original?cb=1741857765971',
302
+ 'title': 'Gelb: Vom hellen Glanz zu finsteren Abgründen',
303
+ 'description': 'md5:9aad4806b4c8ea152ab21e70c9d516be',
304
+ 'duration': 895.0,
305
+ 'thumbnail': r're:https://www\.zdf\.de/assets/image-ard-gelb-vom-hellen-glanz-zu-finsteren-abgruenden-102~original\?cb=\d+',
304
306
  'series': 'Die Magie der Farben',
305
- 'series_id': 'die-magie-der-farben-116',
306
- 'season': 'Season 1',
307
- 'season_number': 1,
308
- 'episode': 'Episode 2',
309
- 'episode_number': 2,
310
- 'timestamp': 1445797800,
311
- 'upload_date': '20151025',
312
- '_old_archive_ids': ['zdf 151025_magie_farben2_tex'],
307
+ 'series_id': 'collection-index-page-ard-collection-ard-dxjuomfyzdpzag93ojy2mzhhmmq3mzk2ztq4nda-132',
308
+ 'season': 'Season 2023',
309
+ 'season_number': 2023,
310
+ 'episode': 'Episode 5',
311
+ 'episode_number': 5,
312
+ 'timestamp': 1690902120,
313
+ 'upload_date': '20230801',
314
+ '_old_archive_ids': ['zdf video_ard_dXJuOmFyZDpwdWJsaWNhdGlvbjo0YTYyOTJjM2Q0ZThlNmY1'],
313
315
  },
314
316
  'params': {'skip_download': True},
315
317
  }, {
@@ -336,24 +338,9 @@ class ZDFIE(ZDFBaseIE):
336
338
  # Videos with sign language variants must not have a 'dgs' suffix on their old archive IDs.
337
339
  '_old_archive_ids': ['zdf 211219_sendung_hjo'],
338
340
  },
339
- }, {
340
- # Video that requires fallback extraction
341
- 'url': 'https://www.zdf.de/nachrichten/politik/deutschland/koalitionsverhandlungen-spd-cdu-csu-dobrindt-100.html',
342
- 'md5': 'c3a78514dd993a5781aa3afe50db51e2',
343
- 'info_dict': {
344
- 'id': 'koalitionsverhandlungen-spd-cdu-csu-dobrindt-100',
345
- 'ext': 'mp4',
346
- 'title': 'Dobrindt schließt Steuererhöhungen aus',
347
- 'description': 'md5:9a117646d7b8df6bc902eb543a9c9023',
348
- 'duration': 325,
349
- 'thumbnail': 'https://www.zdfheute.de/assets/dobrindt-csu-berlin-direkt-100~1920x1080?cb=1743357653736',
350
- 'timestamp': 1743374520,
351
- 'upload_date': '20250330',
352
- '_old_archive_ids': ['zdf 250330_clip_2_bdi'],
353
- },
354
341
  }, {
355
342
  # FUNK video (hosted on a different CDN, has atypical PTMD and HLS files)
356
- 'url': 'https://www.zdf.de/funk/druck-11790/funk-alles-ist-verzaubert-102.html',
343
+ 'url': 'https://www.zdf.de/video/serien/funk-collection-funk-11790-1596/funk-alles-ist-verzaubert-102',
357
344
  'md5': '57af4423db0455a3975d2dc4578536bc',
358
345
  'info_dict': {
359
346
  'id': 'funk-alles-ist-verzaubert-102',
@@ -361,56 +348,93 @@ class ZDFIE(ZDFBaseIE):
361
348
  'title': 'Alles ist verzaubert',
362
349
  'description': 'Die Neue an der Schule verdreht Ismail den Kopf.',
363
350
  'duration': 1278.0,
364
- 'thumbnail': 'https://www.zdf.de/assets/teaser-funk-alles-ist-verzaubert-102~original?cb=1663848412907',
351
+ 'thumbnail': r're:https://www\.zdf\.de/assets/teaser-funk-alles-ist-verzaubert-102~original\?cb=\d+',
365
352
  'series': 'DRUCK',
366
- 'series_id': 'funk-collection-funk-11790-1590',
367
- 'season': 'Season 7',
368
- 'season_number': 7,
369
- 'episode': 'Episode 1',
370
- 'episode_number': 1,
353
+ 'series_id': 'funk-collection-funk-11790-1596',
354
+ 'season': 'Season 2021',
355
+ 'season_number': 2021,
356
+ 'episode': 'Episode 50',
357
+ 'episode_number': 50,
371
358
  'timestamp': 1635520560,
372
359
  'upload_date': '20211029',
373
360
  '_old_archive_ids': ['zdf video_funk_1770473'],
374
361
  },
375
362
  }, {
376
- 'url': 'https://www.zdf.de/serien/soko-stuttgart/das-geld-anderer-leute-100.html',
363
+ # zdfheute video, also available on zdf.de
364
+ 'url': 'https://www.zdfheute.de/video/heute-journal/heute-journal-vom-19-dezember-2025-100.html',
365
+ 'md5': '47af8c2cfa30abf74501170f62754c63',
377
366
  'info_dict': {
378
- 'id': 'das-geld-anderer-leute-100',
367
+ 'id': 'heute-journal-vom-19-dezember-2025-100',
379
368
  'ext': 'mp4',
380
- 'title': 'Das Geld anderer Leute',
381
- 'description': 'md5:cb6f660850dc5eb7d1ab776ea094959d',
382
- 'duration': 2581.0,
383
- 'thumbnail': 'https://epg-image.zdf.de/fotobase-webdelivery/images/e2d7e55a-09f0-424e-ac73-6cac4dd65f35?layout=1920x1080',
384
- 'series': 'SOKO Stuttgart',
385
- 'series_id': 'soko-stuttgart-104',
386
- 'season': 'Season 11',
387
- 'season_number': 11,
388
- 'episode': 'Episode 10',
389
- 'episode_number': 10,
390
- 'timestamp': 1728983700,
391
- 'upload_date': '20241015',
392
- '_old_archive_ids': ['zdf 191205_1800_sendung_sok8'],
369
+ 'title': 'heute journal vom 19. Dezember 2025',
370
+ 'description': 'md5:fd0dfbce0783486db839ff9140a8074b',
371
+ 'duration': 1780.0,
372
+ 'thumbnail': 'https://epg-image.zdf.de/fotobase-webdelivery/images/273e5545-16e7-4ca3-898e-52fe9e06d964?layout=2400x1350',
373
+ 'chapters': 'count:10',
374
+ 'series': 'heute journal',
375
+ 'series_id': 'heute-journal-104',
376
+ 'season': 'Season 2025',
377
+ 'season_number': 2025,
378
+ 'episode': 'Episode 365',
379
+ 'episode_number': 365,
380
+ 'timestamp': 1766178000,
381
+ 'upload_date': '20251219',
382
+ '_old_archive_ids': ['zdf 251219_2200_sendung_hjo'],
393
383
  },
394
384
  }, {
395
- 'url': 'https://www.zdf.de/serien/northern-lights/begegnung-auf-der-bruecke-100.html',
385
+ # zdfheute video, not available on zdf.de (uses the fallback extraction path)
386
+ 'url': 'https://www.zdf.de/nachrichten/politik/deutschland/koalitionsverhandlungen-spd-cdu-csu-dobrindt-100.html',
387
+ 'md5': 'c3a78514dd993a5781aa3afe50db51e2',
396
388
  'info_dict': {
397
- 'id': 'begegnung-auf-der-bruecke-100',
398
- 'ext': 'webm',
399
- 'title': 'Begegnung auf der Brücke',
400
- 'description': 'md5:e53a555da87447f7f1207f10353f8e45',
401
- 'duration': 3083.0,
402
- 'thumbnail': 'https://epg-image.zdf.de/fotobase-webdelivery/images/c5ff1d1f-f5c8-4468-86ac-1b2f1dbecc76?layout=1920x1080',
403
- 'series': 'Northern Lights',
404
- 'series_id': 'northern-lights-100',
405
- 'season': 'Season 1',
406
- 'season_number': 1,
407
- 'episode': 'Episode 1',
408
- 'episode_number': 1,
409
- 'timestamp': 1738546500,
410
- 'upload_date': '20250203',
411
- '_old_archive_ids': ['zdf 240319_2310_sendung_not'],
389
+ 'id': 'koalitionsverhandlungen-spd-cdu-csu-dobrindt-100',
390
+ 'ext': 'mp4',
391
+ 'title': 'Dobrindt schließt Steuererhöhungen aus',
392
+ 'description': 'md5:9a117646d7b8df6bc902eb543a9c9023',
393
+ 'duration': 325,
394
+ 'thumbnail': r're:https://www\.zdfheute\.de/assets/dobrindt-csu-berlin-direkt-100~1920x1080\?cb=\d+',
395
+ 'timestamp': 1743374520,
396
+ 'upload_date': '20250330',
397
+ '_old_archive_ids': ['zdf 250330_clip_2_bdi'],
398
+ },
399
+ }, {
400
+ # logo! video, also available on zdf.de
401
+ 'url': 'https://www.logo.de/logo-vom-freitag-19-dezember-2025-102.html',
402
+ 'md5': 'cfb1a0988b1249f052a437a55851134b',
403
+ 'info_dict': {
404
+ 'id': 'logo-vom-freitag-19-dezember-2025-102',
405
+ 'ext': 'mp4',
406
+ 'title': 'logo! vom Freitag, 19. Dezember 2025',
407
+ 'description': 'md5:971428cb563e924c153580f23870c613',
408
+ 'duration': 490.0,
409
+ 'thumbnail': r're:https://www\.zdf\.de/assets/iran-rote-erde-sendung-19-dezember-2025-100~original\?cb=\d+',
410
+ 'chapters': 'count:7',
411
+ 'series': 'logo!',
412
+ 'series_id': 'logo-154',
413
+ 'season': 'Season 2025',
414
+ 'season_number': 2025,
415
+ 'episode': 'Episode 382',
416
+ 'episode_number': 382,
417
+ 'timestamp': 1766168700,
418
+ 'upload_date': '20251219',
419
+ '_old_archive_ids': ['zdf 251219_1925_sendung_log'],
420
+ },
421
+ }, {
422
+ # logo! video, not available on zdf.de (uses the fallback extraction path)
423
+ 'url': 'https://www.logo.de/kinderreporter-vivaan-trifft-alina-grijseels-100.html',
424
+ 'md5': '094cea026babb67aa25fd0108400bc12',
425
+ 'info_dict': {
426
+ 'id': 'kinderreporter-vivaan-trifft-alina-grijseels-100',
427
+ 'ext': 'mp4',
428
+ 'title': 'Vivaan trifft Handballerin Alina Grijseels',
429
+ 'description': 'md5:9572e7f4340dda823ea4091a76624da6',
430
+ 'duration': 166.0,
431
+ 'thumbnail': r're:https://www\.zdf\.de/assets/vivaan-alina-grijseels-100~original\?cb=\d+',
432
+ 'series': 'logo!',
433
+ 'series_id': 'logo-154',
434
+ 'timestamp': 1766236320,
435
+ 'upload_date': '20251220',
436
+ '_old_archive_ids': ['zdf 251219_kr_alina_grijseels_neu_log'],
412
437
  },
413
- 'params': {'skip_download': 'geo-restricted http format'},
414
438
  }, {
415
439
  # Same as https://www.phoenix.de/sendungen/ereignisse/corona-nachgehakt/wohin-fuehrt-der-protest-in-der-pandemie-a-2050630.html
416
440
  'url': 'https://www.zdf.de/politik/phoenix-sendungen/wohin-fuehrt-der-protest-in-der-pandemie-100.html',
@@ -617,7 +641,7 @@ class ZDFChannelIE(ZDFBaseIE):
617
641
  'title': 'Sylt - Deutschlands edles Nordlicht',
618
642
  'description': 'md5:35407b810c2e1e33efbe15ef6e4c06c3',
619
643
  'duration': 810.0,
620
- 'thumbnail': 'https://www.zdf.de/assets/sylt-118~original?cb=1613992485011',
644
+ 'thumbnail': r're:https://www\.zdf\.de/assets/sylt-118~original\?cb=\d+',
621
645
  'series': 'Sylt - Deutschlands edles Nordlicht',
622
646
  'series_id': 'sylt---deutschlands-edles-nordlicht-movie-100',
623
647
  'timestamp': 1612462500,
@@ -634,38 +658,24 @@ class ZDFChannelIE(ZDFBaseIE):
634
658
  },
635
659
  'playlist_mincount': 2,
636
660
  }, {
637
- 'url': 'https://www.zdf.de/serien/taunuskrimi/',
638
- 'info_dict': {
639
- 'id': 'taunuskrimi-100',
640
- 'title': 'Taunuskrimi',
641
- 'description': 'md5:ee7204e9c625c3b611d1274f9d0e3070',
642
- },
643
- 'playlist_mincount': 8,
644
- }, {
645
- 'url': 'https://www.zdf.de/serien/taunuskrimi/?staffel=1',
646
- 'info_dict': {
647
- 'id': 'taunuskrimi-100-s1',
648
- 'title': 'Taunuskrimi - Season 1',
649
- 'description': 'md5:ee7204e9c625c3b611d1274f9d0e3070',
650
- },
651
- 'playlist_count': 7,
652
- }, {
661
+ # All seasons of playlist
653
662
  'url': 'https://www.zdf.de/magazine/heute-journal-104',
654
663
  'info_dict': {
655
664
  'id': 'heute-journal-104',
656
665
  'title': 'heute journal',
657
666
  'description': 'md5:6edad39189abf8431795d3d6d7f986b3',
658
667
  },
659
- 'playlist_mincount': 500,
668
+ 'playlist_mincount': 366,
660
669
  }, {
661
- 'url': 'https://www.zdf.de/magazine/heute-journal-104?staffel=2024',
670
+ # Only selected season
671
+ 'url': 'https://www.zdf.de/magazine/heute-journal-104?staffel=2025',
662
672
  'info_dict': {
663
- 'id': 'heute-journal-104-s2024',
664
- 'title': 'heute journal - Season 2024',
673
+ 'id': 'heute-journal-104-s2025',
674
+ 'title': 'heute journal - Season 2025',
665
675
  'description': 'md5:6edad39189abf8431795d3d6d7f986b3',
666
676
  },
667
- 'playlist_count': 242,
668
- 'skip': 'Video count changes daily, needs support for playlist_maxcount',
677
+ 'playlist_mincount': 1,
678
+ 'playlist_maxcount': 365,
669
679
  }]
670
680
 
671
681
  _PAGE_SIZE = 24
@@ -42,6 +42,9 @@ class MetadataParserPP(PostProcessor):
42
42
  to a regex like
43
43
  '(?P<title>.+)\ \-\ (?P<artist>.+)'
44
44
  """
45
+ if re.fullmatch(r'\w+', fmt):
46
+ # convert a single field name into regex pattern that matches the entire input
47
+ return rf'(?s)(?P<{fmt}>.+)'
45
48
  if not re.search(r'%\(\w+\)s', fmt):
46
49
  return fmt
47
50
  lastpos = 0
yt_dlp/version.py CHANGED
@@ -1,8 +1,8 @@
1
1
  # Autogenerated by devscripts/update-version.py
2
2
 
3
- __version__ = '2026.01.04.233103'
3
+ __version__ = '2026.01.06.233142'
4
4
 
5
- RELEASE_GIT_HEAD = 'ba499ab0dcf2486d97f739e155264b305e0abd26'
5
+ RELEASE_GIT_HEAD = '27afb31edc492cb079f9bce9773498d08e568ff3'
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 = '2026.01.04.233103dev'
15
+ _pkg_version = '2026.01.06.233142dev'
@@ -2255,6 +2255,9 @@ Modifying metadata examples
2255
2255
  # Regex example
2256
2256
  $ yt-dlp --parse-metadata "description:Artist - (?P<artist>.+)"
2257
2257
 
2258
+ # Copy the episode field to the title field (with FROM and TO as single fields)
2259
+ $ yt-dlp --parse-metadata "episode:title"
2260
+
2258
2261
  # Set title as "Series name S01E05"
2259
2262
  $ yt-dlp --parse-metadata "%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s"
2260
2263
 
@@ -2641,6 +2641,9 @@ $ yt-dlp --parse-metadata \[dq]title:%(artist)s - %(title)s\[dq]
2641
2641
  # Regex example
2642
2642
  $ yt-dlp --parse-metadata \[dq]description:Artist - (?P<artist>.+)\[dq]
2643
2643
 
2644
+ # Copy the episode field to the title field (with FROM and TO as single fields)
2645
+ $ yt-dlp --parse-metadata \[dq]episode:title\[dq]
2646
+
2644
2647
  # Set title as \[dq]Series name S01E05\[dq]
2645
2648
  $ yt-dlp --parse-metadata \[dq]%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s\[dq]
2646
2649
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yt-dlp
3
- Version: 2026.1.4.233103.dev0
3
+ Version: 2026.1.6.233142.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
@@ -1890,6 +1890,9 @@ $ yt-dlp --parse-metadata "title:%(artist)s - %(title)s"
1890
1890
  # Regex example
1891
1891
  $ yt-dlp --parse-metadata "description:Artist - (?P<artist>.+)"
1892
1892
 
1893
+ # Copy the episode field to the title field (with FROM and TO as single fields)
1894
+ $ yt-dlp --parse-metadata "episode:title"
1895
+
1893
1896
  # Set title as "Series name S01E05"
1894
1897
  $ yt-dlp --parse-metadata "%(series)s S%(season_number)02dE%(episode_number)02d:%(title)s"
1895
1898
 
@@ -11,7 +11,7 @@ yt_dlp/options.py,sha256=72Qipr6jhFUO4gUPTIJsqYeHujnZi1L1GYx1Vn5qtiM,100390
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=s-ydQPGqLcZAq4s_6J-c7dns4I-UajyNp0syiroN93c,360
14
+ yt_dlp/version.py,sha256=b7EpX4cx7rWI3karnSaLVDaId-F76_0JaqJ3ch2D8eA,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
@@ -461,7 +461,7 @@ yt_dlp/extractor/la7.py,sha256=GShDLu1N0rS1bY4uIiUkznThvn7gNiwtSgmh7Rs7t08,9435
461
461
  yt_dlp/extractor/laracasts.py,sha256=PzTqAbHXiUqog-mpp2qR_rpKa-sZel4mLyzWTPkbDuc,4587
462
462
  yt_dlp/extractor/lastfm.py,sha256=OpmE-Y-2rcav2r2xaDQzX_EJiltmbbe6fO9VzkLqNWQ,4748
463
463
  yt_dlp/extractor/laxarxames.py,sha256=-YyL-5y4t2L9ptTSLXhvK-SJwvXGqv5l1HfT129zF0c,2773
464
- yt_dlp/extractor/lazy_extractors.py,sha256=qZAmL5fp4joCE-i_78P3LTQlUsvQ4obvaNbINpsadcg,814309
464
+ yt_dlp/extractor/lazy_extractors.py,sha256=tpI7xsGh5KntEGrpzi5lyj80vR5l2CTS3FwArH8udGc,814391
465
465
  yt_dlp/extractor/lbry.py,sha256=gC9jRRo8wSXc1-6somhW13brAtmWGlJ5_Q0NMhZpKwk,18078
466
466
  yt_dlp/extractor/lci.py,sha256=_0XuoITIt_QFA-6eBNpDXZZfouwUWfcdHQlpAOuiLEs,2131
467
467
  yt_dlp/extractor/lcp.py,sha256=edMA8L-eJZLquDvHcSY4oFWI0C8yGgjqW1tmhhLMJ5U,2279
@@ -848,7 +848,7 @@ yt_dlp/extractor/syvdk.py,sha256=odhjQTYIDxWj2lS9Yr_MyFGfWmstxCeOSI7xUrYavs8,124
848
848
  yt_dlp/extractor/sztvhu.py,sha256=2De4mY-V2E4CZQx8HzxnknL0f4_RIi5CTKdcvr4LV78,1616
849
849
  yt_dlp/extractor/tagesschau.py,sha256=D6bXCOYeuXu6BW5hP8Yq5SzWVxMiGXcTennsszi7sZg,6189
850
850
  yt_dlp/extractor/taptap.py,sha256=cI9Y1dSb_glOJlI6S_ttcXHsjwAC7XOPrSnzxGxulz8,10513
851
- yt_dlp/extractor/tarangplus.py,sha256=r6MvrTa9FyD8Ti1_6IcP80KVL1IzDsT3ESpEWFRYZkk,8194
851
+ yt_dlp/extractor/tarangplus.py,sha256=66U7huxpnbHHqDs5fz3xiZ41aUeYWTqPkDTEw5gLJmA,8993
852
852
  yt_dlp/extractor/tass.py,sha256=a5-1HR_xouhR8MEhNxMtzns_bR2LeP-6o4vOohmxIm8,1944
853
853
  yt_dlp/extractor/tbs.py,sha256=QAjno1ds3lzjv8RTrCKGgWqxCsOrxfQ4I6WTlnMCWbc,7851
854
854
  yt_dlp/extractor/tbsjp.py,sha256=FSSpDtu7QkK8c4TwSz5rYVWBD_L4SKZjQRtN8zs4LZw,7536
@@ -1051,7 +1051,7 @@ yt_dlp/extractor/youporn.py,sha256=Ijr1IR9B2x9tgSAcir5VgILiegTjoObqgbg_4HShbFQ,2
1051
1051
  yt_dlp/extractor/zaiko.py,sha256=7m4J60ApM7bxDCCr1_D0vd9HKGnmcvT6WORwhF0bp78,6302
1052
1052
  yt_dlp/extractor/zapiks.py,sha256=tBXg5sY1FYWX1_zFIKT3vfSKbBt_0IFvrdMqTdSs5C4,4048
1053
1053
  yt_dlp/extractor/zattoo.py,sha256=appLwx81P87OOD2ucahw3eY4s75VzPcho6TrsUQ_mUw,29267
1054
- yt_dlp/extractor/zdf.py,sha256=Qf85N7Lgtnxvx_DnmaQMKqVYcBAmNfcn1dNrH-kOYfs,34851
1054
+ yt_dlp/extractor/zdf.py,sha256=_xg7M-o5ZQP4ov_neojOtqsq7YjlUtuxDyfNcCM2DIA,36250
1055
1055
  yt_dlp/extractor/zee5.py,sha256=5ulXZGYqHW0UoX7bVxHMzlZ1hrmgMCfAgRKv-3-bdmc,11983
1056
1056
  yt_dlp/extractor/zeenews.py,sha256=rxH5eNrCMBXkm0HM2ZG5zF5N8HPFUHFZ45J729EFjZw,3219
1057
1057
  yt_dlp/extractor/zenporn.py,sha256=WnkN_cSf5CgxLGgmTvFUeywNTTNJuLblBwkdZYi2eNc,4807
@@ -1109,7 +1109,7 @@ yt_dlp/postprocessor/common.py,sha256=TGv4iP7YWf__PmSSFWhrvshzZw3-yl8Urzoh0doSy-
1109
1109
  yt_dlp/postprocessor/embedthumbnail.py,sha256=WykLv12Jct9OX4SBPePT7HI8ykSMzaD4pyk8pGZYpMY,10530
1110
1110
  yt_dlp/postprocessor/exec.py,sha256=-Oz3sUph4mYQ-bbhT2nadLcHXS4LHiDDcaY83X6RJDs,1542
1111
1111
  yt_dlp/postprocessor/ffmpeg.py,sha256=engqaUIAndaeuXvH5XXs-SdyWw6d4vT1Djh4VrS8PqA,48251
1112
- yt_dlp/postprocessor/metadataparser.py,sha256=_tmPGbgQ95PBabSJBwqiuA00cpvq60AocKOYMKlmNKg,4381
1112
+ yt_dlp/postprocessor/metadataparser.py,sha256=Nhqf9tXmv0QEou4vptp7aOgM6FkKr9uGRXc5bl3HExg,4551
1113
1113
  yt_dlp/postprocessor/modify_chapters.py,sha256=ehN1D-SGqGtY1F9vaWeGOWuBULnfPLvQ1QHtO58O3lU,17827
1114
1114
  yt_dlp/postprocessor/movefilesafterdownload.py,sha256=yfO2Waylcqrab0HJKY-PPTCYuxweSTKdEuGUq0fp2sI,1838
1115
1115
  yt_dlp/postprocessor/sponsorblock.py,sha256=McDfxOTwAmtUnD9TxmRqm9Gyf6DRW4W6bBo5sqnCG6w,4289
@@ -1124,13 +1124,13 @@ yt_dlp/utils/progress.py,sha256=t9kVvJ0oWuEqRzo9fdFbIhHUBtO_8mg348QwZ1faqLo,3261
1124
1124
  yt_dlp/utils/traversal.py,sha256=64E3RcZ56iSX50RI_HbKdDNftkETMLBaEPX791_b7yQ,18265
1125
1125
  yt_dlp/utils/jslib/__init__.py,sha256=CbdJiRA7Eh5PnjF2V4lDTcg0J0XjBMaaq0H4pCfq9Tk,87
1126
1126
  yt_dlp/utils/jslib/devalue.py,sha256=7DCGK_zUN0ZeV5hwPT06zaRMUxX_hyUyFWqs79rxw24,5621
1127
- yt_dlp-2026.1.4.233103.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1128
- yt_dlp-2026.1.4.233103.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=tt0TDGwdMoOxnPTbcAwib0CshxC47M1o1twsNyDSVgI,165220
1129
- yt_dlp-2026.1.4.233103.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=v2WQvWvk4qKpp2-97z2ULb5Msj5dgzU6nMkS-FwSmbM,51488
1130
- yt_dlp-2026.1.4.233103.dev0.data/data/share/man/man1/yt-dlp.1,sha256=I76tezS4KEGpoILtX3Z-4uJuwa0G21_lbMMHtN5WHW0,159789
1131
- yt_dlp-2026.1.4.233103.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1132
- yt_dlp-2026.1.4.233103.dev0.dist-info/METADATA,sha256=DN6SVQWALRo4ndEgkD4Hx7nv0oyr0pJtRJBanyZFNV8,180593
1133
- yt_dlp-2026.1.4.233103.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1134
- yt_dlp-2026.1.4.233103.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1135
- yt_dlp-2026.1.4.233103.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1136
- yt_dlp-2026.1.4.233103.dev0.dist-info/RECORD,,
1127
+ yt_dlp-2026.1.6.233142.dev0.data/data/share/bash-completion/completions/yt-dlp,sha256=b0pb9GLseKD27CjnLE6LlhVxhfmQjmyqV6r_CRbd6ko,5989
1128
+ yt_dlp-2026.1.6.233142.dev0.data/data/share/doc/yt_dlp/README.txt,sha256=AkKlzo4SvuJnf_2b22c63Fd3sBXHCVVWvgC5UwT3oko,165351
1129
+ yt_dlp-2026.1.6.233142.dev0.data/data/share/fish/vendor_completions.d/yt-dlp.fish,sha256=v2WQvWvk4qKpp2-97z2ULb5Msj5dgzU6nMkS-FwSmbM,51488
1130
+ yt_dlp-2026.1.6.233142.dev0.data/data/share/man/man1/yt-dlp.1,sha256=gxajtKE1RbgCtRJ604aAZjRwwHOuELlT1eUbgolpHF4,159920
1131
+ yt_dlp-2026.1.6.233142.dev0.data/data/share/zsh/site-functions/_yt-dlp,sha256=pNhu8tT4ZKrksLRI2mXLqarzGGhnOlm_hkCBVhSxLzg,5985
1132
+ yt_dlp-2026.1.6.233142.dev0.dist-info/METADATA,sha256=dHMuvrExhpr19pqp89UfOyYDwJFdgHoPkOSmgOt5-M4,180716
1133
+ yt_dlp-2026.1.6.233142.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
1134
+ yt_dlp-2026.1.6.233142.dev0.dist-info/entry_points.txt,sha256=vWfetvzYgZIwDfMW6BjCe0Cy4pmTZEXRNzxAkfYlRJA,103
1135
+ yt_dlp-2026.1.6.233142.dev0.dist-info/licenses/LICENSE,sha256=fhLl30uuEsshWBuhV87SDhmGoFCN0Q0Oikq5pM-U6Fw,1211
1136
+ yt_dlp-2026.1.6.233142.dev0.dist-info/RECORD,,