U
    gM                     @   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 ddl	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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   )aes_cbc_encrypt_bytes)ExtractorErrordetermine_extfloat_or_noneint_or_none
js_to_jsontraverse_objurljoinc                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )TencentBaseIEzFSubclasses must set _API_URL, _APP_VERSION, _PLATFORM, _HOST, _REFERERc                 C   sB   | d}| ddkr>|d k	r>|dkr0|   td| d S )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: )getZraise_geo_restrictedr   )selfapi_responser    r   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/tencent.py_check_api_response   s
    
z!TencentBaseIE._check_api_responsec                 C   s   |  dd }| dtt  d| j d| d| j d|d d  d| d d  d}ttdtt	t
| d| ddd	d
d  S )NZhttp_headersz
User-Agent|z|mg3c3b04ba|0   z%||Mozilla|Netscape|Windows x86_64|00|zutf-8s   Okڣ/^r-s   PJV.B?p
whitespace)Zpadding_mode)	get_paraminttime_APP_VERSION	_PLATFORMlowerr   bytessummapordhexupper)r   video_idurlguidZuapayloadr   r   r   	_get_ckey!   s    NzTencentBaseIE._get_ckeyc           
      C   s   d tjtjtj dd}| |||}|||d|dkr>dnd|dkrLd	nd|dkrZd
nd|d	ddddddd| j| j|| j	| j
|d tjtjtj ddd}	| d| j| j||	dd|S )N    )kz8.1vtt10hls23jsonZ28Z404Z100    )vidZcidZcKeyZ
encryptVerZspcaptiontypeZsphlsZdtypeZdefnZspsrtZsphttpsotypeZspwmZhevclvdrmZspvideoZspsfrhdrhostZrefererZehostZappVerplatformr'   ZflowidzQZOutputJson=)queryr   )joinrandomchoicesstringdigitsascii_lowercaser)   _HOST_REFERERr   r   _search_json_download_webpage_API_URL)
r   Z	video_urlr%   	series_idZsubtitle_formatvideo_formatZvideo_qualityr'   Zckeyr;   r   r   r   _get_video_api_response-   sD    
   z%TencentBaseIE._get_video_api_responsec                    st  |d d d }g i  }}|d d D ]}| dsDt|d dkr| j|d t|d	d
d |ddd\}}|| | j||d q&||d  |d  d|d  dd q&| d t|dd fddftddpi }	| d| dt|	 dddt|	 ddd|	 d |	 d!|	 d"|	 d#d$d$i |	 d"d%|	 d&ddkd'
}
|D ]}|	|
 qZ||fS )(NZvlvir   uluir0   r&   m3u8)r0   ptr*   )defaultmp4Ffataltargetfnz?vkey=Zfvkey)r&   extbrflfic                    s   |d  kS )NrW   r   )_v
identifierr   r   <lambda>d       zDTencentBaseIE._extract_video_formats_and_subtitles.<locals>.<lambda>)Zexpected_typeget_allZvwZvhZaudiobandwidthi  )Zscale	bandwidthZvfpsZsnamename
resolutionZhdr10Zsdrr8   )
widthheightZabrZvbrZfpsformat	format_idZformat_noteZdynamic_rangeZhas_drm)
r   r   Z#_extract_m3u8_formats_and_subtitlesr   extend_merge_subtitlesappenddictr   update)r   r   r%   Zvideo_responseformats	subtitlesrH   fmtssubsZformat_responseZcommon_infofr   r\   r   $_extract_video_formats_and_subtitlesP   sN    
  



  z2TencentBaseIE._extract_video_formats_and_subtitlesc                 C   sh   i }t |dpdD ]P}||d  g |d |ddkrBdndt|d d	krXd
