a
    hb                     @   s   d dl Z d dlZd dlZddlm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mZmZmZ G dd deZG d	d
 d
eZG dd deZG dd deZ G dd deZ!dS )    N   )InfoExtractor   )	HTTPError)ExtractorError
clean_htmlextract_attributesfilter_dictfloat_or_noneget_element_by_classget_element_html_by_classint_or_nonejwt_decode_hs256
jwt_encodemake_archive_idmerge_dictsparse_age_limitparse_durationparse_iso8601str_or_nonestrip_or_nonetraverse_objtry_callurl_or_nonec                   @   sL   e Zd ZdZdddddddd	d
dd	dZdZdZdd ZdddZdS )	VRTBaseIEFZdesktopZbrowserZChrome)typenamezundefined (undefined)Windows10)r   versionzVRT web playerz5.1.1-prod-2025-02-14T08:44:16")platformZappZdeviceosplayerz.0-0Fp51UZykfaiCJrfTE3+oMI8zvDteYfPtR+2n1R+z8w=Z@b5f500d55cb44715107249ccd8a5c0136cfb2788dbb71b90a4f142423bacaf38c              	   C   sd  t |dr| | g i  }}t |ddd fD ]}|d  }|d }|dv r| j||d|d	d
\}}	|| | j|	|d q0|dkr|| j|||d	d q0|dkr| j|||d	d\}}	|| | j|	|d q0|dkr| j||dd	d\}}	|| | j|	|d q0|	||d q0t |ddd fD ] }
|
dg 	d|
d i q:||fS )NZdrmZ
targetUrlsc                 S   s   t |d o|d S )Nurlr   )r   _v r'   I/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/vrt.py<lambda><       z:VRTBaseIE._extract_formats_and_subtitles.<locals>.<lambda>r   r#   )ZHLSZHLS_AESmp4F)Zm3u8_idfatal)targetZHDS)Zf4m_idr,   Z	MPEG_DASH)Zmpd_idr,   ZHSSZmss)Zism_idr,   )Z	format_idr#   ZsubtitleUrlsc                 S   s   |d o|d dkS )Nr#   r   ZCLOSEDr'   r$   r'   r'   r(   r)   W   r*   nl)r   Z
report_drmupperZ#_extract_m3u8_formats_and_subtitlesextendZ_merge_subtitlesZ_extract_f4m_formatsZ"_extract_mpd_formats_and_subtitlesZ"_extract_ism_formats_and_subtitlesappend
setdefault)selfdatavideo_idformats	subtitlesr-   Zformat_typeZ
format_urlZfmtssubssubr'   r'   r(   _extract_formats_and_subtitles7   sF    












z(VRTBaseIE._extract_formats_and_subtitlesnullNv2c                 C   s   dt t dd i| j}| jd| d|ddi |  dd	itj|pLd
t|| jd| j	idddd
 dd }| jd| d| |dd||dddS )Nexp   i  zOhttps://media-services-public.vrt.be/vualto-video-aggregator-web/rest/external/z/tokenszDownloading player tokenzFailed to download player tokenContent-Typeapplication/json Zkid)headers)ZidentityTokenZ
