Ë
    š„j,9  ã                   óz   — d dl Z d dlZd dlZd dlZddlmZmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZ  G d„ de«      Zy)	é    Né   )ÚInfoExtractorÚRequesté   )Údetermine_extÚint_or_noneÚ
js_to_jsonÚmake_archive_idÚparse_durationÚparse_iso8601Úurl_or_none)Útraverse_objc                   óÀ  — e Zd ZdZddddddddd	d
ddddddgdœ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/d0“d1d2g“dœd3d4d5dd6d7d8d9d:d;d<d=d>gd?œd@gdAœdBdCdDdEdDdFdGdCdHdIdJdIdKœdLdMœdBdNdOddDdPdQdDdFdGdCdHdIdJdIdRgdSœdTdUidVœdWdXdYddDdZd[dDdFdGdCdHdIdJdId\œdœgZd]Zd^Zd_„ Zed`„ «       Z	da„ Z
djdb„Zdkdc„Zdd„ Zde„ Z ej                   df«      Zdg„ Zdh„ Zdi„ Zy^)lÚRTPIEzuhttps?://(?:www\.)?rtp\.pt/play/(?:[^/#?]+/)?(?P<program_id>p\d+)/(?P<episode_id>e\d+)(?:/[^/#?]+/(?P<asset_id>\d+))?z4http://www.rtp.pt/play/p405/e174042/paixoes-cruzadasÚ e736ce0c665e459ddb818546220b4ef8Ú395769Úmp3u   PaixÃµes Cruzadasz$md5:af979e58ba0ab73f78435fc943fdb070zre:^https?://.*\.jpgg     §@i{›\Ú20190327i€yTÚ20141129Úe174042Úp405zrtp e174042)ÚidÚextÚtitleÚdescriptionÚ	thumbnailÚseriesÚdurationÚmodified_timestampÚmodified_dateÚ	timestampÚupload_dateÚ
episode_idÚ	series_idÚ_old_archive_ids)ÚurlÚmd5Ú	info_dictzIhttps://www.rtp.pt/play/zigzag/p13166/e757904/25-curiosidades-25-de-abrilÚ 5b4859940e3adef61247a77dfb76046ar   Ú1226642r   Úmp4r   u   Estudar ou nÃ£o estudarr   z$md5:3bfd7eb8bebfd5711a08df69c9c14c35r   r!   i�i
fr   g     @b@r"   Ú20240401r   i/Áfr   z25 Curiosidades, 25 de AbrilÚepisode_numberr   Úepisoder    Ú20240404r#   Úe757904r$   Úp13166r%   zrtp e757904zBhttps://www.rtp.pt/play/estudoemcasa/p7776/e500050/portugues-1-anoÚ 57660c0b46db9f22118c52cbd65975e4Ú871639u   PortuguÃªs - 1.Âº anog     š@z$md5:be68925c81269f8c6886589f25fe83eaÚ20201020iÿ˜Ž_zEhttps://cdn-images.rtp.pt/EPG/imagens/39482_59449_64850.png?v=3&w=860Úe500050Úp7776zrtp e500050)r   r   r   r   r   r"   r!   r   r#   r$   r%   zFEpisode data not found in API response; falling back to web extraction)r&   r'   r(   Úexpected_warningsz4https://www.rtp.pt/play/p14335/e877072/a-nossa-tardeÚe877072zA Nossa Tardeg     ‘¹@Úp14335Ú2025i¼ÑhÚ20250922i&‹Ñh)r   r   r   r   r$   Úseasonr#   r!   r"   r   r    é   )r&   r(   Úplaylist_countÚ 2aa3c89c95e852d6f04168b95d0d0632Ú1364711g     0”@zbre:https://cdn-images\.rtp\.pt/multimedia/screenshots/p14335/p14335_1_20250922155118e161t0312\.jpgzrtp e877072)r   r   r   r   r   r   r$   r<   r#   r!   r"   r   r    r%   Ú
noplaylistT)r&   r'   r(   Úparamsz<https://www.rtp.pt/play/p14335/e877072/a-nossa-tarde/1364744Ú b624767af558a557372a6fcd1dcdfa17Ú1364744g     Œ©@zbre:https://cdn-images\.rtp\.pt/multimedia/screenshots/p14335/p14335_2_20250922165718e161t0412\.jpg)r   r   r   r   r   r   r$   r<   r#   r!   r"   r   r    zGrtpplay/2.0.66 (pt.rtp.rtpplay; build:2066; iOS 15.8.3) Alamofire/5.9.1Nc                 óà   — | j                   r| j                   S t        | j                  t        ddddd| j                  dœddi¬	«      d d
dd¬«      ddt
        hf«      | _         | j                   S )Nz2https://rtpplayapi.rtp.pt/play/api/2/token-managerú*/*ÚRTPPLAY_MOBILE_IOSÚ@fac9c328b2f27e26e03d7f8942d66c05b3e59371e16c2a079f5c83cc801bd3eeÚ2145973229682)ÚAcceptzrtp-play-authzrtp-play-auth-hashzrtp-play-auth-timestampú
User-AgentÚkeep_header_casingT)ÚheadersÚ
extensionszFetching guest auth tokenz Could not fetch guest auth tokenF)ÚnoteÚerrnoteÚfatalÚtoken)Ú_AUTH_TOKENr   Ú_download_jsonr   Ú_USER_AGENTÚstr)Úselfs    úK/var/www/html/GAP/venv/lib/python3.12/site-packages/yt_dlp/extractor/rtp.pyÚ_fetch_auth_tokenzRTPIE._fetch_auth_token�   sŽ   € Ø×ÒØ×#Ñ#Ð#Ü'¨×(;Ñ(;¼GØ@àØ!5Ø&hØ+:Ø"×.Ñ.ñð 0°Ð6ô=8ð :>Ø,Ð6XØð )<ó 
)ð # G¬c¨UÐ3ó
5ˆÔð ×ÑÐó    c                 ó    — t         j                  j                  | «      j                  dk(  ry | j	                  dd«      j	                  dd«      S )Nzstreaming-ondemand.rtp.ptz	/drm-fps/z/hls/z
/drm-dash/z/dash/)ÚurllibÚparseÚurlparseÚnetlocÚreplace)r&   s    rX   Ú_cleanup_media_urlzRTPIE._cleanup_media_url�   sA   € ä�<‰<× Ñ  Ó%×,Ñ,Ð0KÒKØØ�{‰{˜;¨Ó0×8Ñ8¸ÀxÓPÐPrZ   c                 ó²  — g }i }t        t        |dt        h| j                  hf«      «      D ]¥  }t	        |«      }|dk(  r=| j                  ||dd¬«      \  }}|j                  |«       | j                  ||¬«       ŒP|dk(  r=| j                  ||dd¬	«      \  }}|j                  |«       | j                  ||¬«       Œ’|j                  |d
dœ«       Œ§ ||fS )N.Úm3u8ÚhlsF)Úm3u8_idrQ   )ÚtargetÚmpdÚdash)Úmpd_idrQ   Úhttp)r&   Ú	format_id)
Úsetr   r   ra   r   Ú#_extract_m3u8_formats_and_subtitlesÚextendÚ_merge_subtitlesÚ"_extract_mpd_formats_and_subtitlesÚappend)	rW   Ú
media_urlsÚ
display_idÚformatsÚ	subtitlesÚ	media_urlr   ÚfmtsÚsubss	            rX   Ú_extract_formatszRTPIE._extract_formats£   sû   € ØˆØˆ	Üœ\¨*°s¼[¸MÈD×LcÑLcÐKdÐ6eÓfÓgò 	ˆIÜ 	Ó*ˆCØ�fŠ}Ø!×EÑEØ˜z°5Àð Fó G‘
��dà—‘˜tÔ$Ø×%Ñ% d°9Ð%Õ=Ø˜’Ø!×DÑDØ˜z°&Àð Eó G‘
��dà—‘˜tÔ$Ø×%Ñ% d°9Ð%Õ=à—‘Ø$Ø!'ñ õ ð	ð" ˜	Ð!Ð!rZ   c           	      ó²  — |d   }t        |dt        hf«      }t        |d«      }| j                  ||«      \  }}	t        |ddd„ f«      D ]K  }
|	j                  |
j	                  d«      xs dg «      j                  |
d	   |
j	                  d
«      dœ«       ŒM i |¥|||rt        | |«      gnd ||	dœ¥t        |dt        hfdt        hfddt        hfdœ«      ¥S )NÚasset_idÚ	asset_url))))rd   rh   Ú
stream_url)Úmultibitrate)Úurl_hlsÚurl_dashru   Úvtt_listc                 ó   — t        |d   «      S )NÚfile)r   ©Ú_Úvs     rX   ú<lambda>z&RTPIE._extract_asset.<locals>.<lambda>À   s   € ÔXcÐdeÐflÑdmÓXn€ rZ   ÚcodeÚptrƒ   Úlanguage)r&   Úname)r   r#   r%   rt   ru   Úasset_thumbnailÚasset_durationÚwebr&   )r   r   Úwebpage_url)	r   Údictry   Ú
setdefaultÚgetrq   r
   r   r   )rW   Ú
asset_datar#   Úepisode_infoÚarchive_compatr{   Ú
asset_urlsrr   rt   ru   Úsub_datas              rX   Ú_extract_assetzRTPIE._extract_asset¹   s  € Ø˜jÑ)ˆÜ! *¨{¼T¸FÐ.CÓDˆ
Ü! *ð /[ó \ˆ
à!×2Ñ2°:¸xÓHÑˆ�ä$ Z°+¸zÑKnÐ1oÓpò 	ˆHØ× Ñ  §¡¨fÓ!5Ò!=¸¸rÓB×IÑIØ Ñ'Ø Ÿ™ ZÓ0ñKõ ð	ð
Øð
àØ$ñ HV¤°°zÓ!BÑ CÐ[_ØØ"ò
ô ˜:Ø/´+°Ð?Ø-´Ð/?Ð@Ø % u¬{¨mÐ<ñ(ó ð
ð 	
rZ   c                 óL   — | j                  |j                  «       › d�|¬«       y )Nz: not found in API response; falling back to web extraction)Úvideo_id)Úreport_warningÚ
capitalize)rW   Úmissing_info_namers   s      rX   Ú_report_fallback_warningzRTPIE._report_fallback_warningÙ   s-   € Ø×ÑØ ×+Ñ+Ó-Ð.Ð.hÐiØð 	õ 	!rZ   c              #   ób   K  — t        |«      D ]  \  }}| j                  |||| ¬«      –— Œ y ­w)N©r•   )Ú	enumerater˜   )rW   Úassetsr#   r”   Úidxr“   s         rX   Ú_entrieszRTPIE._entriesÞ   s>   è ø€ ä(¨Ó0ò 	d‰OˆC�Ø×%Ñ% j°*¸lÐ_bÐ[bÐ%ÓcÓcñ	dùs   ‚-/c                 óÖ  ‡— | j                  «       }|s| j                  d|«       y t        | j                  d|dd  › d|dd  › �‰xs |dddœdd|› �| j                  d	œd
¬«      dt
        h«      }|s| j                  d|«       y |||dœt        |ddt        ht        t        fdt        ht        fdt        ht        t        fdt        d¬«      hfdt        d¬«      hfdt        hfdt        ht        fdt        hfdt        ht        fdt        ht        fdœ
f«      ¥}t        |dd„ f«      }|s| j                  d|«       y ‰r@t        |ˆfd „t        f«      }|s| j                  d!‰› �|«       y | j                  |||«      S |d"   }| j                  t        |«      dkD  xr ||d#   d$d%¬&«      r$ | j                  | j!                  |||«      fi |¤ŽS | j                  |||d'¬(«      S ))Nz
auth tokenz*https://www.rtp.pt/play/api/1/get-episode/r   ú/Útrue)Úinclude_assetsÚinclude_webparamsrF   zBearer )rJ   ÚAuthorizationrK   F)ÚqueryrM   rQ   Úresultzepisode data)r   r#   r$   r.   )Úepisode_titleÚprogram_titleÚepisode_subtitle)Úepisode_descriptionÚepisode_summaryÚepisode_air_dateú )Ú	delimiterÚepisode_lastchangedÚepisode_duration_completer­   r-   Úprogram_seasonr®   )
r   Ú	alt_titler   r!   r   r   r.   r-   r<   r   r¢   c                 ó   — |d   S ©Nr{   © r„   s     rX   r‡   z)RTPIE._extract_from_api.<locals>.<lambda>  s
   € ÀAÀjÁM€ rZ   z	asset IDsc                 ó   •— |d   ‰k(  S rº   r»   )r…   r†   r{   s     €rX   r‡   z)RTPIE._extract_from_api.<locals>.<lambda>  s   ø€ ¸A¸j¹MÈXÑ<U€ rZ   zasset r   r{   zmulti-part episodezindividual part)Úplaylist_labelÚvideo_labelTr    )rY   rž   r   rT   rU   r�   rV   ÚfilterÚanyr   r   r   r˜   Ú_yes_playlistÚlenÚplaylist_resultr¤   )	rW   Ú
program_idr#   r{   Ú
auth_tokenÚepisode_datar”   r¢   r“   s	      `     rX   Ú_extract_from_apizRTPIE._extract_from_apiã   sa  ø€ Ø×+Ñ+Ó-ˆ
ÙØ×)Ñ)¨,¸
ÔCØä# D×$7Ñ$7Ø8¸ÀAÀB¸Ð8HÈÈ*ÐUVÐUWÈ.ÐIYÐZØÒ"˜
¸VÐZ`Ñ*aàØ#*¨:¨,Ð!7Ø"×.Ñ.ñð ð %8ó %ð &¬ vó/ˆñ Ø×)Ñ)¨.¸*ÔEØð Ø$Ø#ñ
ô ˜<¨)Ø<¼s¸eÄVÌSÐQØ0´3°%¼Ð@Ø JÌSÈEÔSYÔ[^Ð_Ø0´=È3Ô3OÐ2PÐQØ'<¼}ÐWZÔ?[Ð>\Ð&]Ø8¼>Ð:JÐKØ+¬c¨U´FÐ;Ø#3´k°]Ð"CØ+¬c¨U´FÐ;Ø*¬S¨E´6Ð:ñ6ð *ó ð	
ˆô$ ˜l¨XÑ7QÐ,RÓSˆÙØ×)Ñ)¨+°zÔBØáÜ% fÓ/UÔWZÐ.[Ó\ˆJÙØ×-Ñ-°°x°jÐ.AÀ:ÔNØØ×&Ñ& z°:¸|ÓLÐLà˜A‘Yˆ
à×ÑÜ�‹K˜!‰OÒ* 
¨J°zÑ,BØ/Ð=Nð ô 
ð (�4×'Ñ'Ø—‘˜f j°,Ó?ñQØCOñQð Qð ×"Ñ" :¨z¸<ÐX\Ð"Ó]Ð]rZ   zŽ(?xs)
        atob\s*\(\s*decodeURIComponent\s*\(\s*
            (\[[0-9A-Za-z%,'"]*\])
        \s*\.\s*join\(\s*(?:""|'')\s*\)\s*\)\s*\)
    c                 ó<   — | j                   j                  d„ |«      S )Nc                 ó  — t        j                  t        j                  t        j
                  j                  dj                  t        j                  | j                  d«      «      «      «      «      j                  d«      «      S )NÚ r   z
iso-8859-1)ÚjsonÚdumpsÚbase64Ú	b64decoder\   r]   ÚunquoteÚjoinÚloadsÚgroupÚdecode)Úms    rX   r‡   z%RTPIE.__unobfuscate.<locals>.<lambda>'  sU   € ”d—j‘jÜ× Ñ ¤§¡×!5Ñ!5Ø—G‘GœDŸJ™J q§w¡w¨q£zÓ2Ó3ó"ó ç‘6˜,Ó'ó)€ rZ   )Ú_RX_OBFUSCATIONÚsub)rW   Údatas     rX   Ú__unobfuscatezRTPIE.__unobfuscate%  s%   € Ø×#Ñ#×'Ñ'ñ)ð óð 	rZ   c                 ó4  — | j                  ||xs |«      }|s!| j                  d|d«      }t        | |«      g}nd }g }i }t        t	        j
                  d|«      d| j                  ht        ht        j                  ht        j                  hdft        j                  hff«      }	| j                  |	|«      \  }}|||||| j                  ddg|d ¬«      | j                  d	d
g|d ¬«      dœ| j                  ||i ¬«      ¥| j                  ddg|d ¬«      |dœ¥S )Nz\basset_id\s*:\s*"(\d+)"zasset IDz:(?:var\s+f\s*=|RTPPlayer\({[^}]+file:)\s*({[^}]+}|"[^"]+")éÿÿÿÿ.zog:descriptionztwitter:description)Údefaultzog:imageztwitter:image)r   r#   r$   rt   ru   r   r   zog:titleztwitter:title)r   r%   )Ú_download_webpageÚ_search_regexr
   r   ÚreÚfindallÚ_RTPIE__unobfuscater	   rË   rÑ   r�   Úvaluesry   Ú_html_search_metaÚ_search_json_ld)
rW   r&   rÄ   r#   r{   ÚwebpageÚold_archive_idsrt   ru   rr   s
             rX   Ú_extract_from_htmlzRTPIE._extract_from_html-  sT  € Ø×(Ñ(¨¨hÒ.D¸*ÓEˆÙØ×)Ñ)Ð*EÀwÐPZÓ[ˆHÜ.¨t°ZÓ@ÐA‰Oà"ˆOàˆØˆ	Ü!¤"§*¡*Ð-jÐlsÓ"tØ�4×%Ñ%Ð&¬¨´t·z±z°lÄTÇ[Á[ÀMÐSVÐWÔZ^×ZdÑZdÐYeÐfðwhó iˆ
à!×2Ñ2°:¸xÓHÑˆ�ð Ø$Ø#ØØ"Ø×1Ñ1Ð3CÐEZÐ2[Ð]dÐnrÐ1ÓsØ×/Ñ/°¸_Ð0MÈwÐ`dÐ/Óeñ
ð ×"Ñ" 7¨H¸bÐ"ÓAð
ð ×+Ñ+¨Z¸Ð,IÈ7Ð\`Ð+ÓaØ /ò
ð 	
rZ   c                 ó    — | j                  |«      j                  ddd«      \  }}}| j                  |||«      xs | j                  ||||«      S )NrÄ   r#   r{   )Ú_match_valid_urlrÒ   rÇ   ræ   )rW   r&   rÄ   r#   r{   s        rX   Ú_real_extractzRTPIE._real_extractH  s\   € Ø+/×+@Ñ+@ÀÓ+E×+KÑ+KÈLÐZfÐhrÓ+sÑ(ˆ
�J à×"Ñ" :¨z¸8ÓDò NØ×&Ñ& s¨J¸
ÀHÓMð	OrZ   )F)zrequired infoN)Ú__name__Ú
__module__Ú__qualname__Ú
_VALID_URLÚ_TESTSrU   rS   rY   Ústaticmethodra   ry   r˜   rž   r¤   rÇ   rÞ   ÚcompilerÕ   rà   ræ   ré   r»   rZ   rX   r   r      sŠ  „ ð J€JàEØ1àØØ(ØAØ0Ø)ØØ",Ø'Ø#Ø%Ø#ØØ!. ñ
ñð( [Ø1ð
Ø�)ð
à�5ð
ð Ð.ð
ð ÐAð	
ð
 Ð0ð
ð ˜ð
ð ˜ð
ð ˜:ð
ð ! *ð
ð Ð4ð
ð ˜að
ð Ð0ð
ð ˜Zð
ð ˜)ð
ð ˜ð
ð    ð!
ñð. TØ1àØØ,ØØAØ%Ø#Ø`Ø#Ø Ø!. ñ
ð gÐgñ#ð( FàØ$ØØ%Ø!ØØ#Ø#Ø%Ø",Ø'ñ
ð ñ!ð& FØ1àØØ$ØØ~Ø%Ø!ØØ#Ø#Ø%Ø",Ø'Ø!. ñ
ð    Ð&ñ)ð. NØ1àØØ$ØØ~Ø%Ø!ØØ#Ø#Ø%Ø",Ø'ñ
ñ	ðAs€Fðj \€KØ€Kò ð  ñQó ðQò
"ó,
ó@!ò
dò
:^ðx !�b—j‘jð "ó 	€Oòò
ó6OrZ   r   )rÍ   rË   rÞ   Úurllib.parser\   Úcommonr   r   Úutilsr   r   r	   r
   r   r   r   Úutils.traversalr   r   r»   rZ   rX   ú<module>rõ      s8   ðÛ Û Û 	Û ç *÷÷ ñ õ +ôyOˆMõ yOrZ   