U
    ¦y^MH ã                   @   s~  d dl mZ 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	Z	ddl
mZm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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 G d
d„ deƒZ6G dd„ de6ƒZ7G dd„ de7ƒZ8G dd„ de7ƒZ9G dd„ de6ƒZ:G dd„ de8ƒZ;G dd„ de8ƒZ<G dd„ de<ƒZ=G dd„ de6ƒZ>G dd„ de9ƒZ?G dd„ de8ƒZ@G d d!„ d!ee@ƒZAG d"d#„ d#eAƒZBG d$d%„ d%e@ƒZCG d&d'„ d'e9ƒZDG d(d)„ d)e6ƒZEG d*d+„ d+e;ƒZFG d,d-„ d-e6ƒZGG d.d/„ d/eEƒZHG d0d1„ d1eEƒZIG d2d3„ d3eEƒZJG d4d5„ d5eƒZKG d6d7„ d7eƒZLdS )8é    )Úunicode_literalsNé   )ÚInfoExtractorÚSearchInfoExtractoré   )ÚJSInterpreter)ÚSWFInterpreter)
Ú
compat_chrÚcompat_HTTPErrorÚcompat_kwargsÚcompat_parse_qsÚcompat_urllib_parse_unquoteÚ compat_urllib_parse_unquote_plusÚcompat_urllib_parse_urlencodeÚcompat_urllib_parse_urlparseÚcompat_urlparseÚ
compat_str)Úbool_or_noneÚ
clean_htmlÚerror_to_compat_strÚextract_attributesÚExtractorErrorÚfloat_or_noneÚget_element_by_attributeÚget_element_by_idÚint_or_noneÚmimetype2extÚ
orderedSetÚparse_codecsÚparse_durationÚremove_quotesÚremove_startÚsmuggle_urlÚstr_or_noneÚ
str_to_intÚtry_getÚunescapeHTMLÚunified_strdateÚunsmuggle_urlÚuppercase_escapeÚurl_or_noneÚurlencode_postdatac                       s`   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
d„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚYoutubeBaseInfoExtractorz-Provide base functions for Youtube extractorsz(https://accounts.google.com/ServiceLoginz,https://accounts.google.com/signin/challengez.https://accounts.google.com/_/signin/sl/lookupz1https://accounts.google.com/_/signin/sl/challengez;https://accounts.google.com/_/signin/challenge?hl=en&TL={0}ÚyoutubeFz9(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}c                 C   s   | j dddt ¡ d d� d S )Nz.youtube.comZPREFzf1=50000000&hl=eni O )Úexpire_time)Ú_set_cookieÚtime©Úself© r3   úOC:\Users\TaGoRe\Desktop\beinconnect-dl\binaries\youtube_dl\extractor\youtube.pyÚ_set_languageI   s      
ýz&YoutubeBaseInfoExtractor._set_languagec                    s   ‡ fdd„|D ƒS )Nc                    s   g | ]}ˆ j |d |d�‘qS )ÚYoutube©Úvideo_id©Ú
url_result)Ú.0Zvid_idr1   r3   r4   Ú
<listcomp>P   s   ÿz<YoutubeBaseInfoExtractor._ids_to_results.<locals>.<listcomp>r3   )r2   Úidsr3   r1   r4   Ú_ids_to_resultsO   s    
þz(YoutubeBaseInfoExtractor._ids_to_resultsc                    s¦  ˆ  ¡ \}}|dkrBˆjr>ˆjj d¡dkr>tdˆj dd�‚dS ˆjˆjddddd	�}|dkrddS ˆ 	|¡‰ ‡ ‡fd
d„}‡fdd„}|dg dddddddddddddddg dgdddg gddddg	|g}|ˆj
|ddƒ}|dkrèdS t|dd„ tƒ}|�s
|dƒ dS |ddddddd|ddggddddddddg dgdddg gddddg	g}	|ˆj|	ddƒ}
|
dk�rpdS t|
dd„ tƒ}|�r´t|dd„ tƒ}||dk�rªdd n|ƒ dS t|
dd„ tƒ}|�sÖ|d ƒ dS t|d!d„ tƒ}|�rJt|d"d„ tƒ}|d#k�rt|d$d„ tƒ}|d%k�r,|d&ƒ dS t|
d'd„ tƒ}|�sN|d(ƒ dS ˆ d)¡}|�sj|d*ƒ dS t|d+ƒ}|dddd,dddddddd|ddgg	g}|ˆj |¡|d-d.ƒ}|dk�rÀdS t|d/d„ tƒ}|�rt|d0d„ tƒ}||dk�rúd1d2 n|ƒ dS t|d3d„ tƒ}n2d4d5d6d7œ}| |d8ˆj|f ¡}|d9| ƒ dS nt|d:d„ tƒ}|�sl|d;ƒ dS ˆj|dd<dd=�}|dk�rŒdS d>|k�r¢|dƒ dS dS )?zè
        Attempt to log in to YouTube.
        True is returned if successful or skipped.
        False is returned if login failed.

        If _LOGIN_REQUIRED is set and no authentication was provided, an error is raised.
        NÚ
cookiefilez-No login info available, needed for using %s.T©ÚexpectedzDownloading login pagezunable to fetch login pageF)ÚnoteÚerrnoteÚfatalc                    sT   ˆ   ¡ }| dddddt |¡ddddœ	¡ ˆj| d ||d	d
„ dt|ƒdddœd�S )Nr   r-   ÚenzN[null,null,null,[],null,"US",null,null,[],"GlifWebSignIn",null,[null,null,[]]]ZGlifWebSignInZServiceLoginz["identifier",""])	ZpstMsgZcheckConnectionZcheckedDomainsZhlZ
deviceinfozf.reqZflowNameZ	flowEntryZ	bgRequestc                 S   s   t  dd| ¡S )Nz^[^[]*Ú )ÚreÚsub©Úsr3   r3   r4   Ú<lambda>|   ó    z>YoutubeBaseInfoExtractor._login.<locals>.req.<locals>.<lambda>Fz/application/x-www-form-urlencoded;charset=utf-8)zContent-TypezGoogle-Accounts-XSRF)rB   rC   Útransform_sourcerD   ÚdataÚheaders)ÚcopyÚupdateÚjsonÚdumpsÚ_download_jsonr+   )ÚurlZf_reqrB   rC   rN   ©Z
login_formr2   r3   r4   Úreql   s0    ö   þüz,YoutubeBaseInfoExtractor._login.<locals>.reqc                    s   ˆ j  | ¡ d S ©N)Ú_downloaderÚreport_warning)Úmessager1   r3   r4   Úwarnƒ   s    z-YoutubeBaseInfoExtractor._login.<locals>.warnÚUSr   r   a  https://accounts.google.com/ServiceLogin?passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Fnext%3D%252F%26action_handle_signin%3Dtrue%26hl%3Den%26app%3Ddesktop%26feature%3Dsign_in_button&hl=en&service=youtube&uilel=3&requestPath=%2FServiceLogin&Page=PasswordSeparationSignIné   zLooking up account infozUnable to look up account infoc                 S   s   | d d S )Nr   r   r3   ©Úxr3   r3   r4   rK   š   rL   z1YoutubeBaseInfoExtractor._login.<locals>.<lambda>zUnable to extract user hashz
Logging inzUnable to log inc                 S   s   | d d S ©Nr   é   r3   r_   r3   r3   r4   rK   ®   rL   c                 S   s   | d S ©Nrb   r3   r_   r3   r3   r4   rK   °   rL   ZINCORRECT_ANSWER_ENTEREDzUnable to login: %szInvalid passwordc                 S   s   | d d S )Nr   éÿÿÿÿr3   r_   r3   r3   r4   rK   ¶   rL   zUnable to extract result entryc                 S   s   | d d S ©Nr   r3   r_   r3   r3   r4   rK   »   rL   c                 S   s   | d S ©Nr   r3   r_   r3   r3   r4   rK   ½   rL   ZTWO_STEP_VERIFICATIONc                 S   s   | d S rc   r3   r_   r3   r3   r4   rK   Á   rL   ZQUOTA_EXCEEDEDz*Exceeded the limit of TFA codes, try laterc                 S   s   | d d S )Nr   r   r3   r_   r3   r3   r4   rK   Æ   rL   zUnable to extract TLz2-step verification codez§Two-factor authentication required. Provide it either interactively or with --twofactor <code>(Note that only TOTP (Google Authenticator App) codes work at this time.)zG-é	   zSubmitting TFA codezUnable to submit TFA codec                 S   s   | d d S ra   r3   r_   r3   r3   r4   rK   ã   rL   c                 S   s   | d S rc   r3   r_   r3   r3   r4   rK   å   rL   zUnable to finish TFA: %szInvalid TFA codec                 S   s   | d d d S )Nr   rd   r   r3   r_   r3   r3   r4   rK   ì   rL   z[This device isn't recognized. For your security, Google wants to make sure it's really you.zEPlease provide additional information to aid in the recovery process.zmThere is something unusual about your activity. For your security, Google wants to make sure it's really you.)ZLOGIN_CHALLENGEZUSERNAME_RECOVERYZREAUTHz%s returned error %s.zC%s
Go to https://accounts.google.com/, login and solve a challenge.c                 S   s   | d S rf   r3   r_   r3   r3   r4   rK   ù   rL   z!Unable to extract CheckCookie URLzChecking cookie©rD   zhttps://myaccount.google.com/)Ú_get_login_infoÚ_LOGIN_REQUIREDrY   ÚparamsÚgetr   ÚIE_NAMEÚ_download_webpageÚ
_LOGIN_URLÚ_hidden_inputsÚ_LOOKUP_URLr%   r   Ú_CHALLENGE_URLÚlistÚ_get_tfa_infor!   Ú_TFA_URLÚformat)r2   ÚusernameÚpasswordZ
login_pagerW   r\   Z
lookup_reqZlookup_resultsZ	user_hashZchallenge_reqZchallenge_resultsZ	login_resZ	login_msgÚresZlogin_challengeZchallenge_strÚstatusÚtlZtfa_codeZtfa_reqZtfa_resultsZtfa_resZtfa_msgZcheck_cookie_urlZ
CHALLENGESÚ	challengeZcheck_cookie_resultsr3   rV   r4   Ú_loginT   s^     ý
           þ     ûö  þ          þý  þ
ÿþ


ÿ
          
þþ
  þ
ÿþ  ÿýþ   ÿ

zYoutubeBaseInfoExtractor._loginc                    s6   |  di ¡ ¡ }d|d< ||d< tt| ƒj|t|ƒŽS )NÚqueryÚtrueZdisable_polymer)rl   rP   Úsuperr,   Ú_download_webpage_handler   )r2   ÚargsÚkwargsr~   ©Ú	__class__r3   r4   r�     s    
 ÿz1YoutubeBaseInfoExtractor._download_webpage_handlec                 C   s&   | j d krd S |  ¡  |  ¡ s"d S d S rX   )rY   r5   r}   r1   r3   r3   r4   Ú_real_initialize  s
    
z)YoutubeBaseInfoExtractor._real_initialize)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ro   Z_TWOFACTOR_URLrq   rr   ru   Ú_NETRC_MACHINErj   Ú_PLAYLIST_ID_REr5   r>   r}   r�   r†   Ú__classcell__r3   r3   r„   r4   r,   :   s    8r,   c                   @   s   e Zd Zdd„ ZdS )Ú!YoutubeEntryListBaseInfoExtractorc                 c   s  | }}t  d¡D ]ê}|  |¡D ]
}|V  q t d|¡}|s@ qþd}d}	||	kràz8| jd| d¡ |d||rtd| nd	f td
�}
W qàW qH tk
rÜ } z6t	|j
tƒrÊ|j
jdkrÊ|d7 }||	krÊW Y ¢qH‚ W 5 d }~X Y qHX qH|
d }| ¡ sô qþ|
d }qd S )Nr   ú+data-uix-load-more-href="/?(?P<more>[^"]+)"r   é   úhttps://youtube.com/%sÚmorezDownloading page #%s%sz (retry #%d)rF   ©rM   )iô  i÷  Úcontent_htmlÚload_more_widget_html)Ú	itertoolsÚcountÚ_process_pagerG   ÚsearchrT   Úgroupr)   r   Ú
isinstanceÚcauser
   ÚcodeÚstrip)r2   ÚpageÚplaylist_idÚmore_widget_htmlr”   Úpage_numÚentryÚmobjr—   Úretriesr’   Úer3   r3   r4   Ú_entries  s<     ÿüz*YoutubeEntryListBaseInfoExtractor._entriesN)r‡   rˆ   r‰   r§   r3   r3   r3   r4   rŽ     s   rŽ   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú YoutubePlaylistBaseInfoExtractorc                 c   s*   |   |¡D ]\}}|  |d||¡V  q
d S )Nr6   )Úextract_videos_from_pager:   )r2   Úcontentr8   Úvideo_titler3   r3   r4   r˜   B  s    z.YoutubePlaylistBaseInfoExtractor._process_pagec           	   	   C   s¾   t  ||¡D ]¬}d| ¡ kr,| d¡dkr,q| d¡}d| ¡ krPt| d¡ƒnd }|r`| ¡ }|dkrld }z"| |¡}|rŒ|| sŒ|||< W q tk
r¶   | |¡ | |¡ Y qX qd S )NÚindexÚidÚ0Útitleu   â–º Play all)	rG   ÚfinditerÚ	groupdictrš   r&   rž   r¬   Ú
ValueErrorÚappend)	r2   Zvideo_rerŸ   Úids_in_pageÚtitles_in_pager¤   r8   r«   Úidxr3   r3   r4   Úextract_videos_from_page_implF  s*    

ÿÿÿ

z>YoutubePlaylistBaseInfoExtractor.extract_videos_from_page_implc                 C   s$   g }g }|   | j|||¡ t||ƒS rX   )r·   Ú	_VIDEO_REÚzip)r2   rŸ   r´   rµ   r3   r3   r4   r©   Z  s       ÿz9YoutubePlaylistBaseInfoExtractor.extract_videos_from_pageN)r‡   rˆ   r‰   r˜   r·   r©   r3   r3   r3   r4   r¨   A  s   r¨   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú!YoutubePlaylistsBaseInfoExtractorc                 c   s,   t t d|¡ƒD ]}|  d| d¡V  qd S )Nzb<h3[^>]+class="[^"]*yt-lockup-title[^"]*"[^>]*><a[^>]+href="/?playlist\?list=([0-9A-Za-z-_]{10,})"ú(https://www.youtube.com/playlist?list=%sÚYoutubePlaylist)r   rG   Úfindallr:   )r2   rª   r    r3   r3   r4   r˜   c  s    þ
 ÿz/YoutubePlaylistsBaseInfoExtractor._process_pagec                 C   s:   |   |¡}|  ||¡}| j|dd�}|  |  ||¡||¡S ©NFrh   )Ú	_match_idrn   Ú_og_search_titleÚplaylist_resultr§   )r2   rU   r    Úwebpager¯   r3   r3   r4   Ú_real_extractj  s    