ndd q|S )N)ZsflrY   r   langr&   ZcaptionTyper   srtr-   rM   Zm3u8_nativehttp)r&   rV   protocol)r   
setdefaultr   rj   r   r   )r   r   rn   Zsubtitler   r   r   _extract_video_native_subtitlesw   s    
z-TencentBaseIE._extract_video_native_subtitlesc                 C   s   |  |||dddg}| |d  t|dp0d}|D ]4}|dkr6||  |||dd| | |d	  q6g i  }}|D ]8}	| |	|\}
}| |	}||
 | j|||d
 qz||fS )Nrt   r0   hdr   )r   rX   rY   .rb   )ZshdZfhd)Zldsdry   r-   rS   )rI   r   r   rj   rr   rx   rh   ri   )r   r&   r%   rG   Zapi_responsesZ	qualitiesqrm   rn   r   ro   rp   Znative_subtitlesr   r   r   (_extract_all_video_formats_and_subtitles   s*         


z6TencentBaseIE._extract_all_video_formats_and_subtitlesc                 C   s   t dd|pd pd S )Nuj   \s*[_\-]\s*(?:Watch online|Watch HD Video Online|WeTV|腾讯视频|(?:高清)?1080P在线观看平台).*?$r*   )resubstrip)r   titler   r   r   _get_clean_title   s     zTencentBaseIE._get_clean_titleN)__name__
__module____qualname____doc__r   r)   rI   rr   rx   r}   r   r   r   r   r   r      s   
#'r   c                   @   s,   e Zd ZdZdZdZdZdZdZdd Z	dS )		VQQBaseIEzhttps?://v\.qq\.comz#https://h5vv6.video.qq.com/getvinfo3.5.57Z10901zv.qq.comc                 C   s   | j d|d|tddS )Nz1<script[^>]*>[^<]*window\.__(?:pinia|PINIA__)\s*=z
pinia dataF)Ztransform_sourcerR   )rD   r
   r   webpager%   r   r   r   _get_webpage_metadata   s        zVQQBaseIE._get_webpage_metadataN)
r   r   r   _VALID_URL_BASErF   r   r   rB   rC   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZej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!d"d#d
dd$d%id&d'd(d)gZd*d+ Zd,S )-
VQQVideoIEz	vqq:videoz0/x/(?:page|cover/(?P<series_id>\w+))/(?P<id>\w+)z(https://v.qq.com/x/page/q326831cny0.htmlZ b11c9cb781df710d686b950376676e2aZq326831cny0rP   u*   我是选手：雷霆裂阵，终极时刻z$md5:e7ed70be89244017dac2a835a10aeb1ezre:^https?://[^?#]+q326831cny0re:^shd)idrV   r   description	thumbnailrg   r&   md5	info_dictz(https://v.qq.com/x/page/o3013za7cse.htmlZ a1bcf42c6d28c189bd2fe2d468abb287Zo3013za7cseu   欧阳娜娜VLOGz$md5:29fe847497a98e04a8c3826e499edd2ezre:^https?://[^?#]+o3013za7csez9https://v.qq.com/x/cover/7ce5noezvafma27/a00269ix3l8.htmlZ 87968df6238a65d2478f19c25adf850bZa00269ix3l8u   鸡毛飞上天 第01集$md5:8cae3534327315b3872fbef5e51b5c5bz"re:^https?://[^?#]+7ce5noezvafma27   鸡毛飞上天)r   rV   r   r   r   seriesrg   Z404)r&   r   r   skipz9https://v.qq.com/x/cover/mzc00200p29k31e/s0043cwsgj0.htmlZ fadd10bf88aec3420f06f19ee1d24c5bZs0043cwsgj0u   第1集：如何快乐吃糖？z$md5:1d8c3a0b8729ae3827fa5b2d3ebd5213zre:^https?://[^?#]+s0043cwsgj0u$   青年理工工作者生活研究所Zskip_downloadrM   )r&   r   r   paramsz9https://v.qq.com/x/cover/mcv8hkc8zk8lnov/x0036x5qqsr.htmlT)r&   Zonly_matchingc              	   C   s   |  |dd\}}| ||}| ||}| |||\}}|| | |pXt|d| |plt|d||| 	|pt|dt|ddS )Nr   rG   )global	videoInfor   )r   r   desc)r   r   Z	pic160x90)r   	coverInfor   )r   r   r   rm   rn   r   r   )
_match_valid_urlgrouprE   r   r}   r   _og_search_titler   _og_search_description_og_search_thumbnailr   r&   r%   rG   r   webpage_metadatarm   rn   r   r   r   _real_extract   s     

