3
b`t                 @   s   d dl m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 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 G d	d
 d
eZ G dd deZ!dS )    )unicode_literalsN   )InfoExtractor)AdobePassIE   )compat_etree_fromstringcompat_parse_qscompat_urllib_parse_urlparsecompat_urlparsecompat_xml_parse_errorcompat_HTTPError)ExtractorErrorextract_attributesfind_xpath_attrfix_xml_ampersandsfloat_or_none
js_to_jsonint_or_noneparse_iso8601smuggle_urlunescapeHTMLunsmuggle_urlupdate_url_query
clean_htmlmimetype2extUnsupportedErrorc               @   s  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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/d0d/d1d2d3dd,dd4d5d6d7d8d9d:d;d<d=d>d?d9d:d@dAdBgZedCdD ZedEdF ZedGdH Z	edIdJ Z
edKdL ZdMdN ZdOS )PBrightcoveLegacyIEzbrightcove:legacyzN(?:https?://.*brightcove\.com/(services|viewer).*?\?|brightcove:)(?P<query>.*)z~http://c.brightcove.com/services/viewer/htmlFederated?playerID=1654948606001&flashID=myExperience&%40videoPlayer=2371591881001Z 5423e113865d26e40624dce2e4b45d95z4Test Brightcove downloads and detection in GenericIEZ2371591881001mp4u]   Xavier Sala i Martín: “Un banc que no presta és un banc zombi que no serveix per a res”Z8TVz$md5:a950cc4285c43e44d763d036710cd9cdiHQZ20130510Z1589608506001)idexttitleuploaderdescription	timestampupload_dateuploader_idz4The player has been deactivated by the content owner)urlmd5note	info_dictskipzzhttp://c.brightcove.com/services/viewer/htmlFederated?playerID=1217746023001&flashID=myPlayer&%40videoPlayer=1785452137001Z1785452137001flvz5JVMLS 2012: Arrays 2.0 - Opportunities and Challengesz<John Rose speaks at the JVM Language Summit, August 1, 2012.ZOraclei*PZ20120814Z
1460825906)r   r   r    r"   r!   r#   r$   r%   zvideo not playable)r&   r)   r*   zhttp://c.brightcove.com/services/viewer/federated_f9?&playerID=1265504713001&publisherID=AQ%7E%7E%2CAAABBzUwv1E%7E%2CxP-xFHVUstiMFlNYfvF4G9yFnNaqCw_9&videoID=2750934548001Z2750934548001z+This Bracelet Acts as a Personal Thermostatz$md5:547b78c64f4112766ccf4e151c20b6a0iH`RZ20131017Z1130468786001)r   r   r    r"   r#   r$   r%   )r&   r)   zhttp://link.brightcove.com/services/player/bcpid756015033001?bckey=AQ~~,AAAApYJi_Ck~,GxhXCegT1Dp39ilhXuxMJxasUhVNZiil&bctid=2878862109001Z2878862109001zLost in Motion IIz$md5:363109c02998fee92ec02211bd8000dfzNational Ballet of Canada)r   r   r    r"   r!   z
Video gonea  http://c.brightcove.com/services/viewer/htmlFederated?%40videoPlayer=ref%3Aevent-stream-356&linkBaseURL=http%3A%2F%2Fwww.redbull.com%2Fen%2Fbike%2Fvideos%2F1331655630249%2Freplay-uci-fort-william-2014-dh&playerKey=AQ%7E%7E%2CAAAApYJ7UqE%7E%2Cxqr_zXk0I-zzNndy8NlHogrCb5QdyZRf&playerID=1398061561001#__youtubedl_smuggle=%7B%22Referer%22%3A+%22http%3A%2F%2Fwww.redbull.com%2Fen%2Fbike%2Fstories%2F1331655643987%2Freplay-uci-dh-world-cup-2014-from-fort-william%22%7DZ3750436379001z:UCI MTB World Cup 2014: Fort William, UK - Downhill FinalszRBTV Old (do not use)iSZ20140827Z710858724001zhttp://c.brightcove.com/services/viewer/htmlFederated?playerID=3550052898001&playerKey=AQ%7E%7E%2CAAABmA9XpXk%7E%2C-Kp7jNgisre1fG5OdqpAFUTcs0lP_ZoLZSealifeZ3550319591001)r    r      zUnsupported URL)r&   r)   playlist_mincountr*   zhttp://c.brightcove.com/services/json/experience/runtime/?command=get_programming_for_experience&playerKey=AQ%7E%7E,AAABXlLMdok%7E,NJ4EoMlZ4rZdx9eU1rkMVd8EaYPBBUlgZ1522758701001z	Lesson 08)r   r    
   zhttps://link.brightcove.com/services/player/bcpid1722935254001/?bctid=5360463607001&autoStart=false&secureConnections=true&width=650&height=350T)r&   only_matchingc       
         s  t jddd |}|jdd}t jdd|}t|}yt|jdW n tk
