
    V|hM                     <   S SK r S SKrS SKrS SKrSSKJr  SSKJr  SSKJ	r	J
r
JrJrJrJrJr   " S S\5      r " S	 S
\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)    N   )InfoExtractor   )aes_cbc_encrypt_bytes)ExtractorErrordetermine_extfloat_or_noneint_or_none
js_to_jsontraverse_objurljoinc                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)TencentBaseIE   zFSubclasses must set _API_URL, _APP_VERSION, _PLATFORM, _HOST, _REFERERc                     UR                  S5      nUR                  S5      S:w  a(  Ub$  US;   a  U R                  5         [        SU 35      eg g )Nmsgcodez0.0)uH   您所在区域暂无此内容版权（如设置VPN请关闭后重试）zeThis content is not available in your area due to copyright restrictions. Please choose other videos.zTencent said: )getraise_geo_restrictedr   )selfapi_responser   s      R/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/tencent.py_check_api_response!TencentBaseIE._check_api_response   s_    u%F#u,   ))+ >#!788 2A,    c                 ~   U R                  S5      S   nU S[        [        R                  " 5       5       SU R                   SU SU R                   SUS S  SUR                  5       S S  S3n[        [        S[        [        [        U5      5       SU 3S5      SS	S
S9R                  5       R                  5       $ )Nhttp_headersz
User-Agent|z|mg3c3b04ba|0   z%||Mozilla|Netscape|Windows x86_64|00|zutf-8s   Okڣ/^r-s   PJV.B?p
whitespace)padding_mode)	get_paraminttime_APP_VERSION	_PLATFORMlowerr   bytessummapordhexupper)r   video_idurlguiduapayloads         r   	_get_ckeyTencentBaseIE._get_ckey    s    ^^N+L9ZqTYY[!1 2,t?P?P>QQRSWRXXYnn%Qs3Bxj"((*Sb/1BBgi %Ac#c7+,-Qwi8'B=:%	' (+suUUW		5r   c                    SR                  [        R                  " [        R                  [        R
                  -   SS95      nU R                  X!U5      n0 SU_SU_SU_SS_S	US
:X  a  SOS_SUS:X  a  SOS_SUS:X  a  SOS_SU_SS_SS_SS_SS_SS_SS_SS_SS_S U R                  _U R                  UU R                  U R                  USR                  [        R                  " [        R                  [        R
                  -   S!S95      S".En	U R                  S#U R                  U R                  X)S$9S%U5      $ )&N    )kvidcidcKey
encryptVerz8.1spcaptiontypevtt10sphlshls2dtype3defnspsrtsphttpsotypejsonspwmhevclv28drm40spvideo4spsfrhdr100host    )refererehostappVerplatformr0   flowidzQZOutputJson=)queryr   )joinrandomchoicesstringdigitsascii_lowercaser3   _HOST_REFERERr%   r&   _search_json_download_webpage_API_URL)
r   	video_urlr.   	series_idsubtitle_formatvideo_formatvideo_qualityr0   ckeyr[   s
             r   _get_video_api_response%TencentBaseIE._get_video_api_response,   s   wwv~~fmmf6L6L&LPRST~~h48
8
9
 D
 %	

 Ou$<S#
 LE1Ss
 LE1Ss
 M
 S
 s
 V
 C
 d
 4
  s!
" #
& DJJ'
( }}''ggfnnV]]V=S=S-SWYZ[5
:   !143I3IMM8 4J 423A8M 	Mr   c                   ^ US   S   S   n/ 0 pTUS   S    H  nUR                  S5      (       d  [        US   5      S:X  aE  U R                  US   [        US	S
S9-   USSS9u  pxUR	                  U5        U R                  XS9  Mp  UR                  US    US    SUS    3SS.5        M     UR                  S5      m[        USSU4S j4[        SS9=(       d    0 n	UR                  S5      UR                  S5      [        U	R                  S5      SS9[        U	R                  S5      SS9U	R                  S5      U	R                  S 5      U	R                  S!5      U	R                  S"5      S#S#0R                  U	R                  S!5      S$5      U	R                  S%S5      S:g  S&.
n
U H  nUR                  U
5        M     XE4$ )'Nvlvir   uluirB   r/   m3u8)rB   ptr6   )defaultmp4Ffataltargetfnz?vkey=fvkey)r/   extbrflfic                    > US   T:H  $ )Nr    )_v
identifiers     r   <lambda>DTencentBaseIE._extract_video_formats_and_subtitles.<locals>.<lambda>c   s    AdGz4Ir   )expected_typeget_allvwvhaudiobandwidthi  )scale	bandwidthvfpssnamename
resolutionhdr10sdrrN   )
widthheightabrvbrfpsformat	format_idformat_notedynamic_rangehas_drm)
r   r   #_extract_m3u8_formats_and_subtitlesr   extend_merge_subtitlesappenddictr	   update)r   r   r.   video_responseformats	subtitlesrj   fmtssubsformat_responsecommon_infofr   s               @r   $_extract_video_formats_and_subtitles2TencentBaseIE._extract_video_formats_and_subtitlesO   s   %d+D1!4*406L&&-U8K*LPV*V!EE ',|]\^*__e5 F 2
 t$%%d%=*512>$3G2H~^eOfNgh    7 $''-
&4'IJ/ 524 	 $''-$((. !4!45E!FdS !4!4[!AN"&&v.%))'2(,,V4*..|<%w/33O4G4G4OQVW&**5!49
 AHH[!  !!r   c           	      
   0 n[        US5      =(       d    S Hg  nUR                  US   R                  5       / 5      R                  US   UR	                  S5      S:X  a  SOS[        US   5      S	:X  a  S
OSS.5        Mi     U$ )N)sflr   r   langr/   captionTyper   srtr>   rt   m3u8_nativehttp)r/   r~   protocol)r   
setdefaultr'   r   r   r   )r   r   r   subtitles       r   _extract_video_native_subtitles-TencentBaseIE._extract_video_native_subtitlesv   s    	$\=AGRGH  &!1!7!7!92>EE (] ;q @ue-:8E?-Kv-UM[aG  H r   c                    U R                  XUSSS5      /nU R                  US   5        [        US5      =(       d    SnU HC  nUS;  d  M  UR                  U R                  XUSSU5      5        U R                  US	   5        ME     / 0 pU HH  n	U R	                  X5      u  pU R                  U	5      nUR                  U
5        U R                  XUS
9  MJ     Xx4$ )Nr   rB   hdr   )r   r   r   .r   )shdfhd)ldsdr   r>   rz   )rm   r   r   r   r   r   r   r   )r   r/   r.   rh   api_responses	qualitiesqr   r   r   r   r   native_subtitless                r   (_extract_all_video_formats_and_subtitles6TencentBaseIE._extract_all_video_formats_and_subtitles   s    55cYPUW\^bcd  q!12 0LM_Q_	A**$$T%A%A9eUA&? @((r):;	   )LBB<ZJD#CCLQNN4 !!$!K * !!r   c                 r    [         R                  " SSU=(       d    S5      R                  5       =(       d    S $ )Nuj   \s*[_\-]\s*(?:Watch online|Watch HD Video Online|WeTV|腾讯视频|(?:高清)?1080P在线观看平台).*?$r6   )resubstrip)r   titles     r   _get_clean_titleTencentBaseIE._get_clean_title   s.    vvy"UW-(,	-r   r   N)__name__
__module____qualname____firstlineno____doc__r   r3   rm   r   r   r   r   __static_attributes__r   r   r   r   r      s+    P9
5!MF%"N	"(-r   r   c                   2    \ rS rSrSrSrSrSrSrSr	S r
Srg	)
	VQQBaseIE   zhttps?://v\.qq\.comz#https://h5vv6.video.qq.com/getvinfo3.5.5710901zv.qq.comc           	      2    U R                  SUSU[        SS9$ )Nz1<script[^>]*>[^<]*window\.__(?:pinia|PINIA__)\s*=z
pinia dataF)transform_sourcery   )rd   r   r   webpager.   s      r   _get_webpage_metadataVQQBaseIE._get_webpage_metadata   s+      @\8jPU ! W 	Wr   r   N)r   r   r   r   _VALID_URL_BASErf   r%   r&   rb   rc   r   r   r   r   r   r   r      s&    ,O4HLIEHWr   r   c                       \ rS rSrSr\R                  S-   rSSSSSS	S
SS.S.SSSSSSSSS.S.SSSSSSSSSS.SS.SSS SS!S"S#S$SS.S%S&0S'.S(S)S*./rS+ r	S,r
g-).
VQQVideoIE   z	vqq:videoz0/x/(?:page|cover/(?P<series_id>\w+))/(?P<id>\w+)z(https://v.qq.com/x/page/q326831cny0.html b11c9cb781df710d686b950376676e2aq326831cny0rw   u*   我是选手：雷霆裂阵，终极时刻z$md5:e7ed70be89244017dac2a835a10aeb1ezre:^https?://[^?#]+q326831cny0re:^shd)idr~   r   description	thumbnailr   r/   md5	info_dictz(https://v.qq.com/x/page/o3013za7cse.html a1bcf42c6d28c189bd2fe2d468abb287o3013za7cseu   欧阳娜娜VLOGz$md5:29fe847497a98e04a8c3826e499edd2ezre:^https?://[^?#]+o3013za7csez9https://v.qq.com/x/cover/7ce5noezvafma27/a00269ix3l8.html 87968df6238a65d2478f19c25adf850ba00269ix3l8u   鸡毛飞上天 第01集$md5:8cae3534327315b3872fbef5e51b5c5bz"re:^https?://[^?#]+7ce5noezvafma27   鸡毛飞上天)r   r~   r   r   r   seriesr   404)r/   r   r   skipz9https://v.qq.com/x/cover/mzc00200p29k31e/s0043cwsgj0.html fadd10bf88aec3420f06f19ee1d24c5bs0043cwsgj0u   第1集：如何快乐吃糖？z$md5:1d8c3a0b8729ae3827fa5b2d3ebd5213zre:^https?://[^?#]+s0043cwsgj0u$   青年理工工作者生活研究所skip_downloadrt   )r/   r   r   paramsz9https://v.qq.com/x/cover/mcv8hkc8zk8lnov/x0036x5qqsr.htmlT)r/   only_matchingc           
         U R                  U5      R                  SS5      u  p#U R                  X5      nU R                  XB5      nU R	                  XU5      u  pgUU R                  U R                  U5      =(       d    [        US5      5      U R                  U5      =(       d    [        US5      UUU R                  U5      =(       d    [        US5      [        US5      S.$ )Nr   rh   )global	videoInfor   )r   r   desc)r   r   	pic160x90)r   	coverInfor   )r   r   r   r   r   r   r   )
_match_valid_urlgroupre   r   r   r   _og_search_titler   _og_search_description_og_search_thumbnailr   r/   r.   rh   r   webpage_metadatar   r   s           r   _real_extractVQQVideoIE._real_extract   s    "33C8>>t[Q((755gH!JJ3Zcd**4+@+@+I ,o.:;KMm.np 77@ _+,<>]^"33G< b)*:<`a"#35UV
 	
r   r   Nr   r   r   r   IE_NAMEr   r   
_VALID_URL_TESTSr	  r   r   r   r   r   r      s    G**-``J :1AA:#
 :1'A:#
 K1/A>'#
  K16A:<#
 #F+ Ka4Fl
r   r   c                   d    \ rS rSrSr\R                  S-   rSSSSS.S	S
.SSSSS.SS
./rS r	Sr
g)VQQSeriesIE   z
vqq:seriesz&/x/cover/(?P<id>\w+)\.html/?(?:[?#]|$)z-https://v.qq.com/x/cover/7ce5noezvafma27.html7ce5noezvafma27r   r   r   r   r   7   r/   r   playlist_countz-https://v.qq.com/x/cover/oshd7r0vy9sfq8e.htmloshd7r0vy9sfq8eu   恋爱细胞2z$md5:9d8a2245679f71ca828534b0f95d2a03   c                    U R                  U5      nU R                  X5      nU R                  X25      n[        R                  " SU5       Vs/ s H  nSU SU S3PM     nnU R                  Xb[        [        U5      U R                  [        US5      =(       d    U R                  U5      5      [        US5      =(       d    U R                  U5      S9$ s  snf )NzQ<div[^>]+data-vid="(?P<video_id>[^"]+)"[^>]+class="[^"]+episode-item-rect--numberz	/x/cover//z.htmlr  r   r  r   iegetterr   r   )	_match_idre   r   r   findallplaylist_from_matchesr   r   r   r   r  r  )r   r/   rh   r   r  r.   episode_pathss          r   r	  VQQSeriesIE._real_extract  s    NN3'	((855gIQSQ[Q[`R  RX9YKq
%@ R  ))GCL''5EG](^ )J+/+@+@+IK%&68TU A 77@ * C 	C	s   Cr   Nr  r   r   r   r  r     s_    G**-VVJ ?#&A

  ?#$A

 F$Cr   r  c                   >    \ rS rSrSrSrSrSrSrSr	S r