zVQQVideoIE._real_extractN	r   r   r   IE_NAMEr   r   
_VALID_URL_TESTSr   r   r   r   r   r      sf   
		6r   c                   @   sJ   e Zd ZdZejd Zddddddd	d
dddddd	gZdd ZdS )VQQSeriesIEz
vqq:seriesz&/x/cover/(?P<id>\w+)\.html/?(?:[?#]|$)z-https://v.qq.com/x/cover/7ce5noezvafma27.htmlZ7ce5noezvafma27r   r   r   r   r   7   r&   r   Zplaylist_countz-https://v.qq.com/x/cover/oshd7r0vy9sfq8e.htmlZoshd7r0vy9sfq8eu   恋爱细胞2z$md5:9d8a2245679f71ca828534b0f95d2a03   c              
      s   |  | | | }| | } fddtd|D }| j| ttt	|| 
t|dpf| |t|dpz| |dS )Nc                    s   g | ]}d   d| dqS )z	/x/cover//z.htmlr   ).0r%   rG   r   r   
<listcomp>  s     z-VQQSeriesIE._real_extract.<locals>.<listcomp>zQ<div[^>]+data-vid="(?P<video_id>[^"]+)"[^>]+class="[^"]+episode-item-rect--numberr   r   r   r   iegetterr   r   )	_match_idrE   r   r~   findallplaylist_from_matchesr   	functoolspartialr   r   r   r   r   )r   r&   r   r   episode_pathsr   r   r   r     s$    
   

zVQQSeriesIE._real_extractNr   r   r   r   r   r      s$   
	r   c                   @   s<   e Zd ZdZdZdZdZdZdZdd Z	dd	 Z
d
d ZdS )
WeTvBaseIEz-https?://(?:www\.)?wetv\.vip/(?:[^?#]+/)?playzhttps://play.wetv.vip/getvinfor   Z4830201zwetv.vipc                 C   s   | j t| ||d|ddS )N)propsZ	pagePropsdataFrQ   )Z_parse_jsonr   Z_search_nextjs_datar   r   r   r   r   )  s
     z WeTvBaseIE._get_webpage_metadatac                 C   s   |  |dd\}}| ||}| ||}| |||\}}|| | |pXt|dt|dpl| |||| 	|t
t|dt|dt
t|dd	S )Nr   rG   r   r   )r   duration)r   episode)	r   r   r   rm   rn   r   r   r   episode_number)r   r   rE   r   r}   r   r   r   r   r   r	   r   r   r   r   _extract_episode.  s"    
zWeTvBaseIE._extract_episodec              
      s   |  | | | }| | } fdd|dD pDtd|}| j| |tt	|| 
t|dpp| |t|dp| |dS )Nc                    s    g | ]}d   d|d  qS )z/play/r   r6   r   )r   r   r   r   r   r   G  s     z.WeTvBaseIE._extract_series.<locals>.<listcomp>Z	videoListz9<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   r&   r   r   r   r   r   r   r   _extract_seriesB  s"    

   

