Compare commits

..

No commits in common. "bc2124e4962429b8dd58917ab180b950b6a2c88e" and "96a79bbdae4c1b6fd693c7314e867b7b7cb471d2" have entirely different histories.

View File

@ -29,11 +29,11 @@ class ZDFBaseIE(InfoExtractor):
def _call_api(self, url, video_id, item, api_token=None, referrer=None):
headers = {}
if api_token:
headers['Api-Auth'] = f'Bearer {api_token}'
headers['Api-Auth'] = 'Bearer %s' % api_token
if referrer:
headers['Referer'] = referrer
return self._download_json(
url, video_id, f'Downloading JSON {item}', headers=headers)
url, video_id, 'Downloading JSON %s' % item, headers=headers)
@staticmethod
def _extract_subtitles(src):
@ -137,7 +137,6 @@ class ZDFBaseIE(InfoExtractor):
class ZDFIE(ZDFBaseIE):
_VALID_URL = r'https?://www\.zdf\.de/(?:[^/]+/)*(?P<id>[^/?#&]+)\.html'
_TESTS = [{
# Same as https://www.phoenix.de/sendungen/ereignisse/corona-nachgehakt/wohin-fuehrt-der-protest-in-der-pandemie-a-2050630.html
'url': 'https://www.zdf.de/politik/phoenix-sendungen/wohin-fuehrt-der-protest-in-der-pandemie-100.html',
@ -196,7 +195,7 @@ class ZDFIE(ZDFBaseIE):
'season': 'Staffel 1',
'series': 'Die Magie der Farben',
'season_number': 1,
'series_id': 'a39900dd-cdbd-4a6a-a413-44e8c6ae18bc',
'seriesId': 'a39900dd-cdbd-4a6a-a413-44e8c6ae18bc',
'season_id': '5a92e619-8a0f-4410-a3d5-19c76fbebb37',
'episode_number': 2,
},
@ -259,7 +258,7 @@ class ZDFIE(ZDFBaseIE):
'upload_date': '20241015',
'thumbnail': 'https://epg-image.zdf.de/fotobase-webdelivery/images/e2d7e55a-09f0-424e-ac73-6cac4dd65f35?layout=2400x1350',
'series': 'SOKO Stuttgart',
'series_id': 'f862ce9a-6dd1-4388-a698-22b36ac4c9e9',
'seriesId': 'f862ce9a-6dd1-4388-a698-22b36ac4c9e9',
'season': 'Staffel 11',
'season_number': 11,
'season_id': 'ae1b4990-6d87-4970-a571-caccf1ba2879',
@ -281,19 +280,18 @@ class ZDFIE(ZDFBaseIE):
'thumbnail': 'https://www.zdf.de/assets/unser-gruener-planet-making-of-1-tropen-100~3840x2160?cb=1653493335577',
'episode': 'Making-of Unser grüner Planet - Tropen',
},
'skip': 'No longer available: "Leider kein Video verfügbar"',
}, {
'url': 'https://www.zdf.de/serien/northern-lights/begegnung-auf-der-bruecke-100.html',
'info_dict': {
'id': '240319_2310_sendung_not',
'ext': 'mp4',
'title': 'Begegnung auf der Brücke',
'description': 'md5:e53a555da87447f7f1207f10353f8e45',
'description': 'Lloyd begegnet an einem verregneten Abend in Dublin einer jungen Frau, die völlig durchnässt auf der Grattan Bridge steht. Es ist der Beginn einer außergewöhnlichen Freundschaft.',
'thumbnail': 'https://epg-image.zdf.de/fotobase-webdelivery/images/c5ff1d1f-f5c8-4468-86ac-1b2f1dbecc76?layout=2400x1350',
'upload_date': '20240319',
'duration': 3083.0,
'timestamp': 1710886200,
'series_id': '1d7a1879-01ee-4468-8237-c6b4ecd633c7',
'seriesId': '1d7a1879-01ee-4468-8237-c6b4ecd633c7',
'series': 'Northern Lights',
'season': 'Staffel 1',
'season_number': 1,
@ -346,6 +344,7 @@ class ZDFIE(ZDFBaseIE):
'title': chap.get('anchorLabel'),
} for chap, next_chap in zip(chapter_marks, chapter_marks[1:])]
target_info = traverse_obj(content, ('programmeItem', 0, 'http://zdf.de/rels/target'))
return merge_dicts(info, {
'title': title,
'description': content.get('leadParagraph') or content.get('teasertext'),
@ -353,16 +352,14 @@ class ZDFIE(ZDFBaseIE):
'timestamp': unified_timestamp(content.get('editorialDate')),
'thumbnails': thumbnails,
'chapters': chapters or None,
'seriesId': traverse_obj(target_info, ('http://zdf.de/rels/cmdm/series', 'seriesUuid')),
'series': traverse_obj(target_info, ('http://zdf.de/rels/cmdm/series', 'seriesTitle')),
'season': traverse_obj(target_info, ('http://zdf.de/rels/cmdm/season', 'seasonTitle')),
'season_number': traverse_obj(target_info, ('http://zdf.de/rels/cmdm/season', 'seasonNumber')),
'season_id': traverse_obj(target_info, ('http://zdf.de/rels/cmdm/season', 'seasonUuid')),
'episode': title,
**traverse_obj(content, ('programmeItem', 0, 'http://zdf.de/rels/target', {
'series_id': ('http://zdf.de/rels/cmdm/series', 'seriesUuid'),
'series': ('http://zdf.de/rels/cmdm/series', 'seriesTitle'),
'season': ('http://zdf.de/rels/cmdm/season', 'seasonTitle'),
'season_number': ('http://zdf.de/rels/cmdm/season', 'seasonNumber'),
'season_id': ('http://zdf.de/rels/cmdm/season', 'seasonUuid'),
'episode_number': 'episodeNumber',
'episode_id': 'contentId',
})),
'episode_number': traverse_obj(target_info, 'episodeNumber'),
'episode_id': traverse_obj(target_info, 'contentId'),
})
def _extract_regular(self, url, player, video_id):
@ -378,7 +375,7 @@ class ZDFIE(ZDFBaseIE):
def _extract_mobile(self, video_id):
video = self._download_json(
f'https://zdf-cdn.live.cellular.de/mediathekV2/document/{video_id}',
'https://zdf-cdn.live.cellular.de/mediathekV2/document/%s' % video_id,
video_id)
formats = []
@ -473,7 +470,7 @@ class ZDFChannelIE(ZDFBaseIE):
webpage = self._download_webpage(url, channel_id)
matches = re.finditer(
fr'''<div\b[^>]*?\sdata-plusbar-id\s*=\s*(["'])(?P<p_id>[\w-]+)\1[^>]*?\sdata-plusbar-url=\1(?P<url>{ZDFIE._VALID_URL})\1''',
r'''<div\b[^>]*?\sdata-plusbar-id\s*=\s*(["'])(?P<p_id>[\w-]+)\1[^>]*?\sdata-plusbar-url=\1(?P<url>%s)\1''' % ZDFIE._VALID_URL,
webpage)
if self._downloader.params.get('noplaylist', False):
@ -484,11 +481,11 @@ class ZDFChannelIE(ZDFBaseIE):
if entry:
return entry
else:
self.to_screen(f'Downloading playlist {channel_id} - add --no-playlist to download just the main video')
self.to_screen('Downloading playlist %s - add --no-playlist to download just the main video' % (channel_id, ))
def check_video(m):
v_ref = self._search_regex(
fr'''(<a\b[^>]*?\shref\s*=[^>]+?\sdata-target-id\s*=\s*(["']){m.group("p_id")}\2[^>]*>)''',
r'''(<a\b[^>]*?\shref\s*=[^>]+?\sdata-target-id\s*=\s*(["'])%s\2[^>]*>)''' % (m.group('p_id'), ),
webpage, 'check id', default='')
v_ref = extract_attributes(v_ref)
return v_ref.get('data-target-video-type') != 'novideo'