playerInfo),:)
separators)rB   r4   vrtPlayerTokenz/videos/zDownloading API JSONzFailed to download API JSON)rF   clienti  )queryexpected_status)roundtime_PLAYER_INFO_download_jsonZgeo_verification_headersjsondumpsr   _JWT_SIGNING_KEY_JWT_KEY_IDencode)r3   r5   rG   id_tokenr   Zplayer_infoZplayer_tokenr'   r'   r(   	_call_api\   s6    

zVRTBaseIE._call_api)r;   Nr<   )	__name__
__module____qualname__Z_GEO_BYPASSrL   rQ   rP   r:   rT   r'   r'   r'   r(   r      s"   %r   c                	   @   sb   e Zd ZdZdZddddddd	d
ddiddddddddd
ddidgZdddZdd ZdS )VRTIEz0VRT NWS, Flanders News, Flandern Info and Sporzazbhttps?://(?:www\.)?(?P<site>vrt\.be/vrtnws|sporza\.be)/[a-z]{2}/\d{4}/\d{2}/\d{2}/(?P<id>[^/?&#]+)z`https://www.vrt.be/vrtnws/nl/2019/05/15/beelden-van-binnenkant-notre-dame-een-maand-na-de-brand/zUpbs-pub-7855fc7b-1448-49bc-b073-316cb60caa71$vid-2ca50305-c38a-4762-9890-65cbd098b7bdr+   u:   Beelden van binnenkant Notre-Dame, één maand na de brandz$md5:6fd85f999b2d1841aa5568f4bf02c3ffg333333?@zNhttps://images.vrt.be/orig/2019/05/15/2d914d61-7710-11e9-abcc-02b7b76bf47f.jpg)idexttitledescriptionduration	thumbnailskip_downloadm3u8r#   	info_dictparamszGhttps://sporza.be/nl/2019/05/15/de-belgian-cats-zijn-klaar-voor-het-ek/zUpbs-pub-f2c86a46-8138-413a-a4b9-a0015a16ce2c$vid-1f112b31-e58e-4379-908d-aca6d80f8818z&De Belgian Cats zijn klaar voor het EKua   Video: De Belgian Cats zijn klaar voor het EK mét Ann Wauters | basketbal, sport in het journaalg{G\@zNhttps://images.vrt.be/orig/2019/05/15/11c0dba3-770e-11e9-abcc-02b7b76bf47f.jpgZ	vrtnieuwsZsporza)zvrt.be/vrtnwsz	sporza.bec              	   C   s  |  | \}}| ||}ttd|p,d}|dp@|d }t|dd}|r`| d| }t|dd	pt| j| }| ||}	| 	|	|\}
}| 
g d
|}|dkrd }||
||t|dt|ddtd|gdt|	dthfdthfdtddhfdthfdS )NZvrtvideorA   zdata-video-idzdata-videoidzdata-publication-idzdata-publicationid$zdata-client-codezdata-client)og:descriptiontwitter:descriptionr\   u   …zdata-posterimagezdata-duration  Canvas)rY   r6   r7   r\   r^   r]   _old_archive_idsr[   ZshortDescriptionr]   )ZscaleposterImageUrl)r[   r\   r]   r^   )Z_match_valid_urlgroups_download_webpager   r   getr   _CLIENT_MAPrT   r:   _html_search_metar   r
   r   str)r3   r#   site
