a
    h#                     @   s   d dl Z d dlZd dlZd dlZddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ G dd deZG d	d
 d
eZG dd deZdS )    N   )InfoExtractor   )ExtractorErrorISO639Utilsdetermine_extfilter_dictfloat_or_noneint_or_nonejoin_nonemptymake_archive_idparse_codecsparse_iso8601parse_qssmuggle_urlunified_timestampunsmuggle_urlurl_or_noneurljoinvariadic)requiretraverse_objc                   @   sp   e Zd ZdgZdZi Zdd ZdddZdd	 Zd
d Z	e
dd Zdd ZdddZdddZe
dd ZdS )	ZDFBaseIEZDE)zdfz	api-tokenc                 C   s   | j s"| j | jj| jdi i t| j dthfddtt k rv| j | 	dd dd | jj
g | j| j R   | j d  d	| j d
  S )Ndefaultexpiresr   r   z0https://zdf-prod-futura.zdf.de/mediathekV2/tokenzDownloading API tokenzFailed to download API tokentype token)_token_cacheupdatecacheload_TOKEN_CACHE_PARAMSr   r
   inttime_download_jsonstore)self r*   I/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/zdf.py_get_api_token"   s    "
zZDFBaseIE._get_api_tokenNc                 C   s(   | j ||d| d| td|idS )NDownloading Failed to download Api-Auth)headers)r'   r   )r)   urlvideo_iditem	api_tokenr*   r*   r+   	_call_api1   s    
zZDFBaseIE._call_apic                 C   sB   |rt |tsd S td|}|r>t|dt|d S d S )Nz(?P<width>\d+):(?P<height>\d+)widthheight)
isinstancestrrematchr%   group)r)   aspect_ratioZmobjr*   r*   r+   _parse_aspect_ratio6   s    zZDFBaseIE._parse_aspect_ratioc                 C   s(   t |dd dthfdthfdfp&d S )Nc                 S   s   |d S )NanchorOffsetr*   _vr*   r*   r+   <lambda>=       z-ZDFBaseIE._extract_chapters.<locals>.<lambda>r?   ZanchorLabel)
start_timetitle)r   r	   r9   )r)   datar*   r*   r+   _extract_chapters<   s    

zZDFBaseIE._extract_chaptersc                 C   sb   t  }i }| D ]N}t|d}|r||v r.q|| |dpDd}||g d|i q|S )Nurilanguagedeur1   )setr   getadd
setdefaultappend)src	seen_urls	subtitlescaptionZsubtitle_urllangr*   r*   r+   _extract_subtitlesB   s    
zZDFBaseIE._extract_subtitlesc                 C   s   t ||ddS )Nz
{playerId}Zandroid_native_6)r   replace)r)   Zapi_base_urltemplater*   r*   r+   _expand_ptmd_templateQ   s    zZDFBaseIE._expand_ptmd_templatec                 C   s  d }d }g g  }}t  }	t|D ]}
t|
i \}
}|ddk}| |
|d|}|dpl| jd|
dd d}|sz|sz|}|st|dd	d
tddhf}|t|ddthf7 }t|ddddthfD ]}t|ddthfD ]}t|dddd fD ]}|d }||	v rq|		| t
|}|dkrB| j||dddd}n|dv rt|d}|rr|rrt|| nd }d|it|d||td |d!t| jd"|d#d dd$g}n| jd%| d&|d' g }|d(}|D ]}t|d)p|d)pd* }|d+d,k}|i |t|d- |o6d.t| oD||oLd/|d0d1d2|rdd3nd4||r~|d0d5ks|s|d6krd7n6|d8kr|d9krd:n|d8krd;n|d9krd<nd4d= qqqqq |p|||| |d>S )?Nvod_media_typeZDGSz	PTMD databasenamez/vod/ptmd/[^/?#]+/(\w+)z
content IDr   
attributesdurationvaluei  )Zscalecaptions.ZpriorityListZformitaetenZ	qualitiesaudioZtracksc                 S   s   t |d S )NrI   r   r@   r*   r*   r+   rC   q   rD   z)ZDFBaseIE._extract_ptmd.<locals>.<lambda>rI   Zm3u8mp4ZhlsF)Zm3u8_idfatal)rb   webmZhighestVerticalResolutionr1   Z	mimeCodechttpr   z_(\d+)k_tbr)r7   r6   	format_idrf   z Skipping unsupported extension "")r2   classrJ    Zvcodecnonerg   ZdgszGerman Sign Languageformat_notez, delimZAudiodeskriptionadirK   main
      r   )rg   rl   
