Compare commits

..

8 Commits

Author SHA1 Message Date
Stefan Lobbenmeier
bc2124e496 autopep8 2024-12-26 09:26:31 -03:00
Stefan Lobbenmeier
9f7bad8677 use md5 for description 2024-12-26 09:23:02 -03:00
Stefan Lobbenmeier
5bca3bb9a0 replace rf with fr 2024-12-26 09:21:21 -03:00
Stefan Lobbenmeier
be42b07646 skip video that is no longer available 2024-12-26 08:53:19 -03:00
pukkandan
ee8e09e0cb
cleanup 2024-12-26 17:20:10 +05:30
Stefan Lobbenmeier
6cda50c0aa use fancy traverse_obj syntax from PR review suggestion 2024-12-26 08:46:17 -03:00
Stefan Lobbenmeier
e8c84f4ee3 replace seriesId with series_id 2024-12-26 08:40:33 -03:00
Stefan Lobbenmeier
1420dfaaf9 revert formatting from % back to f string 2024-12-26 08:37:43 -03:00

View File

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