U
    gR                     @   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   sZ   | j d| f||d|  |id }|ddkrVt| j d|d  dd	|S )
Nzhttps://www.viu.com/api/r   responsestatussuccess said: messageTexpected)_download_jsonZgeo_verification_headersgetr   IE_NAME)selfpathr   argskwargsr    r   8/tmp/pip-unpacked-wheel-q5ljy6pj/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-22168059Z
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/1130599965Z
1130599965zJealousy Incarnate - Episode 1z$md5:d3d82375cab969415d2720b6894361e9Geo-restricted to Indonesiaz)https://india.viu.com/en/media/1126286865T)r/   Zonly_matchingc              
   C   s  |  |}| jd|ddd|ddd d }|d	 }d }|d
pJ|d}|d}|d}|r|r|r| d| d| }n|d }| ||d\}	}
| D ]>\}}td|}|sq|
|dg 	||dd q|||d|d|t
|dt
|d|	|
d	S )Nz	clip/loadzDownloading video dataviu_desktopjsonappidfmtr(   queryitemr   r*   ZurlpathdZurlpathtdirforwholeZ	jwhlsfile/hrefr&   z+subtitle_(?P<lang>[^_]+)_(?P<ext>(vtt|srt))langr)   )r/   r)   r+   Zmoviealbumshowname	episodenoduration)	r(   r*   r+   seriesepisodeepisode_numberrA   formats	subtitles)	_match_idr!   r   #_extract_m3u8_formats_and_subtitlesitemsrematch
setdefaultgroupappendr   )r   r/   video_id
video_datar*   Zm3u8_urlZurl_pathr<   Zhls_filerE   rF   keyvalueZmobjr   r   r    _real_extract?   sR    
  


zViuIE._real_extractNr"   r#   r$   
_VALID_URL_TESTSrS   r   r   r   r    r%       s8     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-22461380Z22461380zThe Good Wife)r(   r*      r3   )r/   r0   playlist_countr2   c                 C   s   |  |}| jd|dddd| ddd }g }|d	g D ]4}|d
}|sPq<t|}|| d| d| q<| |||dS )Nzcontainer/loadzDownloading playlist infor4   r5   z	playlist-r6   r9   	containerr;   r(   zviu:ZViur*   )rG   r!   r   strrN   
url_resultplaylist_result)r   r/   Zplaylist_idZplaylist_dataentriesr;   item_idr   r   r    rS      s8    
 
    zViuPlaylistIE._real_extractN)r"   r#   r$   r   rU   Z_TESTrS   r   r   r   r    rW   r   s   
rW   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:ottZ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%20IZ3421r&   zA New Beginningz$md5:1e7486a619b6399b25ba6a41c0fe5b2cr'   r-   T)r,   Z
noplaylistzGeo-restricted to Singaporer.   zIhttps://www.viu.com/ott/hk/zh-hk/vod/430078/%E7%AC%AC%E5%85%AD%E6%84%9F-3Z430078u   大韓民國的1%z$md5:74d6db47ddd9ddb9c89a05739103ccdbr   i  u   第六感 3zYhttps://d2anahhhmp1ffz.cloudfront.net/1313295781/d2b14f48d008ef2f3a9200c98d8e9b63967b9cc2)	r(   r)   r*   r+   rD   rA   rC   rB   	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%90rX   Z23807u   我的室友是九尾狐z$md5:b42c95f2b4a316cdd6ae14ca695f33b9)r(   r*   r+   F)r/   rY   r0   r1   r2   r         )ZHKZSGZTHZPH   )zzh-hkzzh-cnzen-usNc                 C   sV   t |dd }|rH|dkrHt |dd }t| j d| d| ddd	|d
pTi S )Nc                 S   s   | d d S )Nr   coder   xr   r   r    <lambda>       z(ViuOTTIE._detect_error.<locals>.<lambda>r   c                 S   s   | d d S )Nr   r   r   rf   r   r   r    rh      ri   r   z ()Tr   data)r   r   r   r   )r   r   re   r   r   r   r    _detect_error   s
     zViuOTTIE._detect_errorc                 C   s   | j d kr|  \}}|d kr"d S d| j|  dd}| jd|d|t|dd d}|d	snt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)Z	principalprovider)r   rk   existszInvalid email addressz1https://api-gateway-global.viu.com/api/auth/loginz