preferencerJ   Zlanguage_preference)idr]   formatsrS   )rL   r   r   rM   r5   _search_regexr   r	   dictrN   r   Z_extract_m3u8_formatsr
   roundr   r   Zreport_warningr   
short2longlowerrP   rV   )r)   	ptmd_urlsr2   r4   r=   Z
content_idr]   rw   Zsrc_captionsrR   ptmd_urlZsmuggled_dataZis_dgsZptmdr[   streamZqualityvariantZ
format_urlextZfmtsr7   r6   Zf_classfZf_langZis_audio_onlyr*   r*   r+   _extract_ptmdT   s    






	


zZDFBaseIE._extract_ptmdc                 C   s^   |s|sJ d| j d|d| d| ||r<t| nd t|  d|rPdnd ddS )	Nz One of query or body is requiredzhttps://api.zdf.de/graphqlr-   r.   Tzapplication/json)r/   zApollo-Require-PreflightzContent-Type)queryrG   r0   )r'   jsondumpsencoder   r,   )r)   Zitem_idZ	data_descr   bodyr*   r*   r+   _download_graphql   s    
zZDFBaseIE._download_graphqlc                 C   s    dd t | tjhdd fD S )Nc              	   S   sT   g | ]L\}}t |||d kr dnddttdt |dthfdthfdqS )originalr   r   )rv   r1   ru   z+(?P<width>\d+|auto)[Xx](?P<height>\d+|auto)r6   r7   )r6   r7   )r9   r   r:   searchr
   ).0rg   r1   r*   r*   r+   
<listcomp>   s   z1ZDFBaseIE._extract_thumbnails.<locals>.<listcomp>c                 S   s   t |d S )Nr   ra   r@   r*   r*   r+   rC      rD   z/ZDFBaseIE._extract_thumbnails.<locals>.<lambda>)r   ry   items)sourcer*   r*   r+   _extract_thumbnails   s    zZDFBaseIE._extract_thumbnails)N)NN)NN)__name__
__module____qualname__Z_GEO_COUNTRIESr$   r    r,   r5   r>   rH   staticmethodrV   rY   r   r   r   r*   r*   r*   r+   r      s   