display_idwebpageattrsZasset_idZpublication_idrG   r4   r6   r7   r\   r'   r'   r(   _real_extract   s<    
zVRTIE._real_extractN)rU   rV   rW   IE_DESC
_VALID_URL_TESTSrn   ru   r'   r'   r'   r(   rX   s   s6   rX   c                   @   s   e Zd ZdZdZdZ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d#d$d%gd&dd'd(dd)d*d+d,d-d.d/d0d.d1d2d3d4d-d5d6d7gd&dgZd8Zd9Zd:Z	d;Z
d<Zd=Zd>d? Zd@dA ZedBdC ZdDdE ZdFdG ZdHS )IVrtNUIEZvrtmaxzVRT MAX (formerly VRT NU)zMhttps?://(?:www\.)?vrt\.be/(?:vrtnu|vrtmax)/a-z/(?:[^/]+/){2}(?P<id>[^/?#&]+)zEhttps://www.vrt.be/vrtmax/a-z/ket---doc/trailer/ket---doc-trailer-s6/zUpbs-pub-c8a78645-5d3e-468a-89ec-6f3ed5534bd5$vid-242ddfe9-18f5-4e16-ab45-09b122a19251r+   Zketnetz<Neem een kijkje in de bijzondere wereld van deze Ketnetters.zket---doc-trailer-s6g      >@zReeks 6 volledig vanaf 3 maartZ1739450401467ZTrailerz	Ket & DoczNhttps://images.vrt.be/orig/2025/02/21/63f07122-5bbd-4ca1-b42e-8565c6cd95df.jpgigZ20250224z\canvas pbs-pub-c8a78645-5d3e-468a-89ec-6f3ed5534bd5$vid-242ddfe9-18f5-4e16-ab45-09b122a19251z\ketnet pbs-pub-c8a78645-5d3e-468a-89ec-6f3ed5534bd5$vid-242ddfe9-18f5-4e16-ab45-09b122a19251)rY   rZ   channelr\   rr   r]   episode
episode_idseason	season_idseriesr^   	timestampr[   upload_dateri   )r#   rb   z5https://www.vrt.be/vrtmax/a-z/meisjes/6/meisjes-s6a5/zUpbs-pub-97b541ab-e05c-43b9-9a40-445702ef7189$vid-5e306921-a9aa-4fa9-9f39-5b82c8f1028ez$md5:713793f15cbf677f66200b36b7b1ec5azmeisjes-s6a5gGz@zWeek 5Z1684157692901   6   ZMeisjeszNhttps://images.vrt.be/orig/2023/05/14/bf526ae0-f1d9-11ed-91d7-02b7b76bf47f.jpgirdZ20230528z\canvas pbs-pub-97b541ab-e05c-43b9-9a40-445702ef7189$vid-5e306921-a9aa-4fa9-9f39-5b82c8f1028ez\ketnet pbs-pub-97b541ab-e05c-43b9-9a40-445702ef7189$vid-5e306921-a9aa-4fa9-9f39-5b82c8f1028e)rY   rZ   rz   r\   rr   r]   r{   r|   episode_numberr}   r~   season_numberr   r^   r   r[   r   ri   z0https://www.vrt.be/vrtnu/a-z/taboe/3/taboe-s3a4/zUpbs-pub-f50faa3a-1778-46b6-9117-4ba85f197703$vid-547507fe-1c8b-4394-b361-21e627cbd0fdZeenz$md5:bf61345a95eca9393a95de4a7a54b5c6z
taboe-s3a4gףp=
@z1Mensen met het syndroom van Gilles de la TouretteZ1739055911734   3r>   ZTaboezNhttps://images.vrt.be/orig/2025/02/19/8198496c-d1ae-4bca-9a48-761cf3ea3ff2.jpgiPgZ20250223z\canvas pbs-pub-f50faa3a-1778-46b6-9117-4ba85f197703$vid-547507fe-1c8b-4394-b361-21e627cbd0fdz\ketnet pbs-pub-f50faa3a-1778-46b6-9117-4ba85f197703$vid-547507fe-1c8b-4394-b361-21e627cbd0fdZvrtnuz.www.vrt.bezvrtnu-site_profile_atzvrtnu-site_profile_rtzvrtnu-site_profile_vta^  
    query VideoPage($pageId: ID!) {
        page(id: $pageId) {
            ... on EpisodePage {
                episode {
                    ageRaw
                    description
                    durationRaw
                    episodeNumberRaw
                    id
                    name
                    onTimeRaw
                    program {
                        title
                    }
                    season {
                        id
                        titleRaw
                    }
                    title
                    brand
                }
                ldjson
                player {
                    image {
                        templateUrl
                    }
                    modes {
                        streamId
                    }
                }
            }
        }
    }
    c                 C   s|  |   d }| | j}| | j}|rH| |sH|rH| |sH||fS |r| jj| jddd\}}|r| |s|r| |s| d | 	| j
| j| | 	| j
| j| ||fS | | jsdS | jdd ddd	d
 | | j}| | j}|r|sX| j| jdd  | j| j
d| j d}|s:| | dS | | d | j|    S |rt| j| jd||f ||fS )Nr   
token_data)NNdefaultzRestored tokens from cachez%https://www.vrt.be/vrtmax/sso/refreshzRefreshing tokenszFailed to refresh tokensF)noteerrnoter,   refresh_token/vrtmax/ssozRefreshing of tokens failedz. Re-logging in)Z_get_login_info_get_vrt_cookie_ACCESS_TOKEN_COOKIE_NAME_VIDEO_TOKEN_COOKIE_NAME_is_jwt_token_expiredcacheload_NETRC_MACHINEwrite_debug_set_cookie_TOKEN_COOKIE_DOMAIN_REFRESH_TOKEN_COOKIE_NAME_request_webpagestore	cookiejarclearZreport_warning_perform_login)r3   Zhas_credentialsaccess_tokenvideo_tokenmsgr'   r'   r(   _fetch_tokens.  sP    


