U
    g y                     @   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mZmZ dd ZG d	d
 d
ZG d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decode_packed_codesfloat_or_noneformat_fieldget_element_by_attributeget_element_by_idint_or_none
js_to_jsonohdave_rsa_encrypt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   :/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/iqiyi.pymd5_text    s    r!   c                   @   s   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dd Z
d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 ) IqiyiSDKc                 C   s   || _ || _|| _d S r   )targetip	timestamp)selfr#   r$   r%   r   r   r    __init__%   s    zIqiyiSDK.__init__c                 C   s   t tdd | D S )Nc                 s   s   | ]}t |d V  qdS )   N)int.0pr   r   r    	<genexpr>,   s     z%IqiyiSDK.split_sum.<locals>.<genexpr>)strsum)datar   r   r    	split_sum*   s    zIqiyiSDK.split_sumc                 C   s$   t | trt| } tttt| S r   )
isinstancer)   r.   r/   map)numr   r   r    	digit_sum.   s    
zIqiyiSDK.digit_sumc                 C   s<   |  t| jd d d }|  t| jdd d }||fS )Nr   r   )r5   r.   r%   r&   ZevenZoddr   r   r    even_odd4   s    zIqiyiSDK.even_oddc                 C   s   t | j| _g }td| D ]$}|| j|| ||d    qd| rf|| jdd|  d   |ttt| jdfS )N    r   .)	r!   r#   rangeappendlistr3   r)   r$   split)r&   	chunksizechunksir   r   r    
preprocess9   s    "zIqiyiSDK.preprocessc                    s4   |  d\}}|d d fdd|D  | _d S )Nr8   r    c                 3   s   | ]}t |  V  qd S r   r.   r*   modulusr   r    r-   D   s     zIqiyiSDK.mod.<locals>.<genexpr>)rA   joinr#   )r&   rE   r?   r$   r   rD   r    modB   s    zIqiyiSDK.modc                 C   s   dddd}|  |\}}d}tt|D ]N}|dk rJt|| ||  nd}|dkrh||||  7 }q*||| | 7 }q*|| _d S )N   
   d   )         rB   rK   rM   )rA   r:   lenr.   r#   )r&   r>   Zmodulus_mapr?   r$   retr@   Zip_partr   r   r    r=   F   s     zIqiyiSDK.splitc                 C   s@   t | j| _| | jd d | j | | jdd   | _d S )Nr(   r!   r#   r1   r&   r   r   r    handle_input16W   s    zIqiyiSDK.handle_input16c                 C   sT   t | j| _d}tdD ]0}| jd| d|d   }|| || 7 }q|| _d S )NrB   rK   rM   r   )r!   r#   r:   r1   )r&   rO   r@   partr   r   r    handle_input8[   s    zIqiyiSDK.handle_input8c                 C   s$   t | j| _| | j| j | _d S r   rP   rQ   r   r   r    	handleSumc   s    zIqiyiSDK.handleSumc                    s\   t | j| _t| j}t|jd|j d|j d |  jd	 fdd|D 7  _d S )Nz%02d)ymdrB   c                 3   s   | ]} | V  qd S r   r   )r+   cstringsr   r    r-   o   s     z IqiyiSDK.date.<locals>.<genexpr>)
