o
    ib                     @   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 )	VRTBaseIEFdesktopbrowserChrome)typenamezundefined (undefined)Windows10)r   versionzVRT web playerz5.1.1-prod-2025-02-14T08:44:16")platformappdeviceosplayerz.0-0Fp51UZykfaiCJrfTE3+oMI8zvDteYfPtR+2n1R+z8w=@b5f500d55cb44715107249ccd8a5c0136cfb2788dbb71b90a4f142423bacaf38c              	   C   s`  t |dr
| | g i }}t |ddd fD ]z}|d  }|d }|dv rA| j||d|d	d
\}}	|| | j|	|d q|dkrR|| j|||d	d q|dkrn| j|||d	d\}}	|| | j|	|d q|dkr| j||dd	d\}}	|| | j|	|d q|	||d qt |ddd fD ]}
|
dg 	d|
d i q||fS )Ndrm
targetUrlsc                 S   s   t |d o	|d S )Nurlr   )r   _v r/   H/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/vrt.py<lambda><       z:VRTBaseIE._extract_formats_and_subtitles.<locals>.<lambda>r   r+   )HLSHLS_AESmp4F)m3u8_idfatal)targetHDS)f4m_idr7   	MPEG_DASH)mpd_idr7   HSSmss)ism_idr7   )	format_idr+   subtitleUrlsc                 S   s   |d o	|d dkS )Nr+   r   CLOSEDr/   r,   r/   r/   r0   r1   W   r2   nl)r   
report_drmupper#_extract_m3u8_formats_and_subtitlesextend_merge_subtitles_extract_f4m_formats"_extract_mpd_formats_and_subtitles"_extract_ism_formats_and_subtitlesappend
setdefault)selfdatavideo_idformats	subtitlesr8   format_type
format_urlfmtssubssubr/   r/   r0   _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|p&d
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 kid)headers)identityToken
playerInfo),:)
separators)ra   rO   vrtPlayerTokenz/videos/zDownloading API JSONzFailed to download API JSON)rg   clienti  )queryexpected_status)roundtime_PLAYER_INFO_download_jsongeo_verification_headersjsondumpsr   _JWT_SIGNING_KEY_JWT_KEY_IDencode)rN   rP   rh   id_tokenr"   player_infoplayer_tokenr/   r/   r0   	_call_api\   s8   

zVRTBaseIE._call_api)rY   NrZ   )	__name__
__module____qualname___GEO_BYPASSrm   rs   rr   rX   rx   r/   r/   r/   r0   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-65cbd098b7bdr5   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.jpg	vrtnieuwssporza)zvrt.be/vrtnwsz	sporza.bec              	   C   s  |  | \}}| ||}ttd|pd}|dp |d }t|dd}|r0| d| }t|dd	p:| j| }| ||}	| 	|	|\}
}| 
g d
|}|dkrWd }||
||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 )Nvrtvideor_   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)r~   rQ   rR   r   r   r   _old_archive_idsr   shortDescriptionr   )scaleposterImageUrl)r   r   r   r   )_match_valid_urlgroups_download_webpager   r   getr   _CLIENT_MAPrx   rX   _html_search_metar   r
   r   str)rN   r+   site
display_idwebpageattrsasset_idpublication_idrh   rO   rQ   rR   r   r/   r/   r0   _real_extract   s<   
zVRTIE._real_extractN)ry   rz   r{   IE_DESC
_VALID_URL_TESTSr   r   r/   r/   r/   r0   r}   s   s8    r}   c                   @   s  e Zd ZdZdZdZ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!d"d#g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/d0dd1dd2dd3dd*dd4d!d5d6gid$d7i dd8ddd	d9dd:dd;dd<dd=dd>d,d?dd@dd>d/dAddBddCddDdd=ddEd!dFdGgid$gZdHZdIZdJZ	dKZ
dLZdMZdNdO ZdPdQ ZedRdS ZdTdU ZdVdW ZdXS )YVrtNUIE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/r~   zUpbs-pub-c8a78645-5d3e-468a-89ec-6f3ed5534bd5$vid-242ddfe9-18f5-4e16-ab45-09b122a19251r   r5   channelketnetr   z<Neem een kijkje in de bijzondere wereld van deze Ketnetters.r   zket---doc-trailer-s6r   g      >@episodezReeks 6 volledig vanaf 3 maart
episode_id1739450401467seasonTrailer	season_idseriesz	Ket & Docr   zNhttps://images.vrt.be/orig/2025/02/21/63f07122-5bbd-4ca1-b42e-8565c6cd95df.jpg	timestampigr   upload_date20250224r   z\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)r+   r   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 51684157692901episode_number   6season_number   MeisjeszNhttps://images.vrt.be/orig/2023/05/14/bf526ae0-f1d9-11ed-91d7-02b7b76bf47f.jpgird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-5b82c8f1028ez0https://www.vrt.be/vrtnu/a-z/taboe/3/taboe-s3a4/zUpbs-pub-f50faa3a-1778-46b6-9117-4ba85f197703$vid-547507fe-1c8b-4394-b361-21e627cbd0fdeenz$md5:bf61345a95eca9393a95de4a7a54b5c6z
taboe-s3a4gףp=
@z1Mensen met het syndroom van Gilles de la Tourette1739055911734   3r\   TaboezNhttps://images.vrt.be/orig/2025/02/19/8198496c-d1ae-4bca-9a48-761cf3ea3ff2.jpgiPg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-21e627cbd0fd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   sv  |   d }| | j}| | j}|r$| |s$|r$| |s$||fS |r[| jj| jddd\}}|r[| |s[|r[| |s[| d | 	| j
| j| | 	| j
| j| ||fS | | jscdS | jdd ddd	d
 | | j}| | j}|r}|s| j| jdd  | j| j
