U
    g(                     @   sl   d dl Z d dlZd dl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dS )
    N   )InfoExtractor   )ExtractorErrorencode_data_urifloat_or_noneint_or_nonejoin_nonemptymimetype2extstr_or_nonec                   @   s   e Zd ZdZdZdg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iddddddd dd!d"d#d$d%d&id'd(d&d)gZd3d+d,Zd-d. Zd/d0 Z	d1d2 Z
d*S )4	UstreamIEzfhttps?://(?:www\.)?(?:ustream\.tv|video\.ibm\.com)/(?P<type>recorded|embed|embed/recorded)/(?P<id>\d+)Zustreamz_<iframe[^>]+?src=(["\'])(?P<url>https?://(?:www\.)?(?:ustream\.tv|video\.ibm\.com)/embed/.+?)\1z'http://www.ustream.tv/recorded/20274954Z 088f151799e8f572f84eb62f17d73e5cZ20274954Zflvz4Young Americans for Liberty February 7, 2012 2:28 AMiz0OZ20120207Z	yalibertyZ6780869)idexttitledescription	timestampupload_dateuploaderuploader_id)urlmd5	info_dictzfhttp://www.ustream.tv/embed/recorded/59307601?ub=ff0000&lc=ff0000&oc=ffffff&uc=ffffff&v=3&wmode=directZ 5a2abf40babeac9812ed20ae12d34e10Z59307601z"-CG11- Canada Games Figure SkatingZsportscanadatv)r   r   r   r   zNThis Pro Broadcaster has chosen to remove this video from the ustream.tv site.)r   r   r   skipz$http://www.ustream.tv/embed/10299409r   Z10299409   )r   r   Zplaylist_countz'http://www.ustream.tv/recorded/91343263Z91343263mp4z)GitHub Universe - General Session - Day 1Z20160914iZWZwa0dnskeqkrZ38977840)r   r   r   r   r   r   r   r   Zskip_downloadT)r   r   paramszVhttps://video.ibm.com/embed/recorded/128240221?&autoplay=true&controls=true&volume=100)r   Zonly_matchingNc           
      C   s   dd }dd }|sd}| j d|d d| d	|d
