o
    iR                     @   s   d dl Z 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 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G dd deZdS )    N   )InfoExtractor   )
ExtractorErrorint_or_none
remove_endsmuggle_urlstrip_or_nonetraverse_objtry_getunified_timestampunsmuggle_urlurl_or_nonec                   @   s   e Zd Zi dddZdS )	ViuBaseIE)headersc                O   sd   | j d| g|R i |di |  |id }|ddkr0t| j d|d  dd	|S )
Nzhttps://www.viu.com/api/r   responsestatussuccess said: messageTexpected)_download_jsongeo_verification_headersgetr   IE_NAME)selfpathr   argskwargsr    r    H/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/viu.py	_call_api   s   zViuBaseIE._call_apiN)__name__
__module____qualname__r"   r    r    r    r!   r      s    r   c                   @   sX   e Zd ZdZdddddddd	id
ddddddddd	idddddgZdd ZdS )ViuIEz<(?:viu:|https?://[^/]+\.viu\.com/[a-z]{2}/media/)(?P<id>\d+)zEhttps://www.viu.com/en/media/1116705532?containerId=playlist-22168059
1116705532mp4zCitizen Khan - Ep 1z$md5:d7ea1604f49e5ba79c212c551ce2110eidexttitledescriptionskip_downloadm3u8 downloadzGeo-restricted to Indiaurl	info_dictparamsskipz'https://www.viu.com/en/media/1130599965
1130599965zJealousy Incarnate - Episode 1z$md5:d3d82375cab969415d2720b6894361e9Geo-restricted to Indonesiaz)https://india.viu.com/en/media/1126286865T)r1   only_matchingc              
   C   s  |  |}| jd|ddd|ddd d }|d	 }d }|d
p%|d}|d}|d}|rA|rA|rA| d| d| }n|d }| ||d\}	}
| D ]\}}td|}|s_qR|
|dg 	||dd qR|||d|d|t
|dt
|d|	|
d	S )Nz	clip/loadzDownloading video dataviu_desktopjsonappidfmtr*   queryitemr   r,   urlpathdurlpathtdirforwhole	jwhlsfile/hrefr(   z+subtitle_(?P<lang>[^_]+)_(?P<ext>(vtt|srt))langr+   )r1   r+   r-   moviealbumshowname	episodenoduration)	r*   r,   r-   seriesepisodeepisode_numberrI   formats	subtitles)	_match_idr"   r   #_extract_m3u8_formats_and_subtitlesitemsrematch
setdefaultgroupappendr   )r   r1   video_id
video_datar,   m3u8_urlurl_pathrB   hls_filerM   rN   keyvaluemobjr    r    r!   _real_extract?   sN   



zViuIE._real_extractNr#   r$   r%   
_VALID_URL_TESTSr_   r    r    r    r!   r&       s6    r&   c                   @   s0   e Zd ZdZdZddddddd	Zd
d ZdS )ViuPlaylistIEzviu:playlistz9https?://www\.viu\.com/[^/]+/listing/playlist-(?P<id>\d+)z0https://www.viu.com/en/listing/playlist-2246138022461380zThe Good Wife)r*   r,      r6   )r1   r2   playlist_countr4   c                 C   s   |  |}| jd|dddd| ddd }g }|d	g D ]}|d
}|s(qt|}|| d| d| q| |||dS )Nzcontainer/loadzDownloading playlist infor8   r9   z	playlist-r:   r=   	containerr?   r*   zviu:Viur,   )rO   r"   r   strrV   
url_resultplaylist_result)r   r1   playlist_idplaylist_dataentriesr?   item_idr    r    r!   r_      s.   