S
r   c                       sf  e Zd ZddgZdZdddddd	d
dddddgdddddddd	d
dddddgdddiddddddd	d
dddddgdddiddddddddddddd d!d"d#d$d%gd&d'd(ddddddddddd d!d"d#d$d%gd&ddid)d*ddddddddddd d!d"d#d$d%gd&ddid)d+d,d-dd.d/d0d1d2d3d4d5d6d7d8d9d:d;gd<d'd=d>d?dd@dAdBdCdDdEdFgdG	d'dHdIdJddKdLdMdNdOdPdQdRdSd dTdUdVgd&d'dWdXddYdZd[d\d]d^d_d`dadbdcdddegd&ddfdgdhdidjdkdldmdndd dSd dodpdqgd&ddriddsddtduddtdvddtdwddtdxddtdyddtdzddtd{ddtd|ddtd}ddtgZd~Z fddZdd Zdd Z	  Z
S )ZDFIEzFhttps?://(?:www\.)?zdf\.de/(?:video|play)/(?:[^/?#]+/)*(?P<id>[^/?#]+)z=https?://(?:www\.)?zdf\.de/(?:[^/?#]+/)*(?P<id>[^/?#]+)\.htmlr   zrhttps://www.zdf.de/video/dokus/sylt---deutschlands-edles-nordlicht-movie-100/sylt-deutschlands-edles-nordlicht-100%sylt-deutschlands-edles-nordlicht-100rb   #Sylt - Deutschlands edles Nordlicht$md5:35407b810c2e1e33efbe15ef6e4c06c3     P@<https://www.zdf.de/assets/sylt-118~original?cb=1613992485011-sylt---deutschlands-edles-nordlicht-movie-1009`20210204zdf 210402_1915_sendung_dokrv   r   rF   descriptionr]   	thumbnailseries	series_id	timestampupload_date_old_archive_ids)r1   	info_dictzqhttps://www.zdf.de/play/dokus/sylt---deutschlands-edles-nordlicht-movie-100/sylt-deutschlands-edles-nordlicht-100skip_downloadT)r1   r   paramszbhttps://www.zdf.de/dokumentation/dokumentation-sonstige/sylt-deutschlands-edles-nordlicht-100.htmlzphttps://www.zdf.de/video/dokus/die-magie-der-farben-116/die-magie-der-farben-von-koenigspurpur-und-jeansblau-100Z 1eda17eb40a9ead3046326e10b9c5973z8die-magie-der-farben-von-koenigspurpur-und-jeansblau-100u   Von Königspurpur bis Jeansblauz$md5:a89da10c928c6235401066b60a6d5c1ag     n@zShttps://www.zdf.de/assets/koenigspurpur-bis-jeansblau-100~original?cb=1741857765971zDie Magie der Farbenzdie-magie-der-farben-116zSeason 1r   z	Episode 2r   i-VZ20151025zzdf 151025_magie_farben2_tex)rv   r   rF   r   r]   r   r   r   seasonseason_numberepisodeepisode_numberr   r   r   )r1   md5r   zohttps://www.zdf.de/play/dokus/die-magie-der-farben-116/die-magie-der-farben-von-koenigspurpur-und-jeansblau-100)r1   r   r   r   zfhttps://www.zdf.de/dokumentation/terra-x/die-magie-der-farben-von-koenigspurpur-und-jeansblau-100.htmlzThttps://www.zdf.de/video/magazine/heute-journal-104/heute-journal-vom-19-12-2021-100Z 6ada39465497a84fb98d48ffff69e7b7z heute-journal-vom-19-12-2021-100zheute journal vom 19.12.2021z$md5:02504cf3b03777ff32fcc927d260c5ddg     @zjhttps://epg-image.zdf.de/fotobase-webdelivery/images/273e5545-16e7-4ca3-898e-52fe9e06d964?layout=1920x1080zcount:11heute journalheute-journal-104zSeason 2021i  zEpisode 370ir  i̙aZ20211219zzdf 211219_sendung_hjo)rv   r   rF   r   r]   r   chaptersr   r   r   r   r   r   r   r   r   zhhttps://www.zdf.de/nachrichten/politik/deutschland/koalitionsverhandlungen-spd-cdu-csu-dobrindt-100.htmlZ c3a78514dd993a5781aa3afe50db51e2z0koalitionsverhandlungen-spd-cdu-csu-dobrindt-100u(   Dobrindt schließt Steuererhöhungen ausz$md5:9a117646d7b8df6bc902eb543a9c9023iE  zXhttps://www.zdfheute.de/assets/dobrindt-csu-berlin-direkt-100~1920x1080?cb=1743357653736igZ20250330zzdf 250330_clip_2_bdi)	rv   r   rF   r   r]   r   r   r   r   zFhttps://www.zdf.de/funk/druck-11790/funk-alles-ist-verzaubert-102.htmlZ 57af4423db0455a3975d2dc4578536bczfunk-alles-ist-verzaubert-102zAlles ist verzaubertz0Die Neue an der Schule verdreht Ismail den Kopf.g     @zXhttps://www.zdf.de/assets/teaser-funk-alles-ist-verzaubert-102~original?cb=1663848412907ZDRUCKzfunk-collection-funk-11790-1590zSeason 7   z	Episode 1i0|aZ20211029zzdf video_funk_1770473zHhttps://www.zdf.de/serien/soko-stuttgart/das-geld-anderer-leute-100.htmlzdas-geld-anderer-leute-100zDas Geld anderer Leutez$md5:cb6f660850dc5eb7d1ab776ea094959dg     *@zjhttps://epg-image.zdf.de/fotobase-webdelivery/images/e2d7e55a-09f0-424e-ac73-6cac4dd65f35?layout=1920x1080zSOKO Stuttgartzsoko-stuttgart-104z	Season 11   z
Episode 10rs   i2gZ20241015zzdf 191205_1800_sendung_sok8zLhttps://www.zdf.de/serien/northern-lights/begegnung-auf-der-bruecke-100.htmlzbegegnung-auf-der-bruecke-100rd   u   Begegnung auf der Brückez$md5:e53a555da87447f7f1207f10353f8e45g     @zjhttps://epg-image.zdf.de/fotobase-webdelivery/images/c5ff1d1f-f5c8-4468-86ac-1b2f1dbecc76?layout=1920x1080zNorthern Lightsznorthern-lights-100iDgZ20250203zzdf 240319_2310_sendung_notzgeo-restricted http formatz^https://www.zdf.de/politik/phoenix-sendungen/wohin-fuehrt-der-protest-in-der-pandemie-100.html)r1   Zonly_matchingz@https://www.zdf.de/dokumentation/ab-18/10-wochen-sommer-102.htmlzOhttps://www.zdf.de/politik/phoenix-sendungen/die-gesten-der-maechtigen-100.htmlz>https://www.zdf.de/filme/filme-sonstige/der-hauptmann-112.htmlz8https://www.zdf.de/wissen/nano/nano-21-mai-2019-102.htmlzYhttps://www.zdf.de/service-und-hilfe/die-neue-zdf-mediathek/zdfmediathek-trailer-100.htmlz\https://www.zdf.de/filme/taunuskrimi/die-lebenden-und-die-toten-1---ein-taunuskrimi-100.htmlzqhttps://www.zdf.de/dokumentation/planet-e/planet-e-uebersichtsseite-weitere-dokumentationen-von-planet-e-100.htmlzVhttps://www.zdf.de/arte/todliche-flucht/page-video-artede-toedliche-flucht-16-100.htmlzShttps://www.zdf.de/dokumentation/terra-x/unser-gruener-planet-wuesten-doku-100.htmla$  
query VideoByCanonical($canonical: String!) {
  videoByCanonical(canonical: $canonical) {
    canonical
    title
    leadParagraph
    editorialDate
    teaser {
      description
      image {
        list
      }
    }
    episodeInfo {
      episodeNumber
      seasonNumber
    }
    smartCollection {
      canonical
      title
    }
    currentMedia {
      nodes {
        ptmdTemplate
        ... on VodMedia {
          duration
          aspectRatio
          streamAnchorTags {
            nodes {
              anchorOffset
              anchorLabel
            }
          }
          vodMediaType
          label
        }
        ... on LiveMedia {
          start
          stop
          encryption
          liveMediaType
          label
        }
        id
      }
    }
  }
}
    c                    s0   t  j|i |}|d}t| |g|d< |S )Nrv   r   )superr   popr   )r)   argskwargsZ	ptmd_dataZold_archive_id	__class__r*   r+   r     s    