d| j d}|s| | dS | | d | j|    S |r| 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errnoter7   refresh_token/vrtmax/ssozRefreshing of tokens failedz. Re-logging in)_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clearreport_warning_perform_login)rN   has_credentialsaccess_tokenvideo_tokenmsgr/   r/   r0   _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_namerN   r/   r0   r1   \      z)VrtNUIE._get_vrt_cookie.<locals>.<lambda>)r   )rN   r   r/   r   r0   r   Z  s   zVrtNUIE._get_vrt_cookiec                 C   s   t | d t  dk S )Nr[   i,  )r   rl   )tokenr/   r/   r0   r   ^  s   zVrtNUIE._is_jwt_token_expiredc              	   C   s^  |  | j}|r| |s| d d S | jj| jdd d}|r7| |s7| 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rotd|d dd| j	|d d ddd
 |  | j}|  | j}|  | j}t|||fst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)clientIdloginIDpasswordr^   zhttps://login.vrt.beOIDCXSRF)r]   Oidcxsrfz
Logging inzLogin failedi  )rO   ra   r   r   rj   	errorCodezLogin failed: errorMessageT)expected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   rn   rp   rq   rt   r   r   r   r   r   r   allr   )rN   usernamer   r   
login_datar   r   r/   r/   r0   r   b  sN   


	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|r3d
| nd ddddddd d }|d d d d }z
| j|d|d}W n tyu } z|spt|jtrp|jjdkrp|    d }~ww | ||\}	}
t|dthf}|	s|r|dv r| jdgd n|dv r|   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/graphqlr_   z/publicz/v1zDownloading asset JSONzUnable to download asset JSON	VideoPagepageId)operationNameri   	variableszBearer r^   WEBz1.5.9r   )Authorizationr]   zx-vrt-client-namezx-vrt-client-versionz
x-vrt-zone)rO   ra   rO   pager'   modesr   streamIdzvrtnu-web@PROD)ru   i  code)'CONTENT_AVAILABLE_ONLY_FOR_BE_RESIDENTSCONTENT_AVAILABLE_ONLY_IN_BECONTENT_UNAVAILABLE_VIA_PROXYBE)	countries)2CONTENT_AVAILABLE_ONLY_FOR_BE_RESIDENTS_AND_EXPATSCONTENT_IS_AGE_RESTRICTEDCONTENT_REQUIRES_AUTHENTICATIONzUnable to extract formats: r   r   r   )r   r   ldjson.F)r7   r   r   r   	onTimeRawprogramr   titleRawr~   episodeNumberRawageRawbranddurationRaw)r   r   r   r   r   r   r   r   r   r   	age_limitr   r   r   Ketnet)r~   r   rQ   rR   r   )#	_match_idr   rn   rp   rq   _VIDEO_PAGE_QUERYurllibparseurlparser   rt   r	   rx   r   
isinstancecauser   statusraise_login_requiredrX   r   r   raise_geo_restrictedraise_no_formatsr
   r   r   _json_ldloadsr   r   r   r   r   r   )rN   r+   r   r   r   metadatarP   streaming_infoerQ   rR   r   r/   r/   r0   r     s   




zVrtNUIE._real_extractN)ry   rz   r{   IE_NAMEr   r   r   r   r   r   r   r   r  r   r   staticmethodr   r   r   r/   r/   r/   r0   r      s   	
	
	
J$,
,r   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-a4d227f592far5   zHachis parmentier met witloofz$md5:9960478392d87f63567b5b117688cdc5zhachis-parmentier-met-witloof)r~   r   r   r   r   r   r   r   c              	   C   s   |  |}| ||}| jd|ddd}| j|ddd}| ||\}}||||ttd|p3| d	|ttd
|pB| g d|t	d|gdS )Nz&data-url=(["\'])(?P<id>(?:(?!\1).)+)\1zvideo idr~   )groupz	dako@prodv1)r"   zdish-metadata__titletwitter:titlezdish-description)r   r   r   r   )r~   rQ   rR   r   r   r   r   )
r  r   _html_search_regexrx   rX   r   r   r   r   r   )rN   r+   r   r   rP   rO   rQ   rR   r/   r/   r0   r     s0   


zDagelijkseKostIE._real_extractN)ry   rz   r{   r   r   r   r   r/   r/   r/   r0   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/[^/#\?&]+)r~   r   r   r   r   r   )r+   r   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)r~   r   r   r   r   c                 c   sl    t |ddd hf}|D ]&}|d }| | ||\}}|||dt |dthfdthfdV  qd S )	N)N)
paragraphs.c                 S   s   | d r| S d S )NmediaReferencer/   )xr/   r/   r0   r1     r   z3Radio1BeIE._extract_video_entries.<locals>.<lambda>r*  )r~   rQ   rR   r   body)r   r   )r   rX   rx   r   r   )rN   next_js_datar   
video_datarO   media_referencerQ   rR   r/   r/   r0   _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props	pagePropsitemr~   r   )r   content)r~   r   r   F)get_all)r   zog:titler%  )r   r   r   zog:imageztwitter:image)r   r   r   r   )
r  r   _search_nextjs_dataplaylist_resultr0  r   r   r   r   r   )rN   r+   r   r   r-  r/   r/   r0   r   "  s*   

zRadio1BeIE._real_extractN)ry   rz   r{   r   r   r0  r   r/   r/   r/   r0   r'    s.    r'  )"rp   rl   urllib.parser  commonr   networking.exceptionsr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r}   r   r"  r'  r/   r/   r/   r0   <module>   s    XTC  &