o
    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m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mZmZmZmZmZmZmZ dd ZG d	d
 d
eZG dd deZG dd deZdS )    N   )InfoExtractor)PhantomJSwrapper   )ExtractorError
clean_htmlfloat_or_noneformat_fieldget_element_by_attributeget_element_by_idint_or_none
js_to_jsonparse_age_limitparse_durationparse_iso8601parse_resolution	qualitiesremove_startstr_or_nonetraverse_objurljoinc                 C   s   t |   S N)hashlibmd5encode	hexdigest)text r   J/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/iqiyi.pymd5_text   s   r   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d d!ddgZd"d#d$d%d&d&d'd(d)Zd*d+ Zd,d- Z	d.d/ Z
d0S )1IqiyiIEiqiyiu	   爱奇艺z9https?://(?:(?:[^.]+\.)?iqiyi\.com|www\.pps\.tv)/.+\.htmlz&http://www.iqiyi.com/v_19rrojlavg.html 9c1fb1b99d192b21c559e5a1a2cb3c73mp4u.   美国德州空中惊现奇异云团 酷似UFO)idexttitle)url	info_dictz&http://www.iqiyi.com/v_19rrhnnclk.html b7dc800a4004b1b57749d9abae0472da e3f585b550a280af23c98b6cb2be19fbu   re:^(?:名侦探柯南 国语版：第752集 迫近灰原秘密的黑影 下篇|名偵探柯南 國語版：第752集 迫近灰原秘密的黑影 下篇)$zGeo-restricted to China)r'   r   r(   skipz&http://www.iqiyi.com/w_19rt6o8t9p.htmlTr'   only_matchingz&http://www.iqiyi.com/a_19rrhbc6kt.htmlzhttp://yule.iqiyi.com/pcb.html 4a0af228fddb55ec96398a364248ed7fu2   第2017-04-21期 女艺人频遭极端粉丝骚扰z&http://www.iqiyi.com/v_19rrny4w8w.html f3cf468b39dddb30d676f89a91200dc1u   泰坦尼克号)r'   r(   r+   z&http://www.iqiyi.com/a_19rrhb8ce1.html	202918101u   灌篮高手 国语版)r$   r&   e   )r'   r(   playlist_countz#http://www.pps.tv/w_19rrbav0ph.htmlr   r                  )961221417518c                 C   sb   t t d }d}tt|| | }||d||d}| jd| d| d|dd ||  d	S )
N   d5fb4bd9d50c4be6948c97edd7254b0e 76f90cbd92f94a2e925d83e8ccd22cb7)tvidvidsrcsctz!http://cache.m.iqiyi.com/jp/tmts//c                 S   s
   t | dS )Nvar tvInfoJs=)r   )sr   r   r   <lambda>w   s   
 z&IqiyiIE.get_raw_data.<locals>.<lambda>)transform_sourcequeryheaders)inttimer   str_download_jsongeo_verification_headers)selfrC   video_idtmkeyrF   paramsr   r   r   get_raw_datah   s   zIqiyiIE.get_raw_datac              	   C   s   d}t d|}|sd S | d|d}| jd|ddd}tt| j|}td	D ]A}| jd
| d| d| d|d| d| d}| 	t
|d|}	|	d d }
|
D ]}|| |d  qUt|
|k rj nq)| |||S )N2   zQ<a[^>]+class="site-piclist_pic_link"[^>]+href="(http://www\.iqiyi\.com/.+\.html)"zalbumId\s*:\s*(\d+),zalbum IDzdata-share-title="([^"]+)"zalbum titleFfatalr   z&http://cache.video.qiyi.com/jp/avlist/rH   zDownload playlist page z!Failed to download playlist page noteerrnoterI   datavlistvurl)refindall_search_regexlistmap
url_result	itertoolscount_download_webpage_parse_jsonr   appendlenplaylist_result)rT   webpage	PAGE_SIZElinksalbum_idalbum_titleentriespage_numpagelist_pagepagelistra   itemr   r   r   _extract_playlistz   s>   
zIqiyiIE._extract_playlistc                 C   s8  | j |ddd}| jd|dd d}|d u r"| |}|r|S td| d|d	}g }td
D ]R}| ||}|d dkrO|d dkrG|   td|d  |d }	|	d D ]}
d|
vr^qWt|
d }||
d |d| j	
|ddd qW|r{ n| d
| q/td|pttdd|p| d|d}|||dS )Ntemp_idzdownload video page)r^   z6data-(?:player|shareplattrigger)-tvid\s*=\s*[\'"](\d+)rC   defaultzCan't find any videoz>data-(?:player|shareplattrigger)-videoid\s*=\s*[\'"]([a-f\d]+)rU   r5   codeA00000A00111z!Unable to load data. Error code: r`   vidlm3utxvdr#   m3u8_native)r'   	format_idr%   qualityprotocolzwidget-videotitleclasszmod-play-titz<<span[^>]+data-videochanged-title="word"[^>]*>([^<]+)</span>r&   )r$   r&   formats)rk   re   rz   r   rangerY   raise_geo_restrictedrQ   rm   _FORMATS_MAPget_sleepr   r   r
   _html_search_regex)rT   r'   rp   rC   ro   rU   r   _raw_datar`   streamr   r&   r   r   r   _real_extract   sZ   


