
    VGhH                         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e      Z G d	 d
e      Z G d de      Zy)    N   )InfoExtractor   )ExtractorErrorfloat_or_noneint_or_nonejwt_decode_hs256parse_age_limittry_callurl_or_none)traverse_objc                       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 Zdi i fdZi i fdZd Zd Zd Zd Zd Zy)JioCinemaBaseIE	jiocinemaFNzhttps://www.jiocinema.comzhttps://www.jiocinema.com/)OriginRefererappNameRJIL_JioCinema
appVersionz5.0.0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                 J   |dv sJ |dv rJ| j                   j                  t        j                  t        j                   dt        j
                         |dv rK| j                   j                  t        j                  t        j                   dt        j                         y y )N)accessrefreshall)r   r   -access)r   r   -refresh)cachestorer   _NETRC_MACHINE
_DEVICE_ID_ACCESS_TOKEN_REFRESH_TOKEN)self
token_types     c/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/extractor/jiocinema.py_cache_tokenzJioCinemaBaseIE._cache_token*   s    9999**JJ..?3M3M2Ng0VXgXuXuw++JJ..?3M3M2Nh0WYhYwYwy ,    zDownloading API JSONc           	          | j                  |||t        j                  |d      j                         ddd| j                  |d      S )N),:)
separatorszapplication/json)zContent-TypeAccept)  i    )dataheadersexpected_status)_download_jsonjsondumpsencode_API_HEADERS)r#   urlvideo_idnoter0   r/   s         r%   	_call_apizJioCinemaBaseIE._call_api3   sd    ""4djj*&M&T&T&V 2,a ##a 	a
  / # 0 	0r'   c                 :    | j                  d| d| d |||      S )Nz https://auth-jiocinema.voot.com/zservice/apis/v4/)r9   r0   r/   )r:   )r#   serviceendpointr9   r0   r/   s         r%   _call_auth_apizJioCinemaBaseIE._call_auth_api<   s2    ~~.wi7GzRtW4  9 	9r'   c           
         t         j                  rt         j                  st        dd      | j	                  dddd| j
                  ii | j                  | j                  | j                  d| j                  	      }|j                  d
      }|r/|t         j                  k7  r|t         _        | j                  d       |d   t         _        | j                  d       y )NzUser token has expiredTexpectedtokenrefreshtokenzRefreshing tokenaccesstoken)deviceIdrefreshTokenr0   r/   refreshTokenIdr   	authTokenr   )
r   r"   r    r   r>   r!   	_APP_NAME_APP_VERSIONgetr&   )r#   responserefresh_tokens      r%   _refresh_tokenzJioCinemaBaseIE._refresh_tokenA   s    --_5O5O !9DII&&^%7"D$6$67 ?..? OO $ 3 3? ##	? '  !%56]o.L.LL-:O*i((0(=%(#r'   c                 8   dj                  t        j                  t        j                  d            t
        _        | j                  dddi | j                  dd| j                  d	| j                  d
| j                        }|d   | _
        |d   | _        y )N 
   )krB   guestzDownloading guest tokenphoneiosF)
deviceTypeosrE   freshLaunchadId)r/   rI   userId)joinrandomchoicesstringdigitsr   r    r>   rJ   rK   _GUEST_TOKEN_USER_ID)r#   guest_tokens     r%   _fetch_guest_tokenz"JioCinemaBaseIE._fetch_guest_tokenS   s    %'WWV^^FMMR-P%Q"))W7 ?..?% OO$? ##? * 	 (4#H-r'   c                     | j                  dd| |i | j                         d| j                  i| j                  t	        |ddt
        hfdt
        hfd      |      S )	Nuserz	loginotp/rD   r/   rW   rX   )rW   rX   rG   )r>   geo_verification_headersra   rJ   r   str)r#   r=   rc   r/   r9   s        r%   _call_login_apizJioCinemaBaseIE._call_login_apib   s    ""iz*D ;//1;t00; ..; {F#/#"7#-5 	;  #   	 r'   c                 j    t        fd      xs dt        t        j                         dz
        k  S )Nc                       t               d   S )Nexpr	   )rB   s   r%   <lambda>z3JioCinemaBaseIE._is_token_expired.<locals>.<lambda>n   s    !1%!8!? r'   r      )r   inttime)r#   rB   s    `r%   _is_token_expiredz!JioCinemaBaseIE._is_token_expiredm   s*    ?@EA#diik\_N_J```r'   c           
         | j                   r| j                  | j                         sy d}|j                         dk(  rt        fd      rzt        _         d}| j                  ddgt              d   }|s| j                  d	|        nt        j                  ||      r|t        _
        nj| j                  d
