a
    h 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   K/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/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>,       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/   r0   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   )r6   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listr4   r)   r$   split)r&   	chunksizechunksir   r   r    
preprocess9   s    "zIqiyiSDK.preprocessc                    s4   |  d\}}|d d fdd|D  | _d S )Nr9   r    c                 3   s   | ]}t |  V  qd S r   r/   r*   modulusr   r    r-   D   r.   zIqiyiSDK.mod.<locals>.<genexpr>)rB   joinr#   )r&   rF   r@   r$   r   rE   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   )         rC   rL   rN   )rB   r;   lenr/   r#   )r&   r?   Zmodulus_mapr@   r$   retrA   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#   r2   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 )NrC   rL   rN   r   )r!   r#   r;   r2   )r&   rP   rA   partr   r   r    handle_input8[   s    zIqiyiSDK.handle_input8c                 C   s$   t | j| _| | j| j | _d S r   rQ   rR   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drC   c                 3   s   | ]} | V  qd S r   r   )r+   cstringsr   r    r-   o   r.   z IqiyiSDK.date.<locals>.<genexpr>)
r!   r#   time	localtimer%   r/   tm_yeartm_montm_mdayrG   )r&   schemerY   r   r[   r    dateg   s    zIqiyiSDK.datec                 C   s$   |   \}}|t| j | | _d S r   r8   r!   r#   r7   r   r   r    split_time_even_oddq   s    zIqiyiSDK.split_time_even_oddc                 C   s$   |   \}}|t| j | | _d S r   rd   r7   r   r   r    split_time_odd_evenu   s    zIqiyiSDK.split_time_odd_evenc                 C   s4   |  d\}}tt||d  | | j | _d S Nr9   r   )rB   r/   r0   r6   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 rg   )rB   r6   r%   r/   r0   r#   rh   r   r   r    split_time_ip_sum}   s    zIqiyiSDK.split_time_ip_sumN)__name__
__module____qualname__r'   staticmethodr2   r6   r8   rB   rH   r>   rS   rU   rV   rc   re   rf   ri   rj   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&   rp   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||v r||   qLtd	| qL|jS )
Nzinput=([a-zA-Z0-9]+)\(input)rV   ZhandleInput8ZhandleInput16ZsplitTimeEvenOddZsplitTimeOddEvenZsplitIpTimeSumZsplitTimeIpSumzmod\d+   zdate[ymd]{3}rL   zsplit\d+rM   zUnknown function )r   rp   refindallr"   rV   rU   rS   re   rf   ri   rj   matchrH   r)   rc   r>   r   r#   )r&   r#   r$   r%   Z	functionssdkZother_functionsfunctionr   r   r    run   s,    	zIqiyiSDKInterpreter.runN)rk   rl   rm   r'   rw   r   r   r   r    ro      s   ro   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   灌篮高手 国语版)rz   r|   e   )r}   r~   Zplaylist_countz#http://www.pps.tv/w_19rrbav0ph.htmlr   r   rq   rL   rM         )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   )r1   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errnoteru   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   ro   rw   urllibparse	urlencodegetreport_warning)r&   usernamepasswordr1   ru   r%   r#   Zinterpr   Zvalidation_paramsZvalidation_resultZMSG_MAPr   r   r   r   r    _perform_login   sH    


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>/  r.   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   r1   vlistZvurl)rr   rs   _search_regexr=   r4   
url_result	itertoolscount_download_webpage_parse_jsonr   r<   rO   playlist_result)r&   webpageZ	PAGE_SIZElinksalbum_idZalbum_titleentriesZpage_numZpagelist_pageZpagelistr   itemr   r   r    _extract_playlist2  s<    
zIqiyiIE._extract_playlistc                 C   s>  | j |ddd}| jd|dd d}|d u 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|
v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   rM   r   r   ZA00111z!Unable to load data. Error code: r1   ZvidlZm3utxvdry   Zm3u8_native)r}   Z	format_idr{   qualityprotocolzwidget-videotitleclasszmod-play-titz<<span[^>]+data-videochanged-title="word"[^>]*>([^<]+)</span>r|   )rz   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_datar1   streamr   r|   r   r   r    _real_extractS  sZ    

zIqiyiIE._real_extractN)rk   rl   rm   IE_NAMEIE_DESC
_VALID_URLZ_NETRC_MACHINE_TESTSr   rn   r   r   r   r   r   r   r   r   r    rx      s|   	
6
+!rx   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 2d7caf6eeca8a32b407094b33b757d39ry   Z1ma1i6ferf4u   航海王 第1000集,   Subtitle available on Sunday 4PM（GMT+8）.i  iKaZ20211121r   zEpisode 1000	One Piece   )r{   rz   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virz   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|
v 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/r:   z.jszDownloading #z
 module JSzUnable to download module JSr   r   r   rC   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  s@    
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'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pXi }g }|d?r|| jt|d@dA|d? dB ddC |dDr|| jt|d@dA|dD  ddE |dFrx|dGdH}|dHkr| j |dF dB ddI\}}|| nh|dJkrht| j|dF |ddKdLtd}|sB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 )gNpropsinitialStateZplayZcurVideoInfoZI00002z{}F)r   r   )r1   uidr   r   z https://pcw-api.iq.com/api/vtypezDownloading VIP datazUnable to download VIP datar   rq   rH   intllangen_usZQC005rC   )batch
platformIdmodeCodelangCodeZdeviceId)r   r   r   r   )r1   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   r1   )boss_ts)Nr1   )ZpreviewTimeZrtime)r   get_all)r  r1   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   rD   )r   v)r   r   r    r   ~  r.   z$IqIE._real_extract.<locals>.<lambda>Zm3u8UrlZdm3u8zhttps://cache-m.iq.com/dc/dt/ry   )m3u8_idr   ZmpdUrl)Zmpd_idr   Zm3u8ffts)r{   r  r   Zm4sr   )payload.r1   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)r{   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	mergeDescrO   Zrating)ZplayScoreInfoZscoreZisoUploadDate)ZvideoTagMap..r   )ZactorArr.r   orderZ	albumName)rz   r|   r   	subtitlesr   r   r   r   r%   
categoriescastr   r   )+	_match_idr   r   _search_nextjs_datar   r   r  r   r   unquoter   r   r   r   _DASH_JSr/   rG   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   =  s   














&zIqIE._real_extract)N)rk   rl   rm   r   r   r   floatr   r   r6  r/  r   r   r   r  r   r   r   r   r    r     sl   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-1bk9icvr331Z1bk9icvr331r   r   )rz   r|   r      )r}   r~   Zplaylist_mincountu6   https://www.iq.com/album/九龙城寨-2021-22yjnij099kry   Z22yjnij099ku   九龙城寨z$md5:8a09f50b8ba0db4dc69bc7c844228044i  iKaZ20220111)zShi Yan NengzYu Langz	Peter  lvz
Sun Zi JunzYang Xiao Bor   )r{   rz   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   rC   zUnable to download video listrq   tofrom)r
  r  r  ZendOrderZ
startOrder)r   r   r   r1   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  )	rk   rl   rm   r   r   r9  r   rA  r   r   r   r   r    r:    s6   

r:  )$r   r   rr   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"   ro   rx   r   r:  r   r   r   r    <module>   s    T^# h  7