U
    ge2                     @   s   d dl Z 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 G dd de	ZG d	d
 d
e	ZG dd de	ZdS )    N   )InfoExtractor   )
compat_ord)	ExtractorErrordetermine_extencode_data_uriint_or_none
orderedSetparse_iso8601str_or_noneurl_basenameurshiftc                
   @   s   e Zd ZdZdZdgZdZddddd	d
dddidddddddddidddddddddddiddddddddddgZdd  Zd!d" Z	e
d#d$ Zd%d& Zd'd( Zd)S )*LeIEu	   乐视网zlhttps?://(?:www\.le\.com/ptv/vplay|(?:sports\.le|(?:www\.)?lesports)\.com/(?:match|video))/(?P<id>\d+)\.htmlZCNz#http://www.le.com/ptv/vplay/%s.htmlz)http://www.le.com/ptv/vplay/22005890.htmlZ edadcfe5406976f42f9f266057ee5e40Z22005890mp4uB   第87届奥斯卡颁奖礼完美落幕 《鸟人》成最大赢家z$md5:a9cb175fd753e2962176b7beca21a47c)idexttitledescriptionZhls_prefer_nativeT)urlmd5	info_dictparamsz(http://www.le.com/ptv/vplay/1415246.htmlZ1415246u   美人天下01z$md5:28942e650e82ed4fcc8e4de919ee854d)r   r   r   zFThis video is available only in Mainland China, thus a proxy is neededz(http://www.le.com/ptv/vplay/1118082.htmlZ 2424c74948a62e5f31988438979c5ad1Z1118082u   与龙共舞 完整版z$md5:7506a5eeb1722bb9d4068f85024e3986)noter   r   r   r   z(http://sports.le.com/video/25737697.htmlr   Zonly_matchingz-http://www.lesports.com/match/1023203003.htmlz*http://sports.le.com/match/1023203003.htmlc                 C   s0   d}||k r,t |d|d@ d>  }|d7 }q|S )Nr   r      )r   )selfparam1Zparam2Z_loc3_ r   :/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/leeco.pyrorM   s
    
zLeIE.rorc                 C   s   d}|  ||d |A S )NiC   )r    )r   r   Z_loc2_r   r   r   calc_time_keyT   s    zLeIE.calc_time_keyc                 C   s   | d d  d dkr| S | dd  } tdt|  }t| D ]4\}}t|}|d |d| < |d |d| d < qBt|d }||d  |d |  }tt| }tt| D ](}|d|  d |d| d   ||< qt|S )N   utf-8Zvc_01r      r      )decodelower	bytearraylen	enumerater   rangebytes)Zencrypted_dataZ_loc4_idxvalbZ_loc7_ir   r   r   decrypt_m3u8Y   s    &zLeIE.decrypt_m3u8c                 C   sF   |d d }|d dkrB|d }|dkr2|    ntd| dd	d S )
Nmsgs
playstatusstatusr   flagr   zGeneric error. flag = %dTexpected)Zraise_geo_restrictedr   )r   	play_jsonr4   r6   r   r   r   _check_errorsl   s    
zLeIE._check_errorsc                    s   | | }jd d ddddtt ddd d	}|  fd
d}g }g }|d d }|d d }|dg 	 D ]\}	}
|	|krq|
|	 ||
d  }|||		 D ]j\}}|t|
d | d|	 |dkrdndt|	d}|	dd  dkr,t|	d d |d< |
| qqtjd|dd ddtjddd}jd |d!d"} ||d# |d$ ||d%d&S )'Nz.http://player-pc.le.com/mms/out/video/playJsonzDownloading flash playJson datar   i   i  z
www.le.comZcn)r   ZplatidZsplatidformatsourceZtkeydomainZregion)queryheadersc              	      s`   j |  d| dddddd}j|d d d	  d
| d}| }dt|diS )Nz"Download JSON metadata for format r      Zios)Zm3vr<   expecttss)r?   Znodelistr   locationz(Downloading m3u8 information for format )r   hlszapplication/vnd.apple.mpegurl)_download_jsonZ_request_webpager2   readr   )	media_url	format_idZ
nodes_datareqZ	m3u8_datamedia_idr   r   r   get_flash_urls   s&     
  z*LeIE._real_extract.<locals>.get_flash_urlsr3   playurlr>   r   dispatch-rE   Zm3u8_nativehttp)r   r   rI   protocolqualitypheightu   发布时间&nbsp;([^<>]+) zpublish time)default    )hours)	delimitertimezoner   Ffatalr   Zpic)resrS   )r   formatsr   Z	thumbnailr   	timestampZ_format_sort_fields)	_match_id_download_webpagerF   r"   inttimeZgeo_verification_headersr:   getitemsappendr   r	   r   Z_html_search_regexdt	timedelta_html_search_meta)r   r   pageZplay_json_flashrM   Zextracted_formatsr`   rN   Zplay_domainrI   Zformat_datarH   rR   Z
format_urlfZpublish_timer   r   rK   r   _real_extractv   sp    
 



    
zLeIE._real_extractN)__name__
__module____qualname__IE_DESC
_VALID_URLZ_GEO_COUNTRIES_URL_TEMPLATE_TESTSr    r"   staticmethodr2   r:   rn   r   r   r   r   r      sj      0