z/YoutubePlaylistsBaseInfoExtractor._real_extractN)r‡   rˆ   r‰   r˜   rÃ   r3   r3   r3   r4   rº   b  s   rº   c                T       sö  e Zd ZdZddeji 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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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&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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,dddd.d+œddd1dd2œddd1dd2œddd1dd2œddd1dd2œdd#d1dd2œdd1dd3œddd1dd2œddd1dd2œdd4d1dd2œddd1dd5d6œdd#d1dd5d6œdd7d1dd2œd8d9dd-d:d;œd8d9ddd:d;œd8d9dd/d:d;œd8d9dd:d<œd8d9dd:d<œd8d9d=d:d<œd8d9d>d:d<œd&ddd1d&d(d?œd&ddd1d&d(d?œd&ddd1d&d(d?œd&d#d"d1d&d(d?œd&ddd1d&d(d?œd&ddd1d&d(d?œd&dd1d&d@dAœd&dd1d@d2œd&dd1d@d2œd&dd1d@d2œd&dd1d@d2œd&dd1d@d2œd&dd1d@d2œd&d#d1d@d2œd&d4d1d@d2œd&d7d1d@d2œd&dd1d@d5d6œd&d#d1d@d5d6œd&d4d1d@d5d6œd&d7d1d@d2œd&d7d1d@d5d6œd&d'd9ddBœd&d'd9d/dBœd&d9dCdDdEœd&d9dCdFdEœd&d9dCdGdEœdHdIidJdKdLœdJdKdLœdJdKdLœdJdKdLœdMœRZdNZ	dOZ
dPZdQdRddSdTdUdVdWdXdYdZd[gd\gd]eeed^d_d`œdaœdbdcddddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzgd{d|d}d~d|dgd|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™dRddSdTdUdVdYdZd[gd\gd]eeedšœd›dœid�œdždŸd d8dYd¡d¢d£d¡d¤d¥œdœd¦d§œd¨d©œdªd«d8d¬d­d®d¯d¯d°d±œdœd²d§œd³œd´dµd8d¶d·d¸d¹d¹dºd±œdœd²d§œd³œd»d¼dd½d¾d¿dÀdÁdÂdÃdÄœ	daœdÅdÆddÇdÈdÉdÊdËdÌdÍdŒdÎœ
daœdÏdÐddÑdÒdÓdÔdÔdÕdÖdŒdÎœ
daœd×d×ddØdÙdÚdÛdÜdÝdÚdÞdßdàœdág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÷œ
daœ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	œ
�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$œ
i�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$œ
i�d�d*d�d+�d�d,�d�d �d!�d"�d#�d$œ
igd›dœi�d-�d.œ�d/�d0�d1�d2œ�d3�d4�d5œ�d6dœ�d7œ�d8dœ�d7œ�d9�d:d�d;�d<�d=�d>�d?�d@�dA�d@�dB�d<�dB�dC�dDœd›dœid³œ�dEdœ�d7œ�dF�dGd�dH�dI�dJ�dK�dLdýœd›dœi�dMdÿœ�dN�dOd�dP�dQ�dR�dS�dT�dU�dV�dW�dXœ
d›dœid³œ�dY�dZd�d[�d\�d]�d?�d^�d_�d`�dW�d$œ
d›dœid³œ�dadœ�d7œ�dbdœ�d7œ�dc�ddd�de�df�dg�dh�di�dj�d#�dkœ	d›dœi�d-dÿœ�dl�dmd�dn�do�dp�dq�dr�dr�ds�dtd^d^�duœd›dœi�dvg�dwœ�dx�dyd�dz�d{�d|�d}�d~�d�d€�d�œ	d›dœid³œ�d‚dœ�d7œ�dƒdœ�d7œ�d„dœ�d7œ�d…dœ�d7œ�d†dœ�d7œ�d‡�dˆd�d‰�dŠ�d‹�dŒ�d��dŽ�d��d��d‘œ
dœdO�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©�džœd›dœi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³�džœd›dœid³œ�d¾dœ�d7œg*Z‡ f�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Ó�dÔ„Z�dÕ�dÖ„ Z�d×�dØ„ Z�dÙ�dÚ„ Z�dÛ�dÜ„ Ze�dÝ�dÞ„ ƒZe�dß�dà„ ƒZe �dá�dâ„ ƒZ!e�dã�dä„ ƒZ"�då�dæ„ Z#‡  Z$S (è  Ú	YoutubeIEzYouTube.coma   (?x)^
                     (
                         (?:https?://|//)                                    # http(s):// or protocol-independent URL
                         (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie|kids)?\.com/|
                            (?:www\.)?deturl\.com/www\.youtube\.com/|
                            (?:www\.)?pwnyoutube\.com/|
                            (?:www\.)?hooktube\.com/|
                            (?:www\.)?yourepeat\.com/|
                            tube\.majestyc\.net/|
                            # Invidious instances taken from https://github.com/omarroth/invidious/wiki/Invidious-Instances
                            (?:(?:www|dev)\.)?invidio\.us/|
                            (?:(?:www|no)\.)?invidiou\.sh/|
                            (?:(?:www|fi|de)\.)?invidious\.snopyta\.org/|
                            (?:www\.)?invidious\.kabi\.tk/|
                            (?:www\.)?invidious\.13ad\.de/|
                            (?:www\.)?invidious\.mastodon\.host/|
                            (?:www\.)?invidious\.nixnet\.xyz/|
                            (?:www\.)?invidious\.drycat\.fr/|
                            (?:www\.)?tube\.poal\.co/|
                            (?:www\.)?vid\.wxzm\.sx/|
                            (?:www\.)?yt\.elukerio\.org/|
                            (?:www\.)?yt\.lelux\.fi/|
                            (?:www\.)?kgg2m7yk5aybusll\.onion/|
                            (?:www\.)?qklhadlycap4cnod\.onion/|
                            (?:www\.)?axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid\.onion/|
                            (?:www\.)?c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid\.onion/|
                            (?:www\.)?fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad\.onion/|
                            (?:www\.)?invidious\.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd\.onion/|
                            (?:www\.)?owxfohz4kjyv25fvlqilyxast7inivgiktls3th44jhk3ej3i7ya\.b32\.i2p/|
                            youtube\.googleapis\.com/)                        # the various hostnames, with wildcard subdomains
                         (?:.*?\#/)?                                          # handle anchor (#/) redirect urls
                         (?:                                                  # the various things that can precede the ID:
                             (?:(?:v|embed|e)/(?!videoseries))                # v/ or embed/ or e/
                             |(?:                                             # or the v= param in all its forms
                                 (?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)?  # preceding watch(_popup|.php) or nothing (like /?v=xxxx)
                                 (?:\?|\#!?)                                  # the params delimiter ? or # or #!
                                 (?:.*?[&;])??                                # any other preceding param (like /?s=tuff&v=xxxx or ?s=tuff&amp;v=V36LpHqtcDY)
                                 v=
                             )
                         ))
                         |(?:
                            youtu\.be|                                        # just youtu.be/xxxx
                            vid\.plus|                                        # or vid.plus/xxxx
                            zwearz\.com/watch|                                # or zwearz.com/watch/xxxx
                         )/
                         |(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=
                         )
                     )?                                                       # all until now is optional -> you can pass the naked ID
                     ([0-9A-Za-z_-]{11})                                      # here is it! the YouTube video ID
                     (?!.*?\blist=
                        (?:
                            %(playlist_id)s|                                  # combined list/video URLs are handled by the playlist IE
                            WL                                                # WL are handled by the watch later IE
                        )
                     )
                     (?(1).+)?                                                # if we found the ID, everything can follow
                     $r    z[\?&]next_url=([^&]+)Úflvi�  éð   Úmp3é@   Úh263)ÚextÚwidthÚheightÚacodecÚabrÚvcodeciÂ  i  Ú3gpÚaacÚmp4v)rÊ   rÍ   rÏ   é°   é�   é   Úmp4i€  ih  é`   Úh264i   iÐ  éÀ   é€   iV  ià  é@  )rÊ   rË   rÍ   rÏ   i€  i8  i   i   ÚwebmÚvorbisÚvp8Z3Diìÿÿÿ)rÊ   rÌ   Úformat_noterÍ   rÎ   rÏ   Ú
preferenceZHLSé0   iöÿÿÿé   éH   z
DASH video)rÊ   rÌ   rß   rÏ   )rÊ   rß   rÏ   i   é<   )rÊ   rÌ   rß   rÏ   Úfpsip  Úm4az
DASH audioÚm4a_dash)rÊ   rß   rÍ   rÎ   Ú	container)rÊ   rß   rÍ   rè   Údtsezec-3)rÊ   rÌ   rË   rß   rè   rÏ   Úvp9)rÊ   rÌ   rß   rè   rÏ   )rÊ   rÍ   rß   rÎ   Úopusé2   )rÊ   rß   rÍ   rÎ   éF   é    ÚprotocolÚrtmpÚnonezav01.0.05M.08)rÍ   rÏ   )RÚ5Ú6Z13Z17Z18Z22Z34Z35Z36Z37Z38Ú43Z44Z45Z46Z59Z78Z82Z83Z84Z85Z100Z101Z102Z91Z92Z93Z94Z95Z96Z132Z151Z133Z134Ú135Z136Z137Z138Z160Z212Z264Z298Z299Z266Z139Z140Ú141Z256Z258Z325Z328Z167Z168Z169Z170Z218Z219Z278Z242Z243Z244Z245Z246Z247Z248Z271Z272Z302Z303Z308Z313Z315Z171Z172Z249Z250Z251Ú_rtmpZ394Z395Z396Z397)Zsrv1Zsrv2Zsrv3ÚttmlÚvttFr-   z6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9ZBaW_jenozKcu#   youtube-dl test video "'/\Ã¤â†­ð�•�zPhilipp HagemeisterZphihagz.re:https?://(?:www\.)?youtube\.com/user/phihagZUCLqxVugv74EIW3VWh2NOa3QzCre:https?://(?:www\.)?youtube\.com/channel/UCLqxVugv74EIW3VWh2NOa3QZ20121002uª   test chars:  "'/\Ã¤â†­ð�•�
test URL: https://github.com/rg3/youtube-dl/issues/1892

This is a test video for youtube-dl.

For more information, contact phihag@phihag.de .zScience & Technologyz
youtube-dlé
   r   rg   )r­   rÊ   r¯   ÚuploaderÚuploader_idÚuploader_urlÚ
channel_idÚchannel_urlÚupload_dateÚdescriptionÚ
categoriesÚtagsÚdurationÚ
view_countÚ
like_countÚdislike_countÚ
start_timeÚend_time)rU   Ú	info_dictz+https://www.youtube.com/watch?v=UxxajLWwzqYz.Test generic use_cipher_signature video (#897)ZUxxajLWwzqYZ20120506z9Icona Pop - I Love It (feat. Charli XCX) [OFFICIAL VIDEO]zI Love It (feat. Charli XCX)z$md5:19a2f98d9032b9311e686ed039564f63zIcona Pop i love itZswedenz	pop musiczbig beat recordszbig beatZcharliZxcxz
charli xcxZgirlsÚhboz	i love itzi don't careZiconaÚpopz	iconic epZiconicZloveÚité´   z	Icona PopZIconaPopz0re:https?://(?:www\.)?youtube\.com/user/IconaPop)r­   rÊ   r   r¯   Ú	alt_titler  r  r  rû   rü   rý   ÚcreatorÚtrackÚartist)rU   rB   r
  z+https://www.youtube.com/watch?v=07FYdnEawAQz*Test VEVO video with age protection (#956)Z07FYdnEawAQZ20130703zCJustin Timberlake - Tunnel Vision (Official Music Video) (Explicit)zTunnel Visionz$md5:07dab3356cde4199048e4c7cd93471e1i£  ZjustintimberlakeVEVOz<re:https?://(?:www\.)?youtube\.com/user/justintimberlakeVEVOzJustin Timberlakeé   )r­   rÊ   r   r¯   r  r  r  rû   rü   rý   r  r  r  Ú	age_limitz%//www.YouTube.com/watch?v=yZIXLfi8CZQzEmbed-only video (#1746)ZyZIXLfi8CZQZ20120608zCPrincipal Sexually Assaults A Teacher - Episode 117 - 8th June 2012z$md5:09b78bd971f1e3e289601dfba15ca4f7z	SET IndiaZsetindiaz0re:https?://(?:www\.)?youtube\.com/user/setindia)	r­   rÊ   r   r¯   r  rû   rü   rý   r  z9https://www.youtube.com/watch?v=BaW_jenozKc&v=UxxajLWwzqYz!Use the first video ID in the URL)r­   rÊ   r¯   rû   rü   rý   r   r  r  r  r  r  r  r  Úskip_downloadT)rU   rB   r
  rk   z+https://www.youtube.com/watch?v=a9LDPn-MO4Iz.256k DASH audio (format 141) via DASH manifestza9LDPn-MO4IZ8KVIDEOz/re:https?://(?:www\.)?youtube\.com/user/8KVIDEOrF   zUHDTV TEST 8K VIDEO.mp4)r­   rÊ   r   rü   rý   r  rû   r¯   rö   )Úyoutube_include_dash_manifestrv   zformat 141 not served anymore)rU   rB   r
  rk   Úskipz+https://www.youtube.com/watch?v=IB3lcPjvWLAZIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree Wilsonz$md5:8f5e2b82460520b619ccac1f509d43bféô   ZAfrojackVEVOZ20131011)r­   rÊ   r¯   r  r  rû   rü   r   z141/bestaudio[ext=m4a]©rU   r
  rk   z+https://www.youtube.com/watch?v=nfWlot6h_JMZnfWlot6h_JMzTaylor Swift - Shake It Offz$md5:307195cd21ff7fa352270fe884570ef0éò   ZTaylorSwiftVEVOZ20140818z+https://www.youtube.com/watch?v=T4XJQO3qol8ZT4XJQO3qol8éÛ   Z20100909zAmazing AtheistZTheAmazingAtheistz9re:https?://(?:www\.)?youtube\.com/user/TheAmazingAtheistzBurning Everyone's Koranz¾SUBSCRIBE: http://www.youtube.com/saturninefilms

Even Obama has taken a stand against freedom on this issue: http://www.huffingtonpost.com/2010/09/09/obama-gma-interview-quran_n_710282.html)	r­   rÊ   r  r   rû   rü   rý   r¯   r  z'https://youtube.com/watch?v=HtVdAasjOgUZHtVdAasjOgUz7The Witcher 3: Wild Hunt - The Sword Of Destiny Trailerz@re:(?s).{100,}About the Game\n.*?The Witcher 3: Wild Hunt.{100,}éŽ   zThe WitcherZWitcherGamez3re:https?://(?:www\.)?youtube\.com/user/WitcherGameZ20140605)
r­   rÊ   r¯   r  r  rû   rü   rý   r   r  z+https://www.youtube.com/watch?v=6kLq3WMV1nUZ6kLq3WMV1nUz-Dedication To My Ex (Miss That) (Lyric Video)z$md5:33765bb339e1b47e7e72b5490139bb41éö   Z	LloydVEVOz1re:https?://(?:www\.)?youtube\.com/user/LloydVEVOZ20110629Z__2ABJjxzNoi
  Z20100430Zdeadmau5z0re:https?://(?:www\.)?youtube\.com/user/deadmau5zDada Life, deadmau5z$md5:12c56784b8032162bb936a5f76d55360zDeadmau5 - Some Chords (HD)zThis Machine Kills Some Chords)r­   rÊ   r  r   rü   rý   r  r  rû   r¯   r  zDASH manifest missing)rU   r
  Úexpected_warningsZlqQg6PlCWgIiÅ  Z20150827Zolympicz/re:https?://(?:www\.)?youtube\.com/user/olympiczLHO09  - Women -  GER-AUS - Hockey - 31 July 2012 - London 2012 Olympic GamesZOlympicz5Hockey - Women -  GER-AUS - London 2012 Olympic Games)	r­   rÊ   r  r   rü   rý   r  rû   r¯   zrequires avconvz+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0gÇqÇqü?éU   Z20110310Z	AllenMeowz1re:https?://(?:www\.)?youtube\.com/user/AllenMeowuu   made by Wacom from Korea | å­—å¹•&åŠ æ²¹æ·»é†‹ by TY's Allen | æ„Ÿè¬�heylisa00cavey1001å�Œå­¸ç†±æƒ…æ��ä¾›æ¢—å�Šç¿»è­¯u	   å­«á„‹á„…u8   [A-made] è®Šæ…‹å¦�å­—å¹•ç‰ˆ å¤ªå¦� æˆ‘å°±æ˜¯é€™æ¨£çš„äºº)
r­   rÊ   Ústretched_ratior  r   rü   rý   r  rû   r¯   ZqEJwOuvDf7Iu�   ÐžÐ±Ñ�ÑƒÐ¶Ð´ÐµÐ½Ð¸Ðµ Ñ�ÑƒÐ´ÐµÐ±Ð½Ð¾Ð¹ Ð¿Ñ€Ð°ÐºÑ‚Ð¸ÐºÐ¸ Ð¿Ð¾ Ð²Ñ‹Ð±Ð¾Ñ€Ð°Ð¼ 14 Ñ�ÐµÐ½Ñ‚Ñ�Ð±Ñ€Ñ� 2014 Ð³Ð¾Ð´Ð° Ð² Ð¡Ð°Ð½ÐºÑ‚-ÐŸÐµÑ‚ÐµÑ€Ð±ÑƒÑ€Ð³ÐµZ20150404Zspbelectu+   Ð�Ð°Ð±Ð»ÑŽÐ´Ð°Ñ‚ÐµÐ»Ð¸ ÐŸÐµÑ‚ÐµÑ€Ð±ÑƒÑ€Ð³Ð°)r­   rÊ   r¯   r  r   rü   rû   zThis live event has ended.)rU   r
  rk   r  z+https://www.youtube.com/watch?v=FIl7x6_3R5YZFIl7x6_3R5Yz$md5:7b81415841e02ecd4313668cde88737az$md5:116377fd2963b81ec4ce64b542173306éÜ   Z20150625Zdorappi2000z3re:https?://(?:www\.)?youtube\.com/user/dorappi2000zmincount:31)
r­   rÊ   r¯   r  r  r   rü   rý   rû   Úformatsznot actual anymore)rU   r
  r  z)https://www.youtube.com/embed/CsmdDsKjzN8Z 8ce563a1d667b599d21064e982ab9e31ZCsmdDsKjzN8Z20150501ZAirtekuA   RetransmisiÃ³n en directo de la XVIII media maratÃ³n de Zaragoza.ZUCzTzUmjXxxacNnL8I3m4LnQu1   RetransmisiÃ³n XVIII Media maratÃ³n Zaragoza 2015)r­   rÊ   r   rû   r  rü   r¯   rõ   )rU   Úmd5r
  rk   r  z+https://www.youtube.com/watch?v=jqWvoWXjCVsZjqWvoWXjCVsz"teamPGP: Rocket League Noob Streamz$md5:dc7872fb300e143831327f1bae3af010)r­   r¯   r  r
  z0teamPGP: Rocket League Noob Stream (Main Camera)i§  Z20150721zBeer Games BeerZbeergamesbeerz5re:https?://(?:www\.)?youtube\.com/user/beergamesbeerúStandard YouTube License)
r­   rÊ   r¯   r  r  r   rû   rü   rý   ÚlicenseZ6h8e8xoXJzgz-teamPGP: Rocket League Noob Stream (kreestuh)i©  ZPUOgX5z9xZwz,teamPGP: Rocket League Noob Stream (grizzle)ZteuwxikvS5kz(teamPGP: Rocket League Noob Stream (zim)i¦  úThis video is not available.)rU   r
  Úplaylistrk   r  z+https://www.youtube.com/watch?v=gVfLd0zydloZgVfLd0zydloz/DevConf.cz 2016 Day 2 Workshops 1 14:00 - 15:30©r­   r¯   r   zNot multifeed anymore©rU   r
  Úplaylist_countr  zhttps://vid.plus/FlRa-iH7PGw©rU   Úonly_matchingz_https://zwearz.com/watch/9lWxNJF-ufM/electra-woman-dyna-girl-official-trailer-grace-helbig.htmlz+https://www.youtube.com/watch?v=lsguqyKfVQgZlsguqyKfVQgz4{dark walk}; Loki/AC/Dishonored; collab w/Elflover21zDark Walk - Position Musicz$md5:8085699c11dc3f597ce0410b0dcbb34aé…   Z20151119ZIronSoulElfz3re:https?://(?:www\.)?youtube\.com/user/IronSoulElfz1Todd Haberman,  Daniel Law Heath and Aaron Kaplanz6Position Music - Production Music Vol. 143 - Dark Walk)r­   rÊ   r¯   r  r  r  r   rü   rý   rû   r  r  r  Úalbumz+https://www.youtube.com/watch?v=Ms7iBXnlUO8z+https://www.youtube.com/watch?v=Q39EVAstoRMZQ39EVAstoRMz+Clash Of Clans#14 Dicas De Ataque Para CV 4z$md5:ee18a25c350637c8faff806845bddee9Z20151107ZUCCr7TALkRbo3EtFzETQF1LAzCH GAMER DROIDzThis video does not exist.z+https://www.youtube.com/watch?v=M4gD1WSo5mAZM4gD1WSo5mAz$md5:e41008789470fc2533a3252216f1c1d1z$md5:a677553cf0840649b731a3024aeff4cciÑ  Z20150127ZBerkmanCenterz5re:https?://(?:www\.)?youtube\.com/user/BerkmanCenterz/The Berkman Klein Center for Internet & Societyz4Creative Commons Attribution license (reuse allowed))
r­   rÊ   r¯   r  r  r   rü   rý   rû   r%  z+https://www.youtube.com/watch?v=eQcmzGIKrzgZeQcmzGIKrzgz8Democratic Socialism and Foreign Policy | Bernie Sandersz$md5:dda0d780d5a6e120758d1711d062a867iÜ  zBernie SandersZUCH1dpzjCEiGAt8CXkryhkZgzCre:https?://(?:www\.)?youtube\.com/channel/UCH1dpzjCEiGAt8CXkryhkZgzKhttps://www.youtube.com/watch?feature=player_embedded&amp;amp;v=V36LpHqtcDYz+https://www.youtube.com/watch?v=i1Ko8UG-Tdoz+https://www.youtube.com/watch?v=yYr8q0y5JfgZuGpuVWrhIzEzPiku - Trailerz$md5:c36bd60c3fd6f1954086c083c72092ebZ20150811Z
FlixMatrixZFlixMatrixKaravanz9re:https?://(?:www\.)?youtube\.com/user/FlixMatrixKaravan)	r­   rÊ   r¯   r  r   rû   rü   rý   r%  z+https://www.youtube.com/watch?v=iqKdEhx-dD4ziqKdEhx-dD4zIsolation - Mind Field (Ep 1)z$md5:46a29be4ceffa65b92d277b93f463c0fi%  Z20170118ZVsaucez.re:https?://(?:www\.)?youtube\.com/user/Vsaucez
Mind Field)r­   rÊ   r¯   r  r  r   rû   rü   rý   ÚseriesÚseason_numberÚepisode_numberzSkipping DASH manifest)rU   r
  rk   r  z+https://www.youtube.com/watch?v=6SJNVb0GnPIZ6SJNVb0GnPIz Race Differences in Intelligencez$md5:5d161533167390427a1f8ee89a1fc6f1iÅ  Z20140124zNew Century FoundationZUCEJYpZGqgUob0zVVEaLhvVgzCre:https?://(?:www\.)?youtube\.com/channel/UCEJYpZGqgUob0zVVEaLhvVg)	r­   rÊ   r¯   r  r  r   rû   rü   rý   Z1t24XAntNCYzsJL6WA-aGkQz5https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMMz&https://invidio.us/watch?v=BaW_jenozKcz+https://www.youtube.com/watch?v=s7_qI6_mIXcz+https://www.youtube.com/watch?v=Z4Vy8R84T1UZZ4Vy8R84T1UzCsaman SMAN 53 Jakarta(Sancety) opening COFFEE4th at SMAN 53 Jakartaz$md5:d41d8cd98f00b204e9800998ecf8427ei±  Z20130923zAmelia Putri HarwitaZUCpOxM49HJxmC1qCalXyB3_QzCre:https?://(?:www\.)?youtube\.com/channel/UCpOxM49HJxmC1qCalXyB3_Qzmaxcount:10)
r­   rÊ   r¯   r  r  r   rû   rü   rý   r"  )r  r  z-https://music.youtube.com/watch?v=MgNrAu2pzNsZMgNrAu2pzNszVoyeur Girlz$md5:7ae382a65843d6df2685993e90a8628fZ20190312zStephen - TopiczUC-pWHpBjdGG69N9mM2auIAAZStephenz"it's too much love to know my dearZ20190313iã  )r­   rÊ   r¯   r  r   rû   rü   r  r  r.  Úrelease_dateÚrelease_yearz+https://www.youtube.com/watch?v=k0jLE7tTwjYZk0jLE7tTwjYzLatch Feat. Sam Smithz$md5:3cb1e8101a7c85fcba9b4fb41b951335Z20150110zVarious Artists - TopicZUCNkEcmYdjrH4RqtNgh7BZ9wZ
DisclosurezLatch Featuring Sam SmithZ20121008iÜ  z+https://www.youtube.com/watch?v=74qn0eJSjpAZ74qn0eJSjpAZEastsidez$md5:290516bb73dcbfab0dcc4efe6c3de5f2Z20180710zBenny Blanco - TopicZUCzqz_ksRu_WkIzmivMdIS7Azbenny blanco, Halsey, KhalidZ20180713iâ  z+https://www.youtube.com/watch?v=-hcAI0g-f5Mz-hcAI0g-f5MzPut It On Mez$md5:f6422397c07c4c907c6638e1fee380a5Z20180426zMatt Maeson - TopiczUCnEkIGqtGcQMLk73Kp-Q5LQzMatt Maesonz
The HearseNz/https://www.youtubekids.com/watch?v=3b8nCWDgZ6Qc                    s   t t| ƒj||Ž i | _d S rX   )r€   rÄ   Ú__init__Ú_player_cache)r2   r‚   rƒ   r„   r3   r4   r4  Ð  s    zYoutubeIE.__init__c                 C   s   |   d| ¡ dS )z.Report attempt to download video info webpage.z"%s: Downloading video info webpageN©Ú	to_screen©r2   r8   r3   r3   r4   Ú"report_video_info_webpage_downloadÔ  s    z,YoutubeIE.report_video_info_webpage_downloadc                 C   s   |   d| ¡ dS )z,Report attempt to extract video information.z %s: Extracting video informationNr6  r8  r3   r3   r4   Úreport_information_extractionØ  s    z'YoutubeIE.report_information_extractionc                 C   s   |   d||f ¡ dS )zReport extracted video URL.z%s: Format %s not availableNr6  )r2   r8   rv   r3   r3   r4   Úreport_unavailable_formatÜ  s    z#YoutubeIE.report_unavailable_formatc                 C   s   |   d¡ dS )z1Indicate the download will use the RTMP protocol.zRTMP download detectedNr6  r1   r3   r3   r4   Úreport_rtmp_downloadà  s    zYoutubeIE.report_rtmp_downloadc                 C   s   d  dd„ | d¡D ƒ¡S )z/ Return a string representation of a signature Ú.c                 s   s   | ]}t t|ƒƒV  qd S rX   ©r   Úlen)r;   Úpartr3   r3   r4   Ú	<genexpr>æ  s     z0YoutubeIE._signature_cache_id.<locals>.<genexpr>)ÚjoinÚsplit)r2   Úexample_sigr3   r3   r4   Ú_signature_cache_idä  s    zYoutubeIE._signature_cache_idc                    sP  t  d|¡}|std| ƒ‚| d¡}| d¡}d|||  |¡f }tj |¡|ksXt‚| j	j
 d|¡‰ ˆ d k	r|‡ fdd„S | j	j d	¡r’d
| n
d||f }|dkrÈ| j|||d| d�}	|  |	¡}
nD|dkrú| j|||d| d�}| ¡ }	|  |	¡}
nd�std| ƒ‚d tttt|ƒƒƒ¡}|
|ƒ}dd„ |D ƒ‰ | j	j
 d|ˆ ¡ |
S )Nzs.*?[-.](?P<id>[a-zA-Z0-9_-]+)(?:/watch_as3|/html5player(?:-new)?|(?:/[a-z]{2,3}_[A-Z]{2})?/base)?\.(?P<ext>[a-z]+)$zCannot identify player %rrÊ   r­   z%s_%s_%szyoutube-sigfuncsc                    s   d  ‡ fdd„ˆD ƒ¡S )NrF   c                 3   s   | ]}ˆ | V  qd S rX   r3   )r;   ÚirI   r3   r4   rA  ø  s     zJYoutubeIE._extract_signature_function.<locals>.<lambda>.<locals>.<genexpr>)rB  rI   ©Ú
cache_specrI   r4   rK   ø  rL   z7YoutubeIE._extract_signature_function.<locals>.<lambda>ÚverbosezDownloading player %szDownloading %s player %sZjszDownload of %s failed©rB   rC   ÚswfFzInvalid player type %rrF   c                 S   s   g | ]}t |ƒ‘qS r3   ©Úord©r;   Úcr3   r3   r4   r<     s     z9YoutubeIE._extract_signature_function.<locals>.<listcomp>)rG   Úmatchr   rš   rE  ÚosÚpathÚbasenameÚAssertionErrorrY   ÚcacheÚloadrk   rl   rn   Ú_parse_sig_jsÚ_request_webpageÚreadÚ_parse_sig_swfrB  Úmapr	   Úranger?  Ústore)r2   r8   Ú
player_urlrD  Zid_mZplayer_typeÚ	player_idZfunc_idZdownload_noter�   ry   ÚurlhÚtest_stringÚ	cache_resr3   rG  r4   Ú_extract_signature_functionè  sX    þ

  ÿÿ

ý ý ýz%YoutubeIE._extract_signature_functionc           
      C   s€   dd„ }d  tttt|ƒƒƒ¡}||ƒ}dd„ |D ƒ}d  ||ƒ¡}dd  d	d
„ | d¡D ƒ¡ }d||f }	|  d|	 ¡ d S )Nc                 s   sª   dd„ }d }d}t | dd … | d d… ƒD ]X\}}|d k	r\|| |krHq*||||ƒV  d }q*|| dkrx|| }|}q*q*d| V  q*|d kr˜d| V  n||||ƒV  d S )Nc                 S   sR   | dkrdnt | ƒ}|| dkr,d||  nd}|dkr<dnd| }d|||f S )Nr   rF   z:%dú:r   z	s[%s%s%s])Ústr)ÚstartÚendÚstepZstartsZendsZstepsr3   r3   r4   Ú	_genslice  s    zBYoutubeIE._print_sig_code.<locals>.gen_sig_code.<locals>._genslicez(Never used)r   rd   )rd   r   zs[%d])r¹   )Zidxsri  rh  rf  rF  Úprevr3   r3   r4   Úgen_sig_code  s$    "z/YoutubeIE._print_sig_code.<locals>.gen_sig_coderF   c                 S   s   g | ]}t |ƒ‘qS r3   rL  rN  r3   r3   r4   r<   5  s     z-YoutubeIE._print_sig_code.<locals>.<listcomp>z + z(%s)ú, c                 s   s   | ]}t t|ƒƒV  qd S rX   r>  )r;   Úpr3   r3   r4   rA  8  s     z,YoutubeIE._print_sig_code.<locals>.<genexpr>r=  z<if tuple(len(p) for p in s.split('.')) == %s:
    return %s
zExtracted signature function:
)rB  r[  r	   r\  r?  rC  r7  )
r2   ÚfuncrD  rk  ra  rb  rH  Z	expr_codeZsignature_id_tupler�   r3   r3   r4   Ú_print_sig_code  s    ÿÿzYoutubeIE._print_sig_codec                    s0   | j d|ddd�}t|ƒ}| |¡‰ ‡ fdd„S )N)zX\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(zg\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(zW\b(?P<sig>[a-zA-Z0-9$]{2})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)zS(?P<sig>[a-zA-Z0-9$]+)\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)z1(["\'])signature\1\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(z!\.sig\|\|(?P<sig>[a-zA-Z0-9$]+)\(z€yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?\s*(?P<sig>[a-zA-Z0-9$]+)\(z>\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(zM\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(zH\bc\s*&&\s*a\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(úS\bc\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(rp  z)Initial JS player signature function nameÚsig)rš   c                    s
   ˆ | gƒS rX   r3   rI   ©Zinitial_functionr3   r4   rK   P  rL   z)YoutubeIE._parse_sig_js.<locals>.<lambda>)Ú_search_regexr   Úextract_function)r2   ZjscodeÚfuncnameZjsir3   rr  r4   rW  =  s      ò
zYoutubeIE._parse_sig_jsc                    s.   t |ƒ}d}| |¡}| |d¡‰ ‡ fdd„S )NZSignatureDecipherZdecipherc                    s
   ˆ | gƒS rX   r3   rI   rr  r3   r4   rK   W  rL   z*YoutubeIE._parse_sig_swf.<locals>.<lambda>)r   Zextract_classrt  )r2   Zfile_contentsZswfiZTARGET_CLASSNAMEZsearched_classr3   rr  r4   rZ  R  s
    
zYoutubeIE._parse_sig_swfc           	   
   C   sÚ   |dkrt dƒ‚| d¡r$d| }nt d|¡s<t d|¡}z^||  |¡f}|| jkrn|  |||¡}|| j|< | j| }| j	j
 d¡r’|  ||¡ ||ƒW S  tk
rÔ } zt ¡ }t d| |d	�‚W 5 d}~X Y nX dS )
z3Turn the encrypted s field into a working signatureNz+Cannot decrypt signature without player_urlz//zhttps:z	https?://zhttps://www.youtube.comÚyoutube_print_sig_codezSignature extraction failed: )rœ   )r   Ú
startswithrG   rP  r   ÚurljoinrE  r5  rc  rY   rk   rl   ro  Ú	ExceptionÚ	tracebackÚ
format_exc)	r2   rJ   r8   r^  Úage_gater_  rn  r¦   Útbr3   r3   r4   Ú_decrypt_signatureY  s8    

 ÿ
  ÿ


 ÿzYoutubeIE._decrypt_signaturec              
   C   sâ   z| j d| |dd�}W n> tk
rV } z | j dt|ƒ ¡ i  W Y ¢S d }~X Y nX i }| d¡D ]b}|jd }||kr~qfg }| jD ]6}	t|||	|jd  	d¡d	œƒ}
| 
d
|
 |	dœ¡ qˆ|||< qf|sÞ| j d¡ i S |S )Nz7https://video.google.com/timedtext?hl=en&type=list&v=%sF)rB   z&unable to download video subtitles: %sr  Ú	lang_codeÚnameúutf-8)ÚlangÚvÚfmtr€  z&https://www.youtube.com/api/timedtext?©rU   rÊ   zvideo doesn't have subtitles)Ú_download_xmlr   rY   rZ   r   r½   ÚattribÚ_SUBTITLE_FORMATSr   Úencoder³   )r2   r8   rÂ   Zsubs_docÚerrÚsub_lang_listr  r‚  Úsub_formatsrÊ   rk   r3   r3   r4   Ú_get_subtitlest  s>     þ


üþ

zYoutubeIE._get_subtitlesc                 C   s2   d}| j ||dd d�}|r.| jt|ƒ|dd�S d S )N)z(;ytplayer\.config\s*=\s*({.+?});ytplayerz ;ytplayer\.config\s*=\s*({.+?});zytplayer.config©ÚdefaultFrh   )rs  Ú_parse_jsonr)   )r2   r8   rÂ   ÚpatternsÚconfigr3   r3   r4   Ú_get_ytplayer_config”  s       ÿ  ÿzYoutubeIE._get_ytplayer_configc              
      sd  ˆ   d| ¡ ˆ  ||¡}d| }|s6ˆ j |¡ i S �zú|d }| d¡}|�r&|d }tddddœƒ}|d	 | }	ˆ  |	|¡}
|
 d
¡}|dkr¦ˆ j d¡ i W S |jd }|j dd¡}i }|
 	d¡D ]R}|jd }g }ˆ j
D ]0}t|||||dœƒ}| |d	 | |dœ¡ qä|||< qÌ|W S ‡ fdd„}| d¡}|�rºt|tƒ�rºˆ j||dd�}|�rº|d d }|d d d }g }|d D ] }| d¡}|�rŒ| |¡ �qŒ|||ƒW S |d }|d  }t| d!¡d ƒd" d }g }| d!¡D ]4}tt|ƒƒ}| d#dg¡d }|�rò| |¡ �qò|||ƒW S  tttfk
�r^   ˆ j |¡ i  Y S X dS )$zlWe need the webpage for getting the captions url, pass it as an
           argument to speed up the process.z"%s: Looking for automatic captionsz'Couldn't find automatic captions for %sr‚   ZttsurlÚ	timestamprs   r   )ÚtypeZtlangsZasrsú&r  Nz%Video doesn't have automatic captionsr  ÚkindrF   Útarget)r‚  Útlangr„  Útsr—  r…  c                    sx   t | ƒ}t|jƒ}i }|D ]X}g }ˆ jD ]@}| |g|gdœ¡ t |jt|dƒd�¡} | 	| |dœ¡ q(|||< q|S )N)r™  r„  T©r~   r…  )
r   r   r~   rˆ  rQ   r   Ú
urlunparseÚ_replacer   r³   )Zsub_urlÚ	sub_langsZparsed_sub_urlZ
caption_qsÚcaptionsÚsub_langrŒ  rÊ   r1   r3   r4   Úmake_captionsÖ  s&    

þÿþ

z8YoutubeIE._get_automatic_captions.<locals>.make_captionsÚplayer_responseFrh   rŸ  ZplayerCaptionsTracklistRendererZcaptionTracksr   ÚbaseUrlZtranslationLanguagesZlanguageCodeÚcaption_tracksÚcaption_translation_languagesú,ÚuÚlc)r7  r“  rY   rZ   rl   r   r†  Úfindr‡  r½   rˆ  r³   r›   r   r�  r   rC  r   ÚKeyErrorÚ
IndexErrorr   )r2   r8   rÂ   Zplayer_configÚerr_msgr‚   Zcaption_urlr”  Zlist_paramsZlist_urlZcaption_listZoriginal_lang_nodeZoriginal_langZcaption_kindr‹  Z	lang_noder   rŒ  rÊ   rk   r¡  r¢  ZrendererÚbase_urlr‚  r  r¤  r¥  Zlang_qsr3   r1   r4   Ú_get_automatic_captions¦  s�    
ý



û
þ


  ÿ
z!YoutubeIE._get_automatic_captionsc                    s¤   t t|dd„ ƒpt|dd„ ƒƒ}|s(d S t |¡}t |j¡}d‰ d ‡ fdd„tdd	ƒD ƒ¡}| d
g|gdœ¡ t 	|j
t|dƒd�¡}| j||dddd� d S )Nc                 S   s   | d d d S )NZplaybackTrackingZvideostatsPlaybackUrlr£  r3   r_   r3   r3   r4   rK     rL   z)YoutubeIE._mark_watched.<locals>.<lambda>c                 S   s   | d d S )NZvideostats_playback_base_urlr   r3   r_   r3   r3   r4   rK     rL   z@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_rF   c                 3   s"   | ]}ˆ t  d d¡d@  V  qdS )r   râ   é?   N)ÚrandomÚrandint)r;   Ú_©ZCPN_ALPHABETr3   r4   rA    s     z*YoutubeIE._mark_watched.<locals>.<genexpr>r   é   Ú2)ÚverÚcpnTr›  zMarking watchedzUnable to mark watchedFrh   )r*   r%   r   ÚurlparseÚparse_qsr~   rB  r\  rQ   rœ  r�  r   rn   )r2   r8   Ú
video_infor¢  Zplayback_urlZparsed_playback_urlÚqsr·  r3   r³  r4   Ú_mark_watched  s:    þ ÿþ
þÿ   þzYoutubeIE._mark_watchedc              	   C   sV   dd„ t  d| ¡D ƒ}| tttt  d| ¡ƒƒ¡ t  d| ¡}| dd„ |D ƒ¡ |S )Nc                 S   s   g | ]}t | d ¡ƒ‘qS ©rU   ©r&   rš   )r;   r¤   r3   r3   r4   r<   )  s   ÿz+YoutubeIE._extract_urls.<locals>.<listcomp>a‘  (?x)
            (?:
                <iframe[^>]+?src=|
                data-video-url=|
                <embed[^>]+?src=|
                embedSWF\(?:\s*|
                <object[^>]+data=|
                new\s+SWFObject\(
            )
            (["\'])
                (?P<url>(?:https?:)?//(?:www\.)?youtube(?:-nocookie)?\.com/
                (?:embed|v|p)/[0-9A-Za-z_-]{11}.*?)
            \1z(class="lazyYT" data-youtube-id="([^"]+)"z›(?x)<div[^>]+
            class=(?P<q1>[\'"])[^\'"]*\byvii_single_video_player\b[^\'"]*(?P=q1)[^>]+
            data-video_id=(?P<q2>[\'"])([^\'"]+)(?P=q2)c                 s   s   | ]}|d  V  qdS )rd   Nr3   ©r;   Úmr3   r3   r4   rA  B  s     z*YoutubeIE._extract_urls.<locals>.<genexpr>)rG   r°   Úextendrs   r[  r&   r½   )rÂ   ÚentriesÚmatchesr3   r3   r4   Ú_extract_urls&  s    ôþ
þþzYoutubeIE._extract_urlsc                 C   s   t  | ¡}|r|d S d S re   )rÄ   rÄ  )rÂ   Úurlsr3   r3   r4   Ú_extract_urlF  s    
zYoutubeIE._extract_urlc                 C   s4   t  | j|t j¡}|d kr&td| ƒ‚| d¡}|S )NúInvalid URL: %sr   )rG   rP  Ú
_VALID_URLÚVERBOSEr   rš   )ÚclsrU   r¤   r8   r3   r3   r4   Ú
extract_idK  s
    
zYoutubeIE.extract_idc           
      C   sÒ   | sd S t  d| ¡}|sd S g }t|dd�D ] \}\}}t|ƒ}|d krJq,||krV qÎ|t|ƒkrf|nt|| d ƒ}|d kr€q,||krŒ|}||kr˜ qÎt  dd|¡ d¡}	t  dd|	¡}	| |||	d	œ¡ q,|S )
Nz‚(?:^|<br\s*/>)([^<]*<a[^>]+onclick=["\']yt\.www\.watch\.player\.seekTo[^>]+>(\d{1,2}:\d{1,2}(?::\d{1,2})?)</a>[^>]*)(?=$|<br\s*/>)r   )rf  z<a[^>]+>[^<]+</a>rF   z 	-z\s+ú )r  r	  r¯   )rG   r½   Ú	enumerater   r?  rH   rž   r³   )
r  r  Zchapter_linesÚchaptersZnext_numZchapter_lineZ
time_pointr  r	  Úchapter_titler3   r3   r4   Ú_extract_chaptersS  sR    þ ÿÿ  ÿÿý
zYoutubeIE._extract_chaptersc           „   '      s  t ˆi ƒ\‰}ˆjj dd¡r"dnd}d }d }tˆƒ}|j|jfD ]l}t|ƒ}|d krnd|krnt|d d ƒ}|d krŽd|krŽt|d d ƒ}|d krBd|krBt|d d ƒ}qBt	 
ˆjˆ¡}	|	rÞ|d	 t|	 d
¡ƒ d¡ ‰ˆ ˆ¡‰|dˆ  ‰ˆ ˆˆ¡‰t	 
dˆ¡}	|	d k	�r,t	 dd|	 d
¡¡‰nd ‰g ‰‡fdd„}
‡fdd„‰ d }d }dd„ }‡ ‡fdd„}i }i }d }t	 
dˆ¡d k	�rBd‰|dˆ  ‰ˆ ˆˆd¡}tˆdˆ ˆjd|ddd �d!œƒ}|d" | }zˆj|ˆd#d$d%�}W n tk
�r   d }Y nX |�rt|ƒ}| d&d g¡d }||ˆƒ}|
|ƒ ||ƒ}nÜd‰ˆ ˆˆ¡}|�rþ|d' }| d(¡�sx| d)¡�r–td*d+„ | ¡ D ƒƒ}|
|ƒ |�sÄ| d,¡�rÄˆj|d, t ¡ |d, d-�S | d.¡d/k�sä| d0¡d
k�rèd}|�sþ|| d&¡ˆƒ}|�rˆjj d1d¡�rˆ |ƒ ‡‡fd2d3„}|�sZ|�sZ|ƒ }|�sHd4}td5| dˆd6�‚t|tƒ�sji }t|d7d8„ tƒ�p~i }| d9d g¡d �pœ| d9¡}|�s´ˆj d:¡ d;}td<ˆƒ }}|�rð‡fd=d>„}t	 d?||¡ }}t|ƒ}nˆ  d@ˆ¡�p| dA¡}| dBd¡�süˆjj dC¡�sît|dDd8„ t!ƒ�pFt|dEd8„ t!ƒ}|�rüg } g }!| "dF¡D ]b}"tt#|"ƒƒ}#|  $dGdHt%dI||#dJ d f dBdiƒdK||#d9 d f dLœ¡ |! $|#dJ d ¡ �q`ˆ &dMdN '|!¡ˆf ¡ ˆ (| ˆ||¡S nˆ &dOˆ ¡ |d k�r||ƒ}|d k�r,|�r,t)| dP¡ƒ}|d k�rDt*| dQ¡ƒ}dR|k�rddS|k�rdtdTddU�‚‡fdVdW„}$t|dXd8„ t+ƒ�p„g }%|% ,t|dYd8„ t+ƒ�pžg ¡ dZ|k�rä|dZ d  -d[¡�räˆ .¡  d\d[|dZ d ˆd]œg}&�nê|�s¸|%�s(t/| d(dg¡d ƒd
k�s(t/| d^dg¡d ƒd
k�r¸| d(dg¡d dF | d^dg¡d  }'d_|'k�rftd`ddU�‚g }&i }(| dadg¡d })|)�rô|) "dF¡D ]b}*|* "d¡}+t/|+ƒd
k�r�|+d
  "db¡},t/|,ƒdck�r�|+d
 t)|,d ƒt)|,d
 ƒddœ|(|+d < �q�|%D ]¨}*t0|* de¡ƒ}-|-�s�qø|* df¡}.|* dg¡�p,|.}/t)|* dh¡ƒt)|* di¡ƒ|/t)|* dj¡ƒt)|* dk¡ƒ|-dlk�r†t1|* dm¡�p€|* dn¡doƒnd t)|* dp¡ƒdqœ|(|-< �qø|%D �]
}*|* dr¡�r¼�q¦t2|* ds¡ƒ‰ˆ�s|* dt¡}0|0�sä�q¦t|0ƒ}1t2t|1dud8„ t!ƒƒ‰ˆ�s�q¦nd }0ttˆƒjƒ}1t)t|1dvd8„ ƒƒ}2|2dwk�r>�q¦|* de¡�pT|1de d }3|3�s`�q¦t!|3ƒ}3|0�
rdx|1k�sŠˆjj d1d¡�	rdy}4ˆj|4ˆ�rž|nˆdzd d �}5|5�sèˆ�sè|d k�rÚ|dˆ  }6ˆ |6ˆd¡}ˆ |4|d{¡}5t3 4|5¡‰ˆd k�	rˆ d|ˆd}¡}7t3 4|7¡‰d~|1k�	r4ˆd|1d~ d  7 ‰nÔdx|1k�
r|1dx d }8ˆjj d€¡�	rÒˆd k�	rnd�}9d�}:nFˆ 5d‚¡�	r–ˆjdƒˆd„dd…�}9d†|9 }:nˆjd‡dˆgˆd‰dd…�}9dŠ|9 }:ˆ 6|8¡};ˆ &d‹|3|;|:f ¡ ˆ 7|8ˆˆˆ¡}<t|1dŒd8„ t!ƒ�	pöd�}=ˆdŽ|=|<f 7 ‰d�ˆk�
rˆd�7 ‰|3ˆˆd‘œ}>|3ˆj8k�
rB|> 9ˆj8|3 ¡ |3|(k�
rZ|> 9|(|3 ¡ t	 
d’|1 d“dg¡d ¡}	|	�
r–t:|	 dp¡ƒt:|	 dk¡ƒfnd”\}?}@|?d k�
r¶t)|* dp¡ƒ}?|@d k�
rÎt)|* dk¡ƒ}@t)|1 d•d g¡d ƒ�
pì|$ˆƒ}A|1 dfd g¡d �p
|* df¡}.|1 d–d g¡d �p(|* dg¡}/|3dlk�r^t1|1 dnd g¡d doƒ�p`t1|* dn¡doƒnd }Bt)|1 djd g¡d ƒ�p†t)|* dj¡ƒ}C|A|B|?|@|C|/�pš|.d—œ}D|D ¡ D ]\}E}F|F�r¨|F|>|E< �q¨|1 d˜d g¡d �pÞ|* d™¡}G|G�rz|G "dš¡}H|Hd  "d¡}It/|Iƒdck�rz|I\}J}Kt;|Hd ƒ|>d›< |Jdœk�rzd }Lt	 <d�|G¡D ]&}	|	 dž¡dŸk�r>|	 d ¡}L �qf�q>|L�rz|> 9t=|Lƒ¡ |> d¡¡d¢k�sš|> d£¡d¢k�r¦d¤d¥i|>d¦< |& $|>¡ �q¦�nt2t|d§d8„ t!ƒƒ�pàt2t|d¨d8„ t!ƒƒ}M|M�rzg }&ˆj>|Mˆd©dd…�}N|ND ]t}Oˆjdª|Ods ded d �}-|-�rR|-|Od«< |-ˆj8k�rRˆj8|-  ?¡ }>|> 9|O¡ |>}Oˆ|Od¬< d­|O @d®i ¡d¯< |& $|O¡ �qnT|ƒ }P|P�sštt|d°d8„ t!ƒƒ}P|P�s´tt|d±d8„ t!ƒƒ}P|P�rÆt|PddU�‚td²ƒ‚t|d³d8„ t!ƒ�pìt0| dS¡ƒ}Q|Q�rþt#|Qƒ}Qnˆj d´¡ d }Rd }St	 
dµˆ¡}	|	d k	�r>|	 d¶¡}R|	 d·¡}Snˆj d¸¡ t0| d¹¡ƒ�p€ˆj d¹ˆdºd d ��p€ˆjd»ˆdºd dJd¼�}T|T�r�d½|T nd }Ut	 
d¾ˆt	jA¡}V|Vd k	�rº|V d
¡}Wn,d¿|k�rÖˆj dÀ¡ d }Wnt#|d¿ d ƒ}Wˆj dÁˆdÂd d �}X|X�sˆjdÃdÄgˆdÂd d �}XtB|Xƒ}XˆjCdÅˆdÆd d �}Yt	 
dÇˆ¡}Z|Z�rbtDtE|Z d9¡ƒƒ}[t|Z dÈ¡ƒ}\nd  }[}\‡‡fdÉdÊ„}]|]dËƒ}^|]dÌƒ}_|]dÍƒ}`d  }a}b|�rTt	 
dÎ|¡}	|	�rT|^�sÄ|	 dÏ¡ F¡ }^|_�sö|	 dÐ¡�pôdN 'dÑd+„ |	 dÒ¡ "dÓ¡D ƒ¡}_|`�s
|	 dÔ F¡ ¡}`|	 dÕ¡}b|	 dÖ¡}a|a�rF|a Gd×d¡}a|b�sFt:|ad dØ… ƒ}b|b�rTt:|bƒ}bt	 
dÙˆ¡}c|c�r’tE|c dÚ¡ƒ}dt:|c dÛ¡ƒ}et:|c dÜ¡ƒ}fnd  }d }e}fˆjdÝˆdÞd d �}g|g�rÞˆjCdß|gdàd d �}h|hd k�rÖd n|hg}ind }idádâ„ t	 <ˆ Hdã¡ˆ¡D ƒ}j‡‡fdädå„}k|kdæƒ}l|kdçƒ}m|d k�r<tIˆjdèˆdéd d �ƒ}t1| dê¡ƒ�pXt|dëd8„ ƒ}nˆ Jˆˆ¡}oˆ Kˆˆ¡}pt|dìd8„ ƒ}q|q�s”t)| dí¡ƒ}q|q�s¬tˆ  dîˆdï¡ƒ}qd }rˆjj dðd¡�r*ˆjdñˆdòdóddô�}st|dõd8„ t!ƒ}t|s�r*|t�r*ˆjdöˆd÷dødùdú�}uˆjˆ L|t¡ˆdûdüdtM|u|siƒdý�}rˆ N||q¡}vˆjj d1d¡�rBd}wˆD ]ð}xi ‰z‚‡‡‡‡fdþdÿ„}yt	 �d |y|x¡}xˆjO|xˆ|wˆj8�d�D ]D}z|z �d¡�s¶|$|zds ƒ|z�d< |zd« ˆk�rÐ|zˆ|zd« < d}w�q’W n: ttPfk
�r }{ zˆ �d|{ ˆ¡ W 5 d }{~{X Y nX ˆ�rP‡f�ddâ„|&D ƒ}&|& ,ˆ Q¡ ¡ �qPt	 
�dˆ¡}|||�r¸tR|| �d¡ƒ}}tR|| �d¡ƒ}~|}dk�r¸|~dk�r¸|}|~ }|&D ] }€|€ d£¡d¢k�r–||€�d< �q–|&�s†�d	|k�rX�d
|�d	 k�rˆj �dˆd d �}�|��rþ|� "dF¡nd }‚ˆjS|�d	 d |‚�d� |�d	 d }ƒ�d|ƒk�rF|ƒ }|�rF|}ƒtd5|ƒ dˆd6�‚| �d¡�sxt|�dd8„ ƒ�r†t�dddU�‚ˆ T|&¡ ˆ Uˆ||¡ ˆ|Q|R|S|T|U|X|Y|\�p¶|_||[�pÀ|^|W||i|j|o|p|qˆ�rÚ�dnd|r|v|�dˆ  ||l|m|n|&||||d|e|f|^|_|`|a|b�dœ&S (  NÚprefer_insecureFÚhttpÚhttpsÚtr   rf  rg  z://www.youtube.com/r   ú/zI://www.youtube.com/watch?v=%s&gl=US&hl=en&has_verified=1&bpctr=9999999999z1swfConfig.*?"(https?:\\/\\/.*?watch.*?-.*?\.swf)"z\\(.)z\1c                    s,   |   d¡}|r(|d ˆ kr(ˆ  |d ¡ d S )NZdashmpdr   )rl   r³   )rº  Údash_mpd©Ú	dash_mpdsr3   r4   Úadd_dash_mpdœ  s    
z-YoutubeIE._real_extract.<locals>.add_dash_mpdc                    s.   t t| dd„ tƒƒ}|r*|ˆ kr*ˆ  |¡ d S )Nc                 S   s   | d d S )NÚstreamingDataZdashManifestUrlr3   r_   r3   r3   r4   rK   £  rL   zBYoutubeIE._real_extract.<locals>.add_dash_mpd_pr.<locals>.<lambda>)r*   r%   r   r³   )Úpl_responserÖ  r×  r3   r4   Úadd_dash_mpd_pr¡  s     þz0YoutubeIE._real_extract.<locals>.add_dash_mpd_prc                 S   s   t t| dd„ ƒƒS )Nc                 S   s   | d d S )Nr  r   r3   r_   r3   r3   r4   rK   ¬  rL   zEYoutubeIE._real_extract.<locals>.extract_view_count.<locals>.<lambda>)r   r%   )Zv_infor3   r3   r4   Úextract_view_count«  s    z3YoutubeIE._real_extract.<locals>.extract_view_countc                    s:   t | ƒ}|sd S ˆj||dd�}t|tƒr6ˆ |ƒ |S d S r¾   )r#   r�  r›   Údict)r¢  r8   rÛ  )rÜ  r2   r3   r4   Úextract_player_response®  s    
z8YoutubeIE._real_extract.<locals>.extract_player_responsezplayer-age-gate-content">Tz://www.youtube.com/embed/%szDownloading embed webpagez!https://youtube.googleapis.com/v/z"sts"\s*:\s*(\d+)ÚstsrF   rŽ  )r8   Zeurlrà  z"://www.youtube.com/get_video_info?z!Refetching age-gated info webpagez%unable to download video info webpagerJ  r¢  r‚   Zurl_encoded_fmt_stream_mapÚhlsvpc                 s   s   | ]\}}||gfV  qd S rX   r3   )r;   Úkrƒ  r3   r3   r4   rA  Þ  s     z*YoutubeIE._real_extract.<locals>.<genexpr>Zypc_vidr7   Ú
livestreamÚ1Zlive_playbackr  c                     sR   g } dD ]6\}}ˆ j dj||d�ˆd| d d�}|r|  |¡ q| rNd | ¡S d S )N))Zh1r[   )ÚdivZ
submessagezA(?s)<{tag}[^>]+id=["\']unavailable-{kind}["\'][^>]*>(.+?)</{tag}>)Útagr—  zunavailable %srŽ  Ú
)Ú_html_search_regexrv   r³   rB  )Úmessagesræ  r—  Úmsg©r2   Úvideo_webpager3   r4   Úextract_unavailable_messageí  s      þz<YoutubeIE._real_extract.<locals>.extract_unavailable_messagezUnable to extract video datazYouTube said: %s)rA   r8   c                 S   s   | d S )NZvideoDetailsr3   r_   r3   r3   r4   rK     rL   z)YoutubeIE._real_extract.<locals>.<lambda>r¯   zUnable to extract video titler²  zeow-descriptionc                    s^   t  ˆ |  d¡¡}t|ƒ}t d|j¡rZ|jdkrZt|j	ƒ}| 
d¡}|rZ|d rZ|d S |S )Nr   z4^(?:www\.)?(?:youtube(?:-nocookie)?\.com|youtu\.be)$z	/redirectÚqr   )r   rx  rš   r   rG   r™   ÚnetlocrR  r   r~   rl   )rÀ  Z	redir_urlZparsed_redir_urlr»  rî  r½  r3   r4   Úreplace_url  s    