|        nTt        d| j                   d      |j                         dk(  rt        j                  d| d      r| j                  j                  t        j                    d      t        _
        | j                  j                  t        j                    d      t        _         t        j                  rt        j                   st        d dd      |j                         dk(  rDt        j                  d      r-| j#                          t%        | j&                        }dt)        j*                  j-                               j/                         i| j0                  }| j3                  d||d      }t5        |dt6        hf      st        d      |j9                  d      dk(  }	| j3                  d|d|	rd nd!d"|	rd#nd!i| j:                  |	rd$nd!d%d&i|d'| j=                  d(      id)      }t5        |d*      d+k(  rt        d,d      |d-   t        _
        |d.   t        _         nt        | j>                  d      t%        t        j                         d/   }
|
d0   t        _         |
d1   t        _        t        j                  rM|dk7  rH| jC                  d2       | jE                  d3      d4ur| j                  d5t        j:                   d       nut        j                  se| j                  j                  t        j                   t        j:                   d      t        _
        t        j                  r| jC                  d6       | j                  d7t        j:                   d       | j                  t        j                         r| jG                          y y )8Nz([\da-f]{8}-(?:[\da-f]{4}-){3}[\da-f]{12}rB   c                      t               S )Nrm   )passwords   r%   rn   z0JioCinemaBaseIE._perform_login.<locals>.<lambda>w   s     0 : r'   z7the `refreshToken` UUID from your browser local storagerN   rQ   )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 Tr@   devicez(?:z|\d+)r   r   z,Failed to load cached tokens for device ID ""rU   z\+?\d+numbersendzRequesting OTPOTPInfoz7There was a problem with the phone number login attemptrX   rV   verify
deviceInfoiPhoneAndroidnamez	iPhone OSiOS)platform	androidIdtype)consumptionDeviceNameinfootpz(the one-time password sent to your phonezSubmitting OTPcodei  z	Wrong OTPrF   rI   r/   r[   rE   r   cachedirFz6NOTE: For subsequent logins you can use "-u device -p r   zLogging in as device ID ")$r!   rr   lowerr   r   _configuration_argJioCinemaIE	to_screenre	fullmatchr"   report_warningr   _ACCESS_HINTr   loadr   rd   r	   ra   base64	b64encoder5   decoderK   ri   r   dictrL   r    _get_tfa_info_LOGIN_HINTrb   r&   	get_paramrO   )r#   usernameru   UUID_RErefresh_hintrN   rc   initial_datarM   	is_iphone
user_tokens     `        r%   _perform_loginzJioCinemaBaseIE._perform_loginp   s   d&<&<T=O=O&P=>>w&:;08-X $ 7 7"Va 7 bcd e$NN22>AB \\'=95BO2''*KL>(Z[$NtO`O`Nabmqs s ^^)bllc'%;PRZ.[-1ZZ___=[=[`h_iiq]r-sO*,0JJOOO<Z<Z_g^hho\p,qO)"119V9V$'ST\S]]^%_jnoo^^(R\\)X-N##%*4+<+<=K&**8??+<=DDF##L ++FKO_`H9tf*=>$%^__#-6I++Hk9BX	%+I[9$U%)__)2	D D t))*TUD  !H Hf-5$[4@@-5n-EO*,4[,AO) !!1!1DAA%o&C&CDVL
#-h#7 %/
%;"))h(.Be$~~j)6L_MgMgLhhijl //-1ZZ__..?3M3M2Nh0W.YO*--!!(+2?3M3M2NaPQ!!/"?"?@! Ar'   )__name__
__module____qualname__r   _GEO_BYPASSr!   r"   ra   rb   r    r6   rJ   rK   _API_SIGNATURES_METADATA_API_BASEr   r   r&   r:   r>   rO   rd   ri   rr   r    r'   r%   r   r      s     NKMNLHJ9FbcL,-I '*L#OAFL	>>J^ LB	B y -CBUW 0 ?Ar 9
$$.	 aM"r'   r   c                       e Zd ZdZdZ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d d!d"d#d$gd%d&id'd(d)dd*d+d*d,ddd-d.d/d0gd1d%d&id'gZd2 Zd3 Zy4)5r   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/3759931id3759931extmp4titlezPradeep to stop the wedding?descriptionz$md5:75f72d1d1a66976633345a3de6d672b1episodeepisode_numberY   seasonu   Agnisakshi…Ek Samjhauta-S1season_numberr   serieszAgnisakshi Ek Samjhautadurationg     X@	thumbnailzre:https?://.+\.jpg	age_limit   	season_id3698031upload_date20230606	timestampi w~drelease_date20230607genresDramaskip_downloadm3u8)r7   	info_dictparamsz6https://www.jiocinema.com/movies/bhediya/3754021/watch3754021Bhediyaz$md5:a6bf2900371ac2fc3f1447401a9f7bb0g     @20230525iuod20230524Comedy)r   r   r   r   r   r   r   r   r   r   r   r   c           	          t        |ddd dt        ht        f      }|s| j                  |       | j	                  ||d      \  }}| j                  |       t        |d       |dS )	Nr/   playbackUrlsc                     |d   dk(  S )N
streamtypehlsr   _vs     r%   rn   z<JioCinemaIE._extract_formats_and_subtitles.<locals>.<lambda>   s    <E1I r'   r7   r   )m3u8_idc                 $    d|d   vxs |d   dk  S )Nz/_definst_/smil:vod/r7   heighti  r   r   s     r%   rn   z<JioCinemaIE._extract_formats_and_subtitles.<locals>.<lambda>   s    31U8CYq{VYGY r'   )formats	subtitles)r   r   any
report_drm#_extract_m3u8_formats_and_subtitles_remove_duplicate_formats)r#   playbackr8   m3u8_urlr   r   s         r%   _extract_formats_and_subtitlesz*JioCinemaIE._extract_formats_and_subtitles   s    N$I5S^R_ad+f gOOH%!EEhPXbgEh&&w/ $GY\"	
 	