zIqiyiIE._real_extractN)__name__
__module____qualname__IE_NAMEIE_DESC
_VALID_URL_TESTSr   rY   rz   r   r   r   r   r   r    "   sv    	
6!r    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edddidgddddgZdddddddd d!Zd"d#d$d%d&d'd(d)d*d+d,d-d.Z	d/Z
d0d1 Zd2d3 Zd4d5 Zd;d7d8Zd9d: Zd6S )<IqIEziq.comzInternational version of iQiyiz8https?://(?:www\.)?iq\.com/play/(?:[\w%-]*-)?(?P<id>\w+)z:https://www.iq.com/play/one-piece-episode-1000-1ma1i6ferf4 2d7caf6eeca8a32b407094b33b757d39r#   1ma1i6ferf4u   航海王 第1000集,   Subtitle available on Sunday 4PM（GMT+8）.i  iKa20211121r@   zEpisode 1000	One Piece   )r%   r$   r&   descriptionduration	timestampupload_dateepisode_numberepisodeseries	age_limitaverage_ratingformat500format is restricted)r'   r   r(   rX   expected_warningsz:https://www.iq.com/play/mermaid-in-the-fog-2021-gbdpx13bs4Tr,   240P360P480P720P1080P1080P502K4K)100200300r   600610700800zh_CNzh_TWenkojathmyvir$   esptar)r9   r:   3r<   r>   r?   r;   2324262728a  
        console.log(page.evaluate(function() {
            var tvid = "%(tvid)s"; var vid = "%(vid)s"; var src = "%(src)s";
            var uid = "%(uid)s"; var dfp = "%(dfp)s"; var mode = "%(mode)s"; var lang = "%(lang)s";
            var bid_list = %(bid_list)s; var ut_list = %(ut_list)s; var tm = new Date().getTime();
            var cmd5x_func = %(cmd5x_func)s; var cmd5x_exporter = {}; cmd5x_func({}, cmd5x_exporter, {}); var cmd5x = cmd5x_exporter.cmd5x;
            var authKey = cmd5x(cmd5x('') + tm + '' + tvid);
            var k_uid = Array.apply(null, Array(32)).map(function() {return Math.floor(Math.random() * 15).toString(16)}).join('');
            var dash_paths = {};
            bid_list.forEach(function(bid) {
                var query = {
                    'tvid': tvid,
                    'bid': bid,
                    'ds': 1,
                    'vid': vid,
                    'src': src,
                    'vt': 0,
                    'rs': 1,
                    'uid': uid,
                    'ori': 'pcw',
                    'ps': 1,
                    'k_uid': k_uid,
                    'pt': 0,
                    'd': 0,
                    's': '',
                    'lid': '',
                    'slid': 0,
                    'cf': '',
                    'ct': '',
                    'authKey': authKey,
                    'k_tag': 1,
                    'ost': 0,
                    'ppt': 0,
                    'dfp': dfp,
                    'prio': JSON.stringify({
                        'ff': 'f4v',
                        'code': 2
                    }),
                    'k_err_retries': 0,
                    'up': '',
                    'su': 2,
                    'applang': lang,
                    'sver': 2,
                    'X-USER-MODE': mode,
                    'qd_v': 2,
                    'tm': tm,
                    'qdy': 'a',
                    'qds': 0,
                    'k_ft1': '143486267424900',
                    'k_ft4': '1572868',
                    'k_ft7': '4',
                    'k_ft5': '1',
                    'bop': JSON.stringify({
                        'version': '10.0',
                        'dfp': dfp
                    }),
                };
                var enc_params = [];
                for (var prop in query) {
                    enc_params.push(encodeURIComponent(prop) + '=' + encodeURIComponent(query[prop]));
                }
                ut_list.forEach(function(ut) {
                    enc_params.push('ut=' + ut);
                })
                var dash_path = '/dash?' + enc_params.join('&'); dash_path += '&vf=' + cmd5x(dash_path);
                dash_paths[bid] = dash_path;
            });
            return JSON.stringify(dash_paths);
        }));
        saveAndExit();
    c              
   C   s   | j dd}|r|S | | d|d}| j||ddd}| jd|d	|d