zViuPlaylistIE._real_extractN)r#   r$   r%   r   ra   _TESTr_   r    r    r    r!   rc   r   s    
rc   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dddd	d
ddddddddddd
dddd gZdd!d"d#d$Zdd!d%d&Zd'Z	i Z
d(d) Zd*d+ Zd,d- Zd.d/ Zd'S )0ViuOTTIEzviu:ottviuzkhttps?://(?:www\.)?viu\.com/ott/(?P<country_code>[a-z]{2})/(?P<lang_code>[a-z]{2}-[a-z]{2})/vod/(?P<id>\d+)zIhttp://www.viu.com/ott/sg/en-us/vod/3421/The%20Prime%20Minister%20and%20I3421r(   zA New Beginningz$md5:1e7486a619b6399b25ba6a41c0fe5b2cr)   r/   T)r.   
noplaylistzGeo-restricted to Singaporer0   zIhttps://www.viu.com/ott/hk/zh-hk/vod/430078/%E7%AC%AC%E5%85%AD%E6%84%9F-3430078u   大韓民國的1%z$md5:74d6db47ddd9ddb9c89a05739103ccdbr   i  u   第六感 3zYhttps://d2anahhhmp1ffz.cloudfront.net/1313295781/d2b14f48d008ef2f3a9200c98d8e9b63967b9cc2)	r*   r+   r,   r-   rL   rI   rK   rJ   	thumbnailzGeo-restricted to Hong Kongzthttps://www.viu.com/ott/hk/zh-hk/vod/444666/%E6%88%91%E7%9A%84%E5%AE%A4%E5%8F%8B%E6%98%AF%E4%B9%9D%E5%B0%BE%E7%8B%90re   23807u   我的室友是九尾狐z$md5:b42c95f2b4a316cdd6ae14ca695f33b9)r*   r,   r-   F)r1   rf   r2   r3   r4   r         )HKSGTHPH   )zzh-hkzzh-cnzen-usNc                 C   sV   t |dd }|r$|dkr$t |dd }t| j d| d| ddd	|d
p*i S )Nc                 S      | d d S )Nr   coder    xr    r    r!   <lambda>       z(ViuOTTIE._detect_error.<locals>.<lambda>r   c                 S   r   )Nr   r   r    r   r    r    r!   r      r   r   z ()Tr   data)r   r   r   r   )r   r   r   r   r    r    r!   _detect_error   s
    zViuOTTIE._detect_errorc                 C   s   | j d u r]|  \}}|d u rd S d| j|  dd}| jd|d|t|dd d}|d	s7td
| jd|d|t||dd d}| 	| |d| _ |d| j|< | j S )NBearer application/json)AuthorizationContent-Typez7https://api-gateway-global.viu.com/api/account/validatezValidating email addressemail)	principalprovider)r   r   existszInvalid email addressz1https://api-gateway-global.viu.com/api/auth/loginz
Logging in)r   passwordr   identitytoken)
_user_token_get_login_info_auth_codesr   r9   dumpsencoder   r   r   )r   country_coderW   usernamer   r   r   r    r    r!   _login   s@   


zViuOTTIE._loginc                 C   s\   d tjddd}| jd| d|ddid	t| d
ddtt	 dd
 dd S )N 
0123456789
   )kz4https://api-gateway-global.viu.com/api/auth/token?v=000r   r   zGetting bearer tokenbrowserweben0)countryCodeplatformplatformFlagLabellanguageuuid	carrierId)r   noter   r   )joinrandomchoicesr   r9   r   upperri   r   uuid4r   )r   r   rW   randr    r    r!   
_get_token   s    

zViuOTTIE._get_tokenc                    s  t i \} \ }dddj  }|r%|d< jd  dddd	 }|d
}|s?  |d}||r|dpQi }|d}	|	rg }
t	|	dd dD ],}|d}|smqc|