z,YoutubeIE._real_extract.<locals>.replace_urla  (?x)
                <a\s+
                    (?:[a-zA-Z-]+="[^"]*"\s+)*?
                    (?:title|href)="([^"]+)"\s+
                    (?:[a-zA-Z-]+="[^"]*"\s+)*?
                    class="[^"]*"[^>]*>
                [^<]+\.{3}\s*
                </a>
            r  ZshortDescriptionZforce_singlefeedÚ
noplaylistc                 S   s   | d d d S )NZmulticameraZplayerLegacyMulticameraRendererZmetadataListr3   r_   r3   r3   r4   rK   (  rL   c                 S   s   | d d S )NÚmultifeed_metadata_listr   r3   r_   r3   r3   r4   rK   *  rL   r¦  Úurl_transparentr6   z%s://www.youtube.com/watch?v=%sr­   z%s (%s))Ú_typeÚie_keyrU   r¯   zNDownloading multifeed video (%s) - add --no-playlist to just download video %srl  ú2Downloading just video %s because of --no-playlistZ	viewCountZisLiveZypc_video_rental_bar_textÚauthorzj"rental" videos not supported. See https://github.com/ytdl-org/youtube-dl/issues/359 for more information.r@   c                    s   t ˆ jd| dd d�ƒS )Nz\bclen[=/](\d+)ÚfilesizerŽ  )r   rs  )Ú	media_urlr1   r3   r4   Ú_extract_filesizeO  s       ÿz2YoutubeIE._real_extract.<locals>._extract_filesizec                 S   s   | d d S )NrÚ  r"  r3   r_   r3   r3   r4   rK   S  rL   c                 S   s   | d d S )NrÚ  ZadaptiveFormatsr3   r_   r3   r3   r4   rK   T  rL   Úconnrð   r÷   )Ú	format_idrï   rU   r^  Zadaptive_fmtszrtmpe%3Dyesznrtmpe downloads are not supported, see https://github.com/ytdl-org/youtube-dl/issues/343 for more information.Úfmt_listr`   r   )Ú
resolutionrË   rÌ   ÚitagÚqualityZqualityLabelZaudioSampleRateZcontentLengthrå   rÌ   rô   ZaverageBitrateÚbitrateiè  rË   )Úasrrø  rß   rå   rÌ   ÚtbrrË   Zdrm_familiesrU   Úcipherc                 S   s   | d d S )NrU   r   r3   r_   r3   r3   r4   rK   ‹  rL   c                 S   s   | d d S )NÚstream_typer   r3   r_   r3   r3   r4   rK   ’  rL   r�   rJ   z"assets":.+?"js":\s*("[^"]+")zJS player URL (1)zJS player URLz(ytplayer\.config.*?"url"\s*:\s*("[^"]+")zage gate player URLrq  z&signature=rI  ÚunknownrK  z-(.+?)(?:/watch_as3)?\.swf$zflash playerrh   zflash player %sz2html5player-([^/]+?)(?:/html5player(?:-new)?)?\.jszD(?:www|player(?:_ias)?)[-.]([^/]+)(?:/[a-z]{2,3}_[A-Z]{2})?/base\.jszhtml5 playerzhtml5 player %sz{%s} signature length %s, %sc                 S   s   | d d S )NÚspr   r3   r_   r3   r3   r4   rK   Ð  rL   Ú	signaturez&%s=%sZ
ratebypassz&ratebypass=yes)rü  rU   r^  z#^(?P<width>\d+)[xX](?P<height>\d+)$Úsize©NNZclenÚquality_label)rø  r  rË   rÌ   rå   rß   r•  ÚmimeTypeú;rÊ   )ÚaudioÚvideozC(?P<key>[a-zA-Z_-]+)=(?P<quote>["\']?)(?P<val>.+?)(?P=quote)(?:;|$)ÚkeyÚcodecsÚvalrÍ   rñ   rÏ   Úhttp_chunk_sizei    Údownloader_optionsc                 S   s   | d d S )NrÚ  ZhlsManifestUrlr3   r_   r3   r3   r4   rK     rL   c                 S   s   | d d S )Nrá  r   r3   r_   r3   r3   r4   rK     rL   rÖ   z/itag/(\d+)/rü  r^  ÚTrueÚhttp_headerszYoutubedl-no-compressionc                 S   s   | d d S )NZplayabilityStatusÚreasonr3   r_   r3   r3   r4   rK   2  rL   c                 S   s   | d d S )Nr  r   r3   r_   r3   r3   r4   rK   6  rL   z\no conn, hlsvp, hlsManifestUrl or url_encoded_fmt_stream_map information found in video infoc                 S   s   | d d S )Nr÷  r   r3   r_   r3   r3   r4   rK   =  rL   zunable to extract uploader namezq<link itemprop="url" href="(?P<uploader_url>https?://www\.youtube\.com/(?:user|channel)/(?P<uploader_id>[^"]+))">rü   rý   z#unable to extract uploader nicknameÚ	channelIdú
channel idz6data-channel-external-id=(["\'])(?P<id>(?:(?!\1).)+)\1©r�  rš   z!http://www.youtube.com/channel/%sz*<span itemprop="thumbnail".*?href="(.*?)">Úthumbnail_urlz!unable to extract video thumbnailÚdatePublishedzupload datez (?s)id="eow-date.*?>(.*?)</span>z(?:id="watch-uploader-info".*?>.*?|["\']simpleText["\']\s*:\s*["\'])(?:Published|Uploaded|Streamed live|Started) on (.+?)[<"\']zI<h4[^>]+class="title"[^>]*>\s*License\s*</h4>\s*<ul[^>]*>\s*<li>(.+?)</lir%  a  (?x)
                <h4[^>]+class="title"[^>]*>\s*Music\s*</h4>\s*
                <ul[^>]*>\s*
                <li>(?P<title>.+?)
                by (?P<creator>.+?)
                (?:
                    \(.+?\)|
                    <a[^>]*
                        (?:
                            \bhref=["\']/red[^>]*>|             # drop possible
                            >\s*Listen ad-free with YouTube Red # YouTube Red ad
                        )
                    .*?
                )?</li
            r  c                    s   ˆ j d|  ˆ| d d�S )NzH<h4[^>]+class="title"[^>]*>\s*%s\s*</h4>\s*<ul[^>]*>\s*<li>(.+?)</li>\s*rŽ  )rè  )Úfieldrë  r3   r4   Úextract_metaŠ  s      þz-YoutubeIE._real_extract.<locals>.extract_metaZSongZArtistZAlbumuò   (?s)Provided to YouTube by [^\n]+\n+(?P<track>[^Â·]+)Â·(?P<artist>[^\n]+)\n+(?P<album>[^\n]+)(?:.+?â„—\s*(?P<release_year>\d{4})(?!\d))?(?:.+?Released on\s*:\s*(?P<release_date>\d{4}-\d{2}-\d{2}))?(.+?\nArtist\s*:\s*(?P<clean_artist>[^\n]+))?r  Zclean_artistc                 s   s   | ]}|  ¡ V  qd S rX   )rž   )r;   Úar3   r3   r4   rA  ›  s     r  õ   Â·r.  r3  r2  ú-r^   u‚   <div[^>]+id="watch7-headline"[^>]*>\s*<span[^>]*>.*?>(?P<series>[^<]+)</a></b>\s*S(?P<season>\d+)\s*â€¢\s*E(?P<episode>\d+)</span>r/  ÚseasonÚepisodez6(?s)<h4[^>]*>\s*Category\s*</h4>\s*<ul[^>]*>(.*?)</ul>r  z(?s)<a[^<]+>(.*?)</a>Úcategoryc                 S   s   g | ]}t | d ¡ƒ‘qS )rª   r¾  r¿  r3   r3   r4   r<   ¼  s   ÿz+YoutubeIE._real_extract.<locals>.<listcomp>zog:video:tagc                    s    t ˆ jdt | ¡ ˆ| d d�ƒS )NzL-%s-button[^>]+><span[^>]+class="yt-uix-button-content"[^>]*>([\d,]+)</span>rŽ  )r$   rs  rG   Úescape)Z
