U
    g/I                     @   s   d dl Z d dlZ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 ddlmZ G dd deZG d	d
 d
eZG dd deZdS )    N   )InfoExtractor   )ExtractorErrorfloat_or_noneint_or_nonejwt_decode_hs256parse_age_limittry_callurl_or_none)traverse_objc                   @   s   e Zd ZdZdZdZdZdZdZdZ	dddZ
ddiZd	d
iZdZdZdZde dZdd Zdi i fddZi i fddZdd Zdd Zdd Zdd Zdd  ZdS )!JioCinemaBaseIE	jiocinemaFNzhttps://www.jiocinema.comzhttps://www.jiocinema.com/)ZOriginZRefererZappNameZRJIL_JioCinema
appVersionz5.0.0Zo668nxgzwffz&https://content-jiovoot.voot.com/psapiz1the `accessToken` from your browser local storagezvLog in with "-u phone -p <PHONE_NUMBER>" to authenticate with OTP, or use "-u token -p <ACCESS_TOKEN>" to log in with zw. If you have previously logged in with yt-dlp and your session has been cached, you can use "-u device -p <DEVICE_ID>"c                 C   sX   |dkst |dkr0| jtjtj dtj |dkrT| jtjtj dtj d S )N)accessrefreshall)r   r   -access)r   r   -refresh)AssertionErrorcachestorer   _NETRC_MACHINE
_DEVICE_ID_ACCESS_TOKEN_REFRESH_TOKEN)self
token_type r   >/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/jiocinema.py_cache_token*   s     
  
 zJioCinemaBaseIE._cache_tokenzDownloading API JSONc                 C   s2   | j |||tj|dd ddd| j|ddS )N),:)
separatorszapplication/json)zContent-TypeAccept)  i    )dataheadersZexpected_status)_download_jsonjsondumpsencode_API_HEADERS)r   urlvideo_idnoter(   r'   r   r   r   	_call_api3   s       zJioCinemaBaseIE._call_apic                 C   s    | j d| d| d |||dS )Nz https://auth-jiocinema.voot.com/zservice/apis/v4/)r0   r(   r'   )r1   )r   Zserviceendpointr0   r(   r'   r   r   r   _call_auth_api<   s       zJioCinemaBaseIE._call_auth_apic              	   C   s   t jrt jstddd| jdddd| ji| j| j| jd| jd	}|d
}|rn|t jkrn|t _| 	d |d t _| 	d d S )NzUser token has expiredTexpectedtokenZrefreshtokenzRefreshing tokenaccesstoken)deviceIdrefreshTokenr(   r'   ZrefreshTokenIdr   	authTokenr   )
r   r   r   r   r3   r   	_APP_NAME_APP_VERSIONgetr    )r   responserefresh_tokenr   r   r   _refresh_tokenA   s(      


zJioCinemaBaseIE._refresh_tokenc                 C   s\   d tjtjddt_| jddd| jdd| jd	| jd
| j	d}|d | _
|d | _d S )N 
   )kr6   ZguestzDownloading guest tokenphoneiosF)
deviceTypeosr8   ZfreshLaunchZadId)r'   r;   userId)joinrandomchoicesstringdigitsr   r   r3   r<   r=   _GUEST_TOKEN_USER_ID)r   guest_tokenr   r   r   _fetch_guest_tokenS   s"      

z"JioCinemaBaseIE._fetch_guest_tokenc                 C   sH   | j dd| ||  d| ji| jt|ddthfdthfd|dS )	Nuserz	loginotp/r7   r'   rG   rH   )rG   rH   r:   )r3   geo_verification_headersrO   r<   r   str)r   r2   rQ   r'   r0   r   r   r   _call_login_apib   s        zJioCinemaBaseIE._call_login_apic                    s$   t  fddpdtt d kS )Nc                      s   t  d S )Nexpr   r   r6   r   r   <lambda>n       z3JioCinemaBaseIE._is_token_expired.<locals>.<lambda>r      )r
   inttime)r   r6   r   rY   r   _is_token_expiredm   s    z!JioCinemaBaseIE._is_token_expiredc              
      s  | j r| | j sd S d}| dkrt fddr t_ d}| jddgtdd	 }|sl| d
