@ -14,6 +14,7 @@ from ..utils import (
parse_codecs ,
qualities ,
traverse_obj ,
try_call ,
try_get ,
unified_timestamp ,
update_url_query ,
@ -184,12 +185,20 @@ class ZDFIE(ZDFBaseIE):
' info_dict ' : {
' id ' : ' 151025_magie_farben2_tex ' ,
' ext ' : ' mp4 ' ,
' duration ' : 2615.0 ,
' title ' : ' Die Magie der Farben (2/2) ' ,
' description ' : ' md5:a89da10c928c6235401066b60a6d5c1a ' ,
' duration ' : 2615 ,
' timestamp ' : 1465021200 ,
' upload_date ' : ' 20160604 ' ,
' thumbnail ' : ' https://www.zdf.de/assets/mauve-im-labor-100~768x432?cb=1464909117806 ' ,
' upload_date ' : ' 20160604 ' ,
' episode ' : ' Die Magie der Farben (2/2) ' ,
' episode_id ' : ' POS_954f4170-36a5-4a41-a6cf-78f1f3b1f127 ' ,
' season ' : ' Staffel 1 ' ,
' series ' : ' Die Magie der Farben ' ,
' season_number ' : 1 ,
' seriesId ' : ' a39900dd-cdbd-4a6a-a413-44e8c6ae18bc ' ,
' season_id ' : ' 5a92e619-8a0f-4410-a3d5-19c76fbebb37 ' ,
' episode_number ' : 2 ,
} ,
} , {
' url ' : ' https://www.zdf.de/funk/druck-11790/funk-alles-ist-verzaubert-102.html ' ,
@ -197,12 +206,13 @@ class ZDFIE(ZDFBaseIE):
' info_dict ' : {
' ext ' : ' mp4 ' ,
' id ' : ' video_funk_1770473 ' ,
' duration ' : 1278 ,
' description ' : ' Die Neue an der Schule verdreht Ismail den Kopf. ' ,
' duration ' : 1278.0 ,
' title ' : ' Alles ist verzaubert ' ,
' description ' : ' Die Neue an der Schule verdreht Ismail den Kopf. ' ,
' timestamp ' : 1635520560 ,
' upload_date ' : ' 20211029 ' ,
' thumbnail ' : ' https://www.zdf.de/assets/teaser-funk-alles-ist-verzaubert-102~1920x1080?cb=1663848412907 ' ,
' upload_date ' : ' 20211029 ' ,
' episode ' : ' Alles ist verzaubert ' ,
} ,
} , {
# Same as https://www.phoenix.de/sendungen/dokumentationen/gesten-der-maechtigen-i-a-89468.html?ref=suche
@ -248,19 +258,48 @@ class ZDFIE(ZDFBaseIE):
' timestamp ' : 1675160100 ,
' upload_date ' : ' 20230131 ' ,
' thumbnail ' : ' https://epg-image.zdf.de/fotobase-webdelivery/images/e2d7e55a-09f0-424e-ac73-6cac4dd65f35?layout=2400x1350 ' ,
' series ' : ' SOKO Stuttgart ' ,
' seriesId ' : ' f862ce9a-6dd1-4388-a698-22b36ac4c9e9 ' ,
' season ' : ' Staffel 11 ' ,
' season_number ' : 11 ,
' season_id ' : ' ae1b4990-6d87-4970-a571-caccf1ba2879 ' ,
' episode ' : ' Das Geld anderer Leute ' ,
' episode_number ' : 10 ,
' episode_id ' : ' POS_7f367934-f2f0-45cb-9081-736781ff2d23 ' ,
} ,
} , {
' url ' : ' https://www.zdf.de/dokumentation/terra-x/unser-gruener-planet-wuesten-doku-100.html ' ,
' info_dict ' : {
' id ' : ' 220605_dk_gruener_planet_wuesten_tex ' ,
' id ' : ' 220 525_green_planet_makingof_1_trop en_tex' ,
' ext ' : ' mp4 ' ,
' title ' : ' Unser grüner Planet - Wüsten ' ,
' description ' : ' md5:4fc647b6f9c3796eea66f4a0baea2862 ' ,
' duration ' : 2613.0 ,
' timestamp ' : 1654450200 ,
' upload_date ' : ' 20220605 ' ,
' format_note ' : ' uhd, main ' ,
' thumbnail ' : ' https://www.zdf.de/assets/saguaro-kakteen-102~3840x2160?cb=1655910690796 ' ,
' title ' : ' Making-of Unser grüner Planet - Tropen ' ,
' description ' : ' md5:d7c6949dc7c75c73c4ad51c785fb0b79 ' ,
' duration ' : 435.0 ,
' timestamp ' : 1653811200 ,
' upload_date ' : ' 20220529 ' ,
' format_note ' : ' hd, main ' ,
' 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 ' ,
} ,
} , {
' 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 ' : ' 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 ,
' seriesId ' : ' 1d7a1879-01ee-4468-8237-c6b4ecd633c7 ' ,
' series ' : ' Northern Lights ' ,
' season ' : ' Staffel 1 ' ,
' season_number ' : 1 ,
' season_id ' : ' 22ac26a2-4ea2-4055-ac0b-98b755cdf718 ' ,
' episode ' : ' Begegnung auf der Brücke ' ,
' episode_number ' : 1 ,
' episode_id ' : ' POS_71049438-024b-471f-b472-4fe2e490d1fb ' ,
} ,
} ]
@ -306,19 +345,34 @@ 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 ' ) ,
' duration ' : int_or_none ( t . get ( ' duration ' ) ) ,
' timestamp ' : unified_timestamp ( content . get ( ' editorialDate ' ) ) ,
' 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_number ' : traverse_obj ( target_info , ' episodeNumber ' ) ,
' episode_id ' : traverse_obj ( target_info , ' contentId ' ) ,
} )
def _extract_regular ( self , url , player , video_id ) :
content = self . _call_api (
player [ ' content ' ] , video_id , ' content ' , player [ ' apiToken ' ] , url )
return self . _extract_entry ( player [ ' content ' ] , player , content , video_id )
player_content_v2 = player [ ' content ' ]
player_content_v3 = update_url_query ( player_content_v2 , { ' profile ' : ' player-3 ' } )
content = try_call (
lambda : self . _call_api ( player_content_v3 , video_id , ' content ' , player [ ' apiToken ' ] , url ) ,
lambda : self . _call_api ( player_content_v2 , video_id , ' content ' , player [ ' apiToken ' ] , url ) ,
)
return self . _extract_entry ( player_content_v2 , player , content , video_id )
def _extract_mobile ( self , video_id ) :
video = self . _download_json (