r!   r#   time	localtimer%   r.   tm_yeartm_montm_mdayrF   )r&   schemerX   r   rZ   r    dateg   s    zIqiyiSDK.datec                 C   s$   |   \}}|t| j | | _d S r   r7   r!   r#   r6   r   r   r    split_time_even_oddq   s    zIqiyiSDK.split_time_even_oddc                 C   s$   |   \}}|t| j | | _d S r   rc   r6   r   r   r    split_time_odd_evenu   s    zIqiyiSDK.split_time_odd_evenc                 C   s4   |  d\}}tt||d  | | j | _d S Nr8   r   )rA   r.   r/   r5   r%   r#   r&   r?   r$   r   r   r    split_ip_time_sumy   s    zIqiyiSDK.split_ip_time_sumc                 C   s4   |  d\}}| | j|d  tt| | _d S rf   )rA   r5   r%   r.   r/   r#   rg   r   r   r    split_time_ip_sum}   s    zIqiyiSDK.split_time_ip_sumN)__name__
__module____qualname__r'   staticmethodr1   r5   r7   rA   rG   r=   rR   rT   rU   rb   rd   re   rh   ri   r   r   r   r    r"   $   s"   

	
r"   c                   @   s   e Zd Zdd Zdd ZdS )IqiyiSDKInterpreterc                 C   s
   || _ d S r   )sdk_code)r&   ro   r   r   r    r'      s    zIqiyiSDKInterpreter.__init__c                 C   s   t | j| _td| j}t|||}|j|j|j|j|j	|j
|jd}|D ]}td|rt|t|dd   qLtd|r||dd   qLtd|r|t|dd   qL||kr||   qLtd	| qL|jS )
Nzinput=([a-zA-Z0-9]+)\(input)rU   ZhandleInput8ZhandleInput16ZsplitTimeEvenOddZsplitTimeOddEvenZsplitIpTimeSumZsplitTimeIpSumzmod\d+   zdate[ymd]{3}rK   zsplit\d+rL   zUnknown function )r   ro   refindallr"   rU   rT   rR   rd   re   rh   ri   matchrG   r)   rb   r=   r   r#   )r&   r#   r$   r%   Z	functionssdkZother_functionsfunctionr   r   r    run   s,    	zIqiyiSDKInterpreter.runN)rj   rk   rl   r'   rv   r   r   r   r    rn      s   rn   c                
   @   s   e Zd 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e	d*d+ Z
d,d- Zd.d/ Zd0d1 Zd2d3 Zd4S )5IqiyiIEZiqiyiu	   爱奇艺z9https?://(?:(?:[^.]+\.)?iqiyi\.com|www\.pps\.tv)/.+\.htmlz&http://www.iqiyi.com/v_19rrojlavg.htmlZ 9c1fb1b99d192b21c559e5a1a2cb3c73mp4u.   美国德州空中惊现奇异云团 酷似UFO)idexttitle)url	info_dictz&http://www.iqiyi.com/v_19rrhnnclk.htmlZ b7dc800a4004b1b57749d9abae0472daZ e3f585b550a280af23c98b6cb2be19fbu   re:^(?:名侦探柯南 国语版：第752集 迫近灰原秘密的黑影 下篇|名偵探柯南 國語版：第752集 迫近灰原秘密的黑影 下篇)$zGeo-restricted to China)r|   r   r}   skipz&http://www.iqiyi.com/w_19rt6o8t9p.htmlTr|   Zonly_matchingz&http://www.iqiyi.com/a_19rrhbc6kt.htmlzhttp://yule.iqiyi.com/pcb.htmlZ 4a0af228fddb55ec96398a364248ed7fu2   第2017-04-21期 女艺人频遭极端粉丝骚扰z&http://www.iqiyi.com/v_19rrny4w8w.htmlZ f3cf468b39dddb30d676f89a91200dc1u   泰坦尼克号)r|   r}   r~   z&http://www.iqiyi.com/a_19rrhb8ce1.htmlZ	202918101u   灌篮高手 国语版)ry   r{   e   )r|   r}   Zplaylist_countz#http://www.pps.tv/w_19rrbav0ph.htmlr   r   rp   rK   rL         )Z9612214Z17518c                 C   s   d}d}t | ||S )Nl#   o<%
Q7&ib)P.U[())v[_Na_[3<0#7L'0<:T*F76W i  )r   )r0   Ner   r   r    _rsa_fun   s    zIqiyiIE._rsa_func                 C   s   | j dd ddd}|d }tt }d| d| |  d}t|}|||d	 |}|d
|d d||d}	| j dtj	|	 d ddd}
ddd}|
d }|dkr|
|}|sd| }|