rZ   d	S X td
dd}|d	k	rtdd t	|j
d j D ni j
jdd}t	t|j  fdd}i }|dp|d}|d	krtd||d< |d}|d	k	r
||d< |dp.|dp.|dp.|d}|d	k	r|t|trN|d }|j }t jd|pl|jdstd	S ||d< |d}	|	d	k	r|	|d< | j|S ) z
        Build a Brightcove url from a xml string containing
        <object class="BrightcoveExperience">{params}</object>
        z&(<param(?:\s+[a-zA-Z0-9_]+="[^"]*")*)>c             S   s   | j dd S )Nr   z/>)group)m r2   KC:\Users\Broad\Desktop\All-Down\binaries\youtube_dl\extractor\brightcove.py<lambda>   s    z9BrightcoveLegacyIE._build_brighcove_url.<locals>.<lambda>z<--z<!--z(<object[^>]*)(xmlns=".*?")z\1zutf-8Nz./paramnameZ	flashVarsc             s   s   | ]\}}||d  fV  qdS )r   Nr2   ).0kvr2   r2   r3   	<genexpr>   s   z:BrightcoveLegacyIE._build_brighcove_url.<locals>.<genexpr>valuedata c                s:   | kr|  S t dd| }|d k	r0|jd S  j| S )Nz./paramr5   r:   )r   attribget)r5   node)data_url_params	flashvars
object_docr2   r3   
find_param   s    
z;BrightcoveLegacyIE._build_brighcove_url.<locals>.find_paramplayerIDZplayerIdzCannot find player ID	playerKeyz@videoPlayervideoIdZvideoIDz
@videoListr   zT^(?:\d+|[\da-fA-F]{8}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{4}-?[\da-fA-F]{12})$zref:linkBaseURL)resubreplacer   r   encoder   r   dictr   r=   itemsr>   r	   queryr   
isinstanceliststripmatch
startswith_make_brightcove_url)
clsZ
object_strZfv_elZdata_urlrC   paramsrD   rE   videoPlayerZlinkBaser2   )r@   rA   rB   r3   _build_brighcove_url   sP    
&

z'BrightcoveLegacyIE._build_brighcove_urlc             C   s"   t jd|}|r| j|j S d S )Nar  (?x)customBC\.createVideo\(
                .*?                                                  # skipping width and height
                ["\'](?P<playerID>\d+)["\']\s*,\s*                   # playerID
                ["\'](?P<playerKey>AQ[^"\']{48})[^"\']*["\']\s*,\s*  # playerKey begins with AQ and is 50 characters
                                                                     # in length, however it's appended to itself
                                                                     # in places, so truncate
                ["\'](?P<videoID>\d+)["\']                           # @videoPlayer
            )rH   searchrT   	groupdict)rU   Z	object_jsr1   r2   r2   r3   _build_brighcove_url_from_js   s    z/BrightcoveLegacyIE._build_brighcove_url_from_jsc             C   s
   t d|S )Nz5http://c.brightcove.com/services/viewer/htmlFederated)r   )rU   rV   r2   r2   r3   rT      s    z'BrightcoveLegacyIE._make_brightcove_urlc             C   s   | j |}|r|d S dS )zfTry to extract the brightcove url from the webpage, returns None
        if it can't be found
        r   N)_extract_brightcove_urls)rU   webpageurlsr2   r2   r3   _extract_brightcove_url   s    