zWeTvBaseIE._extract_seriesN)r   r   r   r   rF   r   r   rB   rC   r   r   r   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZej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!d"dd
dgZd#d$ Zd%S )&WeTvEpisodeIEzwetv:episode7/(?P<series_id>\w+)(?:-[^?#]+)?/(?P<id>\w+)(?:-[^?#]+)?zXhttps://wetv.vip/en/play/air11ooo2rdsdi3-Cute-Programmer/v0040pr89t9-EP1-Cute-ProgrammerZ 0c70fdfaa5011ab022eebc598e64bbbeZv0040pr89t9rP   zEP1: Cute Programmer$md5:e87beab3bf9f392d6b9e541a63286343z"re:^https?://[^?#]+air11ooo2rdsdi3Cute Programmer	Episode 1r   i  r   
r   rV   r   r   r   r   r   r   r   rg   r   z4https://wetv.vip/en/play/u37kgfnfzs73kiu/p0039b9nvikZ 3b3c15ca4b9a158d8d28d5aa9d7c0a49Z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-BOOZ 71133f5c2d5d6cad3427e1b010488280Zi0042y00lxpz$md5:f7a0857dbe5fbbe2e7ad630b92b54e6az$md5:76260cb9cdc0ef76826d7ca9d92fadfazre:^https?://[^?#]+i0042y00lxpzWeTV PICK-A-BOOz	Episode 0r   i  c                 C   s
   |  |S Nr   r   r&   r   r   r   r     s    zWeTvEpisodeIE._real_extractN)	r   r   r   r   r   r   r   r   r   r   r   r   r   r   R  s\   
/r   c                   @   sF   e Zd Zejd Zdddddddd	d
dddddgZdd ZdS )WeTvSeriesIE%/(?P<id>\w+)(?:-[^/?#]+)?/?(?:[?#]|$)z5https://wetv.vip/play/air11ooo2rdsdi3-Cute-ProgrammerZair11ooo2rdsdi3r   r   r      r   z9https://wetv.vip/en/play/u37kgfnfzs73kiu-You-Are-My-GloryZu37kgfnfzs73kiur   r   r5   c                 C   s   |  |tS r   )r   r   r   r   r   r   r     s    zWeTvSeriesIE._real_extractN)r   r   r   r   r   r   r   r   r   r   r   r   r     s"   
	r   c                   @   s$   e Zd ZdZdZdZdZdZdZdS )IflixBaseIEz.https?://(?:www\.)?iflix\.com/(?:[^?#]+/)?playz https://vplay.iflix.com/getvinfor   Z330201zwww.iflix.comN)	r   r   r   r   rF   r   r   rB   rC   r   r   r   r   r     s   r   c                   @   sf   e Zd ZdZej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gZdd ZdS )IflixEpisodeIEziflix:episoder   z9https://www.iflix.com/en/play/daijrxu03yypu0s/a0040kvgazaZ 9740f9338c3a2105290d16b68fb3262fZa0040kvgazarP   z&EP1: Put Your Head On My Shoulder 2021z$md5:c095a742d3b7da6dfedd0c8170727a42z"re:^https?://[^?#]+daijrxu03yypu0sz!Put Your Head On My Shoulder 2021r   r   iO
  r   r   r   zohttps://www.iflix.com/en/play/fvvrcc3ra9lbtt1-Take-My-Brother-Away/i0029sd3gm1-EP1%EF%BC%9ATake-My-Brother-AwayZ 375c9b8478fdedca062274b2c2f53681Zi0029sd3gm1u   EP1：Take My Brother Awayz$md5:f0f7be1606af51cd94d5627de96b0c76z"re:^https?://[^?#]+fvvrcc3ra9lbtt1zTake My Brother Away   c                 C   s
   |  |S r   r   r   r   r   r   r     s    zIflixEpisodeIE._real_extractN)	r   r   r   r   r   r   r   r   r   r   r   r   r   r     s@   
 r   c                   @   sF   e Zd Zejd Zdddddddd	d
dddddgZdd ZdS )IflixSeriesIEr   z=https://www.iflix.com/en/play/g21a6qk4u1s9x22-You-Are-My-HeroZg21a6qk4u1s9x22zYou Are My Heroz$md5:9c4d844bc0799cd3d2b5aed758a2050ar   (   r   z*https://www.iflix.com/play/0s682hc45t0ohllZ0s682hc45t0ohllzMiss Gu Who Is Silentz$md5:a9651d0236f25af06435e845fa2f8c78   c                 C   s   |  |tS r   )r   r   r   r   r   r   r     s    zIflixSeriesIE._real_extractN)r   r   r   r   r   r   r   r   r   r   r   r   r     s"   
	r   )r   r=   r~   r?   r   commonr   Zaesr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s$   $ 	N'27
(