U
    $Pf8w                     @   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m Z m!Z!m"Z" G d	d
 d
eZ#G dd deZ$dS )    )unicode_literalsN   )AdobePassIE)InfoExtractor   )compat_etree_fromstringcompat_HTTPErrorcompat_parse_qscompat_urllib_parse_urlparsecompat_urlparsecompat_xml_parse_error)
clean_htmlextract_attributesExtractorErrorfind_xpath_attrfix_xml_ampersandsfloat_or_noneint_or_none
js_to_jsonmimetype2extparse_iso8601smuggle_urlstr_or_nonetry_getunescapeHTMLunsmuggle_urlUnsupportedErrorupdate_url_queryurl_or_nonec                   @   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md5Znote	info_dictskipzzhttp://c.brightcove.com/services/viewer/htmlFederated?playerID=1217746023001&flashID=myPlayer&%40videoPlayer=1785452137001Z1785452137001Z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+   Z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)   Zonly_matchingc           
         s  t ddd |}|dd}t dd|}t|}zt|dW n tk
r\   Y d	S X td
dd}|d	k	rtdd t	|j
d  D ni j
dd}t	t|j  fdd}i }|dp|d}|d	krtd||d< |d}|d	k	r||d< |dp0|dp0|dp0|d}|d	k	r~t|trP|d }| }t d|sv|dsvd	S ||d< |d}	|	d	k	r|	|d< | |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   |  dd S )Nr   z/>group)m r4   C/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/extractor/brightcove.py<lambda>       z:BrightcoveLegacyIE._build_brightcove_url.<locals>.<lambda>z<--z<!--z(<object[^>]*)(xmlns=".*?")z\1zutf-8N./paramnameZ	flashVarsc                 s   s   | ]\}}||d  fV  qdS )r   Nr4   ).0kvr4   r4   r5   	<genexpr>   s   z;BrightcoveLegacyIE._build_brightcove_url.<locals>.<genexpr>valuedata c                    s:   | kr|  S t dd| }|d k	r0|jd S  | S )Nr8   r9   r>   )r   attribget)r9   nodeZdata_url_paramsZ	flashvarsZ
object_docr4   r5   
find_param   s    
z<BrightcoveLegacyIE._build_brightcove_url.<locals>.find_paramplayerIDZplayerIdzCannot find player ID	playerKey@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	   rA   itemsrB   r
   queryr   
isinstanceliststripmatch
startswith_make_brightcove_url)
clsZ
object_strZfv_elZdata_urlrE   paramsrF   rG   videoPlayerZlinkBaser4   rD   r5   _build_brightcove_url   sZ     

&

z(BrightcoveLegacyIE._build_brightcove_urlc                 C   s"   t d|}|r| | 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
            )rK   searchrW   	groupdict)rX   Z	object_jsr3   r4   r4   r5   _build_brightcove_url_from_js   s    	z0BrightcoveLegacyIE._build_brightcove_url_from_jsc                 C   s
   t d|S )Nz5http://c.brightcove.com/services/viewer/htmlFederated)r   )rX   rY   r4   r4   r5   rW      s     z'BrightcoveLegacyIE._make_brightcove_urlc                 C   s   |  |}|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)rX   webpageurlsr4   r4   r5   _extract_brightcove_url   s    
z*BrightcoveLegacyIE._extract_brightcove_urlc                    s   t d|}|r<t|d}d|ks6d|ks6d|kr<|gS t d|}|rhttd fdd	|D S t d
|}|rttd fdd	|D S dd	 t 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)   rG   rI   ZidVideoz(?sx)<object
            (?:
                [^>]+?class=[\'"][^>]*?BrightcoveExperience.*?[\'"] |
                [^>]*?>\s*<param\s+name="movie"\s+value="https?://[^/]*brightcove\.com/
            ).+?>\s*</object>Nc                    s   g | ]}  |qS r4   )r[   )r:   r3   rX   r4   r5   
<listcomp>  s     z?BrightcoveLegacyIE._extract_brightcove_urls.<locals>.<listcomp>z(customBC\.createVideo\(.+?\);)c                    s   g | ]}  |qS r4   )r^   )r:   Z	custom_bcrc   r4   r5   rd     s   c                 S   s   g | ]\}}|qS r4   r4   )r:   _srcr4   r4   r5   rd     s     zW<iframe[^>]+src=([\'"])((?:https?:)?//link\.brightcove\.com/services/player/(?!\1).+)\1)rK   r\   r   r2   findallrS   filter)rX   r`   Zurl_mr)   matchesr4   rc   r5   r_      s.    

 z+BrightcoveLegacyIE._extract_brightcove_urlsc                 C   s  t |i \}}tdd|}tdd|}t| j|}|d}t|}|d}|r|dd gd px|d	|}|d }d