|  qt	||r|t_
q| d|  ntd| j ddn| dkr&t	d| d r&| jtj  dt_
| jtj  dt_ tj
rtj s>td  dddn| dkr0t	d r0|   t| j}dt   i| j}| d||d}t|dthfstd|ddk}	| d|d |	rd!nd"d#|	rd$nd"i| j|	rd%nd"d&d'i|d(| d)id*}t|d+d,krtd-dd|d. t_
|d/ t_ nt| jddttj d0 }
|
d1 t_ |
d2 t_tj
r|dkr| !d3 | "d4d5k	r| d6tj d n4tj
s| jtjtj dt_
tj
r| !d7 | d8tj d | tj r | #  d S )9Nz([\da-f]{8}-(?:[\da-f]{4}-){3}[\da-f]{12}r6   c                      s   t  S NrX   r   passwordr   r   rZ   w   r[   z0JioCinemaBaseIE._perform_login.<locals>.<lambda>z7the `refreshToken` UUID from your browser local storager@   rB   )Zie_keyr   zTo extend the life of your login session, in addition to your access token, you can pass --extractor-args "jiocinema:refresh_token=REFRESH_TOKEN" where REFRESH_TOKEN is z!Invalid refresh_token value. Use z8The password given could not be decoded as a token; use Tr4   Zdevicez(?:z|\d+)r   r   z,Failed to load cached tokens for device ID ""rE   z\+?\d+numbersendzRequesting OTPZOTPInfoz7There was a problem with the phone number login attemptrH   rF   verifyZ
deviceInfoZiPhoneZAndroidnamez	iPhone OSZiOS)platformZ	androidIdtype)ZconsumptionDeviceNameinfoZotpz(the one-time password sent to your phonezSubmitting OTPcodei  z	Wrong OTPr9   r;   r'   rI   r8   r   ZcachedirFz6NOTE: For subsequent logins you can use "-u device -p r   zLogging in as device ID ")$r   r_   lowerr
   r   Z_configuration_argJioCinemaIEZ	to_screenre	fullmatchr   Zreport_warningr   _ACCESS_HINTr   loadr   rR   r   rO   base64	b64encoder,   decoder=   rV   r   dictr>   r   Z_get_tfa_info_LOGIN_HINTrP   r    	get_paramrA   )r   usernamerb   ZUUID_REZrefresh_hintr@   rQ   Zinitial_datar?   Z	is_iphoneZ
user_tokenr   ra   r   _perform_loginp   s    
 
$
 	 



 

zJioCinemaBaseIE._perform_login)__name__
__module____qualname__r   Z_GEO_BYPASSr   r   rO   rP   r   r-   r<   r=   _API_SIGNATURES_METADATA_API_BASErp   rv   r    r1   r3   rA   rR   rV   r_   ry   r   r   r   r   r      s.   

		r   c                   @   s   e 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gdddidddddddddddddd gd!ddidgZd"d# Zd$d% Zd&S )'rm   r   z^https?://(?:www\.)?jiocinema\.com/?(?:movies?/[^/?#]+/|tv-shows/(?:[^/?#]+/){3})(?P<id>\d{3,})z`https://www.jiocinema.com/tv-shows/agnisakshi-ek-samjhauta/1/pradeep-to-stop-the-wedding/3759931Z3759931Zmp4zPradeep to stop the wedding?z$md5:75f72d1d1a66976633345a3de6d672b1Y   u   Agnisakshi…Ek Samjhauta-S1r   zAgnisakshi Ek Samjhautag     X@zre:https?://.+\.jpg   Z3698031Z20230606i w~dZ20230607ZDrama)idexttitledescriptionepisodeepisode_numberseasonseason_numberseriesduration	thumbnail	age_limit	season_idupload_date	timestamprelease_dategenresZskip_downloadZm3u8)r.   	info_dictparamsz6https://www.jiocinema.com/movies/bhediya/3754021/watchZ3754021ZBhediyaz$md5:a6bf2900371ac2fc3f1447401a9f7bb0g     @Z20230525iuodZ20230524ZComedy)r   r   r   r   r   r   r   r   r   r   r   r   c                 C   s\   t |dddd dthtf}|s*| | | j||dd\}}| | t |dd |d	S )
Nr'   ZplaybackUrlsc                 S   s   |d dkS )NZ
streamtypehlsr   _vr   r   r   rZ      r[   z<JioCinemaIE._extract_formats_and_subtitles.<locals>.<lambda>r.   r   )Zm3u8_idc                 S   s   d|d kp|d dkS )Nz/_definst_/smil:vod/r.   heighti  r   r   r   r   r   rZ      r[   )formats	subtitles)r   r   anyZ
report_drmZ#_extract_m3u8_formats_and_subtitlesZ_remove_duplicate_formats)r   playbackr/   Zm3u8_urlr   r   r   r   r   _extract_formats_and_subtitles   s"         