dr|d|
d  7 }| d|  dS dS )Nz http://kylin.iqiyi.com/get_tokenzGet token for loggingzUnable to get token for loggingnoteerrnotert   z</apis/reglogin/login.action?lang=zh_TW&area_code=null&email=z&passwd=z@&agenttype=1&from=undefined&keeplogin=0&piccode=&fromurl=&_pos=1r$   Z BEA3AA1908656AABCCFF76582C4C6660tokenZ f8d91d57af224da7893dd397d52d811a)r#   serverr   Zbird_srcsignZbird_tz http://kylin.iqiyi.com/validate?zValidate credentialszUnable to validate credentialsz=please login via the web interface and enter the CAPTCHA codezbad username or password)ZP00107ZP00117codeA00000zerror msgz: zunable to log in: FT)_download_jsonr)   r\   r   r   rn   rv   urllibparse	urlencodegetreport_warning)r&   usernamepasswordr0   rt   r%   r#   Zinterpr   Zvalidation_paramsZvalidation_resultZMSG_MAPr   r   r   r   r    _perform_login   sL        


zIqiyiIE._perform_loginc                 C   sb   t t d }d}tt|| | }||d||d}| jd| d| d|dd ||  d	S )
N  Z d5fb4bd9d50c4be6948c97edd7254b0eZ 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>/      z&IqiyiIE.get_raw_data.<locals>.<lambda>)transform_sourcequeryheaders)r)   r\   r!   r.   r   Zgeo_verification_headers)r&   r   video_idtmkeyr   paramsr   r   r    get_raw_data   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 ]}| jd
| d| d| d|d| d| d}| 	t
|d|}	|	d d }
|
D ]}|| |d  qt|
|k rR qqR| |||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/r   zDownload playlist page z!Failed to download playlist page r   r   r0   vlistZvurl)rq   rr   _search_regexr<   r3   
url_result	itertoolscount_download_webpage_parse_jsonr   r;   rN   playlist_result)r&   webpageZ	PAGE_SIZElinksalbum_idZalbum_titleentriesZpage_numZpagelist_pageZpagelistr   itemr   r   r    _extract_playlist2  sH          zIqiyiIE._extract_playlistc                 C   s>  | j |ddd}| jd|dd d}|d krD| |}|r<|S td| d|d	}g }td
D ]}| ||}|d dkr|d dkr|   td|d  |d }	|	d D ]>}
d|
krqt|
d }||
d |d| j	
|ddd q|r q| d
| q^td|p0ttdd|p0| d|d}|||dS )NZtemp_idzdownload video page)r   z6data-(?:player|shareplattrigger)-tvid\s*=\s*[\'"](\d+)r   defaultzCan't find any videoz>data-(?:player|shareplattrigger)-videoid\s*=\s*[\'"]([a-f\d]+)r   rL   r   r   ZA00111z!Unable to load data. Error code: r0   ZvidlZm3utxvdrx   Zm3u8_native)r|   Z	format_idrz   qualityprotocolzwidget-videotitleclasszmod-play-titz<<span[^>]+data-videochanged-title="word"[^>]*>([^<]+)</span>r{   )ry   r{   formats)r   r   r   r   r:   r   Zraise_geo_restrictedr.   r;   _FORMATS_MAPr   Z_sleepr   r   r   Z_html_search_regex)r&   r|   r   r   r   r   r   _raw_datar0   streamr   r{   r   r   r    _real_extractS  sh         
  
zIqiyiIE._real_extractN)rj   rk   rl   IE_NAMEIE_DESC
_VALID_URLZ_NETRC_MACHINE_TESTSr   rm   r   r   r   r   r   r   r   r   r    rw      s|   	
6
+!rw   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-1ma1i6ferf4Z 2d7caf6eeca8a32b407094b33b757d39rx   Z1ma1i6ferf4u   航海王 第1000集,   Subtitle available on Sunday 4PM（GMT+8）.i  iKaZ20211121r   zEpisode 1000	One Piece   )rz   ry   r{   descriptiondurationr%   upload_dateepisode_numberZepisodeseries	age_limitaverage_ratingformat500format is restricted)r|   r   r}   r   expected_warningsz:https://www.iq.com/play/mermaid-in-the-fog-2021-gbdpx13bs4Tr   Z240PZ360PZ480PZ720PZ1080PZ1080P50Z2KZ4K)Z100Z200Z300r   Z600Z610Z700Z800zh_CNzh_TWenkojathZmyviry   esptar)r   r   3r   r   r   r   Z23Z24Z26Z27Z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ppi }t|D ]d}||p|}	| jd|	 d||  d|d| ddddpd}
d|
krz| j 	dd|
 |
  S qzt