count_namerë  r3   r4   Ú_extract_countÀ  s    ÿ  ýz/YoutubeIE._real_extract.<locals>._extract_countÚlikeÚdislikez4<[^>]+class=["\']watch-view-count[^>]+>\s*([\d,\s]+)z
view countZaverageRatingc                 S   s   t | d d ƒS )NZ
avg_ratingr   )r   r_   r3   r3   r4   rK   Ð  rL   c                 S   s   t | d d ƒS )NZlength_secondsr   )r   r_   r3   r3   r4   rK   ×  rL   ZlengthSecondsr  zvideo durationÚwriteannotationszB([\'"])XSRF_TOKEN\1\s*:\s*([\'"])(?P<xsrf_token>[A-Za-z0-9+/=]+)\2z
xsrf tokenÚ
xsrf_token)rš   rD   c                 S   s   | d d d d S )NÚannotationsr   ZplayerAnnotationsUrlsRendererZ
invideoUrlr3   r_   r3   r3   r4   rK   å  rL   z@([\'"])XSRF_FIELD_NAME\1\s*:\s*([\'"])(?P<xsrf_field_name>\w+)\2zxsrf field nameÚxsrf_field_nameZsession_token)rš   r�  zDownloading annotationsz$Unable to download video annotations)rB   rC   rD   rN   c                    s"   |   d¡}ˆ |ˆˆˆ ¡}d| S )Nr   z/signature/%s)rš   r~  )r¤   rJ   Zdec_s)r|  r^  r2   r8   r3   r4   Údecrypt_sigù  s    
z,YoutubeIE._real_extract.<locals>.decrypt_sigz/s/([a-fA-F0-9\.]+))rD   Úformats_dictrø  zSkipping DASH manifest: %rc                    s    g | ]}|d  ˆ   ¡ kr|‘qS )rü  )Úkeys)r;   Úf)Údash_formatsr3   r4   r<   	  s      zS<meta\s+property="og:video:tag".*?content="yt:stretch=(?P<w>[0-9]+):(?P<h>[0-9]+)">ÚwÚhr   r  z?The uploader has not made this video available in your country.ZregionsAllowed)rê  Ú	countrieszInvalid parametersZlicense_infoc                 S   s   | d d S )NrÚ  ZlicenseInfosr3   r_   r3   r3   r4   rK   9	  rL   zThis video is DRM protected.r  z://www.youtube.com/watch?v=%s)&r­   rû   rü   rý   rþ   rÿ   r   r%  r  r¯   r  Ú	thumbnailr  r  r  Ú	subtitlesÚautomatic_captionsr  r  r+  rÎ  Úwebpage_urlr  r  r  Úaverage_ratingr"  Úis_liver  r	  r/  r0  r1  r  r  r.  r2  r3  )Vr(   rY   rk   rl   r   Úfragmentr~   r   r   rG   r™   Ú_NEXT_URL_REr   rš   ÚlstriprË  rn   rH   r   rs  r   r“  rÞ  Úitemsr:   rÄ   rõ  r›   r%   rZ   r   r   Ú_html_search_metar   rC  r   r³   r"   r7  rB  rÁ   r   r   rs   rÁ  rw  r<  r?  r#   r   r*   rR   ÚloadsÚendswithrE  r~  Ú_formatsrQ   Úintr   r°   r   Ú_extract_m3u8_formatsrP   Ú
setdefaultÚDOTALLr'   rè  r    r&   rž   ÚreplaceÚ_meta_regexr$   Úextract_subtitlesÚextract_automatic_captionsÚ_proto_relative_urlr+   rÐ  Ú_extract_mpd_formatsrª  ÚvaluesÚfloatÚraise_geo_restrictedÚ_sort_formatsÚmark_watched)„r2   rU   Zsmuggled_dataÚprotor  r	  Ú
parsed_urlZ	componentr~   r¤   rÙ  r:  r  rÝ  rß  r¢  rº  Zembed_webpagerN   Zvideo_info_urlZvideo_info_webpagerÛ  Zytplayer_configr‚   rí  Zunavailable_messageZvideo_detailsr«   Zdescription_originalZvideo_descriptionrð  rò  rÂ  Zfeed_idsÚfeedZ	feed_datarú  Zstreaming_formatsr"  Zencoded_url_mapZformats_specrý  r„  ÚspecZwidth_heightrÿ  r   r  r  Zurl_datar  rü  Z	ASSETS_REZjsplayer_url_jsonZ	embed_urlZplayer_url_jsonZencrypted_sigZplayer_versionZplayer_descZparts_sizesr  r  ÚdctrË   rÌ   rø  r  rå   Zmore_fieldsr  ÚvalueZtype_Z
type_splitZkind_extr—  r²  r  Úmanifest_urlÚm3u8_formatsÚa_formatZerror_messageZvideo_uploaderZvideo_uploader_idZvideo_uploader_urlrþ   rÿ   Zm_thumbZvideo_thumbnailr   Zvideo_licenseZm_musicZvideo_alt_titleZvideo_creatorr  r  r  r.  r2  r3  Z	m_episoder/  r0  r1  Zm_cat_containerr$  Zvideo_categoriesZ
video_tagsr&  r  r  r9  Zvideo_subtitlesr7  Zvideo_durationZvideo_annotationsr*  Zinvideo_urlr,  rÎ  Zdash_mpd_fatalÚmpd_urlr-  Zdfr¦   Zstretched_mr2  r3  Zratior0  Zregions_allowedr4  r  r3   )	rÜ  r|  r1  rØ  r^  r2   rU   r8   rì  r4   rÃ   v  sf   þ

	   ÿý ý



  ÿ   ÿ  ÿÿ
 ø	
