
    }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!   ii
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    G/root/.hermes/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 )< 
) #GcU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[MDLcLcKd6efg 	I	*Cf}!EEz5 F G
dt$%%d9%=!DDz& E G
dt$%%d9%=$!'  	" 	!!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    XcdefldmXn 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)!*{TF.CD
!* /[ \
!22:xH$Z+zKn1o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OC%%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
    AjM rZ   z	asset IDsc                     |d   k(  S r   r   )r   r   r{   s     rX   r   z)RTPIE._extract_from_api.<locals>.<lambda>  s    AjMX<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AB8H*UVUW.IYZ"
VZ`*a#*:,!7"..  %8 % &v/ )).*E $#
 <)<seVSQ03%@ JSESY[^_0=33O2PQ'<}WZ?[>\&]8>:JK+cUF;#3k]"C+cUF;*SE6:6 * 	
$ lX7Q,RS))+zB%f/UWZ.[\J--xj.A:N&&z:|LLAY
K!O*
Jz,B/=N  
 (4''fj,?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    djj  !5!5GGDJJqwwqz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))*EwPZ[H.tZ@AO"O	!"**-jls"t4%%&tzzlT[[MSVWZ^ZdZdYefwh i
!22:xH $#"113CEZ2[]dnr1s//_0Mw`d/e
 ""7Hb"A
 ++Z,I7\`+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+KLZfhr+s(
J"":z8D N&&sJ
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Fj \KK   Q Q
",
@!
d
:^x !bjj " 	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   