|krt	d|}|d k	r|dg|d
< |d}	|	r|	d 
 r|	d }	|	s|d}
|
rd|
d kr|
d }
nb|d
}|r\|d 
 r\i }|r*||d	< | jd|d  ||dd}|r\| jd|ddd}
|
r|
dd dd}tdt|d }	|	rd|	|f }|rt|d|i}| |t |S t|d S )Nz$(?<=[?&])(videoI(d|D)|idVideo|bctid)z%40videoPlayerz(?<=[?&])bckeyrG   rQ   rH   rJ   r   RefererrF   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rm   ~=z>QzFhttp://players.brightcove.net/%s/default_default/index.html?videoId=%sreferrer)r   rK   rL   rU   
_VALID_URLr2   r   parse_qsrB   r\   isdigit_download_webpage_search_regexsplitrM   structunpackbase64urlsafe_b64decoder   Z
url_resultBrightcoveNewIEZie_keyr   )selfr)   smuggled_dataZmobjZ	query_strrQ   rZ   Zreferervideo_idZpublisher_idZ
player_key	player_idrl   Zplayer_pageZ
enc_pub_idZbrightcove_new_urlr4   r4   r5   _real_extract  s`    







    z BrightcoveLegacyIE._real_extractN)__name__
__module____qualname__IE_NAMErr   _TESTSclassmethodr[   r^   rW   rb   r_   r   r4   r4   r4   r5   r   (   s   


j
E



"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 )/r|   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:39Zskip_downloadT)r)   r+   rY   zbhttps://players.brightcove.net/1752604059001/S13cJdUBz_default/index.html?playlistId=5718313430001Z5718313430001zNo Audio Playlistr.   r-   )r)   r+   Zplaylist_countrY   zahttp://players.brightcove.net/5690807595001/HyZNerRl7_default/index.html?playlistId=5743160747001r0   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 | |}|r|d S d S )Nr   )r|   _extract_urls)ier`   ra   r4   r4   r5   _extract_url  s    zBrightcoveNewIE._extract_urlc                 C   s   g }t d|D ]$\}}||dr*|nd|  qt d|D ]\}}}}}	t|}
|
d}|shqB|pt|
d}|s|qB|p|
dpd}|	p|
d	pd}	d
|||	|f }|s| ||dsqB|| qB|S )NzZ<iframe[^>]+src=(["\'])((?:https?:)?//players\.brightcove\.net/\d+/[^/]+/index\.html.+?)\1httpzhttp:aj  (?isx)
                    (<video(?:-js)?\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)rK   rg   appendrV   r   rB   Z_is_valid_url)r   r`   entriesre   r)   videoZ
script_tag
account_idr   embedattrsr   Zbc_urlr4   r4   r5   r     sB    	 

   
  zBrightcoveNewIE._extract_urlsc                    s  |d   }d}g }|dp g }|D ]}|d}	t|d}
|d}|	dks`|drl|d	7 }q&q&|
d
krxq&q&|
dks|	dkr|sq&|| j||ddddd q&|
dkr|sq&|| j||ddd q&|d}|d|d }}|s|s|r&|sq&t|ddt|d t|d}t|d|	|
pT|	 d}|dkr~ dkr~|	ddi n|	| |d d!  fd"d#}|s|r|	|p|||rd$nd%|rdnd&d' n|	|||d(d) |
| q&|sj|d*}|rJ|d }t|d+pB|d,pB|d- d.d/|rj|t|krjtd0d.d/| | |D ]}|d1i 	| qxi }|d2g D ]p}|d3d4krqt|d}|sҐqt|d5pt|d6pd7 }||g 
d8|i qd}t|d9d}|d k	r@|dkr@d.}||rR| |n|t|d:|d;pt|d<|t|d=|d>|||d?g |d@S )ANr9   r   sources	containertyperf   ZWVMZkey_systemsr   ZismZm3u8ZM2TSr    Zm3u8_nativeZhlsF)Zm3u8_idrm   ZmpdZdashrn   streaming_srcstream_nameapp_nameZavg_bitratei  heightwidthsize)tbrfilesizer   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   r4   r5   build_format_id	  s    zCBrightcoveNewIE._parse_brightcove_metadata.<locals>.build_format_idr   zhttp-streaming)r)   r   Zsource_preferenceZrtmp)r)   Z	play_pathr   errorsmessageerror_subcode
error_codeTexpectedzThis video is DRM protected.Zhttp_headersZtext_tracksr   ZcaptionsZsrclanglabelenr)   r   r%   	thumbnailZposterZpublished_atr   tags)r!   r#   r%   r   r   r&   r(   r   	subtitlesr   is_live)rT   rB   r   extendZ_extract_m3u8_formatsZ_extract_mpd_formatsr   r   lowerupdater   r   lenZ_sort_formats
setdefaultr   r   Z_live_titler   r   )r}   	json_datar   rl   r#   Znum_drm_sourcesr   r   sourcer   r"   rf   r   r   r   r   fr   r   errorr   Z
text_trackZtext_track_urllangr   r   r4   r   r5   _parse_brightcove_metadata  s    


     

 

 
 