r'   c                 p   | j                  |      }| j                  s,| j                  | j                        r| j	                          n7| j                  r+| j                  | j                        r| j                          | j                  d| |di | j                         d| j                  xs | j                  i| j                  | j                  | j                  | j                  dddi 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dd d!d"d#d d$| j                  %      }t        |d&t        hf      }|d'k(  r| j                  d(g)       n|d*k(  r>d+}| j                  rt        |d ,      | j!                  | d-| j"                   d .       n<|d/k(  rt        d0d ,      |(|d1k7  r#t        d2t        |d3t$        hf      xs |       | j'                  | j(                   d4|dd5| d6d7d89      }|| j*                  d:| j-                  ||      t        |d;d<t$        hfd=t$        hfd>d<t$        ht.        fd?t$        hd@ hfdAdBt0        ht.        fdCt$        hfdAdDt0        ht.        fdEt2        hfdFt4        hfdGt6        hfdH
f      t        |dIdJdCt$        hfd=t$        hfdKt$        ht.        fdLt$        ht.        fdBt0        hfdMt$        ht.        fdCt$        hfdAt0        hfdNt0        hfdOt$        hfdEt2        hfdPt4        hfdQdRt$        hfdSdTt6        hfdUf      S )VNz,https://apis-jiovoot.voot.com/playbackjv/v3/zDownloading playback JSONrD   
androidwebweb)deviceiduniqueidx-apisignaturesz
x-platformzx-platform-token4kFageGroupz18+r   z3.4.0bitrateProfilexhdpi
capabilityyesnone)
aesSupportfairPlayDrmSupportplayreadyDrmSupportwidevineDRMSupport30fps1440p)frameRateSupportvideoQuality)drmCapabilityframeRateCapabilitycontinueWatchingRequireddolbydownloadRequesthevckidsSafemanufacturerWindowsmodelmultiAudioRequiredT	osVersion10parentalPinValidr   rG   r   r.   IN)	countriesi  z0This content is only available for premium usersr@   z. )methodr-   z&The requested content is not available   zJioCinema says: messagez-/voot/v1/voot-web/content/query/asset-detailszinclude:commondesktop)idsresponseTypedevicePlatformType)fatalquery)r   http_headersr/   r   fullSynopsisshowtournamentNamec                     | dk7  r| S d S )NzSeason 0r   )xs    r%   rn   z+JioCinemaIE._real_extract.<locals>.<lambda>J  s    AOq Y] r'   r   r   	fullTitle	episodeNo
ageNemonictotalDurationimages)
r   r   r   r   r   r   r   r   r   r   resultr   showName
seasonNameseasonId
uploadTimetelecastDater   r   .seoogImage)r   r   r   r   r   r   r   r   r   r   r   r   r   r   )	_match_idr!   rr   ra   rd   rO   r:   rg   rJ   r    rb   r   r   rp   raise_geo_restrictedr   raise_login_requiredr   rh   r2   r   r6   r   filterr   r
   r   r   )r#   r7   r8   r   status_code	error_msgmetadatas          r%   _real_extractzJioCinemaIE._real_extract   sX   >>#&!!d&<&<T=N=N&O##%D$:$:4;M;M$N!>>:8*Ex' 	2//1	2t11FT5F5F	2 ..	2 !OO MM#'#7#7*$)	2eE g !'	
 &+.4/5.4	& -4(/- ," +E#$ %& "5'( )* E+, 	-. /0 %d12 T34 #D56 "4#7#77 " 'R #8fse_=#%%%7D JI!!$Y>>%%2d6F6F5G&HQU%VC !ITXYY$); "<9se:L#M#\Q\"]^` ` &&&&''TUE!(, (&/* '   --!
 11(HE!
 8f 3% .6!6C5&9+cU5]4^_"+X}f!M'#/#,kK=&"Q*_,=>,}o>&6/ & 	!