dtd}| jd|d|ddtddp8i }t|D ]2}||pE|}	| jd|	 d||  d|d| ddddp^d}
d|
v ro| j 	dd|
 |
  S q=t
d)Niq	player_jszT<script src="((?:https?:)?//stc\.iqiyipic\.com/_next/static/chunks/webpack-\w+\.js)"zwebpack URLzDownloading webpack JSzUnable to download webpack JSr]   z["\']\s*\+\s*zJS locationsz.{\s*(?:\d+\s*:\s*["\'][\da-f]+["\']\s*,?\s*)+}z\[\w+\]\+["\']\.js)contains_patternend_patternrL   z["\']\s*\+\(\s*zreplacement mapz-{\s*(?:\d+\s*:\s*["\'][\w.-]+["\']\s*,?\s*)+}z\[\w+\]\|\|\w+\)\+["\']\.F)r   r   rL   r\   z-https://stc.iqiyipic.com/_next/static/chunks/.z.jszDownloading #z
 module JSzUnable to download module JSr^   r_   r\    zvms requestzUnable to extract player JS)cacheload_proto_relative_urlre   rk   _search_jsonr   reversedr   storer   )rT   rp   rU   player_js_cachewebpack_js_url
webpack_jswebpack_mapreplacement_mapmodule_indexreal_module	module_jsr   r   r   _extract_vms_player_jsS  sB   zIqIE._extract_vms_player_jsc                 C   s   |  d| ||dS )Nz<,\s*(function\s*\([^\)]*\)\s*{\s*var _qda.+_qdc\(\)\s*})\s*,zsignature function)re   r   rT   rp   rU   r   r   r   _extract_cmd5x_functionp  s   zIqIE._extract_cmd5x_functionc              
      sD   j d||d|dddtd  sd S  fdd D _d S )	Nz:function\s*\([^)]*\)\s*\{\s*"use strict";?\s*var \w\s*=\s*z
video tagsz"{\s*\d+\s*:\s*\{\s*nbid\s*:.+}\s*}z\s*,\s*\w\s*=\s*\{\s*getNewVdF)r   r   r\   rL   c              
      s*   i | ]}|t  |d ftj|dqS )valueexpected_typer}   )r   rQ   	_BID_TAGSr   ).0bidextracted_bid_tagsrT   r   r   
<dictcomp>|  s    z)IqIE._update_bid_tags.<locals>.<dictcomp>)r   r   r   r   r   r   r   r   _update_bid_tagst  s   zIqIE._update_bid_tagsNc                 C   s   |  d|}|r|jS |S )Nzhttps://iq.com/)_get_cookiesr   r   )rT   namer}   cookier   r   r   _get_cookie  s   zIqIE._get_cookiec                    s  |  |}| ||}| || | ||d }|d d }|d }t| j| dd|tjj	ddd	d
d}|r^| j
d|dddd| dd| dd| ddddd}t|dtd}	ndg}	| t| ddj|dd|| j|d  |d! t|d"td#d$|| d%d| dd| ddd&d'dg| j  d( d&d'|	 d( | ||d)
 d*d  |}
g i }}| j
td+|
d |d,d-d.d/ td0tdd1}td2tdr| d3t|d d4 ttd5tdD ] |
 }|s| d6  d7 qt| j