td  d| d| ddditt||dd  qc|
||d|dS d}|d j| pdd fdd}j sȈ j < d }z| }W n? ttfy    }|d ur|d < nd!\}d"< z| }W n ttfy   |d ur jd#d$ Y nw Y nw |std%dd&g }|d'p!i  D ]Q\}tjd(d)d d*}|ratj|}ttjj |j!dd+"|d,pPd-d.d/ |j#tj$d% }|
||d0t&|fd1dtd2 q$i }|d3pg D ]>}|dpd4}|d'r|'|g 
|d' d5d6| d7 |d8r|'| d9g 
|d8 d5d:| d7 qt(|d}||dt&|d;d |t)|d<t)|d"t*|d=||d>
S )?Nzvod/ajax-detailr   )rplatform_flag_label
product_idarea_idzhttp://www.viu.com/ott/z
/index.phpzDownloading video infor=   r   current_product	series_idrJ   productc                 S   s   t | ddS )Nnumberr   )r   r   r   r    r    r!   r   )  s    z(ViuOTTIE._real_extract.<locals>.<lambda>)r\   r   rD   z/vod/force_noplaylistTsynopsisr   namer-   Fccs_product_id3)r   language_flag_idc               
      s:   j ddddj   dd} | dS )Nz:https://api-gateway-global.viu.com/api/playback/distributeFzDownloading stream infor   )r   RefererOrigin)rW   r>   fatalr   r   stream)r   r   r   r   )stream_data)r   r>   r   r1   rW   r    r!   download_playback:  s   z1ViuOTTIE._real_extract.<locals>.download_playbackr   )T180rI   r   )methodzCannot get stream infor   r1   zs(\d+)pheightdefault)keep_blank_valuestime_duration9999999r   )rI   duration_startr(   c                    s   | d   S )Nsizer    r   )
vid_formatr    r!   r   o  r   )	format_idr1   r   r+   filesizesubtitleundsrtzSpoken text for )r1   r+   r   second_subtitle_url_ostzOn-screen text for c                 S   r   )NrJ   r   r    r   r    r    r!   r     r   r   cover_image_url)
r*   r,   r-   rJ   rK   rL   rI   rv   rM   rN   )+r   _match_valid_urlgroups_AREA_IDr   r   r   raise_geo_restricted_yes_playlistsortedrV   rj   r   rq   ri   striprk   _LANGUAGE_FLAGlowerr   r   r   KeyErrorr   raise_login_requiredrQ   int_search_regexurllibparseurlparsedict	parse_qslr>   update_replace	urlencodegeturlr   rT   r	   r   r   )r   r1   idata	lang_coder   product_datarX   r   rJ   r   rn   entryro   duration_limitr   r   r   rM   
stream_urlr   old_stream_urlrN   subrF   r,   r    )r   r>   r   r1   r   rW   r!   r_     s   