z*BrightcoveLegacyIE._extract_brightcove_urlc                s   t jd|}|r<t|jd}d|ks6d|ks6d|kr<|gS t jd|}|rhttd fdd	|D S t jd
|}|rttd fdd	|D S dd	 t jd|D S )z6Return a list of all Brightcove URLs from the webpage z(?x)
                <meta\s+
                    (?:property|itemprop)=([\'"])(?:og:video|embedURL)\1[^>]+
                    content=([\'"])(?P<url>https?://(?:secure|c)\.brightcove.com/(?:(?!\2).)+)\2
            r&   rE   rF   ZidVideoz(?sx)<object
            (?:
                [^>]+?class=[\'"][^>]*?BrightcoveExperience.*?[\'"] |
                [^>]*?>\s*<param\s+name="movie"\s+value="https?://[^/]*brightcove\.com/
            ).+?>\s*</object>Nc                s   g | ]} j |qS r2   )rX   )r6   r1   )rU   r2   r3   
<listcomp>  s    z?BrightcoveLegacyIE._extract_brightcove_urls.<locals>.<listcomp>z(customBC\.createVideo\(.+?\);)c                s   g | ]} j |qS r2   )r[   )r6   Z	custom_bc)rU   r2   r3   r`     s   c             S   s   g | ]\}}|qS r2   r2   )r6   _srcr2   r2   r3   r`     s    zW<iframe[^>]+src=([\'"])((?:https?:)?//link\.brightcove\.com/services/player/(?!\1).+)\1)rH   rY   r   r0   findallrP   filter)rU   r]   Zurl_mr&   matchesr2   )rU   r3   r\      s$    

z+BrightcoveLegacyIE._extract_brightcove_urlsc             C   s  t |i \}}tjdd|}tjdd|}tj| j|}|jd}tj|}|jd}|r|jdd gd px|jd	|}|d }d
|krtj	d|}|d k	r|jdg|d
< |jd}	|	r|	d j
 r|	d }	|	s|jd}
|
rd|
d kr|
d }
nb|jd
}|r\|d j
 r\i }|r*||d	< | jd|d  ||dd}|r\| jd|ddd}
|
r|
jdd jdd}tjdtj|d }	|	rd|	|f }|rt|d|i}| j|tj |S t|d S )Nz$(?<=[?&])(videoI(d|D)|idVideo|bctid)z%40videoPlayerz(?<=[?&])bckeyrE   rN   z@videoPlayerrG   r   RefererrD   z/bcpid(\d+)r   ZpublisherId,z0http://link.brightcove.com/services/player/bcpidF)headersfatalz.<param\s+name="playerKey"\s+value="([\w~,-]+)"z
player key)ri   ~=z>QzFhttp://players.brightcove.net/%s/default_default/index.html?videoId=%sreferrer)r   rH   rI   rR   
_VALID_URLr0   r
   parse_qsr>   rY   isdigit_download_webpage_search_regexsplitrJ   structunpackbase64urlsafe_b64decoder   
url_resultBrightcoveNewIEie_keyr   )selfr&   smuggled_datamobjZ	query_strrN   rW   referervideo_idZpublisher_idZ
player_key	player_idrh   player_pageZ
enc_pub_idZbrightcove_new_urlr2   r2   r3   _real_extract  sT    