zZDFIE._extract_ptmdc           	   
   C   s   | j d| |ddd}|d }t|dthttdhf}g }t|dtjhd	fD ]F\}}t|d
thf}|spqR|||t|	dt|	dd qRd|it|ddt
hfddt
hfdthtfdd| jhfd| |||  d|iS )Nz4https://zdf-prod-futura.zdf.de/mediathekV2/document/zDownloading fallback metadataz$Failed to download fallback metadata)ZnoteZerrnotedocument)streamApiUrlAndroid)Zstreamsr   r   zPTMD URLZ
teaserBild.r1   r6   r7   )r1   rv   r6   r7   
thumbnailsZtitelZbeschreibung))r   date)metaeditorialDater_   )rF   r   r   rS   rv   )r'   r   r   anyr   ry   r   rP   r
   rM   r9   r   rV   r   r,   )	r)   Zdocument_idvideor   r~   r   Zthumbnail_keyr   Zthumbnail_urlr*   r*   r+   _extract_fallback  sH    



zZDFIE._extract_fallbackc           	      C   s8  |  |}| j|dd| jd|iddd d }|s>| |S d }g }t|dd	d
d fD ]N}| d|d }|d }rt|d|i}|| |sZ| 	|d}qZi t|dt
hfdtt
hfdthfddd| jhfddthfddthfddt
hfddt
hfdd	ddd	| jhfd	| |||  |d|iS )Nzvideo metadataZVideoByCanonical	canonical)operationNamer   	variables)r   rG   ZvideoByCanonicalZcurrentMedianodesc                 S   s   |d S )NptmdTemplater*   r@   r*   r*   r+   rC   3  rD   z%ZDFIE._real_extract.<locals>.<lambda>zhttps://api.zdf.der   ZvodMediaTyperZ   ZaspectRatiorF   ZleadParagraph)teaserr   r   r   imagelistepisodeInfoepisodeNumberseasonNumberZsmartCollectionr   ZstreamAnchorTags)	rF   r   r   r   r   r   r   r   r   rv   )	_match_idr   _GRAPHQL_QUERYr   r   rY   rM   r   rP   r>   r9   r   r   r   r
   rH   r   r,   )	r)   r1   r2   
video_datar=   r}   noder~   rZ   r*   r*   r+   _real_extract&  sL    