td+||d8| j   d9dd:d/td}t|d;d< fd=d>ftdd1p*i }g }|d?rH|| jt|d@dA|d? dB ddC |dDrb|| jt|d@dA|dD  ddE |dFr|dGdH}|dHkr| j |dF dB ddI\}}|| n3|dJkrt| j|dF |ddKdLtd}|sq| !| |d@dA\}}|| n| | dM |s|dNr| | j   dO n| dP| j   dQ |D ]}|"t#t$| j  | j  dRt%|dS q|| qtdTtdD ]#| j&tdUdV}|'|g fdWdXdYD  q|dZr=|d[r=|d[n|}||d\ |||d]t(|d^t)|d_t|d`tdt*|dat|dbtdt|dctdt|ddpvd |dedfS )gNpropsinitialStateplaycurVideoInfoI00002z{}F)rL   r\   )r`   uidr   r|   z https://pcw-api.iq.com/api/vtypezDownloading VIP datazUnable to download VIP datar   r3   modintllangen_usQC005r   )batch
platformIdmodeCodelangCodedeviceId)r^   r_   rM   r\   )r`   all_vip.vipType)r   0i )timeoutz9Executing signature code (this may take a couple minutes)z<!DOCTYPE html>tvIdrD   )initialProps	pagePropsptid04022001010011000000r   dfp[,])
rC   rD   rE   r   r  moder   bid_listut_list
cmd5x_func)note2htmlrU   jscodezhttps://cache-video.iq.comz%Downloading initial video format infoz,Unable to download initial video format infor]   r`   )boss_ts)Nr`   )previewTimertime)r   get_all)r  r`   prvzThis preview video is limited{}z to %s seconds)programvideo.r   zUnknown format id: z%. It is currently not being extractedzDownloading format data for zUnable to download format datar   r  r   c                    s   t |d  kS )Nr   )rQ   )r   v)r   r   r   rK     s    z$IqIE._real_extract.<locals>.<lambda>m3u8Urldm3u8zhttps://cache-m.iq.com/dc/dt/r#   )m3u8_idr\   mpdUrl)mpd_idr\   m3u8ffts)r%   r$  r\   m4sr[   )payload.r`   z$ formats are currently not supportedrJ   z format is restrictedzUnable to extract z format)r   format_notescrsz)r  stl.lid_namec                    s6   g | ]\}} |r|t  d d| dqS )dstlzhttp://meta.video.iqiyi.com)r%   r'   )r   r   )r   
format_key
format_ext)initial_format_data
sub_formatr   r   
<listcomp>  s    
z&IqIE._real_extract.<locals>.<listcomp>))srtr7  )webvttvttalbumId	albumInfor   	mergeDescrn   rating)playScoreInfoscoreisoUploadDate)videoTagMap..r   )actorArr.r   order	albumName)r$   r&   r   	subtitlesr   r   r   r   r   
categoriescastr   r   )+	_match_idrk   r   _search_nextjs_datar   rl   r   urllibparseunquoterR   r   r   r   _DASH_JSrQ   joinr   keysr   stripr   r   r   report_warningr   r	   setdictextend_extract_m3u8_formats_extract_mpd_formats!_parse_m3u8_formats_and_subtitles _parse_mpd_formats_and_subtitlesupdater   rf   r   	_LID_TAGS
setdefaultr   r   r   )rT   r'   rU   rp   
next_props	page_data
video_infor   vip_datar  
dash_pathsr   rE  preview_time	dash_pathformat_datavideo_formatextracted_formatsr(  m3u8_formatsr   mpd_datampd_formatsfr   extra_metadatar   )r   r4  r5  r   r     s  














&zIqIE._real_extractr   )r   r   r   r   r   r   floatr   r   rZ  rM  r   r   r   r   r   r   r   r   r   r      sn    H
r   c                   @   sd   e Zd ZdZdZddddddd	d
ddddddddg ddeddgdgZdddZdd ZdS )	IqAlbumIEziq.com:albumz9https?://(?:www\.)?iq\.com/album/(?:[\w%-]*-)?(?P<id>\w+)z3https://www.iq.com/album/one-piece-1999-1bk9icvr3311bk9icvr331r   r   )r$   r&   r      )r'   r(   playlist_mincountu6   https://www.iq.com/album/九龙城寨-2021-22yjnij099kr#   22yjnij099ku   九龙城寨z$md5:8a09f50b8ba0db4dc69bc7c844228044i  iKa20220111)zShi Yan NengzYu Langz	Peter  lvz
Sun Zi JunzYang Xiao Bor   )r%   r$   r&   r   r   r   r   r   rG  r   r   r   )r'   r(   r   Nr   r   c           	      c   s    |D ]C}| j d| |d|dd dd|||d |d d	d
}|d d D ]}| d|dp6|d  t |d|dV  q)qd S )Nz-https://pcw-api.iq.com/api/episodeListSource/z Downloading video list episodes msgr   zUnable to download video listr3   tofrom)r  r  r  endOrder
startOrder)r^   r_   rM   r`   epgzhttps://www.iq.com/play/%splayLocSuffix	qipuIdStrr   )rR   r   rh   r   ie_key)	rT   album_id_numpage_rangesrs   	mode_code	lang_code
page_rangepager   r   r   r   _entries'  s&   

zIqAlbumIE._entriesc                 C   s   |  |}| ||}| ||}|d d d d }|ddkr-| d| t S | | |d |d	 |t	|d
t	|d||d|dS )Nr   r   albumvideoAlbumInfo	videoTypesingleVideozhttps://www.iq.com/play/r:  totalPageRange)r   r  r  r  )r   r  r  r  r   desc)
rH  rk   rI  r   rh   r   rz  ro   r  r   )rT   r'   rs   rp   	next_data
album_datar   r   r   r   7  s   
zIqAlbumIE._real_extract)Nr   r   )	r   r   r   r   r   rk  r   r  r   r   r   r   r   rl  	  s8    

rl  ) r   ri   rc   rP   urllib.parserJ  commonr   openloadr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   rl  r   r   r   r   <module>   s    L 3  7