z BrightcoveLegacyIE._real_extractN)__name__
__module____qualname__IE_NAMErm   _TESTSclassmethodrX   r[   rT   r_   r\   r   r2   r2   r2   r3   r   %   s   

F#r   c               @   s   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ddd	ddiddddddddid d!dd"d#dd"d$dd"d%dd"gZed&d' Zed(d) Zi fd*d+Z	d,d- Z
d.S )/rx   zbrightcove:newzhttps?://players\.brightcove\.net/(?P<account_id>\d+)/(?P<player_id>[^/]+)_(?P<embed>[^/]+)/index\.html\?.*(?P<content_type>video|playlist)Id=(?P<video_id>\d+|ref:[^&]+)zxhttp://players.brightcove.net/929656772001/e41d32dc-ec74-459e-a845-6c69f7b724ea_default/index.html?videoId=4463358922001Z c8100925723840d4b0d243f7025703beZ4463358922001r   z Meet the man behind Popcorn Timez$md5:eac376a4fe366edc70279bfb681aea16gjtd@icUZ20150904Z929656772001zmincount:20)	r   r   r    r"   durationr#   r$   r%   formats)r&   r'   r)   zyhttp://players.brightcove.net/4036320279001/5d112ed9-283f-485f-a7f9-33f42e8bc042_default/index.html?videoId=4279049078001Z4279049078001zTitansgrave: Chapter 0gZd;h@iVrUZ20150606Z4036320279001zmincount:39skip_downloadT)r&   r)   rV   zbhttps://players.brightcove.net/1752604059001/S13cJdUBz_default/index.html?playlistId=5718313430001Z5718313430001zNo Audio Playlist)r   r    r,   )r&   r)   playlist_countrV   zahttp://players.brightcove.net/5690807595001/HyZNerRl7_default/index.html?playlistId=5743160747001)r&   r/   zwhttp://players.brightcove.net/3910869709001/21519b5c-4b3b-4363-accb-bdc8f358f823_default/index.html?videoId=ref:7069442zbhttp://players.brightcove.net/710858724001/default_default/index.html?videoId=ref:event-stream-356zvhttp://players.brightcove.net/1305187701/c832abfb-641b-44eb-9da0-2fe76786505f_default/index.html?videoId=4377407326001c             C   s   t j| |}|r|d S d S )Nr   )rx   _extract_urls)ier]   r^   r2   r2   r3   _extract_url  s    zBrightcoveNewIE._extract_urlc             C   s   g }x4t jd|D ]$\}}|j|jdr,|nd|  qW xt jd|D ]\}}}}}	t|}
|
jd}|snqH|pz|
jd}|sqH|p|
jdpd}|	p|
jd	pd}	d
|||	|f }| r| j||d rqH|j| qHW |S )NzZ<iframe[^>]+src=(["\'])((?:https?:)?//players\.brightcove\.net/\d+/[^/]+/index\.html.+?)\1httpzhttp:ab  (?isx)
                    (<video\s+[^>]*\bdata-video-id\s*=\s*['"]?[^>]+>)
                    (?:.*?
                        (<script[^>]+
                            src=["\'](?:https?:)?//players\.brightcove\.net/
                            (\d+)/([^/]+)_([^/]+)/index(?:\.min)?\.js
                        )
                    )?
                zdata-video-idzdata-accountzdata-playerdefaultz
data-embedz<http://players.brightcove.net/%s/%s_%s/index.html?videoId=%szpossible brightcove video)rH   rc   appendrS   r   r>   _is_valid_url)r   r]   entriesra   r&   videoZ
script_tag
account_idr   embedattrsr~   bc_urlr2   r2   r3   r     s,    	 	
	
zBrightcoveNewIE._extract_urlsc                sr  |d j  }g }x|jdg D ]}|jd}t|jd}|jd}	|dks |dks |jdrfq q |d	ksv|d
kr|	s|q |j| j|	|ddddd q |dkr|	sq |j| j|	|ddd q |jd}
|jd|jd }}|	 r|
 r| s | rq t|jddt|jd t|jd}t|jd||pJ|j d}|dkrt dkrt|j	ddi n|j	| |jdd   fd!d"}|	s|