zZDFIE._real_extract)r   r   r   
_VALID_URLIE_NAME_TESTSr   r   r   r   __classcell__r*   r*   r   r+   r      s    |2%r   c                       s   e Zd ZdZdZddddddd	d
dddddd	e gddddddddddddgdddidddddddd	dd d!d"dd#d	d$d%d&d"dd'd(d)d*d+d,dd-d	d.d/d0d,dd1d2d3gZd4Ze	 fd5d6Z
d>d8d9Zd:d; Zd<d= Z  ZS )?ZDFChannelIEz2https?://www\.zdf\.de/(?:[^/?#]+/)*(?P<id>[^/?#]+)zzdf:channelz1https://www.zdf.de/sport/das-aktuelle-sportstudiozdas-aktuelle-sportstudio-220zdas aktuelle sportstudioz$md5:e46c785324238a03edcf8b301c5fd5dc)rv   rF   r      )r1   r   Zplaylist_mincountz5https://www.zdf.de/sport/das-aktuelle-sportstudio-220zFhttps://www.zdf.de/dokus/sylt---deutschlands-edles-nordlicht-movie-100r   rb   r   r   r   r   r   r   r   r   r   r   T)Zadd_ier1   r   r   z9https://www.zdf.de/gesellschaft/aktenzeichen-xy-ungeloestzaktenzeichen-xy-ungeloest-110u   Aktenzeichen XY... Ungelöstz$md5:b79ac0d64b979e53cbe510c0ca9cb7ber   z&https://www.zdf.de/serien/taunuskrimi/ztaunuskrimi-100ZTaunuskrimiz$md5:ee7204e9c625c3b611d1274f9d0e3070   z0https://www.zdf.de/serien/taunuskrimi/?staffel=1ztaunuskrimi-100-s1zTaunuskrimi - Season 1r   )r1   r   playlist_countz-https://www.zdf.de/magazine/heute-journal-104r   r   z$md5:6edad39189abf8431795d3d6d7f986b3i  z:https://www.zdf.de/magazine/heute-journal-104?staffel=2024zheute-journal-104-s2024zheute journal - Season 2024   z>Video count changes daily, needs support for playlist_maxcount)r1   r   r   skip   c                    s   t |rdS t |S )NF)r   suitabler   )clsr1   r   r*   r+   r     s    zZDFChannelIE.suitableNc                 C   sT   | j |d| d| ddtt||| j|dtdddd	id
dd d S )Nzseason z page z JSONZseasonByCanonical)ZseasonIndexr   ZepisodesPageSizeZepisodesAfterpersistedQueryr   Z@9412a0f4ac55dc37d46975d461ec64bfd14380d815df843a1492348f77b5c99aversionZ
sha256Hashr   r   
extensionsr   rG   smartCollectionByCanonical)r   r   r   r   
_PAGE_SIZE)r)   playlist_idcanonical_id
season_idxr   page_numbercursorr*   r*   r+   _fetch_page  s*    zZDFChannelIE._fetch_pagec                 c   s  t |D ]\}}|d ur"||kr"qd }tdD ]}| ||||||}	t|	d}
t|
ddddd fD ]^}| j|d tfi t|d	thfd
dthfdtthfdt	hfddt
hfddt
hfdV  qht|
dddthfpi }|dr|ds q|d }q0qd S )Nr   )seasonsr   ..Zepisodesr   c                 S   s   t |d S )N
sharingUrlra   r@   r*   r*   r+   rC     rD   z'ZDFChannelIE._entries.<locals>.<lambda>r   r   r   rF   r   r   r   r   r   )rv   rF   r   r   r   r   rp   ZpageInfoZhasNextPageZ	endCursor)	enumerate	itertoolscountr   r   
url_resultr   r9   r   r   r
   ry   rM   )r)   r   r   season_numbersZrequested_season_numberr   r   r   r   pager   r   Z	page_infor*   r*   r+   _entries  s8    






zZDFChannelIE._entriesc           	      C   sd  |  |}| ||}| j| j|jddd}tt|ddthf}t||oRd| }| j	|ddt
|d	d
t
ddddiddd d }t|dthfpi }t|ddddthf}| |o|t|do|ds| |d t|d S |d ur||vrtd| d| | |||||tt|dthf|oLd| ddt|dthfS )Nz
channel idrv   )r<   Zstaffelrp   szsmart collection dataZGetSmartCollectionByCanonicald   )r   ZvideoPageSizer   r   Z@cb49420e133bd668ad895a8cea0e65cba6aa11ac1cacb02341ff5cf32a17cd02r   r   r   rG   r   r   r   .numberr   r   zSeason z% was not found in the collection datarF   z - rm   ZinfoText)r   Z_request_webpagerx   r   r1   r   r   r
   r   r   r   r   ry   Z_yes_playlistr   rM   r   r   r   Zplaylist_resultr   r9   )	r)   r1   r   Zurlhr   r   Zcollection_datar   r   r*   r*   r+   r     sR    
zZDFChannelIE._real_extract)N)r   r   r   r   r   r   Zie_keyr   r   classmethodr   r   r   r   r   r*   r*   r   r+   r   M  s   				O
r   )r   r   r:   r&   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Zutils.traversalr   r   r   r   r   r*   r*   r*   r+   <module>   s   L %   