ý  ÿýþúÿÿ


üD(



ý
(ø


 ý
  ÿ  ÿ

 þ



  þ
ÿ ü
ÿ   ÿ
ý
*

 ÿÿÿÿÿÿ&ú

 ÿ

  þý  ÿû   ÿ   ÿ
 þÿ þþ
þ

   ÿÿ   þü ÿ

   ÿÿ  ý  þð,

þ  þ  þþ
  þþ ÿ  ÿ   þ  ÿ  ý  
ü  þ ÿþ  ÿ ÿ þ 
ÚzYoutubeIE._real_extract)F)%r‡   rˆ   r‰   ÚIE_DESCr,   rŒ   rÈ  r<  rB  rˆ  Ú_GEO_BYPASSrm   rC  Ú_TESTSr4  r9  r:  r;  r<  rE  rc  ro  rW  rZ  r~  r�  r“  r®  r¼  ÚstaticmethodrÄ  rÆ  ÚclassmethodrË  rÐ  rÃ   r�   r3   r3   r„   r4   rÄ   q  sˆ  8È9

™iîþ          þðýòý÷ýò ÿíøþïøþôøþô÷þöþöþõÿñ÷ ÿóöþù
 ÿòöòù
þðýöÿöÿöÿöÿÙ6 ÿÀDþøþþ	ò ÿêýù
 ÿñö ÿñö ÿñþý÷ ÿïô ÿÿì÷ ÿñýýþþýöþíô ÿïô ÿíô ÿîô ÿîþ€ € € € € Ñ     :.' f"rÄ   c                   @   sÖ  e Zd ZdZddeji ZdZdZe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.d/œd0d1d2d3d4d5d6dœd7œd8d9d:d;d<d=dœd>œd?d@d2dAdBd,œdCdDœdEdFdGdHdIdJdœdKd"œdLdMdNdOdPdQdRdSdTdUdVgeeeedWœdXdYidZe ¡ gd[œd\d]d^d_d`dadbdcdddegeeedfœdYdYdgœdhœdidjdkdldldmœdndoœdpdYdqœdrdYdqœdsdYdqœdtdYdqœdudYdqœgZdvdw„ Zdxdy„ Zdzd{„ Zd|d}„ Zd~d„ Zd€d�„ Zd‚S )ƒÚYoutubePlaylistIEzYouTube.com playlistsa  (?x)(?:
                        (?:https?://)?
                        (?:\w+\.)?
                        (?:
                            (?:
                                youtube(?:kids)?\.com|
                                invidio\.us
                            )
                            /
                            (?:
                               (?:course|view_play_list|my_playlists|artist|playlist|watch|embed/(?:videoseries|[0-9A-Za-z_-]{11}))
                               \? (?:.*?[&;])*? (?:p|a|list)=
                            |  p/
                            )|
                            youtu\.be/[0-9A-Za-z_-]{11}\?.*?\blist=
                        )
                        (
                            (?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)?[0-9A-Za-z-_]{10,}
                            # Top tracks, they can also include dots
                            |(?:MC)[\w\.]*
                        )
                        .*
                     |
                        (%(playlist_id)s)
                     )r    r»   zYhref="\s*/watch\?v=%s(?:&amp;(?:[^"]*?index=(?P<index>\d+))?(?:[^>]+>(?P<title>[^<]+))?)?z(?P<id>[0-9A-Za-z_-]{11})zyoutube:playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcZUCmlqkdCBesrv2Lak1mF_MxAz	Sergey M.Z"PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczyoutube-dl public playlist)rü   rû   r­   r¯   r   )rU   r
  r*  zHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlistr   zZPlaylist with deleted videos (#651). As a bonus, the video #51 is also twice in this list.zHhttps://www.youtube.com/playlist?list=PLwP_SiAcdui0KVebT0mU9Apz359a4ubsCz29C3: Not my departmentZ"PLwP_SiAcdui0KVebT0mU9Apz359a4ubsCZChristiaan008ZChRiStIaAn008)r¯   r­   rû   rü   r×   )rB   rU   r
  r*  z
issue #673ZPLBB231211A4F62143z%[OLD]Team Fortress 2 (Class-based LP)ZWickydooé   )rB   rU   r
  Úplaylist_mincountzLarge playlistz>https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0QzUploads from CauchemarZUUBABnxM4Ar9ten8Mdjj1j0QZ	CauchemarZCauchemar89i  Z"PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlZYDL_safe_search)r¯   r­   r   zThis playlist is privater)  ZembeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur^   ZJODA15Z"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEuZmilanzUCEI1-PVPcYXjB73Hfelbmaw)rB   rU   r*  r
  zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIliå  z'2018 Chinese New Singles (11/6 updated)Z"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlZLBKZsdragonfang©rU   rc  r
  zEmbedded SWF playerzNhttps://www.youtube.com/p/YN5VISEtHet5D4NEvfTd0zcgFk84NqFZ?hl=en_US&fs=1&rel=0ZJODA7Z YN5VISEtHet5D4NEvfTd0zcgFk84NqFZzThis playlist does not exist)rB   rU   r*  r
  r  zTBuggy playlist: the webpage has a "Load more" button but it doesn't have more videosz>https://www.youtube.com/playlist?list=UUXw-G3eDE9trcvY2sBMM_aAzUploads from Interstellar MoviezUUXw-G3eDE9trcvY2sBMM_aAzInterstellar MovieZInterstellarMovie1é   zThttps://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4ZFqZTN594JQwrÜ   z6Smiley's People 01 detective, Adventure Series, ActionZSTREEMZUCyPhqAZgwYWZfxElWVbVJngzCre:https?://(?:www\.)?youtube\.com/channel/UCyPhqAZgwYWZfxElWVbVJngZ20150526r$  z$md5:507cdcb5a49ac0da37a920ece610be80zPeople & Blogs)r­   rÊ   r¯   rû   rü   rý   r   r%  r  r  r  r  r  r  r  Tr&  )rU   r
  rk   r  Úadd_iezDhttps://youtu.be/yeWKywCrFtk?list=PL2qgrgXsNUG5ig9cat4ohreBjYLAPC0J5ZyeWKywCrFtkrÖ   z#Small Scale Baler and Braiding RugszBackus-Page House MuseumZbackuspagemuseumz8re:https?://(?:www\.)?youtube\.com/user/backuspagemuseumZ20161008z$md5:800c0c78d5eb128500bffd4f0b4f2e8azNonprofits & Activism)r­   rÊ   r¯   rû   rü   rý   r   r  r  r  r  r  )rñ  r  r  zHhttps://www.youtube.com/playlist?list=PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz Data Analysis with Dr Mike PoundZ"PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baZComputerphile)r¯   r­   rü   rû   é   )rU   r
  rc  z4https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21r+  ZTLGGrESM50VT6acwMjAyMjAxNwZ)OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMzChttps://invidio.us/playlist?list=PLDIoUOhQQPlXr63I_vwF9GD8sAKh77dWUzMhttps://www.youtubekids.com/watch?v=Agk7R8I8o5U&list=PUZ6jURNr1WQZCNHF0ao-c0gc                 C   s   |   ¡  d S rX   ©r}   r1   r3   r3   r4   r†   /
  s    z"YoutubePlaylistIE._real_initializec                 C   s”   g }g }t  d|¡D ]B}t|ƒ}|d }t| d¡ƒ}|rB| ¡ }| |¡ | |¡ q|  | j|||¡ |  d|||¡ |  d|||¡ t	||ƒS )Nz:(<[^>]*\bdata-video-id\s*=\s*["\'][0-9A-Za-z_-]{11}[^>]+>)zdata-video-idz