dd S )NZiqZ	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_patternr   z["\']\s*\+\(\s*zreplacement mapz-{\s*(?:\d+\s*:\s*["\'][\w.-]+["\']\s*,?\s*)+}z\[\w+\]\|\|\w+\)\+["\']\.F)r   r   r   r   z-https://stc.iqiyipic.com/_next/static/chunks/r9   z.jszDownloading #z
 module JSzUnable to download module JSr   r   r   rB   zvms requestzUnable to extract player JS)cacheloadZ_proto_relative_urlr   r   _search_jsonr   reversedr   storer   )r&   r   r   Zplayer_js_cacheZwebpack_js_urlZ
webpack_jsZwebpack_mapZreplacement_mapZmodule_indexZreal_moduleZ	module_jsr   r   r    _extract_vms_player_js  sZ               
  
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)r   r   r&   r   r   r   r   r    _extract_cmd5x_function(  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   r   c              
      s*   i | ]"}|t  |d ftj|dqS )valueexpected_typer   )r   r.   	_BID_TAGSr   )r+   bidZextracted_bid_tagsr&   r   r    
<dictcomp>4  s    z)IqIE._update_bid_tags.<locals>.<dictcomp>)r   r   r   r   r   r   r   r    _update_bid_tags,  s    
    zIqIE._update_bid_tagsNc                 C   s   |  d|}|r|jS |S )Nzhttps://iq.com/)Z_get_cookiesr   r   )r&   namer   cookier   r   r    _get_cookie9  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'dg| 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pVi }g }|d?r|| jt|d@dA|d? dB ddC |dDr|| jt|d@dA|dD  ddE |dFrv|dGdH}|dHkr| j |dF dB ddI\}}|| nh|dJkrft| j|dF |ddKdLtd}|s@q| !| |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 ]F| 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pd |dedfS )hNpropsinitialStateZplayZcurVideoInfoZI00002z{}F)r   r   )r0   uidr   r   z https://pcw-api.iq.com/api/vtypezDownloading VIP datazUnable to download VIP datar   rp   rG   intllangen_usZQC005rB   )batch
platformIdmodeCodelangCodeZdeviceId)r   r   r   r   )r0   Zall_vip.ZvipType)r   0i )timeoutz9Executing signature code (this may take a couple minutes)z<!DOCTYPE html>ZtvIdr   )initialProps	pagePropsZptidZ04022001010011000000r   dfp[,])
r   r   r   r  r  moder  Zbid_listut_listZ
cmd5x_func)Znote2htmlr   Zjscodezhttps://cache-video.iq.comz%Downloading initial video format infoz,Unable to download initial video format infor   r0   )boss_ts)Nr0   )ZpreviewTimeZrtime)r   get_all)r  r0   Z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   rC   )r   v)r   r   r    r   ~  r   z$IqIE._real_extract.<locals>.<lambda>Zm3u8UrlZdm3u8zhttps://cache-m.iq.com/dc/dt/rx   )m3u8_idr   ZmpdUrl)Zmpd_idr   Zm3u8ffts)rz   r  r   Zm4sr   )payload.r0   z$ formats are currently not supportedr   z format is restrictedzUnable to extract z format)r   Zformat_noteZscrsz)r  stl.Zlid_namec                    s6   g | ].\}} |r|t  d d| dqS )Zdstlzhttp://meta.video.iqiyi.com)rz   r|   )r   r   )r+   Z
format_keyZ
format_ext)initial_format_data
sub_formatr   r    
<listcomp>  s
    