z*BrightcoveNewIE._parse_brightcove_metadatac                    s  t |i \}}|d|dd tj| \ }d f jj	d}d}fdd fd	d
}d |f }i |d}|rȈ
|td|dd tdD ] }	|s| }d}d| d< zj|d}
W  qW q tk
r } zt|jtr|jjdkr|j  d }
|
dph|
d }|
ddkrj|d n*|
ddkr|sd }d  W Y qt|dd W 5 d }~X Y qX q|
d}|r:|d ddkr:|
d }|d  |d! |d" }j|dd| id#|id$}
|d%kr~fd&d'|
d(g D |
d)|
d*|
d+S j|
dS ),NZgeo_countriesZgeo_ip_blocks)Z	countriesZ	ip_blocksz%s_%s
brightcoveFc                    s   j jd | S )Nr   )_downloadercachestorex)policy_key_idr}   r4   r5   r6   Y  r7   z/BrightcoveNewIE._real_extract.<locals>.<lambda>c                     s   d f } j | d ddp$i }t|dd }|s| d }jd|d	d d
}|rjt|dd}|r|d}|sjd|ddd}| |S )Nz'http://players.brightcove.net/%s/%s_%s/zconfig.jsonFrn   c                 S   s   | d d S )NZvideo_cloud
policy_keyr4   r   r4   r4   r5   r6   `  r7   zKBrightcoveNewIE._real_extract.<locals>.extract_policy_key.<locals>.<lambda>zindex.min.jszcatalog\(({.+?})\);catalog)r   Z	policyKeyz$policyKey\s*:\s*(["\'])(?P<pk>.+?)\1z
policy keypkr1   )_download_jsonr   ru   rv   _parse_jsonr   rB   )base_urlconfigr   r`   r   )r   r   r   r}   store_pkr   r4   r5   extract_policy_key[  sP             
  z9BrightcoveNewIE._real_extract.<locals>.extract_policy_keyz>https://edge.api.brightcove.com/playback/v1/accounts/%s/%ss/%srq   zhttps?://[^/]+r   )rj   ZOriginr   Tzapplication/json;pk=%sAccept)rl   )i  i  r   r   r   Z
CLIENT_GEO)msgZINVALID_POLICY_KEYr   r   ZTVE_AUTHcustom_fields
source_urlZbcadobepassrequestoridZbcadobepassresourceidZtveToken)rl   rQ   Zplaylistc                    s*   g | ]"}| d r|| d  qS )r!   )rB   r   )r:   Zvid)rl   r}   r4   r5   rd     s    
z1BrightcoveNewIE._real_extract.<locals>.<listcomp>Zvideosr!   r9   r%   )r   Z_initialize_geo_bypassrB   rK   rU   rr   groupsr   r   loadr   r\   r2   ranger   r   rR   causer   coder   readdecodeZraise_geo_restrictedZ_extract_mvpd_authZplaylist_resultr   )r}   r)   r~   content_typer   Zpolicy_key_extractedr   Zapi_urlrq   re   r   er   r   r   Z	tve_tokenr4   )r   r   rl   r   r   r}   r   r   r5   r   M  s    

    

   zBrightcoveNewIE._real_extractN)r   r   r   r   rr   r   staticmethodr   r   r   r   r4   r4   r4   r5   r|   U  st     =

<vr|   )%
__future__r   rz   rK   rx   Z	adobepassr   commonr   compatr   r   r	   r
   r   r   utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r|   r4   r4   r4   r5   <module>   s    P  /