r|j	|	p|
||	rd#nd$|	rdnd?d& n|j	|||d'd( |j
| q W |s*|jd)i jd*}|r*|j
|d+d, |jd-}| rr|rr|d }t|jd.pj|jd/pj|d0 d1d2| j| x |D ]}|jd3i j	| qW i }xB|jd4g D ]2}|jdr|j|jd5g j
d6|d i qW d}t|jd7d}|d k	r|dkrd1}||r$| j|n|t|jd8|jd9pF|jd:|t|jd;|jd<|||jd=g |d>S )@Nr5   sources	containertyperb   ismZWVMZkey_systemsm3u8ZM2TSr   m3u8_nativehlsF)m3u8_idri   mpddash)ri   streaming_srcstream_nameapp_nameZavg_bitratei  heightwidthsize)tbrfilesizer   r   r   vcodecnonecodec)r   r   r   c                s,   | }r|dt  7 } r(|d  7 }|S )Nz-%dkz-%dp)int)kind	format_id)r   r   r2   r3   build_format_id  s    zCBrightcoveNewIE._parse_brightcove_metadata.<locals>.build_format_idr   zhttp-streamingr   )r&   r   source_preferencertmp)r&   	play_pathr   custom_fieldsZs3sourceurlsource)r&   r   errorsmessageerror_subcode
error_codeT)expectedhttp_headersZtext_trackssrclangr&   r   r"   	thumbnailposterZpublished_atr   tags)r   r    r"   r   r   r#   r%   r   	subtitlesr   is_live)rQ   r>   r   extend_extract_m3u8_formats_extract_mpd_formatsr   r   lowerupdater   r   _sort_formats
setdefault_live_titler   r   )rz   	json_datar~   rh   r    r   r   r   r   rb   r   r   r   r   fr   Zs3_source_urlr   errorr   Z
text_trackr   r   r2   )r   r   r3   _parse_brightcove_metadata  s    




&


z*BrightcoveNewIE._parse_brightcove_metadatac                s  t |i \}}j|jd|jdd tjj|j \ }d f jjj	d}d}fdd fd	d
}d |f }i |jd}|rȈj
|tjd|jdd xtdD ]}	|s| }d}d| d< yj|d}
P W q tk
r } zt|jtr|jjd-krj|jj j d }
|
jdpd|
d }|
jddkrj|d n&|
jddkr| rd }d  wt|dd W Y d d }~X qX qW |
jd}|r4|d jddkr4|
d  }j|d! |d" |d# }j|dd| id$|id%}
|d&krxjfd'd(|
jd)g D |
jd*|
jd+|
jd,S j|
dS ).Ngeo_countriesZgeo_ip_blocks)	countries	ip_blocksz%s_%s
brightcoveFc                s   j jjd | S )Nr   )_downloadercachestore)x)policy_key_idrz   r2   r3   r4   P  s    z/BrightcoveNewIE._real_extract.<locals>.<lambda>c                 st   j d f } d }jd| dd d}|rRjt|dd}|rR|jd}|shjd| d	d
d}| |S )Nz3http://players.brightcove.net/%s/%s_%s/index.min.jszcatalog\(({.+?})\);catalog)r   F)ri   Z	policyKeyz$policyKey\s*:\s*(["\'])(?P<pk>.+?)\1z
policy keypk)r0   )rp   rq   _parse_jsonr   r>   )r]   
policy_keyr   )r   r   r   rz   store_pkr~   r2   r3   extract_policy_keyR  s"    
z9BrightcoveNewIE._real_extract.<locals>.extract_policy_keyz>https://edge.api.brightcove.com/playback/v1/accounts/%s/%ss/%srl   zhttps?://[^/]+r   )rf   Originr   Tzapplication/json;pk=%sAccept)rh       r   r   r   Z
CLIENT_GEO)msgZINVALID_POLICY_KEY)r   r   ZTVE_AUTHr   
source_urlZbcadobepassrequestoridZbcadobepassresourceidZtveToken)rh   rN   playlistc                s*   g | ]"}|j d rj||j d  qS )r   )r>   r   )r6   Zvid)rh   rz   r2   r3   r`     s   z1BrightcoveNewIE._real_extract.<locals>.<listcomp>videosr   r5   r"   )r   r   )r   _initialize_geo_bypassr>   rH   rR   rm   groupsr   r   loadr   rY   r0   range_download_jsonr   rO   causer   coder   readdecoderaise_geo_restricted_extract_mvpd_authplaylist_resultr   )rz   r&   r{   content_typer   Zpolicy_key_extractedr   Zapi_urlrl   ra   r   er   r   r   Z	tve_tokenr2   )r   r   rh   r   r   rz   r   r~   r3   r   D  sp    




zBrightcoveNewIE._real_extractN)r   r   r   r   rm   r   staticmethodr   r   r   r   r2   r2   r2   r3   rx   R  sR   



=prx   )"
__future__r   ru   rH   rs   commonr   	adobepassr   compatr   r   r	   r
   r   r   utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   r2   r2   r2   r3   <module>   s    D  /