zVrtNUIE._fetch_tokensc                    s   t  fddS )Nc                      s    d  jS )Nzhttps://www.vrt.be/vrtmax/sso)_get_cookiesvaluer'   cookie_namer3   r'   r(   r)   \  r*   z)VrtNUIE._get_vrt_cookie.<locals>.<lambda>)r   )r3   r   r'   r   r(   r   Z  s    zVrtNUIE._get_vrt_cookiec                 C   s   t | d t  dk S )Nr=   i,  )r   rK   )tokenr'   r'   r(   r   ^  s    zVrtNUIE._is_jwt_token_expiredc              	   C   s`  |  | j}|r(| |s(| d d S | jj| jdd d}|rn| |sn| d | j| j| j|dd d S | j	dd dd	d
 | j
dd td||d d| dd jddddd}|drtd|d dd| j	|d d ddd
 |  | j}|  | j}|  | j}t|||fs0td| j| jd||f | j| jd| ||fS ) NzKUsing refresh token from logged-in cookies; skipping login with credentialsr   r   z!Restored refresh token from cacher   )pathz#https://www.vrt.be/vrtmax/sso/loginzGetting session cookieszFailed to get session cookies)r   r   z"https://login.vrt.be/perform_loginz
vrtnu-site)ZclientIdZloginIDpasswordr@   zhttps://login.vrt.beZOIDCXSRF)r?   ZOidcxsrfz
Logging inzLogin failedi  )r4   rB   r   r   rI   Z	errorCodezLogin failed: ZerrorMessageT)expectedZredirectUrlzGetting access tokenzFailed to get access tokenz%Unable to extract token cookie valuesr   )r   r   r   r   r   r   r   r   r   r   rM   rN   rO   rR   r   r   rm   r   r   r   allr   )r3   usernamer   r   Z
login_datar   r   r'   r'   r(   r   b  sL    


	
zVrtNUIE._perform_loginc                 C   s@  |  |}|  \}}| jd|r$dnd d|ddtd| jdtj|j	id	
 t|rfd
| nd ddddddd d }|d d d d }z| j|d|d}W nJ ty } z2|st|jtr|jjdkr|    W Y d }~n
d }~0 0 | ||\}	}
t|dthf}|	sb|rb|dv r>| jdgd n$|dv rR|   n| d|  t|d d!t|d"d#| jt|d$d%tjhf|d&d't|d(d)thfd*thfd+thfd,d)thfd-d.thfd-d.thfd/thfd)thfd0thfd/thfd1t hfd2thfd3t!hfd4f|||	|
t"d5|t"d6|gd7S )8Nz$https://www.vrt.be/vrtnu-api/graphqlrA   z/publicz/v1zDownloading asset JSONzUnable to download asset JSONZ	VideoPageZpageId)ZoperationNamerH   	variableszBearer r@   ZWEBz1.5.9r   )Authorizationr?   zx-vrt-client-namezx-vrt-client-versionz
x-vrt-zone)r4   rB   r4   pager"   modesr   ZstreamIdzvrtnu-web@PROD)rS   i  code)Z'CONTENT_AVAILABLE_ONLY_FOR_BE_RESIDENTSZCONTENT_AVAILABLE_ONLY_IN_BEZCONTENT_UNAVAILABLE_VIA_PROXYZBE)Z	countries)Z2CONTENT_AVAILABLE_ONLY_FOR_BE_RESIDENTS_AND_EXPATSZCONTENT_IS_AGE_RESTRICTEDZCONTENT_REQUIRES_AUTHENTICATIONzUnable to extract formats: r]   rg   rj   )r]   r^   Zldjson.F)r,   r{   r[   r\   Z	onTimeRawprogramr}   ZtitleRawrY   ZepisodeNumberRawZageRawZbrandZdurationRaw)r[   r\   r   r   r}   r   r~   r{   r   r|   Z	age_limitrz   r]   rh   ZKetnet)rY   rr   r6   r7   ri   )#	_match_idr   rM   rN   rO   _VIDEO_PAGE_QUERYurllibparseurlparser   rR   r	   rT   r   
isinstancecauser   statusZraise_login_requiredr:   r   rp   Zraise_geo_restrictedZraise_no_formatsr
   rm   r   Z_json_ldloadsr   r   r   r   r   r   )r3   r#   rr   r   r   metadatar5   Zstreaming_infoer6   r7   r   r'   r'   r(   ru     s    