r   c                       sl   e 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gZe fddZdd Z  ZS )LePlaylistIEz;https?://[a-z]+\.le\.com/(?!video)[a-z]+/(?P<id>[a-z0-9_]+)zhttp://www.le.com/tv/46177.htmlZ46177u   美人天下z$md5:395666ff41b44080396e59570dbac01c)r   r   r   #   )r   r   Zplaylist_countz(http://tv.le.com/izt/wuzetian/index.htmlZwuzetianu   武媚娘传奇z$md5:e12499475ab3d50219e5bba00b3cb248`   )r   r   Zplaylist_mincountz)http://tv.le.com/pzt/lswjzzjc/index.shtmlTr   z"http://www.le.com/comic/92063.htmlz5http://list.le.com/listn/c1009_sc532002_d2_p1_o1.htmlc                    s   t |rdS t |S )NF)r   suitablesuper)clsr   	__class__r   r   rz      s    zLePlaylistIE.suitablec                    st     |} ||}ttd|} fdd|D } jd|dddd } jd	|dd} j||||d
S )Nz8<a[^>]+href="http://www\.letv\.com/ptv/vplay/(\d+)\.htmlc                    s    g | ]} j tj| d dqS )ZLe)Zie)Z
url_resultr   rt   ).0rL   r   r   r   
<listcomp>   s   z.LePlaylistIE._real_extract.<locals>.<listcomp>keywordsFr]   u   ，r   r   )Zplaylist_titleZplaylist_description)rb   rc   r
   refindallrk   splitZplaylist_result)r   r   Zplaylist_idrl   Z	media_idsentriesr   r   r   r   r   rn      s(    
 

zLePlaylistIE._real_extract)	ro   rp   rq   rs   ru   classmethodrz   rn   __classcell__r   r   r}   r   rw      s8   	
rw   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Zedd Zdd Zdd Z	dS )LetvCloudIEu	   乐视云z)https?://yuntv\.letv\.com/bcloud.html\?.+z=http://yuntv.letv.com/bcloud.html?uu=p7jnfw5hw9&vu=467623dedfZ 26450599afd64c513bc77030ad15db44Zp7jnfw5hw9_467623dedfr   zVideo p7jnfw5hw9_467623dedf)r   r   r   )r   r   r   zvhttp://yuntv.letv.com/bcloud.html?uu=p7jnfw5hw9&vu=ec93197892&pu=2c7cd40209&auto_play=1&gpcflag=1&width=640&height=360Z e03d9cc8d9c13191e1caf277e42dbd31Zp7jnfw5hw9_ec93197892zVideo p7jnfw5hw9_ec93197892z=http://yuntv.letv.com/bcloud.html?uu=p7jnfw5hw9&vu=187060b6fdZ cb988699a776b22d4a41b9d43acfb3acZp7jnfw5hw9_187060b6fdzVideo p7jnfw5hw9_187060b6fdc                    sv    d dkr"d}ddddddg}n d d	kr@d
}dddddg}d  fdd|D | }t|   d< d S )NcfflashZ 2f9d6924b33a165a6d8b5d3d42f4f987r<   ranuuvervuhtml5Zfbeh5player12c43eccf2bec3300344bver c                    s   g | ]}| |  qS r   r   )r   itemobjr   r   r   %  s     z)LetvCloudIE.sign_data.<locals>.<listcomp>sign)joinhashlibr   encode	hexdigest)r   Zsaltrg   Z
input_datar   r   r   	sign_data  s    zLetvCloudIE.sign_datac                    s   fdd}||t   }|ddkr<|||d }|ds|drhtd|d d	d
n(|drtd|d  d	d
ntddd }g }|d d d  D ]h}	|	d }
||
d }|t|}||t|t|
dt|
dt	|
dt	|
dd q|S )Nc                    sB   | dddt |d}| dtj|  d|  S )Nz2.2zfirefox44.0json)r   r   r   r<   r   r   r   z!http://api.letvcloud.com/gpc.php?z#Downloading playJson data for type )strr   rF   urllibparse	urlencode)r   ra   datarL   r   r   r   r   r   get_play_json)  s    	
 z/LetvCloudIE._get_formats.<locals>.get_play_jsoncodeiW'  ra   r   messagezLetv cloud said: {}Tr7   zLetv cloud returned error %dz$Letv cloud returned an unknown errorc                 S   s   t | dS )Nr$   )base64	b64decoder'   )sr   r   r   r   E  s    z+LetvCloudIE._get_formats.<locals>.b64decodeZ
video_infomediaplay_urlZmain_urlvtypeZ
definitionZvwidthZvheight)r   r   rI   Zformat_notewidthrV   )
re   rf   r   r<   valuesr   rh   r   r   r	   )r   r   r   r   rL   r   r9   r   r`   r   r   r   Zdecoded_urlr   r   r   _get_formats(  s2    



	zLetvCloudIE._get_formatsc                 C   s   t d|}t d|}|r |s2td| dd|d}|d}|d | }| d|||| d	||| }|d
| |dS )Nz
uu=([\w]+)z
vu=([\w]+)zInvalid URL: Tr7   r   _r   r   zVideo )r   r   r`   )r   searchr   groupr   )r   r   Zuu_mobjZvu_mobjr   r   rL   r`   r   r   r   rn   X  s    

 zLetvCloudIE._real_extractN)
ro   rp   rq   rr   rs   ru   rv   r   r   rn   r   r   r   r   r      s8   		

0r   )r   datetimeri   r   r   re   urllib.parser   commonr   compatr   utilsr   r   r   r	   r
   r   r   r   r   r   rw   r   r   r   r   r   <module>   s   , 16