zViuOTTIE._real_extract)r#   r$   r%   r   _NETRC_MACHINEra   rb   r   r   r   r   r   r   r   r_   r    r    r    r!   rq      st    /!rq   c                   @   sV   e Zd ZdddddddZee Zee ZdZ	ed	d
Z
dddZdd ZdS )ViuOTTIndonesiaBaseIEg      ?r9   g      @g       @r8   desktop)verr<   averappverr;   r   Nr   )zx-session-idzx-client      )ADULTSteensc              	   C   sJ   | j dd ddi| ji | jd| jitd| ji ddd t_d S )	Nz"https://um.viuapi.io/user/identityzContent-typer   iiddeviceIdzDownloading token information)r   r>   r   r   r   )	r   _HEADERS_BASE_QUERY
_DEVICE_IDr9   r   r   r   _TOKEN)r   r    r    r!   _real_initialize  s   
z&ViuOTTIndonesiaBaseIE._real_initialize)r#   r$   r%   r  ri   r   r   r  _SESSION_IDr  r  _AGE_RATINGS_MAPPERr  r    r    r    r!   r     s$    	r   c                   @   s   e Zd ZdZ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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gZd.d/ Zd0S )1ViuOTTIndonesiaIEz?https?://www\.viu\.com/ott/\w+/\w+/all/video-[\w-]+-(?P<id>\d+)zhttps://www.viu.com/ott/id/id/all/video-japanese-drama-tv_shows-detective_conan_episode_793-1165863142?containerId=playlist-26271226
1165863142r(   i  zEpisode 793zDetective Conan - Episode 793i  z$md5:b79d55345bc1e0217ece22616267c9a5zhhttps://vuclipi-a.akamaihd.net/p/cloudinary/h_171,w_304,dpr_1.5,f_auto,c_thumb,q_auto:low/1165863189/d-120210101i f_)
r*   r+   rL   rK   r,   rI   r-   rv   upload_date	timestamp)r1   r2   zlhttps://www.viu.com/ott/id/id/all/video-korean-reality-tv_shows-entertainment_weekly_episode_1622-1118617054
1118617054iV  zEpisode 1622z$md5:6d68ca450004020113e9bf27ad99f0f8z#Entertainment Weekly - Episode 1622iy  zhhttps://vuclipi-a.akamaihd.net/p/cloudinary/h_171,w_304,dpr_1.5,f_auto,c_thumb,q_auto:low/1120187848/d-1i T20150101zShin Hyun-joonz
Lee Da-Hee)r*   r+   rL   rK   r-   r,   rI   rv   r  r  castzhttps://www.viu.com/ott/id/id/all/video-japanese-trailer-tv_shows-trailer_jujutsu_kaisen_ver_01-1166044219?containerId=playlist-26273140
116604421920200101i ^zTrailer 'Jujutsu Kaisen' Ver.01\   zhhttps://vuclipi-a.akamaihd.net/p/cloudinary/h_171,w_304,dpr_1.5,f_auto,c_thumb,q_auto:low/1166044240/d-1)zJunya Enokiu    Yûichi Nakamuraz Yuma Uchidaz
Asami Setor   )
r*   r+   r  r  r,   rI   rv   r-   r  	age_limitzhttps://www.viu.com/ott/id/id/all/video-japanese-animation-movies-demon_slayer_kimetsu_no_yaiba_the_movie_mugen_train-1165892707?containerId=1675060691786
1165892707z8Demon Slayer - Kimetsu no Yaiba - The Movie: Mugen Trainzcount:9zhhttps://vuclipi-a.akamaihd.net/p/cloudinary/h_171,w_304,dpr_1.5,f_auto,c_thumb,q_auto:low/1165895279/d-1z$md5:1ce9c35a3aeab384085533f746c87469im  )
r*   r+   r  r  r,   r  r  rv   r-   rI   c                 C   s  |  |}| ||}| jd| |ddtji| jddid}| |d |\}}| d|d	|d
 d }| D ]6\}}| j	d|dddd\}	}
|	rq|
rq|
|	g |
|d |
dkrq||	 dt|| d dd q;tttdd | ||dpi }|t|ddp|d|dp|d|dt|dt|d||t|ddtd pt|d!t|d"d d#| j|d$d%S )&Nz$https://um.viuapi.io/drm/v1/content/    r   ccodeID)r   r   playUrlzwindow\.__INITIAL_STATE__\s*=zinitial statecontentclipDetailsz(^subtitle_(?P<lang>[\w-]+)_(?P<ext>\w+)$zsubtitle metadata)NN)rF   r+   )r   rU   )r+   r1   vttr   c                 S   s   |  ddv S )Nz@type)	TVEpisodeMovie)r   r   r    r    r!   r     s    z1ViuOTTIndonesiaIE._real_extract.<locals>.<lambda>r   r,   display_titler   r-   rI   )imager1   dateCreated
episode_norH   )expected_typeepisodeNumber)actor.r   r   internal_age_rating)r*   r,   r-   rI   rv   r  rM   rN   rL   r  r  )rO   _download_webpager   r   r  r  rP   _search_jsonrQ   r   rT   rV   r   r
   listfilter_yield_json_ldr   r   r   r	  )r   r1   
display_idwebpagerX   rM   rN   initial_stater\   rF   r+   rK   r    r    r!   r_     sh   

zViuOTTIndonesiaIE._real_extractNr`   r    r    r    r!   r
    sr    =r
  )r9   r   rR   urllib.parser   r   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r&   rc   rq   r   r
  r    r    r    r!   <module>   s    0
R$ |!