z*JioCinemaIE._extract_formats_and_subtitlesc                 C   s  |  |}| js&| | jr&|   n| jr@| | jr@|   | jd| |d|  d| jpb| ji| j| j	| j
| j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| jdd}t|dthf}|dkr| jdgd n|dkr(d}| jrt|dd| j| d| j d d nL|d kr@td!ddn4|d k	rt|d"krttd#t|d$thfpl| | j| j d%|dd&| d'd(d)d*}|| jd+| ||t|d,d-thfd.thfd/d-thd0d1 hfd2thd3d1 hfd4d5thd6d1 hfd7thfd4d8thd9d1 hfd:thfd;thfd<thfd=
ft|d>d?d7thfd.thfd@thdAd1 hfdBthdCd1 hfd5thfdDthdEd1 hfd7thfd4thfdFthfdGthfd:thfdHthfdIdJthfdKdLthfdMfS )NNz,https://apis-jiovoot.voot.com/playbackjv/v3/zDownloading playback JSONr7   Z
androidwebZweb)ZdeviceidZuniqueidx-apisignaturesz
x-platformzx-platform-tokenFz18+z3.4.0Zxhdpiyesnone)Z
aesSupportZfairPlayDrmSupportZplayreadyDrmSupportZwidevineDRMSupportZ30fpsZ1440p)ZframeRateSupportZvideoQuality)ZdrmCapabilityZframeRateCapabilityWindowsT10)Z4kZageGroupr   ZbitrateProfileZ
capabilityZcontinueWatchingRequiredZdolbyZdownloadRequestZhevcZkidsSafeZmanufacturermodelZmultiAudioRequiredZ	osVersionZparentalPinValidr   r:   rk   r&   IN)Z	countriesi  z0This content is only available for premium usersr4   z. )methodr%   z&The requested content is not available   zJioCinema says: messagez-/voot/v1/voot-web/content/query/asset-detailszinclude:commonZdesktop)idsresponseTypeZdevicePlatformType)fatalquery)r   Zhttp_headersr'   rg   ZfullSynopsisshowc                 S   s   | pd S r`   r   xr   r   r   rZ   I  r[   z+JioCinemaIE._real_extract.<locals>.<lambda>ZtournamentNamec                 S   s   | dkr| S d S )NzSeason 0r   r   r   r   r   rZ   J  r[   r   r   c                 S   s   | pd S r`   r   r   r   r   r   rZ   K  r[   	fullTitleZ	episodeNoc                 S   s   | pd S r`   r   r   r   r   r   rZ   M  r[   Z
ageNemonicZtotalDurationZimages)
r   r   r   r   r   r   r   r   r   r   resultr   ZshowNamec                 S   s   | pd S r`   r   r   r   r   r   rZ   U  r[   Z
seasonNamec                 S   s   | pd S r`   r   r   r   r   r   rZ   V  r[   ZseasonIdc                 S   s   | pd S r`   r   r   r   r   r   rZ   X  r[   Z
uploadTimeZtelecastDater   r   .ZseoZogImage)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Z	_match_idr   r_   rO   rR   rA   r1   rT   r<   r   rP   r}   r   r]   Zraise_geo_restrictedr   Zraise_login_requiredrv   rU   r)   r~   r-   r   r   r	   r   r   )r   r.   r/   r   status_code	error_msgmetadatar   r   r   _real_extract   s    

  

)


 	


zJioCinemaIE._real_extractN)rz   r{   r|   IE_NAME
_VALID_URL_TESTSr   r   r   r   r   r   rm      sT   )rm   c                   @   sH   e Zd ZdZdZddddddd	d
ddddgZdd Zdd ZdS )JioCinemaSeriesIEzjiocinema:serieszJhttps?://(?:www\.)?jiocinema\.com/tv-shows/(?P<slug>[\w-]+)/(?P<id>\d{3,})z1https://www.jiocinema.com/tv-shows/naagin/3499917Z3499917Znaagin)r   r   x   )r.   r   Zplaylist_mincountz=https://www.jiocinema.com/tv-shows/mtv-splitsvilla-x5/3499820Z3499820zmtv-splitsvilla-x5i6  c           
      c   s  t | j| j d| |dddidddd d	d
d f}t|ddD ]\}}|d }|dp`|}tdD ]}t | j| j d|d| d| dd|d|ddddd f}|s qD|D ]<}	| j|	d tft |	ddt	hfdt
hfdt
hfdV  qqlqDd S )Nz/voot/v1/voot-web/view/show/z Downloading series metadata JSONr   r   )r   Ztraysc                 S   s   |d dkS )NZtrayIdzseason-by-show-multifilterr   r   r   r   r   rZ   |  r[   z,JioCinemaSeriesIE._entries.<locals>.<lambda>ZtrayTabsc                 S   s   |d S )Nr   r   r   r   r   r   rZ   }  r[   r   )startr   labelz5/voot/v1/voot-web/content/generic/series-wise-episodezDownloading season z page z JSONzepisode:asc)sortr   r   pager   c                 S   s   |d ot |d S )Nr   slug)r   r   r   r   r   rZ     r[   r   r   r   r   )r/   Zvideo_titler   r   )r   r)   r~   	enumerater>   	itertoolscountZ
url_resultrm   rU   r   )
r   	series_idZseasonsZ
season_numr   r   r   Zpage_numZepisodesr   r   r   r   _entriesx  sT        
 
 zJioCinemaSeriesIE._entriesc                 C   s*   |  |dd\}}| | |||S )Nr   r   )Z_match_valid_urlgroupZplaylist_resultr   )r   r.   r   r   r   r   r   r     s    zJioCinemaSeriesIE._real_extractN)rz   r{   r|   r   r   r   r   r   r   r   r   r   r   e  s"   r   )rr   r   r*   rK   rn   rM   r^   r   r   utilsr   r   r   r   r	   r
   r   Zutils.traversalr   r   rm   r   r   r   r   r   <module>   s   $	 + &