data-titlez2href="\s*/watch\?v\s*=\s*(?P<id>[0-9A-Za-z_-]{11})z3data-video-ids\s*=\s*["\'](?P<id>[0-9A-Za-z_-]{11}))
rG   r½   r   r&   rl   rž   r³   r·   r¸   r¹   )r2   rŸ   r´   rµ   ÚitemÚattrsr8   r«   r3   r3   r4   r©   2
  s@     ÿ
   ÿ  þ  þz*YoutubePlaylistIE.extract_videos_from_pagec           
         sÊ   g ‰ |dd … }t  d¡D ]j}d||f }|  ||d |¡¡‰tt dt |¡ ˆ¡ƒ}‡ fdd„|D ƒ}|sr q†ˆ  |¡ ˆ d }q|  	ˆ ¡}‡fd	d
„}|dƒp²|dƒp²|dƒ}t
|ƒ}	|  |||	¡S )Niõÿÿÿr   z&https://youtube.com/watch?v=%s&list=%sz#Downloading page {0} of Youtube mixzr(?xs)data-video-username=".*?".*?
                           href="/watch\?v=([0-9A-Za-z_-]{11})&amp;[^"]*?list=%sc                    s   g | ]}|ˆ kr|‘qS r3   r3   )r;   Z_id©r=   r3   r4   r<   ]
  s      z2YoutubePlaylistIE._extract_mix.<locals>.<listcomp>rd   c                    s   t d| ˆ ƒS )NÚclass)r   )Ú