" 8h%u- .6%uf5'#7"*[M!:(3%8'#/#,{m"<*[M:!/# 7*_,=>'-9#S3%0#Y>4 & #!
 !	
r'   N)r   r   r   IE_NAME
_VALID_URL_TESTSr   r(  r   r'   r%   r   r      sF   GrJq
)
5
 3
 A	

 5
 b
 4
 Q
 /
 
 /
 
 
 :
 
  J!
" wi#
& #F++. HA /%#&j
 #F+!-'FR
g
r'   r   c                   D    e Zd ZdZdZddddddd	d
ddddgZd Zd Zy)JioCinemaSeriesIEzjiocinema:serieszJhttps?://(?:www\.)?jiocinema\.com/tv-shows/(?P<slug>[\w-]+)/(?P<id>\d{3,})z1https://www.jiocinema.com/tv-shows/naagin/34999173499917naagin)r   r   x   )r7   r   playlist_mincountz=https://www.jiocinema.com/tv-shows/mtv-splitsvilla-x5/34998203499820zmtv-splitsvilla-x5i6  c              #     K   t        | j                  | j                   d| |dddi      dd dd	 f      }t        |d
      D ]  \  }}|d   }|j	                  d      xs |}t        j                  d
      D ]  }t        | j                  | j                   d|d| d| dd|d|d      dd f      }|s w|D ]C  }	 | j                  |	d   t        fi t        |	ddt        hfdt        hfdt        hfd       E   y w)Nz/voot/v1/voot-web/view/show/z Downloading series metadata JSONr
  r  )r  traysc                     |d   dk(  S )NtrayIdzseason-by-show-multifilterr   r   s     r%   rn   z,JioCinemaSeriesIE._entries.<locals>.<lambda>|  s    !H+1M"M r'   trayTabsc                     |d   S )Nr   r   r   s     r%   rn   z,JioCinemaSeriesIE._entries.<locals>.<lambda>}  s
    QtW 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                 ,    |d   xr t        |d         S )Nr   slug)r   r   s     r%   rn   z,JioCinemaSeriesIE._entries.<locals>.<lambda>  s    $0RK&	<R r'   r>  r  r   r   )r8   video_titler   r   )r   r2   r   	enumeraterL   	itertoolscount
url_resultr   rh   r   )
r#   	series_idseasons
season_numr   r   r:  page_numepisodesr   s
             r%   _entrieszJioCinemaSeriesIE._entriesx  su    t22&&''CI;OQZ.~x6P  3  R M,T./ #,G1"= 	JtIJJw'5:E%OOA. '(;(;..//de!4UG6(5Q -'(0 (	Z )< ) "#RSU  ' G)$//8DW(,,7#+?.6-F/8;-.H	O 9 	s   DD
c                     | j                  |      j                  dd      \  }}| j                  | j                  |      ||      S )Nr>  r   )_match_valid_urlgroupplaylist_resultrI  )r#   r7   r>  rD  s       r%   r(  zJioCinemaSeriesIE._real_extract  sA    //4::64Hi##DMM)$<iNNr'   N)r   r   r   r)  r*  r+  rI  r(  r   r'   r%   r-  r-  e  sQ     G^JB
 ! O)
 !F <Or'   r-  )r   rA  r3   r]   r   r_   rq   r  r   utilsr   r   r   r	   r
   r   r   utils.traversalr   r   r   r-  r   r'   r%   <module>rP     s]        	   !   +g"m g"Tb
/ b
J3O 3Or'   