zVrtNUIE._real_extractN)rU   rV   rW   ZIE_NAMErv   rw   rx   r   r   r   r   r   r   r   r   staticmethodr   r   ru   r'   r'   r'   r(   ry      s   J$,
,ry   c                   @   s:   e Zd ZdZdZddddddd	d
didgZdd ZdS )DagelijkseKostIEzdagelijksekost.een.bez;https?://dagelijksekost\.een\.be/gerechten/(?P<id>[^/?#&]+)zEhttps://dagelijksekost.een.be/gerechten/hachis-parmentier-met-witloofz+md-ast-27a4d1ff-7d7b-425e-b84f-a4d227f592far+   zHachis parmentier met witloofz$md5:9960478392d87f63567b5b117688cdc5zhachis-parmentier-met-witloof)rY   rZ   r[   r\   rr   r_   r`   ra   c              	   C   s   |  |}| ||}| jd|ddd}| j|ddd}| ||\}}||||ttd|pf| d	|ttd
|p| g d|t	d|gdS )Nz&data-url=(["\'])(?P<id>(?:(?!\1).)+)\1zvideo idrY   )groupz	dako@prodZv1)r   zdish-metadata__titletwitter:titlezdish-description)r\   rf   re   rh   )rY   r6   r7   rr   r[   r\   ri   )
r   rl   Z_html_search_regexrT   r:   r   r   ro   r   r   )r3   r#   rr   rs   r5   r4   r6   r7   r'   r'   r(   ru     s0    


zDagelijkseKostIE._real_extractN)rU   rV   rW   rv   rw   rx   ru   r'   r'   r'   r(   r     s   r   c                   @   sP   e Zd ZdZdddddddd	d
dddddddd	d
gZdd Zdd ZdS )
Radio1BeIEz;https?://radio1\.be/(?:lees|luister/select)/(?P<id>[\w/-]+)zQhttps://radio1.be/luister/select/de-ochtend/komt-n-va-volgend-jaar-op-in-walloniez$eb6c22e9-544f-44f4-af39-cf8cccd29e22u'   Komt N-VA volgend jaar op in Wallonië?z0de-ochtend/komt-n-va-volgend-jaar-op-in-walloniez$md5:b374ea1c9302f38362df9dea1931468ez%re:https?://cds\.vrt\.radio/[^/#\?&]+)rY   r[   rr   r\   r^   r   )r#   rb   Zplaylist_mincountzvhttps://radio1.be/lees/europese-unie-wil-onmiddellijke-humanitaire-pauze-en-duurzaam-staakt-het-vuren-in-gaza?view=webz$5d47f102-dbdb-4fa0-832b-26c1870311f2zZEuropese Unie wil "onmiddellijke humanitaire pauze" en "duurzaam staakt-het-vuren" in Gazaz$md5:1aad1fae7d39edeffde5d3e67d276b64zVeuropese-unie-wil-onmiddellijke-humanitaire-pauze-en-duurzaam-staakt-het-vuren-in-gaza)rY   r[   r\   r^   rr   c                 c   sj   t |ddd hf}|D ]L}|d }| | ||\}}|||dt |dthfdthfdV  qd S )	N)N)Z
paragraphs.c                 S   s   | d r| S d S )NmediaReferencer'   )xr'   r'   r(   r)     r*   z3Radio1BeIE._extract_video_entries.<locals>.<lambda>r   )rY   r6   r7   r[   body)r[   r\   )r   r:   rT   rp   r   )r3   next_js_datarr   Z
video_datar4   Zmedia_referencer6   r7   r'   r'   r(   _extract_video_entries  s"    
z!Radio1BeIE._extract_video_entriesc                 C   s   |  |}| ||}| ||d d d }| j| ||fi tt|dthfdthfdthfddd	|| 	g d
|| 	g d|| 	ddg|dS )NpropsZ	pagePropsitemrY   r[   )r\   content)rY   r[   r\   F)get_all)r   zog:titler   )r\   re   rf   zog:imageztwitter:image)rr   r[   r\   r^   )
r   rl   Z_search_nextjs_dataZplaylist_resultr   r   r   rp   r   ro   )r3   r#   rr   rs   r   r'   r'   r(   ru   "  s*    

zRadio1BeIE._real_extractN)rU   rV   rW   rw   rx   r   ru   r'   r'   r'   r(   r     s,   r   )"rN   rK   urllib.parser   commonr   Znetworking.exceptionsr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   ry   r   r   r'   r'   r'   r(   <module>   s   XTC  &