z&IqIE._real_extract.<locals>.<listcomp>))srtr&  )ZwebvttZvttalbumIdZ	albumInfor   Z	mergeDescrN   Zrating)ZplayScoreInfoZscoreZisoUploadDate)ZvideoTagMap..r   )ZactorArr.r   orderZ	albumName)ry   r{   r   	subtitlesr   r   r   r   r%   
categoriescastr   r   )r  )+	_match_idr   r   _search_nextjs_datar   r   r  r   r   unquoter   r   r   r   _DASH_JSr.   rF   r   keysr   stripr   r	   r   r   r   r
   setdictextendZ_extract_m3u8_formatsZ_extract_mpd_formatsZ!_parse_m3u8_formats_and_subtitlesZ _parse_mpd_formats_and_subtitlesupdater   r<   r   	_LID_TAGS
setdefaultr   r   r   )r&   r|   r   r   Z
next_propsZ	page_dataZ
video_infor  Zvip_datar  Z
dash_pathsr   r)  Zpreview_timeZ	dash_pathZformat_dataZvideo_formatZextracted_formatsr  Zm3u8_formatsr   Zmpd_dataZmpd_formatsfr  Zextra_metadatar   )r   r#  r$  r    r   =  sL   

       


    




     
       
   

    

&zIqIE._real_extract)N)rj   rk   rl   r   r   r   floatr   r   r6  r/  r   r   r   r  r   r   r   r   r    r     sn    H
r   c                   @   sj   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dddg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-1bk9icvr331Z1bk9icvr331r   r   )ry   r{   r      )r|   r}   Zplaylist_mincountu6   https://www.iq.com/album/九龙城寨-2021-22yjnij099krx   Z22yjnij099ku   九龙城寨z$md5:8a09f50b8ba0db4dc69bc7c844228044i  iKaZ20220111zShi Yan NengzYu Langz	Peter  lvz
Sun Zi JunzYang Xiao Bor   )rz   ry   r{   r   r   r%   r   r   r+  r   r   r   )r|   r}   r   Nr  r  c           	      c   s   |D ]}| j d| |d|dd dd|||d |d d	d
}|d d D ]8}| d|dpj|d  t |d|dV  qPqd S )Nz-https://pcw-api.iq.com/api/episodeListSource/z Downloading video list episodes r   rB   zUnable to download video listrp   tofrom)r
  r  r  ZendOrderZ
startOrder)r   r   r   r0   Zepgzhttps://www.iq.com/play/%sZplayLocSuffixZ	qipuIdStrr   )r   r   r   r   ie_key)	r&   Zalbum_id_numZpage_rangesr   	mode_codeZ	lang_codeZ
page_rangepager  r   r   r    _entries  s&     
  zIqAlbumIE._entriesc                 C   s   |  |}| ||}| ||}|d d d d }|ddkrZ| d| t S | | |d |d	 |t	|d
t	|d||d|dS )Nr  r  ZalbumZvideoAlbumInfoZ	videoTypeZsingleVideozhttps://www.iq.com/play/r'  ZtotalPageRange)r  r  r  r  )r  r  r  r  r   desc)
r,  r   r-  r   r   r   r>  r   rA  r   )r&   r|   r   r   Z	next_dataZ
album_datar   r   r    r     s    
  zIqAlbumIE._real_extract)Nr  r  )	rj   rk   rl   r   r   r9  r   rA  r   r   r   r   r    r:    s6   

r:  )$r   r   rq   r\   urllib.parser   commonr   Zopenloadr   utilsr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r"   rn   rw   r   r:  r   r   r   r    <module>   s    T^# h  7