S rS	 rS
rg)
WeTvBaseIEi  z-https?://(?:www\.)?wetv\.vip/(?:[^?#]+/)?playzhttps://play.wetv.vip/getvinfor   4830201zwetv.vipc                 V    U R                  [        U R                  X5      S5      USS9$ )N)props	pagePropsdataFrx   )_parse_jsonr   _search_nextjs_datar   s      r   r    WeTvBaseIE._get_webpage_metadata(  s5    11'DFdeE   # 	#r   c                    U R                  U5      R                  SS5      u  p#U R                  X5      nU R                  XB5      nU R	                  XU5      u  pgUU R                  U R                  U5      =(       d    [        US5      5      [        US5      =(       d    U R                  U5      UUU R                  U5      [        [        US5      5      [        US5      [        [        US5      5      S.	$ )Nr   rh   r  r  )r   duration)r   episode)	r   r   r   r   r   r   r0  r   episode_number)r  r  re   r   r   r   r  r   r  r  r
   r  s           r   _extract_episodeWeTvBaseIE._extract_episode-  s    "33C8>>t[Q((755gH!JJ3Zcd**4+@+@+I ,e.:;KMc.df()9;WX D#::7C"227;#L1AC\$]^"#35KL),7GIa*bc
 	
r   c                    U R                  U5      nU R                  X5      nU R                  XC5      nUR                  S5       Vs/ s H  nSU SUS    3PM     sn=(       d    [        R
                  " SU5      nU R                  XsU[        U5      U R                  [        US5      =(       d    U R                  U5      5      [        US5      =(       d    U R                  U5      S9$ s  snf )	N	videoListz/play/r  r9   z9<a[^>]+class="play-video__link"[^>]+href="(?P<path>[^"]+)r  r  r  )r   re   r   r   r   r!  r"  r   r   r   r  r  )r   r/   r  rh   r   r  r1  r#  s           r   _extract_seriesWeTvBaseIE._extract_seriesA  s    NN3'	((855gIO_OcOcdoOpqOpGF9+Qwu~.>?Opq nJJ'celm 	 ))GCL''5EG](^ )J+/+@+@+IK%&68TU A 77@ * C 	C rs   C,r   N)r   r   r   r   r   rf   r%   r&   rb   rc   r   r3  r7  r   r   r   r   r&  r&    s0    FO/HLIEH#

(Cr   r&  c                       \ rS rSrSr\R                  S-   rSSSSSS	S
SSSSSS.
S.SSSSSSSSSSSSS.
S.SSSSSSSS S!S"S#SS.
S./rS$ r	S%r
g&)'WeTvEpisodeIEiQ  zwetv:episode7/(?P<series_id>\w+)(?:-[^?#]+)?/(?P<id>\w+)(?:-[^?#]+)?zXhttps://wetv.vip/en/play/air11ooo2rdsdi3-Cute-Programmer/v0040pr89t9-EP1-Cute-Programmer 0c70fdfaa5011ab022eebc598e64bbbev0040pr89t9rw   zEP1: Cute Programmer$md5:e87beab3bf9f392d6b9e541a63286343z"re:^https?://[^?#]+air11ooo2rdsdi3Cute Programmer	Episode 1r   i  r   
r   r~   r   r   r   r   r1  r2  r0  r   r   z4https://wetv.vip/en/play/u37kgfnfzs73kiu/p0039b9nvik 3b3c15ca4b9a158d8d28d5aa9d7c0a49p0039b9nvikzEP1: You Are My Glory$md5:831363a4c3b4d7615e1f3854be3a123bz"re:^https?://[^?#]+u37kgfnfzs73kiuYou Are My Gloryi	  zhttps://wetv.vip/en/play/lcxgwod5hapghvw-WeTV-PICK-A-BOO/i0042y00lxp-Zhao-Lusi-Describes-The-First-Experiences-She-Had-In-Who-Rules-The-World-%7C-WeTV-PICK-A-BOO 71133f5c2d5d6cad3427e1b010488280i0042y00lxpz$md5:f7a0857dbe5fbbe2e7ad630b92b54e6az$md5:76260cb9cdc0ef76826d7ca9d92fadfazre:^https?://[^?#]+i0042y00lxpzWeTV PICK-A-BOOz	Episode 0r   i  c                 $    U R                  U5      $ Nr3  r   r/   s     r   r	  WeTvEpisodeIE._real_extract      $$S))r   r   N)r   r   r   r   r  r&  r   r  r  r	  r   r   r   r   r:  r:  Q  s    G++.hhJ j1+A>'"#
  F1,A>("#
  s1;A:'"#
=-F^*r   r:  c                   `    \ rS rSr\R
                  S-   rSSSSS.SS	.S
SSSS.SS	./rS rSr	g)WeTvSeriesIEi  %/(?P<id>\w+)(?:-[^/?#]+)?/?(?:[?#]|$)z5https://wetv.vip/play/air11ooo2rdsdi3-Cute-Programmerair11ooo2rdsdi3r?  r>  r     r  z9https://wetv.vip/en/play/u37kgfnfzs73kiu-You-Are-My-Gloryu37kgfnfzs73kiurE  rD  rU   c                 .    U R                  U[        5      $ rI  )r7  r:  rK  s     r   r	  WeTvSeriesIE._real_extract  s    ##C77r   r   N)
r   r   r   r   r&  r   r  r  r	  r   r   r   r   rO  rO    s[    ++.VVJ G#&A

  K#'A

 F$8r   rO  c                   ,    \ rS rSrSrSrSrSrSrSr	Sr
g)	IflixBaseIEi  z.https?://(?:www\.)?iflix\.com/(?:[^?#]+/)?playz https://vplay.iflix.com/getvinfor   330201zwww.iflix.comr   N)r   r   r   r   r   rf   r%   r&   rb   rc   r   r   r   r   rW  rW    s     GO1HLIEHr   rW  c                       \ rS rSrSr\R                  S-   rSSSSSS	S
SSSSSS.
S.SSSSSSSSSSSSS.
S./rS r	Sr
g)IflixEpisodeIEi  ziflix:episoder;  z9https://www.iflix.com/en/play/daijrxu03yypu0s/a0040kvgaza 9740f9338c3a2105290d16b68fb3262fa0040kvgazarw   z&EP1: Put Your Head On My Shoulder 2021z$md5:c095a742d3b7da6dfedd0c8170727a42z"re:^https?://[^?#]+daijrxu03yypu0sz!Put Your Head On My Shoulder 2021r@  r   iO
  r   rA  r   zohttps://www.iflix.com/en/play/fvvrcc3ra9lbtt1-Take-My-Brother-Away/i0029sd3gm1-EP1%EF%BC%9ATake-My-Brother-Away 375c9b8478fdedca062274b2c2f53681i0029sd3gm1u   EP1：Take My Brother Awayz$md5:f0f7be1606af51cd94d5627de96b0c76z"re:^https?://[^?#]+fvvrcc3ra9lbtt1zTake My Brother Away   c                 $    U R                  U5      $ rI  rJ  rK  s     r   r	  IflixEpisodeIE._real_extract  rM  r   r   N)r   r   r   r   r  rW  r   r  r  r	  r   r   r   r   rZ  rZ    s    G,,/iiJ K1=A>9"#
  A11A>,"#
F@*r   rZ  c                   `    \ rS rSr\R
                  S-   rSSSSS.SS	.S
SSSS.SS	./rS rSr	g)IflixSeriesIEi  rP  z=https://www.iflix.com/en/play/g21a6qk4u1s9x22-You-Are-My-Herog21a6qk4u1s9x22zYou Are My Heroz$md5:9c4d844bc0799cd3d2b5aed758a2050ar  (   r  z*https://www.iflix.com/play/0s682hc45t0ohll0s682hc45t0ohllzMiss Gu Who Is Silentz$md5:a9651d0236f25af06435e845fa2f8c78   c                 .    U R                  U[        5      $ rI  )r7  rZ  rK  s     r   r	  IflixSeriesIE._real_extract  s    ##C88r   r   N)
r   r   r   r   rW  r   r  r  r	  r   r   r   r   rc  rc    sZ    ,,/WWJ O#&A

  <#,A

 F$9r   rc  )r]   r   r_   r$   commonr   aesr   utilsr   r   r	   r
   r   r   r   r   r   r   r  r&  r:  rO  rW  rZ  rc  r   r   r   <module>rm     s     	   ! '  E-M E-PW WK
 K
\$C) $CN/C /Cd4*J 4*n8: 82* %*[ %*P9K 9r   