class_name)rÂ   r3   r4   rK   e
  rL   z0YoutubePlaylistIE._extract_mix.<locals>.<lambda>zplaylist-titleztitle long-titler¯   )r–   r—   rn   rv   r   rG   r½   r%  rÁ  r>   r   rÁ   )
r2   r    Zlast_idÚnrU   Únew_idsZurl_resultsZsearch_titleZ
title_spanr¯   r3   )r=   rÂ   r4   Ú_extract_mixN
  s:      ÿÿý


ÿýzYoutubePlaylistIE._extract_mixc                 C   s‚  | j | }|  ||¡}t d|¡D ]Œ}| ¡ }t d|¡}|rv| d¡}d| }d|kr`|d7 }|d7 }t|dd	�‚q"t d
|¡r�tddd	�‚q"t d|¡r q"q"|  d| ¡ q"| j	d|dd d�}d}	| j	d|	 |dd d�}
t 
d|	 |¡}|�r| d¡}t || d¡¡}nd  }}d}|�sRzt|  ||¡ƒ W n tk
�rP   d}Y nX |  |  ||¡||¡}| |
||dœ¡ ||fS )Nz0<div class="yt-alert-message"[^>]*>([^<]+)</div>zE[^<]*(?:The|This) playlist (?P<reason>does not exist|is private)[^<]*r  zThis playlist %sZprivatez(, use --username or --netrc to access itr=  Tr@   z[^<]*Invalid parameters[^<]*z+Invalid parameters. Maybe URL is incorrect.z[^<]*Choose your language[^<]*z Youtube gives an alert message: z:(?s)<h1 class="pl-header-title[^"]*"[^>]*>\s*(.*?)\s*</h1>r¯   rŽ  z:class=["\']pl-header-details[^>]+>\s*<li>\s*<a[^>]+\bhref=z&%s["\']/(?:user|channel)/[^>]+>([^<]+)rû   z;%s(["\'])(?P<path>/(?:user|channel)/(?P<uploader_id>.+?))\1rü   rR  F)rû   rü   rý   )Ú_TEMPLATE_URLrn   rG   r½   rž   rP  rš   r   rZ   rè  r™   r   rx  Únextr§   ÚStopIterationrÁ   rQ   )r2   r    rU   rŸ   rP  r¤   r  r[   Úplaylist_titleZ_UPLOADER_BASErû   rü   rý   Ú
has_videosr'  r3   r3   r4   Ú_extract_playlistn
  st    

þ  þ  þþ


  ÿýz#YoutubePlaylistIE._extract_playlistc                 C   sˆ   t  t  |¡j¡}| dd g¡d p4| jd|dd d�}|r„| jj d¡rj|  d| ¡ || j	|d|d	�fS |  d
||f ¡ |d fS dS )Nrƒ  r   zL(?:(?:^|//)youtu\.be/|youtube\.com/embed/(?!videoseries))([0-9A-Za-z_-]{11})úvideo idrŽ  rñ  rö  r6   r7   zEDownloading playlist %s - add --no-playlist to just download video %sr
  )
r   r¹  r¸  r~   rl   rs  rY   rk   r7  r:   )r2   rU   r    Z
query_dictr8   r3   r3   r4   Ú_check_download_just_video¬
  s      þz,YoutubePlaylistIE._check_download_just_videoc                 C   sŒ   t  | j|¡}|d kr"td| ƒ‚| d¡p4| d¡}|  ||¡\}}|rN|S | d¡rb|  |¡S |  |¡\}}|sx|s||S | j	|d|d�S )NrÇ  r   r   )ZRDZULZPUr6   r7   )
rG   rP  rÈ  r   rš   rx  rw  rp  rv  r:   )r2   rU   r¤   r    r8   r  ru  r'  r3   r3   r4   rÃ   »
  s    

zYoutubePlaylistIE._real_extractN)r‡   rˆ   r‰   r\  r,   rŒ   rÈ  rq  Z_VIDEO_RE_TPLr¸   rm   rs   rC  rÄ   rõ  r^  r†   r©   rp  rv  rx  rÃ   r3   r3   r3   r4   ra  j	  sH  èüø
üø
ü÷ü÷ü÷þù	üüüý
þø
ü÷ò ÿéôþðü÷þþýþþ€ ß ' >ra  c                	       s„   e Zd 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œgZe	‡ fdd„ƒZ
dd„ Zdd„ Z‡  ZS ) ÚYoutubeChannelIEzYouTube.com channelszuhttps?://(?:youtu\.be|(?:\w+\.)?youtube(?:-nocookie|kids)?\.com|(?:www\.)?invidio\.us)/channel/(?P<id>[0-9A-Za-z_-]+)z)https://www.youtube.com/channel/%s/videoszJ(?:title="(?P<title>[^"]+)"[^>]+)?href="/watch\?v=(?P<id>[0-9A-Za-z_-]+)&?zyoutube:channelzpaginated channelz8https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8wé[   ZUUKfVa3S1e4PHvxWcwyMMg8wzUploads from lex willzlex willZUCKfVa3S1e4PHvxWcwyMMg8w©r­   r¯   rû   rü   )rB   rU   rc  r
  zAge restricted channelz8https://www.youtube.com/channel/UCs0ifCMCm1icqRbqhUINa0wrÈ   ZUUs0ifCMCm1icqRbqhUINa0wzUploads from Deus ExzDeus ExZDeusExOfficialz3https://invidio.us/channel/UC23qupoDRn9YOAVzeoxjOQATr+  z<https://www.youtubekids.com/channel/UCyu8StPfZWapR6rfW_JgqcAc                    s(   t  |¡st |¡rdS tt| ƒ |¡S )NF)ÚYoutubePlaylistsIEÚsuitableÚYoutubeLiveIEr€   ry  ©rÊ  rU   r„   r3   r4   r}  ø
  s    ÿzYoutubeChannelIE.suitablec                 C   s
   | j | S rX   )rq  )r2   rU   rþ   r3   r3   r4   Ú_build_template_urlý
  s    z$YoutubeChannelIE._build_template_urlc           
   
      s^  ˆ   |¡}ˆ  ||¡}ˆ j|d |ddd�}|dkr:d}n>ˆ jd|dd d�}|sxˆ jd|d	d d�}|rxˆ jd
|dd d�}|r®| d¡r®d|dd …  }ˆ  t |d| ¡d¡S ˆ  ||d¡}t	 
d|¡d k	}|rô‡ fdd„ˆ  |¡D ƒ}ˆ  ||¡S ztˆ  ||¡ƒ W n@ tk
�rH   ˆ jd|dd dd�}	|	�rDtd|	 dd�‚Y nX ˆ  ˆ  ||¡|¡S )Nz?view=57zDownloading channel pageFrh   r  r  rŽ  )z
al:ios:urlztwitter:app:url:iphoneztwitter:app:url:ipadzchannel urlz$vnd\.youtube://user/([0-9A-Za-z_-]+)ZUCZUUr   z/playlist?list=%sr¼   zDownloading page #1z¨(?x)
                class="[^"]*?(?:
                    channel-header-autogenerated-label|
                    yt-channel-title-autogenerated
                )[^"]*"c                    s"   g | ]\}}ˆ j |d ||d�‘qS )r6   )r8   r«   r9   )r;   r8   r«   r1   r3   r4   r<   '  s   ý  þz2YoutubeChannelIE._real_extract.<locals>.<listcomp>zR(?s)<div[^>]+class=(["\']).*?\byt-alert-message\b.*?\1[^>]*>(?P<alert>[^<]+)</div>Zalertr  zYoutube said: %sTr@   )r¿   r€  rn   r?  rs  rw  r:   r   rx  rG   r™   r©   rÁ   rr  r§   rs  rè  r   )
r2   rU   rþ   Zchannel_pageZchannel_playlist_idrÿ   r    ZautogeneratedrÂ  Zalert_messager3   r1   r4   rÃ      sx    
  þ   ÿ  þ  þ ÿüü
ü   þzYoutubeChannelIE._real_extract)r‡   rˆ   r‰   r\  rÈ  rq  r¸   rm   r^  r`  r}  r€  rÃ   r�   r3   r3   r„   r4   ry  Õ
  sD   üüüûþþèry  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œgZe‡ fdd„ƒZ	dd„ Z