| d|d |d ||d d||d d|d ||ddd}|d d d d }|d d d d }	| j d| d|	 |d| dS )Nc                 S   s   t | dd  S )Nr   )hex)n r   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/ustream.py
num_to_hexI   s    z.UstreamIE._get_stream_info.<locals>.num_to_hexc                 S   s   t t| S )N)random	randrangeint)xr   r   r   <lambda>L       z,UstreamIE._get_stream_info.<locals>.<lambda> zhttp://rg    חAz-1-z*-recorded-lp-live.ums.ustream.tv/1/ustreamzDownloading connection infoZviewerr   r   :z_rpin.g  4&kCZrecorded)typeZappIdZ
appVersionZrsidZrpinZreferrerZmediaZapplication)notequeryargshostZconnectionIdzhttp://z/1/ustream?connectionId=zDownloading stream infor*   )_download_json)
selfr   video_id
app_id_ver
extra_noter    ZrndZ	conn_infor-   Zconnection_idr   r   r   _get_stream_infoH   s2      zUstreamIE._get_stream_infoc                 C   sh   t dD ]Z}| j||||dkr.d|d  dndd}d|d d	 d kr|d d	 d d   S qg S )
Nr   r   z (try r   )r'   )r3   streamr,   )ranger4   )r0   r   r1   r2   Ztrial_countZstream_infor   r   r   _get_streamse   s      zUstreamIE._get_streamsc                 C   sF  dd }g }|d D ]*}|d d }d||d |d  d|d d	 ig}t |d
 |d  D ]:}|d||d |d  ||d t|d d  i q`|d }|dd }	td|	t|ddtddt||d|d|d}
|	dkr|
	|dd|dd n|
	d|d|dd ||
 q|S )Nc                 S   s   |  dt|d d|S )N%r   )replacestr)templateidxZ
chunk_hashr   r   r   resolve_dash_templatep   s    z=UstreamIE._parse_segmented_mp4.<locals>.resolve_dash_templateZstreamsZ	providersr   r   ZinitUrlhashes0ZvideoLengthZ	chunkTimeZ
segmentUrl
   contentType/ZdashZbitrateZhttp_dash_segmentss   <MPD/>ztext/xmlheightwidth)	format_idprotocolr   r   rD   rE   	fragmentsvideocodecnone)vcodecacodecZvbr)rL   rM   Zabr)
r7   appendr;   splitr	   r   getr   r
   update)r0   Zdash_stream_infor>   formatsr6   ZproviderrH   r=   content_typekindfr   r   r   _parse_segmented_mp4o   s^       
    

zUstreamIE._parse_segmented_mp4c                    s   |}|d|ddkr@|dd }|dS |ddkr|d|}d|d}fd	d
|D S d d}|d}|rt	j
 d| dd|d }|d }	t|d  fdd|d  D }
|
sDj|dd}|rD|
j|d d ddd |d}t|d}t|d }t|d!}|d"i d#}|d"i d}d$d |d%i  D }|	||||||||
d&
S )'Nr   r)   zembed/recordedhttp://www.ustream.tv/recorded/Ustreamembedz-ustream\.vars\.offAirContentVideoIds=([^;]+);zcontent video IDsc                 3   s   | ]}  d | dV  qdS )rW   rX   N
url_result).0ur0   r   r   	<genexpr>   s     z*UstreamIE._real_extract.<locals>.<genexpr>zhttps://api.ustream.tv/videos/z.jsonerrorz returned error: T)expectedrI   r   	file_sizec                    s"   g | ]\}}|r|| d qS ))r   r   r   filesizer   )r\   rF   Z	video_url)rc   r1   r   r   
<listcomp>   s    z+UstreamIE._real_extract.<locals>.<listcomp>Z
media_urls)   r   )r2   r   r   r   Zhls)r   Zm3u8_idr   Z
created_atlengthZviewsownerusernamec                 S   s   g | ]\}}||d qS ))r   r   r   )r\   Zthumbnail_idZthumbnail_urlr   r   r   rd      s   Z	thumbnail)
r   r   r   
thumbnailsr   duration
view_countr   r   rR   )_match_valid_urlgroupr[   _download_webpageZ_parse_jsonZ_search_regexZplaylist_resultr/   rP   r   IE_NAMEr   itemsr8   extendZ_extract_m3u8_formatsr   )r0   r   mZdesktop_urlwebpageZcontent_video_idsr   r`   rI   r   rR   Zhls_streamsr   r   rj   rk   r   r   ri   r   )rc   r0   r1   r   _real_extract   s    



 
 
 

   

zUstreamIE._real_extract)N)__name__
__module____qualname__
_VALID_URLro   Z_EMBED_REGEXZ_TESTSr4   r8   rV   rt   r   r   r   r   r      sh     3

.r   c                   @   s,   e Zd ZdZdZdddiddZdd	 Zd
S )UstreamChannelIEz3https?://(?:www\.)?ustream\.tv/channel/(?P<slug>.+)zustream:channelz*http://www.ustream.tv/channel/channeljapanr   Z10874166   )r   r   Zplaylist_mincountc                    s     |}|d} ||} d|}d}d| d}g }|r jtj|||dt|d  dd	}	|	t
d
|	d  |	d }q@ fdd|D }
d|||
dS )NZslugzustream:channel_idzhttp://www.ustream.tvz/ajax/socialstream/videos/z/1.jsonz%Downloading video information (next: r   r5   r.   zdata-content-id="(\d.*)"dataZnextUrlc                    s   g | ]}  d | dqS )rW   rX   rZ   )r\   Zvidr^   r   r   rd     s   z2UstreamChannelIE._real_extract.<locals>.<listcomp>Zplaylist)_typer   
display_identries)rl   rm   rn   Z_html_search_metar/   urllibparseurljoinlenrq   refindall)r0   r   rr   r}   rs   Z
channel_idZBASEZnext_urlZ	video_idsZreplyr~   r   r^   r   rt      s.    

 

zUstreamChannelIE._real_extractN)ru   rv   rw   rx   ro   Z_TESTrt   r   r   r   r   ry      s    ry   )r!   r   urllib.parser   commonr   utilsr   r   r   r   r	   r
   r   r   ry   r   r   r   r   <module>   s   $ ]