Logging in)rq   passwordrr   identitytoken)
_user_tokenZ_get_login_info_auth_codesr   r5   dumpsencoder   r   rl   )r   country_coderO   usernamert   r   rk   r   r   r    _login   sD    
  

  

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=Z000rp   rn   zGetting bearer tokenbrowserweben0)ZcountryCodeplatformZplatformFlagLabellanguageuuidZ	carrierId)r   noterk   rv   )joinrandomchoicesr   r5   ry   upperr[   r   uuid4rz   )r   r{   rO   Zrandr   r   r    
_get_token   s"    
  


zViuOTTIE._get_tokenc                    s  t i \} \ }dddj  }|rJ|d< jd  dddd	 }|d
}|s~  |d}||r@|dpi }|d}	|	r@g }
t	|	dd dD ]X}|d}|sq|

td  d| d| ddditt||dd  qʈ|
||d|dS d}|d j| p^dd fdd}j s j < d }z
| }W n ttfk
r*    }|d k	r|d < nd!\}d"< z
| }W n2 ttfk
r$   |d k	r jd#d$ Y nX Y nX |s>td%dd&g }|d'pPi  D ]\}tjd(d)d d*}|rtj|}ttjj |j!dd+"|d,pd-d.d/ |j#tj$d% }|
||d0t&|fd1dtd2 qVi }|d3pg D ]|}|dp d4}|d'rR|'|g 
|d' d5d6| d7 |d8r|'| d9g 
|d8 d5d:| d7 qt(|d}||dt&|d;d |t)|d<t)|d"t*|d=||d>
S )?Nzvod/ajax-detailr   )rZplatform_flag_label
product_idarea_idzhttp://www.viu.com/ott/z
/index.phpzDownloading video infor9   rk   Zcurrent_product	series_idrB   productc                 S   s   t | ddS )Nnumberr   )r   r   rf   r   r   r    rh   )  ri   z(ViuOTTIE._real_extract.<locals>.<lambda>)rQ   r   r=   z/vod/Zforce_noplaylistTZsynopsisr~   namer+   Fccs_product_id3)r   Z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 inform   )ro   ZRefererZOrigin)rO   r:   fatalr   r   stream)r   rx   rl   r   )stream_data)r{   r:   r   r/   rO   r   r    download_playback:  s       z1ViuOTTIE._real_extract.<locals>.download_playbackru   )TZ180rA   rt   )methodzCannot get stream infor   r/   zs(\d+)pheightdefault)keep_blank_valuesZtime_durationZ9999999r   )rA   Zduration_startr&   c                    s   | d   S )Nsizer   rf   )
vid_formatr   r    rh   o  ri   )Z	format_idr/   r   r)   filesizeZsubtitleZundsrtzSpoken text for )r/   r)   r   Zsecond_subtitle_urlZ_ostzOn-screen text for c                 S   s   | d d S )NrB   r   r   rf   r   r   r    rh     ri   r   Zcover_image_url)
r(   r*   r+   rB   rC   rD   rA   ra   rE   rF   )+r   Z_match_valid_urlgroups_AREA_IDr   r   r   Zraise_geo_restrictedZ_yes_playlistsortedrN   r\   r   r`   r[   stripr]   _LANGUAGE_FLAGlowerrx   r   r   KeyErrorr}   Zraise_login_requiredrI   int_search_regexurllibparseurlparsedict	parse_qslr:   update_replace	urlencodegeturlr   rL   r	   r   r   )r   r/   ZidataZ	lang_coder   Zproduct_datarP   r   rB   r   r^   entryr_   Zduration_limitr   r   rv   rE   Z
stream_urlr   Zold_stream_urlrF   subr?   r*   r   )r{   r:   r   r/   r   rO   r    rS     s    
  



  




zViuOTTIE._real_extract)r"   r#   r$   r   Z_NETRC_MACHINErU   rV   r   r   rw   rx   rl   r}   r   rS   r   r   r   r    r`      sr   /!r`   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      ?r5   g      @g       @r4   Zdesktop)verr8   ZaverZappverr7   r   Nr   )zx-session-idzx-client      )ZADULTSZteensc              	   C   sF   | j dd ddi| j| jd| jitd| ji ddd t_d S )	Nz"https://um.viuapi.io/user/identityzContent-typern   ZiidZdeviceIdzDownloading token information)r   r:   rk   r   rv   )	r   _HEADERS_BASE_QUERY
_DEVICE_IDr5   ry   rz   r   _TOKEN)r   r   r   r    _real_initialize  s     z&ViuOTTIndonesiaBaseIE._real_initialize)r"   r#   r$   r   r[   r   r   r   Z_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 d#d$d%d&gd'd(
dd)d*dddd+d'd,d-d.d/d0
dgZd1d2 Zd3S )4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-26271226Z
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-1Z20210101i f_)
r(   r)   rD   rC   r*   rA   r+   ra   upload_date	timestamp)r/   r0   zlhttps://www.viu.com/ott/id/id/all/video-korean-reality-tv_shows-entertainment_weekly_episode_1622-1118617054Z
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 TZ20150101zShin Hyun-joonz
Lee Da-Hee)r(   r)   rD   rC   r+   r*   rA   ra   r   r   castzhttps://www.viu.com/ott/id/id/all/video-japanese-trailer-tv_shows-trailer_jujutsu_kaisen_ver_01-1166044219?containerId=playlist-26273140Z
1166044219Z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-1zJunya Enokiu    Yûichi Nakamuraz Yuma Uchidaz
Asami Setor   )
r(   r)   r   r   r*   rA   ra   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=1675060691786Z
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   ra   r+   rA   c                 C   s  |  |}| ||}| jd| |ddtji| jddid}| |d |\}}| d|d	|d
 d }| D ]l\}}| j	d|dddd\}	}
|	rt|
rt|
|	g |
|d |
dkrt||	 dt|| d dd qttttdd | ||dpi }|t|ddp |d|dp4|d|dt|dt|d||t|ddtd prt|d!t|d"d d#| j|d$d%S )&Nz$https://um.viuapi.io/drm/v1/content/ri   ro   ZccodeZID)rk   r   ZplayUrlzwindow\.__INITIAL_STATE__\s*=zinitial statecontentZclipDetailsz(^subtitle_(?P<lang>[\w-]+)_(?P<ext>\w+)$zsubtitle metadata)NN)r?   r)   )r   rM   )r)   r/   Zvttr   c                 S   s   |  ddkS )Nz@type)Z	TVEpisodeZMovie)r   rf   r   r   r    rh     ri   z1ViuOTTIndonesiaIE._real_extract.<locals>.<lambda>r   r*   Zdisplay_titler   r+   rA   )imager/   ZdateCreatedZ
episode_nor@   )Zexpected_typeZepisodeNumber)Zactor.r   r   Zinternal_age_rating)r(   r*   r+   rA   ra   r   rE   rF   rD   r   r   )rG   Z_download_webpager   r   r   r   rH   Z_search_jsonrI   r   rL   rN   r   r
   listfilterZ_yield_json_ldr   r   r   r   )r   r/   Z
display_idZwebpagerP   rE   rF   Zinitial_staterQ   r?   r)   rC   r   r   r    rS     sv    
       

 
zViuOTTIndonesiaIE._real_extractNrT   r   r   r   r    r     sp   
=r   )r5   r   rJ   urllib.parser   r   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r%   rW   r`   r   r   r   r   r   r    <module>   s   0
R$ |!