‡  ZS )ÚYoutubeUserIEz1YouTube.com user videos (URL or "ytuser" keyword)z¦(?:(?:https?://(?:\w+\.)?youtube\.com/(?:(?P<user>user|c)/)?(?!(?:attribution_link|watch|results|shared)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)(?P<id>[A-Za-z0-9_-]+)z$https://www.youtube.com/%s/%s/videoszyoutube:userz/https://www.youtube.com/user/TheLinuxFoundationrÛ   ZUUfX55Sx5hEFjoC3cNs6mCUQz!Uploads from The Linux FoundationzThe Linux FoundationZTheLinuxFoundationr{  rd  z0https://www.youtube.com/c/12minuteathlete/videoséù   zUUVjM-zV6_opMDx7WYxnjZiQzUploads from 12 Minute Athletez12 Minute AthleteZthe12minuteathletezytuser:phihagTr+  z&https://www.youtube.com/c/gametrailersz$https://www.youtube.com/gametrailersz3https://www.youtube.com/user/kananishinoSMEJ/videosc                    sJ   t ‡ fdd„tƒ  ¡ D ƒƒ}t‡fdd„|D ƒƒr6dS ttˆ ƒ ˆ¡S d S )Nc                 3   s2   | ]*\}}|  d ¡r| d¡r|ˆ k	r|V  qdS )r6   ÚIEN)rw  rA  )r;   r€  Úklass)rÊ  r3   r4   rA  g  s
     
 
  z)YoutubeUserIE.suitable.<locals>.<genexpr>c                 3   s   | ]}|  ˆ ¡V  qd S rX   )r}  )r;   Úier½  r3   r4   rA  h  s     F)ÚiterÚglobalsr>  Úanyr€   r�  r}  )rÊ  rU   Zother_yt_iesr„   r  r4   r}  c  s    zYoutubeUserIE.suitablec                 C   s,   t  | j|¡}| j| d¡pd| d¡f S )NÚuserr­   )rG   rP  rÈ  rq  rš   )r2   rU   rþ   r¤   r3   r3   r4   r€  m  s    z!YoutubeUserIE._build_template_url)r‡   rˆ   r‰   r\  rÈ  rq  rm   r^  r`  r}  r€  r�   r3   r3   r„   r4   r�  :  sH   üýüûþþþýã#	r�  c                   @   sn   e Zd ZdZdZdZdddddd	d
ddddgdddgeedœddidœdddœdddœdddœgZdd„ ZdS )r~  zYouTube.com live streamszX(?P<base_url>https?://(?:\w+\.)?youtube\.com/(?:(?:user|channel|c)/)?(?P<id>[^/]+))/livezyoutube:livez/https://www.youtube.com/user/TheYoungTurks/liveZa48o2S1cPoorÖ   z The Young Turks - Live Main ShowzThe Young TurksZTheYoungTurksz5re:https?://(?:www\.)?youtube\.com/user/TheYoungTurksZ20150715r$  z$md5:438179573adcdff3c97ebb1ee632b891zNews & PoliticszCenk Uygur (TV Program Creator)z$The Young Turks (Award-Winning Work)zTalk Show (TV Genre))r­   rÊ   r¯   rû   rü   rý   r   r%  r  r  r  r  r  r  Tr  z=https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/liver+  z/https://www.youtube.com/c/CommanderVideoHq/livez*https://www.youtube.com/TheYoungTurks/livec                 C   sŽ   t  | j|¡}| d¡}| d¡}| j||dd�}|r„| jd|ddd�}| jd	|d
d d�}| d¡r„|r„t  d|¡r„|  |t	 
¡ ¡S |  |¡S )Nr­   r­  Frh   r•  z	page typerF   rŽ  ZvideoIdrw  r  z^[0-9A-Za-z_-]{11}$)rG   rP  rÈ  rš   rn   Ú_og_search_propertyr?  rw  r:   rÄ   rõ  )r2   rU   r¤   rþ   r­  rÂ   Z	page_typer8   r3   r3   r4   rÃ   –  s.    

   ÿ   ÿ ÿzYoutubeLiveIE._real_extractN)	r‡   rˆ   r‰   r\  rÈ  rm   rC  r^  rÃ   r3   r3   r3   r4   r~  r  sB   ó ÿïþþþær~  c                   @   sN   e 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œgZdS )r|  z"YouTube.com user/channel playlistszHhttps?://(?:\w+\.)?youtube\.com/(?:user|channel)/(?P<id>[^/]+)/playlistszyoutube:playlistsz7https://www.youtube.com/user/ThirstForScience/playlistsr^   ZThirstForSciencer(  rd  z>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=ddrí   Zigorkle1u   Ð˜Ð³Ð¾Ñ€ÑŒ ÐšÐ»ÐµÐ¹Ð½ÐµÑ€zBhttps://www.youtube.com/channel/UCiU1dHvZObB2iP6xkJ__Icw/playlistsé   ZUCiU1dHvZObB2iP6xkJ__IcwzChem PlayerZBlocked)rU   rc  r
  r  N)r‡   rˆ   r‰   r\  rÈ  rm   r^  r3   r3   r3   r4   r|  ¦  s.   þý	þü	þùñr|  c                   @   s   e Zd ZdZdS )ÚYoutubeSearchBaseInfoExtractorzUhref="\s*/watch\?v=(?P<id>[0-9A-Za-z_-]{11})(?:[^"]*"[^>]+\btitle="(?P<title>[^"]+))?N)r‡   rˆ   r‰   r¸   r3   r3   r3   r4   rŒ  Å  s   rŒ  c                   @   s0   e Zd ZdZedƒZdZdZi Zg Z	dd„ Z
dS )ÚYoutubeSearchIEzYouTube.com searchesÚinfzyoutube:searchZytsearchc                 C   sú   g }|}d|  d¡i}| | j¡ dt|ƒ }t d¡D ]œ}| j|d| d| ddd	id
�}|d d d }	d|	kr€tddd�‚t|  	|	¡ƒ}
||
7 }|
r¦t
|ƒ|krª qÖ| jd|	ddd�}|dkrÈ qÖt d|¡}q8t
|ƒ|krî|d|… }|  ||¡S )z-Get a specified number of results for a queryZsearch_queryr�  z https://www.youtube.com/results?r   z
query "%s"zDownloading page %szUnable to download API pageZspfZnavigate)r8   rB   rC   r~   Úbodyrª   zclass="search-messagez[youtube] No video resultsTr@   zjhref="(/results\?[^"]*\bsp=[^"]+)"[^>]*>\s*<span[^>]+class="[^"]*\byt-uix-button-content\b[^"]*"[^>]*>Nextz	next linkNrŽ  zhttps://www.youtube.com/)r‰  rQ   Ú_EXTRA_QUERY_ARGSr   r–   r—   rT   r   rs   r˜   r?  rè  r   rx  rÁ   )r2   r~   rn  ZvideosÚlimitZ	url_queryZ
result_urlÚpagenumrN   Zhtml_contentZ
new_videosZ	next_linkr3   r3   r4   Ú_get_n_resultsÓ  sJ     ÿ ü ÿ  þzYoutubeSearchIE._get_n_resultsN)r‡   rˆ   r‰   r\  rN  Ú_MAX_RESULTSrm   Ú_SEARCH_KEYr�  r^  r“  r3   r3   r3   r4   r�  É  s   r�  c                   @   s&   e Zd Zejd ZdZdZddiZdS )ÚYoutubeSearchDateIEz:dateZytsearchdatez)YouTube.com searches, newest videos firstZsearch_sortZvideo_date_uploadedN)r‡   rˆ   r‰   r�  rm   r•  r\  r�  r3   r3   r3   r4   r–  û  s   
r–  c                   @   s:   e Zd ZdZdZdZddddidœd	d
dœgZdd„ ZdS )ÚYoutubeSearchURLIEzYouTube.com search URLszyoutube:search_urlz\https?://(?:www\.)?youtube\.com/results\?(.*?&)?(?:search_query|q)=(?P<query>[^&]+)(?:[&]|$)zchttps://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=videorb   r¯   zyoutube-dl test videord  z2https://www.youtube.com/results?q=test&sp=EgQIBBgBTr+  c                 C   s<   t  | j|¡}t| d¡ƒ}|  ||¡}| j|  |¡|d�S )Nr~   ©rt  )rG   rP  rÈ  r   rš   rn   rÁ   r˜   )r2   rU   r¤   r~   rÂ   r3   r3   r4   rÃ     s    z YoutubeSearchURLIE._real_extractN)r‡   rˆ   r‰   r\  rm   rÈ  r^  rÃ   r3   r3   r3   r4   r—    s    ÿýþúr—  c                       s<   e Zd ZdZdZdZdddddœd	œgZ‡ fd
d„Z‡  ZS )ÚYoutubeShowIEz YouTube.com (multi-season) showsz3https?://(?:www\.)?youtube\.com/show/(?P<id>[^?#]*)zyoutube:showz)https://www.youtube.com/show/airdisastersrb   ZairdisasterszAir Disastersr(  rd  c                    s   |   |¡}tt| ƒ d| ¡S )Nz)https://www.youtube.com/show/%s/playlists)r¿   r€   r™  rÃ   )r2   rU   r    r„   r3   r4   rÃ   %  s    

ÿzYoutubeShowIE._real_extract)	r‡   rˆ   r‰   r\  rÈ  rm   r^  rÃ   r�   r3   r3   r„   r4   r™    s   þý	r™  c                   @   s8   e Zd ZdZdZedd„ ƒZdd„ Zdd„ Zd	d
„ Z	dS )ÚYoutubeFeedsInfoExtractorzr
    Base class for feed extractors
    Subclasses must define the _FEED_NAME and _PLAYLIST_TITLE properties.
    Tc                 C   s
   d| j  S )Nz
youtube:%s)Ú
_FEED_NAMEr1   r3   r3   r4   rm   2  s    z!YoutubeFeedsInfoExtractor.IE_NAMEc                 C   s   |   ¡  d S rX   rh  r1   r3   r3   r4   r†   6  s    z*YoutubeFeedsInfoExtractor._real_initializec           
      #   s´   g ‰ | }}t  d¡D ]˜}t d|¡}tt‡ fdd„t|ƒƒƒ}|sH q°ˆ  |¡ |  |¡D ]
}|V  q\t 	d|¡}|s| q°| j
d| d¡ | jd| td	�}	|	d
 }|	d }qd S )Nr   z&href="\s*/watch\?v=([0-9A-Za-z_-]{11})c                    s   | ˆ kS rX   r3   r7   rk  r3   r4   rK   D  rL   z4YoutubeFeedsInfoExtractor._entries.<locals>.<lambda>r�   r‘   r’   zDownloading page #%sr“   r”   r•   )r–   r—   rG   r½   rs   Úfilterr   rÁ  r>   r™   rT   rš   Ú_PLAYLIST_TITLEr)   )
r2   rŸ   r¡   r”   r¢   rÃ  ro  r£   r¤   r’   r3   rk  r4   r§   9  s*    
 ýz"YoutubeFeedsInfoExtractor._entriesc                 C   s*   |   d| j | j¡}| j|  |¡| jd�S )Nzhttps://www.youtube.com/feed/%sr˜  )rn   r›  r�  rÁ   r§   )r2   rU   rŸ   r3   r3   r4   rÃ   X  s    þ ÿz'YoutubeFeedsInfoExtractor._real_extractN)
r‡   rˆ   r‰   rŠ   rj   Úpropertyrm   r†   r§   rÃ   r3   r3   r3   r4   rš  +  s   
rš  c                   @   s4   e Zd ZdZdZdZdddœdddœgZdd	„ Zd
S )ÚYoutubeWatchLaterIEzyoutube:watchlaterzMYoutube watch later list, ":ytwatchlater" for short (requires authentication)zfhttps?://(?:www\.)?youtube\.com/(?:feed/watch_later|(?:playlist|watch)\?(?:.+&)?list=WL)|:ytwatchlaterz(https://www.youtube.com/playlist?list=WLTr+  z;https://www.youtube.com/watch?v=bCNU9TrbiRk&index=1&list=WLc                 C   s*   |   |d¡\}}|r|S |  d¡\}}|S )NZWL)rx  rv  )r2   rU   r²  r  r'  r3   r3   r4   rÃ   m  s
    z!YoutubeWatchLaterIE._real_extractN©r‡   rˆ   r‰   rm   r\  rÈ  r^  rÃ   r3   r3   r3   r4   rŸ  `  s   þþýrŸ  c                   @   s$   e Zd ZdZdZdZdZdd„ ZdS )ÚYoutubeFavouritesIEzyoutube:favoriteszJYouTube.com favourite videos, ":ytfav" for short (requires authentication)z@https?://(?:www\.)?youtube\.com/my_favorites|:ytfav(?:ou?rites)?Tc                 C   s&   |   dd¡}|  d|d¡}|  |d¡S )Nz$https://www.youtube.com/my_favoriteszYoutube Favourites videoszlist=(.+?)["&]zfavourites playlist idr¼   )rn   rs  r:   )r2   rU   rÂ   r    r3   r3   r4   rÃ   {  s    z!YoutubeFavouritesIE._real_extractN)r‡   rˆ   r‰   rm   r\  rÈ  rj   rÃ   r3   r3   r3   r4   r¡  u  s
   r¡  c                   @   s   e Zd ZdZdZdZdZdS )ÚYoutubeRecommendedIEzLYouTube.com recommended videos, ":ytrec" for short (requires authentication)zDhttps?://(?:www\.)?youtube\.com/feed/recommended|:ytrec(?:ommended)?ZrecommendedzYoutube Recommended videosN©r‡   rˆ   r‰   r\  rÈ  r›  r�  r3   r3   r3   r4   r¢  �  s   r¢  c                   @   s   e Zd ZdZdZdZdZdS )ÚYoutubeSubscriptionsIEzJYouTube.com subscriptions feed, "ytsubs" keyword (requires authentication)zHhttps?://(?:www\.)?youtube\.com/feed/subscriptions|:ytsubs(?:criptions)?ZsubscriptionszYoutube SubscriptionsNr£  r3   r3   r3   r4   r¤  ˆ  s   r¤  c                   @   s   e Zd ZdZdZdZdZdS )ÚYoutubeHistoryIEzGYoutube watch history, ":ythistory" for short (requires authentication)z7https?://(?:www\.)?youtube\.com/feed/history|:ythistoryÚhistoryzYoutube HistoryNr£  r3   r3   r3   r4   r¥  �  s   r¥  c                   @   sT   e 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œgZdd„ ZdS )ÚYoutubeTruncatedURLIEzyoutube:truncated_urlFaX  (?x)
        (?:https?://)?
        (?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/
        (?:watch\?(?:
            feature=[a-z_]+|
            annotation_id=annotation_[^&]+|
            x-yt-cl=[0-9]+|
            hl=[^&]*|
            t=[0-9]+
        )?
        |
            attribution_link\?a=[^&]+
        )
        $
    zAhttps://www.youtube.com/watch?annotation_id=annotation_3951667041Tr+  zhttps://www.youtube.com/watch?z.https://www.youtube.com/watch?x-yt-cl=84503534z)https://www.youtube.com/watch?feature=fooz&https://www.youtube.com/watch?hl=en-GBz$https://www.youtube.com/watch?t=2372c                 C   s   t ddd�‚d S )NzëDid you forget to quote the URL? Remember that & is a meta character in most shells, so you want to put the URL in quotes, like  youtube-dl "https://www.youtube.com/watch?feature=foo&v=BaW_jenozKc"  or simply  youtube-dl BaW_jenozKc  .Tr@   )r   )r2   rU   r3   r3   r4   rÃ   ½  s    úz#YoutubeTruncatedURLIE._real_extractNr   r3   r3   r3   r4   r§  –  s.   þþþþþþñr§  c                   @   s,   e Zd ZdZdZdZdddœgZdd„ Zd	S )
ÚYoutubeTruncatedIDIEzyoutube:truncated_idFzEhttps?://(?:www\.)?youtube\.com/watch\?v=(?P<id>[0-9A-Za-z_-]{1,10})$z*https://www.youtube.com/watch?v=N_708QY7ObTr+  c                 C   s"   |   |¡}td||f dd�‚d S )Nz1Incomplete YouTube ID %s. URL %s looks truncated.Tr@   )r¿   r   )r2   rU   r8   r3   r3   r4   rÃ   Ñ  s
    

þz"YoutubeTruncatedIDIE._real_extractNr   r3   r3   r3   r4   r¨  Ç  s   þr¨  )MÚ
__future__r   r–   rR   Zos.pathrQ  r°  rG   r0   rz  Úcommonr   r   Zjsinterpr   Z	swfinterpr   Úcompatr	   r
   r   r   r   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&   r'   r(   r)   r*   r+   r,   rŽ   r¨   rº   rÄ   ra  ry  r�  r~  r|  rŒ  r�  r–  r—  r™  rš  rŸ  r¡  r¢  r¤  r¥  r§  r¨  r3   r3   r3   r4   Ú<module>   sl   0l a'!                	  me84251