U
    $Pf{.                    @   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	m
Z
mZ ddlmZmZmZmZmZmZmZ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!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, d	d
 Z-G dd de
Z.G dd de.Z/G dd de.Z0G dd de
Z1G dd de
Z2G dd de
Z3G dd de.Z4G dd dee.Z5G dd de5Z6G dd de0Z7G dd  d e
Z8G d!d" d"e7Z9G d#d$ d$e7Z:G d%d& d&e7Z;G d'd( d(e
Z<G d)d* d*e
Z=dS )+    )unicode_literalsN   )InfoExtractorSearchInfoExtractor   )
compat_chrcompat_HTTPErrorcompat_parse_qs
compat_str compat_urllib_parse_unquote_pluscompat_urllib_parse_urlencodecompat_urllib_parse_urlparsecompat_urlparse)JSInterpreter)ExtractorError
clean_htmldict_getfloat_or_noneint_or_nonemimetype2extparse_codecsparse_duration	qualitiesremove_startsmuggle_urlstr_or_none
str_to_inttry_getunescapeHTMLunified_strdateunsmuggle_urlupdate_url_queryurl_or_noneurlencode_postdataurljoinc                 C   s   t t | jS N)r   parse_qsurlparsequeryurl r+   @/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/extractor/youtube.pyr&   1   s    r&   c                   @   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dddddiiZdZdZdZd"ddZdd Zdd Zdd  Zd!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}youtubeFzB(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM)c                    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rd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}|rt|dd t}||dkrd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rdS t|d/d t}|rt|d0d t}||dkrd1d2 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rd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.
        NZ
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sr+   r+   r,   <lambda>l       z>YoutubeBaseInfoExtractor._login.<locals>.req.<locals>.<lambda>Fz/application/x-www-form-urlencoded;charset=utf-8)zContent-TypezGoogle-Accounts-XSRF)r1   r2   Ztransform_sourcer3   dataheaders)copyupdatejsondumps_download_jsonr#   )r*   Zf_reqr1   r2   r<   Z
login_formselfr+   r,   req\   s0       z,YoutubeBaseInfoExtractor._login.<locals>.reqc                    s    j |  d S r%   )_downloaderZreport_warning)messagerD   r+   r,   warns   s    z-YoutubeBaseInfoExtractor._login.<locals>.warnZ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   r+   xr+   r+   r,   r:      r;   z1YoutubeBaseInfoExtractor._login.<locals>.<lambda>zUnable to extract user hashz
Logging inzUnable to log inc                 S   s   | d d S Nr      r+   rK   r+   r+   r,   r:      r;   c                 S   s   | d S NrN   r+   rK   r+   r+   r,   r:      r;   ZINCORRECT_ANSWER_ENTEREDzUnable to login: %szInvalid passwordc                 S   s   | d d S )Nr   r+   rK   r+   r+   r,   r:      r;   zUnable to extract result entryc                 S   s   | d d S Nr   r+   rK   r+   r+   r,   r:      r;   c                 S   s   | d S Nr   r+   rK   r+   r+   r,   r:      r;   ZTWO_STEP_VERIFICATIONc                 S   s   | d S rO   r+   rK   r+   r+   r,   r:      r;   ZQUOTA_EXCEEDEDz*Exceeded the limit of TFA codes, try laterc                 S   s   | d d S )Nr   r   r+   rK   r+   r+   r,   r:      r;   zUnable to extract TLz2-step verification codezTwo-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 rM   r+   rK   r+   r+   r,   r:      r;   c                 S   s   | d S rO   r+   rK   r+   r+   r,   r:      r;   zUnable to finish TFA: %szInvalid TFA codec                 S   s   | d d d S )Nr   rP   r   r+   rK   r+   r+   r,   r:      r;   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 rR   r+   rK   r+   r+   r,   r:      r;   z!Unable to extract CheckCookie URLzChecking cookier3   zhttps://myaccount.google.com/)Z_get_login_info_LOGIN_REQUIREDrF   paramsgetr   IE_NAME_download_webpage
_LOGIN_URLZ_hidden_inputs_LOOKUP_URLr   r
   _CHALLENGE_URLlistZ_get_tfa_infor   _TFA_URLformat)rD   usernamepasswordZ
login_pagerE   rI   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_resultsr+   rC   r,   _loginD   s^     
                              




          

  
     

zYoutubeBaseInfoExtractor._loginc                 C   sr   |  d}|drd S d }|d}|rLd|jkr8d S | jd|jdd d}|s\tdd	}| d
dd|  d S )Nhttps://www.youtube.com/z__Secure-3PSIDZCONSENTZYESzPENDING\+(\d+)consentdefaultd   i  z.youtube.comzYES+cb.20210328-17-p0.en+FX+%s)Z_get_cookiesrW   value_search_regexrandomrandintZ_set_cookie)rD   cookiesZ
consent_idrh   r+   r+   r,   _initialize_consent   s"    



   z,YoutubeBaseInfoExtractor._initialize_consentc                 C   s&   |    | jd krd S |  s"d S d S r%   )rq   rF   rf   rH   r+   r+   r,   _real_initialize
  s
    
z)YoutubeBaseInfoExtractor._real_initializecontextclientWEB2.20201021.03.00Z
clientNameZclientVersionzN(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=\s*({.+?})\s*;z)ytInitialPlayerResponse\s*=\s*({.+?})\s*;z(?:var\s+meta|</script|\n)Tc              
   C   sF   | j  }|| | jd| |ddt|d|ddiddid	S )
Nz&https://www.youtube.com/youtubei/v1/%szDownloading API JSONUnable to download API pageutf8content-typeapplication/jsonkeyZ'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8)video_idr1   r2   r<   r3   r=   r(   )_DEFAULT_API_DATAr>   r?   rB   r@   rA   encode)rD   epr(   r}   r3   r<   r+   r+   r,   	_call_api  s    

   z"YoutubeBaseInfoExtractor._call_apic                 C   s(   |  | d| j| jf | jf|d|S )N%s\s*%syt initial data)_parse_jsonrm   _YT_INITIAL_DATA_RE_YT_INITIAL_BOUNDARY_RErD   r}   webpager+   r+   r,   _extract_yt_initial_data)  s     z1YoutubeBaseInfoExtractor._extract_yt_initial_datac                 C   s"   | j | jd|ddd|ddp i S )Nz"ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;ytcfg{}ri   FrT   )r   rm   r   r+   r+   r,   _extract_ytcfg0  s       z'YoutubeBaseInfoExtractor._extract_ytcfgc           	   
   C   s   |d }t |dd dd ft}t |dd t}tt |dd t}t |dd tpVd}t| jd	td
d|dd d}t |dd dd ft}dt |||||||d	S )NvideoIdc                 S   s   | d d d d S Ntitlerunsr   textr+   rK   r+   r+   r,   r:   :  r;   z9YoutubeBaseInfoExtractor._extract_video.<locals>.<lambda>c                 S   s   | d d S Nr   
simpleTextr+   rK   r+   r+   r,   r:   ;  r;   c                 S   s   | d d d d S )NZdescriptionSnippetr   r   r   r+   rK   r+   r+   r,   r:   =  r;   c                 S   s   | d d S )NZ
lengthTextr   r+   rK   r+   r+   r,   r:   @  r;   c                 S   s   | d d S )NZviewCountTextr   r+   rK   r+   r+   r,   r:   B  r;   r5   z	^([\d,]+)z\sz
view countri   c                 S   s   | d d d d S )NZ	ownerTextr   r   r   r+   rK   r+   r+   r,   r:   H  r;   c                 S   s   | d d d d S )NZshortBylineTextr   r   r   r+   rK   r+   r+   r,   r:   I  r;   r*   )	_typeie_keyidr*   r   descriptionduration
view_countuploader)	r   r
   r   r   rm   r6   r7   	YoutubeIEr   )	rD   rendererr}   r   r   r   Zview_count_textr   r   r+   r+   r,   _extract_video6  s`           z'YoutubeBaseInfoExtractor._extract_videoN)T)__name__
__module____qualname____doc__rZ   Z_TWOFACTOR_URLr[   r\   r^   Z_NETRC_MACHINErU   _PLAYLIST_ID_RErf   rq   rr   r~   r   _YT_INITIAL_PLAYER_RESPONSE_REr   r   r   r   r   r+   r+   r+   r,   r-   5   s6    8	
r-   c                T       s  e Zd ZdZdZdddei ZdZdZdZ	d	Z
d
dddddddddddgdgdeeeddddd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dgdeeed+d,d-id.d/d0d1d2dd3d4d5d3d6d7d-d8d9d:d;d<d=d2d>d?d@dAdAdBdCdD	d-dEd9dFdGdHddIdJdKdLdMdNdOdP	ddQdRddSdTdUdVdWdXdYd%dZ
dd[d-d\d]d]dd^d_d`dad`dbd`dcdddedfgdgdhdhddidjdkdldmdndodp	d,dqidFdrdsddtdudvdwdxdydzd{d|
dd}d}d~dd5ddddd,dqiddddd~ddddddddd
ddddddddddddd-dd9dddddddddddddddddd	iddddddddddd	iddddddddddd	iddddddddddd	igd,d-idddddddddd-d\dd-d\ddddddddddddddddȜd,d-idFdd-d\dddddddddd,d-idddd-d\ddddddddddddݜ
d,d-idFdddddddddddd
d,d-idFdd-d\dd-d\ddddddddddd	d,d-iddddddddddddddddd,d-idg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\dd-d\dddddddddddd
d-dddddddddd d!d"d#dd$d%d&d'd,d-idFd(d-d\d)d*dd+d,d-d.d.d/d0d1d2d3d,d-id4dd5d6dd7d5d8d9d9dd,d-idFd:d;dd<d=d>d?d?dd,d-idFd@d-d\dAd-d\dBdBddCdDdEdFdGdHdIdCdJdKdKdLd,d-idFdMd-d\dNdNddOdPdQdRdSdTdUd,d-idFg.ZdVdWdXdYdZd[d\dVd]d^dYdZd[d\d_d`dadbd_dcddd`dedad\ddfdgd`dhdid\ddjdkd`dldid\dVdfdgd`dmdid\dVdndod`dmdid\d_dpd`dadqddrdsd`dldid\ddtdud`dldid\d~dfdgdvdmdwd\d~dndodvdmdwd\d~djdkdvdldwd\d~drdsdvdldwd\ddndod`dmdid\ddndod`dmdid\ddgdxd`dmdidydzddodxd`dmdidydzddkdxd`dldidydzddsdxd`dldidydzd~dgdxdvdmdwdydzd~dodxdvdldwdydzd~dkdxdvdldwdydzdddd{d`d|did}dzddXd{d`d|did}dzddgd{d`dmdid}dzddod{d`dmdid}dzddkd{d`d~did}dzddsd{d`d~did}dzddXd{d`d|did}dzddd{d`dedid}dzddXddidddgddidddoddidddkddidddsddiddddiddddddidddoddidddddidddkddiddddsddiddddddidd2dd`d|ddd2dd`dmddd2dd`d~ddd2dd`ddd2dd`ddd2ddddd2ddddd~dgdfdd~dwdd~dodndd~dwdd~dkdjdd~dwdd~dsdrdd~dwdd~dodndd~dwdd~dodndd~dwdd~dddd~ddd~dXdddd~dgdddd~dodddd~dodddd~dodddd~dkdddd~dsdddd~ddddd~ddddd~dkddddd~dsddddd~dddddd~ddddd~dddddd~dvddmdd~dvdd~dd~ddddd~ddddd~ddddddidddddddddddddRZe fddZ fddZdd Zedd Z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dd Zdd Zdd Z  ZS (  r   zYouTube.com)7z!(?:www\.)?redirect\.invidious\.ioz(?:(?:www|dev)\.)?invidio\.usz(?:(?:www|no)\.)?invidiou\.shz((?:(?:www|fi)\.)?invidious\.snopyta\.orgz(?:www\.)?invidious\.kabi\.tk(?:www\.)?invidious\.13ad\.dez#(?:www\.)?invidious\.mastodon\.hostz$(?:www\.)?invidious\.zapashcanon\.frz3(?:www\.)?(?:invidious(?:-us)?|piped)\.kavin\.rocksz%(?:www\.)?invidious\.tinfoil-hat\.netz"(?:www\.)?invidious\.himiko\.cloudz((?:www\.)?invidious\.reallyancient\.techz(?:www\.)?invidious\.tubez(?:www\.)?invidiou\.sitez(?:www\.)?invidious\.sitez(?:www\.)?invidious\.xyzz (?:www\.)?invidious\.nixnet\.xyzz (?:www\.)?invidious\.048596\.xyzz(?:www\.)?invidious\.drycat\.frz(?:www\.)?inv\.skyn3t\.inz(?:www\.)?tube\.poal\.coz(?:www\.)?tube\.connect\.cafez(?:www\.)?vid\.wxzm\.sxz(?:www\.)?vid\.mint\.lgbtz(?:www\.)?vid\.puffyan\.usz(?:www\.)?yewtu\.bez(?:www\.)?yt\.elukerio\.orgz(?:www\.)?yt\.lelux\.fiz$(?:www\.)?invidious\.ggc-project\.dez(?:www\.)?yt\.maisputain\.ovhz(?:www\.)?ytprivate\.comr   z (?:www\.)?invidious\.toot\.koelnz(?:www\.)?invidious\.fdn\.frz!(?:www\.)?watch\.nettohikari\.comz (?:www\.)?invidious\.namazso\.euz"(?:www\.)?invidious\.silkky\.cloudz(?:www\.)?invidious\.exonip\.dez%(?:www\.)?invidious\.riverside\.rocksz#(?:www\.)?invidious\.blamefran\.netz(?:www\.)?invidious\.moomoo\.dez(?:www\.)?ytb\.trom\.tfz(?:www\.)?yt\.cyberhost\.ukz!(?:www\.)?kgg2m7yk5aybusll\.onionz!(?:www\.)?qklhadlycap4cnod\.onionzI(?:www\.)?axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid\.onionzI(?:www\.)?c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid\.onionzI(?:www\.)?fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad\.onionzT(?:www\.)?invidious\.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd\.onionzH(?:www\.)?owxfohz4kjyv25fvlqilyxast7inivgiktls3th44jhk3ej3i7ya\.b32\.i2pzI(?:www\.)?4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd\.onionzI(?:www\.)?w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd\.onionzI(?:www\.)?kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad\.onionzI(?:www\.)?grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad\.onionzI(?:www\.)?hpniueoejy4opn7bc4ftgazyqjoeqwlvh2uiku2xqku6zpoa4bf5ruid\.oniona	  (?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)s|
                            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
                            %(invidious)s
                         )/
                         |(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=
                         )
                     )?                                                       # all until now is optional -> you can pass the naked ID
                     (?P<id>[0-9A-Za-z_-]{11})                                # here is it! the YouTube video ID
                     (?(1).+)?                                                # if we found the ID, everything can follow
                     $Z	invidious|)z*/s/player/(?P<id>[a-zA-Z0-9_-]{8,})/playerz/(?P<id>[a-zA-Z0-9_-]{8,})/player(?:_ias\.vflset(?:/[a-zA-Z]{2,3}_[a-zA-Z]{2,3})?|-plasma-ias-(?:phone|tablet)-[a-z]{2}_[A-Z]{2}\.vflset)/base\.js$z%\b(?P<id>vfl[a-zA-Z0-9_-]+)\b.*?\.js$)Zsrv1Zsrv2Zsrv3ZttmlZvttFr.   z6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9ZBaW_jenozKcmp4u#   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   rS   )r   extr   r   uploader_iduploader_url
channel_idchannel_urlupload_dater   
categoriestagsr   r   
like_countdislike_count
start_timeend_time)r*   	info_dictz%//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   	age_limitzPrivate video)r*   r1   r   skipz9https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQz!Use the first video ID in the URL)r   r   r   r   r   r   r   r   r   r   r   r   r   r   skip_downloadT)r*   r1   r   rV   z+https://www.youtube.com/watch?v=a9LDPn-MO4Iz.256k DASH audio (format 141) via DASH manifestza9LDPn-MO4IZm4aZ8KVIDEOz/re:https?://(?:www\.)?youtube\.com/user/8KVIDEOr5   zUHDTV TEST 8K VIDEO.mp4)r   r   r   r   r   r   r   r   141)youtube_include_dash_manifestr_   zformat 141 not served anymore)r*   r1   r   rV   r   z+https://www.youtube.com/watch?v=IB3lcPjvWLAZIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree Wilsonz$md5:8f5e2b82460520b619ccac1f509d43bf   ZAfrojackVEVOZ20131011gp=
/`@)	r   r   r   r   r   r   r   r   abrz141/bestaudio[ext=m4a]r*   r   rV   z+https://www.youtube.com/watch?v=T4XJQO3qol8ZT4XJQO3qol8   Z20100909zAmazing AtheistZTheAmazingAtheistz9re:https?://(?:www\.)?youtube\.com/user/TheAmazingAtheistzBurning Everyone's KoranzSUBSCRIBE: 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XgnwCQzjau8r*   only_matchingZ__2ABJjxzNoi
  Z20100430Zdeadmau5z0re:https?://(?:www\.)?youtube\.com/user/deadmau5z$md5:6cbcd3a92ce1bc676fc4d6ab4ace2336zDeadmau5 - Some Chords (HD)zSome Chords)r   r   r   r   r   r   creatorr   r   r   	alt_titlezDASH manifest missing)r*   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qEJwOuvDf7Iwebmu   Обсуждение судебной практики по выборам 14 сентября 2014 года в Санкт-ПетербургеZ20150404Zspbelectu+   Наблюдатели Петербурга)r   r   r   r   r   r   r   zThis live event has ended.)r*   r   rV   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)r*   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   135)r*   md5r   rV   r   z+https://www.youtube.com/watch?v=jvGDaLqkpTgZjvGDaLqkpTgz(Tom Clancy Free Weekend Rainbow Whateverz$md5:e03b909557865076822aa169218d6a5dr   r   r   r   z6Tom Clancy Free Weekend Rainbow Whatever (Main Camera)i)  Z20161111zTeam PGPZUChORY56LMMETTuGjXaJXvLgzCre:https?://(?:www\.)?youtube\.com/channel/UChORY56LMMETTuGjXaJXvLg)	r   r   r   r   r   r   r   r   r   Z3AKt1R1aDnwz3Tom Clancy Free Weekend Rainbow Whatever (Camera 2)i*  ZRtAMM00gpVcz3Tom Clancy Free Weekend Rainbow Whatever (Camera 3)i*  Z6N2fdlP3C5Uz3Tom Clancy Free Weekend Rainbow Whatever (Camera 4)i*  )r*   r   playlistrV   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r*   r   playlist_countr   zhttps://vid.plus/FlRa-iH7PGwz_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   trackartist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=FRhJzUSJbGIz+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   licensez+https://www.youtube.com/watch?v=eQcmzGIKrzgZeQcmzGIKrzgz8Democratic Socialism and Foreign Policy | Bernie Sandersz$md5:13a2503d7b5904ef4b223aa101628f39i  zBernie SandersZUCH1dpzjCEiGAt8CXkryhkZgzCre:https?://(?:www\.)?youtube\.com/channel/UCH1dpzjCEiGAt8CXkryhkZg)
r   r   r   r   r   r   r   r   r   r   zKhttps://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Standard YouTube License)	r   r   r   r   r   r   r   r   r   This video is not available.z+https://www.youtube.com/watch?v=iqKdEhx-dD4ziqKdEhx-dD4zIsolation - Mind Field (Ep 1)z$md5:f540112edec5d09fc8cc752d3d4ba3cdi%  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)r*   r   rV   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/UCEJYpZGqgUob0zVVEaLhvVgzJThis video has been removed for violating YouTube's policy on hate speech.Z1t24XAntNCYzsJL6WA-aGkQz&https://invidio.us/watch?v=BaW_jenozKcz1https://redirect.invidious.io/watch?v=BaW_jenozKcz)https://redirect.invidious.io/Yh0AhrY9GjAz+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.youtubekids.com/watch?v=3b8nCWDgZ6QZDJztXj2GPflZDJztXj2GPfkz9Panjabi MC - Mundian To Bach Ke (The Dictator Soundtrack)z$md5:bf577a41da97918e94fa9798d9228825Z20090125ZProchorowkaz3re:https?://(?:www\.)?youtube\.com/user/Prochorowkaz
Panjabi MCz@Beware of the Boys (Mundian to Bach Ke) - Motivo Hi-Lectro Remixz'Beware of the Boys (Mundian To Bach Ke))r   r   r   r   r   r   r   r   r   r   r   zVideo unavailablez+https://www.youtube.com/watch?v=x41yOUIvK2kZx41yOUIvK2kzIMG 3456Z20170613ZElevageOrVertz+https://www.youtube.com/watch?v=CHqg6qOn4noZCHqg6qOn4noz+Part 77   Sort a list of simple types in c#z$md5:b8746fa52e10cdbf47997903f13b20dcZ20130831Z	kudvenkatz+https://www.youtube.com/watch?v=gVfgbahppCYz1https://www.youtube.com/watch_popup?v=63RmMXCd_bQZOtqTfy26tG0zBurn Outz$md5:8d07b84dcbcbfb34bc12a56d968b6131Z20141120zThe Cinematic Orchestra - TopicZUCIzsJBIyo8hhpFm1NK0uLgwzCre:https?://(?:www\.)?youtube\.com/channel/UCIzsJBIyo8hhpFm1NK0uLgwzThe Cinematic Orchestraz	Every DayN)r   r   r   r   r   r   r   r   r   r   r   Zrelease_datar   z+https://www.youtube.com/watch?v=nGC3D_FkCmgZcBvYw8_A0vQu:   4K Ueno Okachimachi  Street  Scenes  上野御徒町歩きz$md5:ea770e474b7cd6722b4c95b833c03630Z20201120zWalk around JapanZUC3o_t8PzBmXf5S9b7GLx1MwzCre:https?://(?:www\.)?youtube\.com/channel/UC3o_t8PzBmXf5S9b7GLx1Mw)r   r   r   r   r   r   r   r   Zflvi     Zmp3@   Zh263)r   widthheightacodecr   vcodeci  i  Z3gpZaacZmp4v)r   r   r            i  ih  `   Zh264i   i        iV  i  i@  )r   r   r   r   i  i8  i   i   ZvorbisZvp8Z3Di)r   r   format_noter   r   r   Z
preferenceZHLS0   i   H   z
DASH video)r   r   r   r   )r   r   r   i  <   )r   r   r   r   fpsip  z
DASH audioZm4a_dash)r   r   r   r   	container)r   r   r   r   Zdtsezec-3)r   r   r   r   r   r   Zvp9)r   r   r   r   r   )r   r   r   r   Zopus2   )r   r   r   r   F      protocolZrtmpnonezav01.0.05M.08)r   r   )R56Z13Z17Z18Z22Z34Z35Z36Z37Z38Z43Z44Z45Z46Z59Z78Z82Z83Z84Z85Z100Z101Z102Z91Z92Z93Z94Z95Z96Z132Z151Z133Z134r   Z136Z137Z138Z160Z212Z264Z298Z299Z266Z139Z140r   Z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251Z_rtmpZ394Z395Z396Z397c                    s:   ddl m} ||}|dd gd r*dS tt| |S )Nr   r&   r]   r   F)r.   r&   rW   superr   suitableclsr*   r&   qs	__class__r+   r,   r     s
    zYoutubeIE.suitablec                    s"   t t| j|| i | _i | _d S r%   )r   r   __init___code_cache_player_cache)rD   argskwargsr   r+   r,   r     s    zYoutubeIE.__init__c                 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 r%   r
   len).0partr+   r+   r,   	<genexpr>  s     z0YoutubeIE._signature_cache_id.<locals>.<genexpr>)joinsplit)rD   example_sigr+   r+   r,   _signature_cache_id  s    zYoutubeIE._signature_cache_idc                 C   s6   | j D ]}t||}|r q,qtd| |dS )NzCannot identify player %rr   )_PLAYER_INFO_REr6   searchr   group)r   
player_urlZ	player_reZid_mr+   r+   r,   _extract_player_info  s    
zYoutubeIE._extract_player_infoc           
         s   |  |}d|| |f }tj||ks0t| jjd|  d k	rT fddS || j	kr~| j
||d| d| d| j	|< | j	| }| |}dtttt|}||}	d	d
 |	D  | jjd|  |S )Nzjs_%s_%szyoutube-sigfuncsc                    s   d  fddD S )Nr5   c                 3   s   | ]} | V  qd S r%   r+   )r  ir8   r+   r,   r	    s     zJYoutubeIE._extract_signature_function.<locals>.<lambda>.<locals>.<genexpr>)r
  r8   
cache_specr8   r,   r:     r;   z7YoutubeIE._extract_signature_function.<locals>.<lambda>zDownloading player zDownload of %s failed)r1   r2   r5   c                 S   s   g | ]}t |qS r+   ordr  cr+   r+   r,   
<listcomp>  s     z9YoutubeIE._extract_signature_function.<locals>.<listcomp>)r  r  ospathbasenameAssertionErrorrF   cacheloadr   rY   _parse_sig_jsr
  mapr   ranger  store)
rD   r}   r  r  	player_idZfunc_idcoderb   test_string	cache_resr+   r  r,   _extract_signature_function  s.    
 
 

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rd| 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   r5   z:%d:r   z	s[%s%s%s])str)startendstepZstartsZendsZstepsr+   r+   r,   	_genslice  s    zBYoutubeIE._print_sig_code.<locals>.gen_sig_code.<locals>._genslicez(Never used)r   rP   )rP   r   zs[%d])zip)Zidxsr/  r.  r,  r  prevr+   r+   r,   gen_sig_code  s$    "z/YoutubeIE._print_sig_code.<locals>.gen_sig_coder5   c                 S   s   g | ]}t |qS r+   r  r  r+   r+   r,   r  "  s     z-YoutubeIE._print_sig_code.<locals>.<listcomp>z + z(%s), c                 s   s   | ]}t t|V  qd S r%   r  )r  pr+   r+   r,   r	  %  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:
)r
  r"  r   r#  r  r  	to_screen)
rD   funcr  r2  r'  r(  r  Z	expr_codeZsignature_id_tupler&  r+   r+   r,   _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$]+)\(z;\bm=(?P<sig>[a-zA-Z0-9$]{2,})\(decodeURIComponent\(h\.s\)\)z=\bc&&\(c=(?P<sig>[a-zA-Z0-9$]{2,})\(decodeURIComponent\(c\)\)z(?:\b|[^a-zA-Z0-9$])(?P<sig>[a-zA-Z0-9$]{2,})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\);[a-zA-Z0-9$]{2}\.[a-zA-Z0-9$]{2}\(a,\d+\)zj(?:\b|[^a-zA-Z0-9$])(?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$]+)\(zyt\.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$]+)\(r8  z)Initial JS player signature function namesig)r  c                    s
    | gS r%   r+   r8   Zinitial_functionr+   r,   r:   @  r;   z)YoutubeIE._parse_sig_js.<locals>.<lambda>)rm   r   Zextract_function)rD   ZjscodefuncnameZjsir+   r:  r,   r!  *  s      
zYoutubeIE._parse_sig_jsc              
   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?://https://www.youtube.comZyoutube_print_sig_codezSignature extraction failed: )cause)r   
startswithr6   matchr   r$   r  r  r)  rF   rV   rW   r7  	Exception	traceback
format_exc)rD   r9   r}   r  r%  r6  etbr+   r+   r,   _decrypt_signatureB  s8    

 
  


 zYoutubeIE._decrypt_signaturec                    s   t 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videostatsPlaybackUrlbaseUrlr+   rK   r+   r+   r,   r:   `  r;   z)YoutubeIE._mark_watched.<locals>.<lambda>z@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_r5   c                 3   s"   | ]} t d dd@  V  qdS )r   r   ?   N)rn   ro   )r  _ZCPN_ALPHABETr+   r,   r	  i  s     z*YoutubeIE._mark_watched.<locals>.<genexpr>r      2)vercpnT)r(   zMarking watchedzUnable to mark watchedFrT   )r"   r   r   r'   r&   r(   r
  r#  r?   
urlunparse_replacer   rY   )rD   r}   player_responseZplayback_urlZparsed_playback_urlr   rM  r+   rI  r,   _mark_watched]  s0    
   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 r)   r   r  )r  mobjr+   r+   r,   r  y  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 )rP   Nr+   r  mr+   r+   r,   r	    s     z*YoutubeIE._extract_urls.<locals>.<genexpr>)r6   finditerextendr]   r"  r   findall)r   entriesmatchesr+   r+   r,   _extract_urlsv  s    
zYoutubeIE._extract_urlsc                 C   s   t | }|r|d S d S rQ   )r   r[  )r   urlsr+   r+   r,   _extract_url  s    
zYoutubeIE._extract_urlc                 C   s4   t | j|t j}|d kr&td| |d}|S )NzInvalid URL: %sr   )r6   r?  
_VALID_URLVERBOSEr   r  )r   r*   rS  r}   r+   r+   r,   
extract_id  s
    
zYoutubeIE.extract_idc                 C   s   t |dd t}|sd S dd }g }t|ddD ]b\}}||}	|	d krJq0|t|k rb||| n|}
|
d krpq0t |dd t}||	|
|d q0|S )	Nc                 S   s    | d d d d d d d S )NZplayerOverlaysZplayerOverlayRendererZdecoratedPlayerBarRendererZ	playerBarZchapteredPlayerBarRendererchaptersr+   rK   r+   r+   r,   r:     s   z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>c                 S   s   t t| dd tddS )Nc                 S   s   | d d S )NchapterRendererZtimeRangeStartMillisr+   rK   r+   r+   r,   r:     r;   zMYoutubeIE._extract_chapters_from_json.<locals>.chapter_time.<locals>.<lambda>  )Zscale)r   r   int)chapterr+   r+   r,   chapter_time  s    z;YoutubeIE._extract_chapters_from_json.<locals>.chapter_timer   r,  c                 S   s   | d d d S )Nrb  r   r   r+   rK   r+   r+   r,   r:     r;   r   r   r   )r   r]   	enumerater  r
   append)rD   r<   r}   r   Zchapters_listrf  ra  next_numre  r   r   r   r+   r+   r,   _extract_chapters_from_json  s<    

 
z%YoutubeIE._extract_chapters_from_jsonc                 C   s,   | j | jd|| jf |f||dd|ddS )Nr   r   ri   FrT   )r   rm   r   )rD   r   regexr}   namer+   r+   r,   _extract_yt_initial_variable  s       z&YoutubeIE._extract_yt_initial_variablec           p         s  t |i \}}|} d }|d | }j|d |ddd }r^j|d}|stdd|i|}|d	pi }|d
dkrj|d |dd|d| dddddd}|rjt	t
|dd tpd|dd}	|	rt|	tr|	}t	|dd t}
|
r|
 |
S dd r8fddndd }|dpNi }t	|dd tpdi }|dp|dp|d d!dg}|d"}|d#dsjjd$st	|d%d t}|rg }g }|d&D ]}t
t|  fd'd(}|d)}|sq|d}|}|r,|d*| 7 }|d+d,t|d  d) d-  d#d.i|d/ || qd0d1||f  ||||S nd2|  g }g }i }d }td3d4d5d6d7d8d9d:d;d<g
}|d=pi }|d>pg }||d?pg  |D ]b}|d@s|dAr(qt|dB} |dC}!| rT|!rT|!|| < |dDdEkrhq|dF}"|"s&t
|dG}#tt	|#dHd }"t	|#dId }$|#r|"r|$sq|sވs̐qjdJdKdd}|sq|#dL d- ||}%t	|#dMd pdN}&|"dO|& dP |% 7 }"| r6||  t|dQpL|dRdS}'t |dTt |dU| |dVpz|!t |dWt |dX||!|'|"|dYdZ
}(|d[})|)rt!"d\|)}*|*rt#|*$d|(d]< |(%t&|*$d^ |(d_d`k}+|(dad`k},|+r|'|(db< |,r*|'|(dc< |+s6|,r^dddei|(df< |(d]r^|(d] dg |(dh< ||( q|di}-|-rĈj'|-|djddD ]4}.jdk|.dF dBd dl} | r| |.dm< ||. qjjdnd.rl|do}/|/rlj(|/|ddD ]t}.|.dm } | |krq| |kr*|||  |.dC< t jdp|.dqpD|.dF drd dl}0|0r^|0|.ds< ||. q|s6|dtrt)dud.dvt	|dwd tpi }1|1d
p|d
}2|1dx}3|3r$t*|3}3|3dykr|dz}4|4s|d{}5|5r|5d&nd }4+|3|4 |2d||3 7 }2|2r6t)|2d.dv,| |d}pNg }6|6sxrxd~d t!-.dD }6|6D ]}7|7/dr|t!0d|7}*|*r|dd |*1 D \}8}9|8d-kr||9d-kr||8|9 }:|D ]}.|.dad`kr|:|.d< q qq|g };||fD ]j}<t	|<dd t2p"g D ]@}=|=dF}>|>s<q$|;t |=dX|>t |=dYd q$|;r
 qq
|ddg}=|=rdF|=ig};|dp|d}?|dp|dp|d}@t |dp|dpt3|d}A|d}B|d}C||B	r4|n|||;|t5|d	p0|d|d |C	rLd|Cdnd |C|@|@	r`d|@ nd |At |d	p|d	p|dt|d|ddk	s|ddk	s|ddk	rdnd-||?	r|?gnd |6|Bd}Dt	|dd t}E|E
rfdd}Fi }G|Ed
pg D ]}H|Hd}|
s,
q|Hddk
rb|Hd}I|I
sP
q|F|G||Ii  
qi }J|Ed
ptg D ],}K|Kd}L|L
s
qv|F|J||Ld|Li 
qv|J|Dd< 
q|G|Dd< t6|}M|Mj7|Mj8fD ]b}Nt
|N}O|O9 D ]J\}P}QdD ]:\}R}S|Rd7 }R|R|Dk
r|P|Sk
rt3|O|P d- |D|R< 
q
q
q|rt!0d|}*|*r|*$d}T|*$d}U|Ur|U:dd}U|Ts|Ud d }T|D%|*$d; |*$dpd1dd |*$ddD |*$d; |Ut |Td d }Vrj<|d}V|Vsjdd|i|dd}V|Vr=|V||A}W|Ws|Vdp6g D ]}Xt	|Xdd t2}Y|YsVq8fdd}Zg }Wt>|YddD ]~\}[|[dápi }\|Z|\}]t?|Yk r|Zt	|Yfddn|A}^|]d ksr|^d krҐqr|W|]|^|\ddŜ qr|Wr8 qq8|Wr|W|Dd< t	|Vdd t2p$g }Y|YD ]|}[|[dȡ}_|_r|_dɡ}`|`r|`}`t	|_dd dkrv|`|Dd< n>t!0d|`}*|*r|D%|*$dt@|*$d^t@|*$dΡdϜ t	|_dd t2pg D ]}a|adѡpi }'dd dfdd dd gdffD ]\\}b}ct	|'|btpi dס}d|drt!"|c|d}*|*rtA|*$dء|D|*$dDd <  qʐqqt	|_dd }e|er|edۡ\}f}g|D%tA|ftA|gdܜ |[dݡ}h|hr*t	|hdd t|Dd< t	|hdd t2pg }id}j|iD ]$}kt	|kdd d.krd.}j qq|iD ]}k|kdpi }l|ld}m|ms2q
|ld }m|ld d- }n|mdkrb|n|Dd< n@|js
|mdkr||n|Dd< n&|mdkr|n|Dd< n|mdkr
|n|Dd< q
q*dD ]"\}o}R|D|o}Q|Qr|Q|D|R< qB|| |DS )Nz//www.youtube.com/zwatch?v=z &bpctr=9999999999&has_verified=1FrT   zinitial player responseZplayerr   ZplayabilityStatusreasonzSign in to confirm your ageZget_video_infoz!Refetching age-gated info webpagez%unable to download video info webpagez!https://youtube.googleapis.com/v/r   ZTVHTML5z
6.20180913)r}   Zeurlhtml5r  Zcver)r(   r3   c                 S   s   | d d S )NrP  r   r+   rK   r+   r+   r,   r:     r;   z)YoutubeIE._real_extract.<locals>.<lambda>r   c                 S   s   | d d d S )NerrorScreenZ%playerLegacyDesktopYpcTrailerRendererZtrailerVideoIdr+   rK   r+   r+   r,   r:     r;   c                 S   sP   | sd S |  d}|r$t|tr$|S |  d}t|ts<d S ddd |D S )Nr   r   r5   c                 S   s$   g | ]}t |d tr|d  qS )r   )
isinstancerW   r
   )r  rr+   r+   r,   r    s      z=YoutubeIE._real_extract.<locals>.get_text.<locals>.<listcomp>)rW   rs  r
   r]   r
  )rL   r   r   r+   r+   r,   get_text  s    


z)YoutubeIE._real_extract.<locals>.get_textc                    s    j | d dS )Nri   )_html_search_metarK   )rD   r   r+   r,   r:     r;   c                 S   s   d S r%   r+   rK   r+   r+   r,   r:     r;   ZvideoDetailsc                 S   s   | d d S )NmicroformatZplayerMicroformatRendererr+   rK   r+   r+   r,   r:     r;   r   zog:titleztwitter:titleZshortDescriptionZforce_singlefeed
noplaylistc                 S   s   | d d d S )NZmulticameraZplayerLegacyMulticameraRendererZmetadataListr+   rK   r+   r+   r,   r:     r;   ,c                    s   t  fddtS )Nc                    s   |   d S rQ   r+   rK   rn  r+   r,   r:   *  r;   z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>)r   r
   rz  )	feed_datarz  r,   
feed_entry(  s
     
 z+YoutubeIE._real_extract.<locals>.feed_entryr   z (%s)Zurl_transparentZYoutuber   T)r   r   r*   r   zNDownloading multifeed video (%s) - add --no-playlist to just download video %sr3  2Downloading just video %s because of --no-playlistZtinysmallZmediumZlargeZhd720Zhd1080Zhd1440Zhd2160Zhd2880ZhighresZstreamingDatar   ZadaptiveFormatsZtargetDurationSecZdrmFamiliesitagqualitytypeZFORMAT_STREAM_TYPE_OTFr*   ZsignatureCipherc                 S   s   | d d S )Nr*   r   r+   rK   r+   r+   r,   r:   ]  r;   c                 S   s   | d d S )Nr9   r   r+   rK   r+   r+   r,   r:   ^  r;   z)"(?:PLAYER_JS_URL|jsUrl)"\s*:\s*"([^"]+)"z
player URLr9   c                 S   s   | d d S )Nspr   r+   rK   r+   r+   r,   r:   j  r;   	signature&=ZaverageBitrateZbitraterc  ZaudioSampleRateZcontentLengthZqualityLabelr   r   r   )
asrfilesize	format_idr   r   r   r  tbrr*   r   ZmimeTypez.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?r   r   r   r   r   Zvbrr   Zhttp_chunk_sizei   Zdownloader_optionsZ_dashr   ZhlsManifestUrlr   z/itag/(\d+)ri   r  r   ZdashManifestUrlz/clen/(\d+)Zfragment_base_urlz	file sizer  ZlicenseInfoszThis video is DRM protected.r/   c                 S   s   | d d S )Nrr  ZplayerErrorMessageRendererr+   rK   r+   r+   r,   r:     r;   	subreasonz?The uploader has not made this video available in your country.ZavailableCountriesZregionsAllowed
keywordsc                 S   s   g | ]}t |d qS )contentrR  rT  r+   r+   r,   r    s   z+YoutubeIE._real_extract.<locals>.<listcomp>zog:video:tagzyt:stretch=z(\d+)\s*:\s*(\d+)c                 s   s   | ]}t |V  qd S r%   )float)r  vr+   r+   r,   r	    s     z*YoutubeIE._real_extract.<locals>.<genexpr>r   c                 S   s   | d d S )N	thumbnail
thumbnailsr+   rK   r+   r+   r,   r:     r;   )r   r*   r   zog:imageztwitter:imagecategoryZgenre	channelIdZexternalChannelIdZlengthSecondsr   ZisLiveZownerProfileUrlZ
uploadDateauthorz/(?:channel|user)/([^/?&#]+)zuploader idz https://www.youtube.com/channel/Z	viewCountZinteractionCountZaverageRatingZisFamilySafeZisFamilyFriendlyfalsezog:restrictions:agez18+r   )r   r   r   r  r   r   r   r   r   r   r   r   r   Zaverage_ratingr   webpage_urlr   r   is_livec                 S   s   | d d S )NZcaptionsZplayerCaptionsTracklistRendererr+   rK   r+   r+   r,   r:     r;   c                    s@   g } j D ](}|d|i ||t||d q
|| |< d S )Nfmt)r   r*   )_SUBTITLE_FORMATSr?   rj  r!   )r   base_url	lang_coder(   Z	lang_subsr  rH   r+   r,   process_language  s    
 
z1YoutubeIE._real_extract.<locals>.process_languageZcaptionTracksrF  kindr  ZlanguageCodeZtranslationLanguagesZtlangautomatic_captions	subtitles))r,  )r,  t)r-  )r-  _timeu   (?s)(?P<track>[^·\n]+)·(?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]+))?.+\nAuto-generated by YouTube\.\s*$r   r   -r5   rJ   r   Zclean_artistc                 s   s   | ]}|  V  qd S r%   )strip)r  ar+   r+   r,   r	  Q  s     r      ·r   )r   r   r   r   r   r   nextZengagementPanelsc                 S   s   | d d d d S )NZ"engagementPanelSectionListRendererr  ZmacroMarkersListRenderercontentsr+   rK   r+   r+   r,   r:   f  r;   c                    s   t  | dS )NZtimeDescription)r   rW   )mmlir)ru  r+   r,   rf  k  s    z-YoutubeIE._real_extract.<locals>.chapter_timerg  macroMarkersListItemRendererc                    s   |   d S )Nr  r+   rK   )rk  r+   r,   r:   t  r;   rh  ra  c                 S   s   | d d d d d S )Nr  twoColumnWatchNextResultsresultsr+   rK   r+   r+   r,   r:     r;   ZvideoPrimaryInfoRendererZsuperTitleLinkc                 S   s   | d d S )NZsuperTitleIconZiconTyper+   rK   r+   r+   r,   r:     r;   ZLOCATION_PINlocationu   (.+?)\s*S(\d+)\s*•\s*E(\d+)   )r   r   r   c                 S   s   | d d d S )NZvideoActionsZmenuRendererZtopLevelButtonsr+   rK   r+   r+   r,   r:     r;   ZtoggleButtonRendererc                 S   s   | d d d S )NZdefaultTextaccessibilityaccessibilityDatar+   rK   r+   r+   r,   r:     r;   z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                 S   s   | d S )Nr  r+   rK   r+   r+   r,   r:     r;   c                 S   s   | d d S )Nr  r+   rK   r+   r+   r,   r:     r;   zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peoplelabelcount_countc                 S   s   | d d d S )NZsentimentBarZsentimentBarRendererZtooltipr+   rK   r+   r+   r,   r:     r;   z / )r   r   ZvideoSecondaryInfoRendererc                 S   s   | d d d S )NownervideoOwnerRendererr   r+   rK   r+   r+   r,   r:     r;   Zchannelc                 S   s   | d d d S )NZmetadataRowContainerZmetadataRowContainerRendererrowsr+   rK   r+   r+   r,   r:     r;   c                 S   s   | d d S )NmetadataRowRendererZhasDividerLiner+   rK   r+   r+   r,   r:     r;   r  r  ZLicenser   ZAlbumZArtistZSong))r   r   )r   r   )Cr    	_match_idZhttp_schemerY   ro  r   r   rW   r   r   r	   r
   rs  dict
url_resultr   rF   rV   r  r   rj  r   r5  r
  playlist_resultr   rW  r   r"   rm   rE  r   r   r6   r?  r   r  r?   r   Z_extract_m3u8_formatsZ_extract_mpd_formatsr   r   Zraise_geo_restrictedZ_sort_formatsrV  Z_meta_regexr>  r  groupsr]   r   Z_live_titler   r   fragmentr(   itemsreplacer  r   rl  ri  r  rd  r   Zmark_watched)prD   r*   Zsmuggled_datar}   r  r  rP  Zplayability_statusZ
video_infoprZtrailer_video_idZsearch_metaZvideo_detailsrw  video_titleZvideo_descriptionZmultifeed_metadata_listrY  Zfeed_idsfeedr|  Zfeed_idZ
feed_titler   r   ZitagsZitag_qualitiesr  qZstreaming_dataZstreaming_formatsr  r  r  Zfmt_urlZscZencrypted_sigr  r  r  dctmimetyperS  Zno_audioZno_videoZhls_manifest_urlfZdash_manifest_urlr  Zpemrrp  r  Z	countriesZregions_allowedr  keywordwhZratior  r   r  Zthumbnail_urlr  r   r   r  Zowner_profile_urlinfoZpctrr  r  Zcaption_trackr  r  Ztranslation_languageZtranslation_language_code
parsed_url	componentr(   kr  Zd_kZs_ksr   r   Zinitial_datara  Zengagment_pannelr  rf  r  r  r   r   ZvpirstlZtlbgetterrm  r  Zsbr_tooltipr   r   Zvsirr  Zmultiple_songsrowZmrrZ	mrr_titleZmrr_contents_textZs_kr+   )r{  ru  rk  rD   r   r,   _real_extract  s|   
           
   


  
 
  
   
   
  


    


 

 







 

   
   

*        
 





 











zYoutubeIE._real_extract) r   r   r   IE_DESCZ_INVIDIOUS_SITESr
  r^  r  r  Z_GEO_BYPASSrX   rd  _TESTS_formatsclassmethodr   r   r  r  r)  r7  r!  rE  rQ  staticmethodr[  r]  r`  rl  ro  r  __classcell__r+   r+   r   r,   r   W  s<  ;! # 	 
 
2 ?	 
        
 
             &               
j		'(r   c                -       s  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d	d
dddddd	d
ddddddddddd d!ddd"d#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&d1d(d	d2d*d3d&d4d(d	d5d*d6d&d7d(d	d8d*d9ddd:ddd;ddd<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdBdKdLdMdddNdOdPdQdRdSdBdTdLdUdVdWdXdYdZd[d*d\ddd]d^d_d`dadbdcdddedfdggeeeedhdididje	 gdkdldddmdddndodpdqdrdsdtdudvdwgeeedxdididydzd{dpd|d}d~dddeddwgdddgeeddididddddddddddddddddddddddddddddddddddddddddddddddddd*dddg+Z
e fddZdd Zedd Zdd Zdd ZdddZdd Zdd Zdd Zdd Zdd ZedddZedd Zedd Zdd Zedd Zedd Zedd Zdd ZddĄ Z ddƄ Z!ddȄ Z"  Z#S )YoutubeTabIEzYouTube.com taba  (?x)
                    https?://
                        (?:\w+\.)?
                        (?:
                            youtube(?:kids)?\.com|
                            invidio\.us
                        )/
                        (?:
                            (?:channel|c|user|feed|hashtag)/|
                            (?:playlist|watch)\?.*?\blist=|
                            (?!(?:watch|embed|v|e)\b)
                        )
                        (?P<id>[^/?\#&]+)
                    zyoutube:tabuM   https://www.youtube.com/c/ИгорьКлейнер/playlists?view=1&flow=grid^   ZUCqj7Cz7revf5maW9g5pgNcgu%   Игорь Клейнер - Playlistsz$md5:be97ee0f14ee314f1f002cf187166ee2r   r*   playlist_mincountr   z>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=ddzJhttps://www.youtube.com/c/3blue1brown/playlists?view=50&sort=dd&shelf_id=3rN   ZUCYO_jab_esuFRV4b17AJtAwz3Blue1Brown - Playlistsz$md5:e1384e8a133307dd10edee76e875d62fz7https://www.youtube.com/user/ThirstForScience/playlistsrJ   ZUCAEtajcuhQ6an9WEzY9LEMQzThirstForScience - Playlistsz$md5:609399d937ea957b0f53cbffb747a14cz3https://www.youtube.com/c/ChristophLaimer/playlistsTr   zHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcZUCmlqkdCBesrv2Lak1mF_MxAz	Sergey M.Z"PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczyoutube-dl public playlist)r   r   r   r   r   )r*   r   r   zHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlistr   zAhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/featuredZUCKfVa3S1e4PHvxWcwyMMg8wzlex will - Homez$md5:2163c5d0ff54ed5f598d6a7e6211e488r   )r*   r   r  z?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videosi  zWhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videos?view=0&sort=p&flow=grid   zBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists   zBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Communityr   zAhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/channelszlex will - Channels   z3https://invidio.us/channel/UCmlqkdCBesrv2Lak1mF_MxAz<https://www.youtubekids.com/channel/UCmlqkdCBesrv2Lak1mF_MxAz:https://music.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxAzZPlaylist 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UCEPzS1rYsrkqzSLNp76nrcgr   r   r   r   r   )r1   r*   r   r   zLarge playlistz>https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0QzUploads from CauchemarZUUBABnxM4Ar9ten8Mdjj1j0QZ	CauchemarZUCBABnxM4Ar9ten8Mdjj1j0Qic  r1   r*   r   r  z/http://www.youtube.com/user/NASAgovVideo/videoszTBuggy 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UCXw-G3eDE9trcvY2sBMM_aA   zHhttps://www.youtube.com/playlist?list=PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz Data Analysis with Dr Mike PoundZ"PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5bazUC9-y-6csu5WGm29I7JiwpnAZComputerphile)r   r   r   r      zChttps://invidio.us/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczThttps://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   r   )r*   r   rV   r   Zadd_iezMhttps://www.youtubekids.com/watch?v=Agk7R8I8o5U&list=PUZ6jURNr1WQZCNHF0ao-c0gz5https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMMz=https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQ/liveZ9Auq9mYxFEEr   zWatch Sky News livezSky NewsZskynewsz/re:https?://(?:www\.)?youtube\.com/user/skynewsZ20191102z$md5:78de4e1c2359d0ea3ed829678e38b662zNews & Politicsr   r   r   r   r   r   r   r   r   r   r   r   r   z/https://www.youtube.com/user/TheYoungTurks/liveZa48o2S1cPooz The Young Turks - Live Main ShowzThe Young TurksZTheYoungTurksz5re:https?://(?:www\.)?youtube\.com/user/TheYoungTurksZ20150715z$md5:438179573adcdff3c97ebb1ee632b891z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*   r   rV   r   z=https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/livez/https://www.youtube.com/c/CommanderVideoHq/livez%https://www.youtube.com/feed/trendingz$https://www.youtube.com/feed/libraryz$https://www.youtube.com/feed/historyz*https://www.youtube.com/feed/subscriptionsz(https://www.youtube.com/feed/watch_laterz(https://www.youtube.com/feed/recommendedzChttps://www.youtube.com/watch?v=UC6u0Tct-Fo&list=PL36D642111D65BE7CzFhttps://www.youtube.com/course?list=ECUl4u3cNGP61MdtwGTqZA0MreSaDybji8zhttps://www.youtube.com/coursez!https://www.youtube.com/zsecurityz*http://www.youtube.com/NASAgovVideo/videosz*https://www.youtube.com/TheYoungTurks/livez%https://www.youtube.com/hashtag/cctv9Zcctv9z#cctv9r   i^  zdhttps://www.youtube.com/watch?list=PLW4dVinRY435CBE_JD3t-0SRXKfnZHS1P&feature=youtu.be&v=M9cJMXmQ_ZUc                    s   t |rdS tt| |S )NF)r   r   r   r  )r   r*   r   r+   r,   r   	  s     zYoutubeTabIE.suitablec                 C   s6   | j d|dd d}|r|S |  d|d}| d|dS )Nr  z
channel idri   )zog:urlz
al:ios:urlzal:android:urlz
al:web:urlztwitter:urlztwitter:app:url:iphoneztwitter:app:url:ipadztwitter:app:url:googleplayzchannel urlz2https?://(?:www\.)?youtube\.com/channel/([^/?#&])+)rv  rm   )rD   r   r   r   r+   r+   r,   _extract_channel_id	  s$         z YoutubeTabIE._extract_channel_idc                 C   sL   t | tst|  D ]0\}}|dr|ds4qt |ts@q|  S d S )NZgridZRenderer)rs  r  r  r  r>  endswith)itemr|   r   r+   r+   r,   _extract_grid_item_renderer*	  s    
z(YoutubeTabIE._extract_grid_item_rendererc           
      c   s&  |d D ]}t |tsq| |}t |ts0qt|dd dd ft}|d}|rt| jd| t ||dV  q|d}|r| 	|V  q|d	}|rt|d
d t}| jd| t |dV  qt
dt|dd t}|rtttfD ]0}	|	|r| j||	 |	||dV   qqqd S )Nr  c                 S   s   | d d d d S r   r+   rK   r+   r+   r,   r:   <	  r;   z,YoutubeTabIE._grid_entries.<locals>.<lambda>c                 S   s   | d d S r   r+   rK   r+   r+   r,   r:   =	  r;   
playlistIdz(https://www.youtube.com/playlist?list=%sier}   r  r   r  c                 S   s   | d d S r   r+   rK   r+   r+   r,   r:   O	  r;   z"https://www.youtube.com/channel/%s)r  r  rg   c                 S   s   | d d d d S )NnavigationEndpointcommandMetadatawebCommandMetadatar*   r+   rK   r+   r+   r,   r:   V	  r;   )rs  r  r  r   r
   rW   r  r  r   r   r$   YoutubePlaylistIEr   r   r  )
rD   grid_rendererr  r   r   playlist_idr}   r   ep_urlr  r+   r+   r,   _grid_entries4	  sl    


 
 

    
   zYoutubeTabIE._grid_entriesc                 c   sN   | d}t|tsd S | d}|r<| |D ]
}|V  q0| d}|rJd S )Nr  gridRendererZhorizontalListRenderer)rW   rs  r  r  )rD   shelf_rendererr  r   entryr+   r+   r,   _shelf_entries_from_content_	  s    



z(YoutubeTabIE._shelf_entries_from_contentFc                 c   sh   t |dd t}td|}|rN|r.d|kr.d S t |dd t}| j||dV  | |D ]
}|V  qXd S )Nc                 S   s   | d d d d S NZendpointr  r  r*   r+   rK   r+   r+   r,   r:   q	  r;   z-YoutubeTabIE._shelf_entries.<locals>.<lambda>r<  z
/channels?c                 S   s   | d d d d S r   r+   rK   r+   r+   r,   r:   {	  r;   )r  )r   r
   r$   r  r  )rD   r  Zskip_channelsr   Z	shelf_urlr   r  r+   r+   r,   _shelf_entrieso	  s"     
  zYoutubeTabIE._shelf_entriesc                 c   sZ   |d D ]L}t |tsq|dp*|d}t |ts8q|d}|sHq| |V  qd S )Nr  playlistVideoRendererZplaylistPanelVideoRendererr   )rs  r  rW   r   )rD   video_list_rendererr  r   r}   r+   r+   r,   _playlist_entries	  s    


zYoutubeTabIE._playlist_entriesc                 C   s   | d}|r| |S d S )Nr   )rW   r   )rD   video_rendererr}   r+   r+   r,   _video_entry	  s    
zYoutubeTabIE._video_entryc           
      c   s   t |dd t}|sd S t |dd t}d }|rD| |}|rD|V  t |dd tpVg }|D ]\}t|tslq\t |dd t}|sq\t|sq\t|}	||	krq\| j	|t
 |dV  q\d S )Nc                 S   s   | d d S )NpostZbackstagePostRendererr+   rK   r+   r+   r,   r:   	  r;   z3YoutubeTabIE._post_thread_entries.<locals>.<lambda>c                 S   s   | d d S )NZbackstageAttachmentvideoRendererr+   rK   r+   r+   r,   r:   	  r;   c                 S   s   | d d S )NZcontentTextr   r+   rK   r+   r+   r,   r:   	  r;   c                 S   s   | d d d S )Nr  ZurlEndpointr*   r+   rK   r+   r+   r,   r:   	  r;   r  r}   )r   r  r  r]   rs  r
   r   r   r  r  r   )
rD   Zpost_thread_rendererZpost_rendererr  r}   r  r   runr  Zep_video_idr+   r+   r,   _post_thread_entries	  sD        

  

z!YoutubeTabIE._post_thread_entriesc                 c   sR   | d}t|tsd S |D ]0}| d}t|ts6q| |D ]
}|V  q@qd S )Nr  backstagePostThreadRenderer)rW   rs  r]   r  r  )rD   Zpost_thread_continuationr  r  r   r  r+   r+   r,   !_post_thread_continuation_entries	  s    



z.YoutubeTabIE._post_thread_continuation_entriesc                 c   s6   |D ],}t |dd t}|r| |}|r|V  qd S )Nc                 S   s   | d d d S )NrichItemRendererr  r  r+   rK   r+   r+   r,   r:   	  r;   z1YoutubeTabIE._rich_grid_entries.<locals>.<lambda>)r   r  r  )rD   r  r  r  r  r+   r+   r,   _rich_grid_entries	  s    
zYoutubeTabIE._rich_grid_entriesNc                 C   s   | | d}|r||d< |S )N)Zctokencontinuationitctr+   )r  ctpr(   r+   r+   r,   _build_continuation_query	  s    z&YoutubeTabIE._build_continuation_queryc                 C   s@   t | dd t}|sd S |d}|s*d S |d}t||S )Nc                 S   s   | d d d S )Ncontinuationsr   ZnextContinuationDatar+   rK   r+   r+   r,   r:   	  r;   z>YoutubeTabIE._extract_next_continuation_data.<locals>.<lambda>r  clickTrackingParams)r   r  rW   r  r	  )r   next_continuationr  r  r+   r+   r,   _extract_next_continuation_data	  s      

z,YoutubeTabIE._extract_next_continuation_datac                    s   |  |}|r|S g }dD ]" |t| fddtp8g  q|D ]T}t|tsRqBt|dd t}|shqBt|dd t}|s~qB|d}t	||  S d S )N)r  r  c                    s   |   S r%   r+   rK   r|   r+   r,   r:   	  r;   z4YoutubeTabIE._extract_continuation.<locals>.<lambda>c                 S   s   | d d S )NcontinuationItemRenderercontinuationEndpointr+   rK   r+   r+   r,   r:   	  r;   c                 S   s   | d d S )NcontinuationCommandtokenr+   rK   r+   r+   r,   r:   	  r;   r  )
r  rW  r   r]   rs  r  r
   rW   r  r	  )r   r   r  r  r  Zcontinuation_epr  r  r+   r  r,   _extract_continuation	  s2    
 
   
z"YoutubeTabIE._extract_continuationc           #      c   s  t |dd t}|sd S t |dd t}|r|ddk}d }t |dd tpRg }|D ]D}	t|	tsjqXt |	dd t}
|
sqXt |
dd tpg }|D ]}t|tsq|d	}|r| |D ]
}|V  q| |}q|d
}|r
| |D ]
}|V  q| |}q|d}|r8| || D ]}|V  q(q|d}|rl| 	|D ]}|V  qR| |}q|d}|r| 
|}|r|V  q|sX| |
}qX|s| |}nB|d}|sd S | |dpg D ]}|V  q| |}| ||}t |dd tpd}d|dd}t |dd tp@dd|di}t |dd t}| ||}|rl||d< d|i}tdD ]
}|s q|r||d< |d |d< d|d  i|d!< d"}d#}||krpz@| jd$d d%||rd&| nd'f |t|d(d)}W qpW n^ tk
rj } z>t|jtrX|jjd*krX|d7 }||krXW Y 
q W 5 d }~X Y nX q|s| qt |d+d tp|}t |d,d t}|rJ|d-}|r| |D ]}|V  q| |}q~|d.}|r| |D ]}|V  q| |}q~|d/}|rJ| |D ]}|V  q.| |}q~t|d0}t |d1d t}|r|d" } t| tsq~| | }|rd2|i}!| |!D ]}|V  q| |!}q~| d3p| d4}|r
d|i}"| |"D ]}|V  q| |"}q~| d}|rHd|i}| |D ]}|V  q,| |}q~| d5}|r| |D ]}|V  qb| d|i}q~ qq~d S )6Nc                 S   s   | d S )Nr  r+   rK   r+   r+   r,   r:   	  r;   z'YoutubeTabIE._entries.<locals>.<lambda>c                 S   s   | d S )NsectionListRendererr+   rK   r+   r+   r,   r:   	  r;   r   ZChannelsc                 S   s   | d S Nr  r+   rK   r+   r+   r,   r:   	  r;   c                 S   s   | d S )NitemSectionRendererr+   rK   r+   r+   r,   r:   	  r;   c                 S   s   | d S r  r+   rK   r+   r+   r,   r:   	  r;   ZplaylistVideoListRendererr  ZshelfRendererr  r  ZrichGridRendererr  c                 S   s   | d S )NZINNERTUBE_CLIENT_VERSIONr+   rK   r+   r+   r,   r:   -
  r;   z2.20210407.08.001r{   )zx-youtube-client-namezx-youtube-client-versionrz   c                 S   s   | d S )NZINNERTUBE_CONTEXTr+   rK   r+   r+   r,   r:   5
  r;   rt   ru   rw   c                 S   s   | d d S )Nrt   visitorDatar+   rK   r+   r+   r,   r:   ;
  r;   zx-youtube-identity-tokenrs   r   zx-goog-visitor-idr  r  r  ZclickTrackingr   r  zVhttps://www.youtube.com/youtubei/v1/browse?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8zDownloading page %d%sz (retry #%d)r5   ry   )r=   r<   )i  i  c                 S   s   | d d S )NZresponseContextr  r+   rK   r+   r+   r,   r:   c
  r;   c                 S   s   | d S )NZcontinuationContentsr+   rK   r+   r+   r,   r:   f
  r;   ZplaylistVideoListContinuationZgridContinuationZitemSectionContinuation)ZonResponseReceivedActionsZonResponseReceivedEndpointsc                 S   s   | d d d S )Nr   appendContinuationItemsActioncontinuationItemsr+   rK   r+   r+   r,   r:   }
  r;   r  r  r  r  )r   r  rW   r]   rs  r  r  r  r  r  r  r  r   r
   _extract_identity_token	itertoolsr  rB   r@   rA   r   r   r=  r   r&  r  r   r  )#rD   tabitem_idr   Ztab_contentZslr_rendererZis_channels_tabr  slr_contentsslr_contentZis_rendererisr_contentsZisr_contentr   r  Zrich_grid_rendererr   client_versionr=   rs   Zvisitor_dataZidentity_tokenr<   page_numr  retriesresponserC  Zcontinuation_contentsZcontinuation_rendererZon_response_receivedZcontinuation_itemsZcontinuation_itemr  r  r+   r+   r,   _entries	  sf   
















    
  


    









  









zYoutubeTabIE._entriesc                 C   s2   | D ] }t |dd tr|d   S qtdd S )Nc                 S   s   | d d S )NtabRendererselectedr+   rK   r+   r+   r,   r:   
  r;   z4YoutubeTabIE._extract_selected_tab.<locals>.<lambda>r'  zUnable to find selected tab)r   boolr   )tabsr  r+   r+   r,   _extract_selected_tab
  s    z"YoutubeTabIE._extract_selected_tabc                 C   s   i }t | dd t}|r|D ]v}t|ts,q|d}t|tsBqt |dd t}|r|d|d< t |dd t|d< td	t |d
d t|d< q|S )Nc                 S   s   | d d d S )NZsidebarZplaylistSidebarRendererr  r+   rK   r+   r+   r,   r:   
  r;   z0YoutubeTabIE._extract_uploader.<locals>.<lambda>Z$playlistSidebarSecondaryInfoRendererc                 S   s   | d d d d d S )NZ
videoOwnerr  r   r   r   r+   rK   r+   r+   r,   r:   
  r;   r   r   c                 S   s   | d d d S )Nr  browseEndpointZbrowseIdr+   rK   r+   r+   r,   r:   
  r;   r   rg   c                 S   s   | d d d S )Nr  r,  ZcanonicalBaseUrlr+   rK   r+   r+   r,   r:   
  r;   r   )r   r]   rs  r  rW   r
   r$   )r<   r   Zsidebar_rendererr  r   r  r+   r+   r,   _extract_uploader
  s<      


    
zYoutubeTabIE._extract_uploaderc                 C   sp   g }t | dd tpg D ]L}t|ts(qt |dd t}|s>qt |dd dd ft}|r|| qd|S )Nc                 S   s   | d S )Nalertsr+   rK   r+   r+   r,   r:   
  r;   z-YoutubeTabIE._extract_alert.<locals>.<lambda>c                 S   s   | d d S )NZalertRendererr   r+   rK   r+   r+   r,   r:   
  r;   c                 S   s   | d S )Nr   r+   rK   r+   r+   r,   r:   
  r;   c                 S   s   | d d d S )Nr   r   r   r+   rK   r+   r+   r,   r:   
  r;   r  )r   r]   rs  r  r
   rj  r
  )r<   r.  alertZ
alert_textr   r+   r+   r,   _extract_alert
  s&    
  zYoutubeTabIE._extract_alertc                 C   s   |  |}t|dd t}|}d  }}	|rp|dp6|}
|d}|
pH|}|rZ|d| 7 }|d}	|d}nBt|dd t}|r|d}n"t|dd t}|rt|d	d }| j| ||||||	d
}|| | |S )Nc                 S   s   | d d S )NmetadataZchannelMetadataRendererr+   rK   r+   r+   r,   r:   
  r;   z1YoutubeTabIE._extract_from_tabs.<locals>.<lambda>r   z - %sr   Z
externalIdc                 S   s   | d d S )Nr1  ZplaylistMetadataRendererr+   rK   r+   r+   r,   r:   
  r;   c                 S   s   | d d S )NheaderZhashtagHeaderRendererr+   rK   r+   r+   r,   r:   
  r;   c                 S   s   | d d S )NZhashtagr   r+   rK   r+   r+   r,   r:   
  r;   )r  playlist_titleZplaylist_description)r+  r   r  rW   r  r&  r?   r-  )rD   r  r   r<   r*  Zselected_tabr   r  r   r   Zchannel_titleZ	tab_titler   r+   r+   r,   _extract_from_tabs
  sL    
  

     zYoutubeTabIE._extract_from_tabsc                 C   sv   | dpt|dd t}| dp&|}t|t|dd t}|r`||kr`| j|t ||dS | j| |||dS )Nr   c                 S   s   | d d S )NZ	titleTextr   r+   rK   r+   r+   r,   r:   
  r;   z5YoutubeTabIE._extract_from_playlist.<locals>.<lambda>r  c                 S   s   | d d d d S r  r+   rK   r+   r+   r,   r:   
  r;   r  )r  r3  )	rW   r   r
   r$   r  r  r   r  r  )rD   r  r*   r<   r   r   r  Zplaylist_urlr+   r+   r,   _extract_from_playlist
  s.          z#YoutubeTabIE._extract_from_playlistc                 C   s.   |rt |dd t}|r|S | jd|dd dS )Nc                 S   s   | d S )NZID_TOKENr+   rK   r+   r+   r,   r:     r;   z6YoutubeTabIE._extract_identity_token.<locals>.<lambda>z%\bID_TOKEN["\']\s*:\s*["\'](.+?)["\']zidentity tokenri   )r   r
   rm   )rD   r   r   r  r+   r+   r,   r    s      z$YoutubeTabIE._extract_identity_tokenc                 C   sP  |  |}tt|jdd}t|}|dd gd }|dd gd }|r|r| jjdr| 	d|  | j
|t |dS | 	d	||f  | ||}| ||}t|d
d t}|r| ||||S t|dd t}	|	r| ||||	S t|dd tp|}|r(| j
|t |dS | |}
|
rDt|
ddtdd S )Nzwww.youtube.com)netlocr  r   r]   rx  r}  r  zEDownloading playlist %s - add --no-playlist to just download video %sc                 S   s   | d d d S )Nr  ZtwoColumnBrowseResultsRendererr*  r+   rK   r+   r+   r,   r:     r;   z,YoutubeTabIE._real_extract.<locals>.<lambda>c                 S   s   | d d d d S )Nr  r  r   r+   rK   r+   r+   r,   r:     r;   c                 S   s   | d d d S )NZcurrentVideoEndpointZwatchEndpointr   r+   rK   r+   r+   r,   r:   %  r;   Tr/   zUnable to recognize tab page)r  r   rN  r'   rO  r&   rW   rF   rV   r5  r  r   r   rY   r   r   r]   r4  r  r5  r
   r0  r   )rD   r*   r  r   r}   r  r   r<   r*  r   r/  r+   r+   r,   r    sR    
     
zYoutubeTabIE._real_extract)F)N)$r   r   r   r  r^  rX   r]   rd  r   r   r  r  r   r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r&  r+  r-  r0  r4  r5  r  r  r  r+   r+   r   r,   r    sN  

       -
	+
	

 2


	r  c                
       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$gZe	 fd&d'Z
d(d) Z  ZS )*r  zYouTube.com playlistsa  (?x)(?:
                        (?:https?://)?
                        (?:\w+\.)?
                        (?:
                            (?:
                                youtube(?:kids)?\.com|
                                invidio\.us
                            )
                            /.*?\?.*?\blist=
                        )?
                        (?P<id>%(playlist_id)s)
                     )r  zyoutube:playlistz
issue #673ZPLBB231211A4F62143z%[OLD]Team Fortress 2 (Class-based LP)ZWickydoozUCKSpbfbl5kRQpTdL7kMc-1Qr     r  Z"PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlZYDL_safe_search)r   r   r   zThis playlist is privater   ZembeddedzQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEurJ   ZJODA15Z"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEuZmilanzUCEI1-PVPcYXjB73Hfelbmaw)r1   r*   r   r   zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIli  z'2018 Chinese New Singles (11/6 updated)Z"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlZLBKZUC21nz3_MesPLqtDqwdvnoxAr  ZTLGGrESM50VT6acwMjAyMjAxNwTr   Z)OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                    sH   t |rdS ddlm} ||}|dd gd r8dS tt| |S )NFr   r   r  r   )r  r   r.   r&   rW   r   r  r   r   r+   r,   r   n  s    
zYoutubePlaylistIE.suitablec                 C   s8   |  |}t|}|sd|i}| jtd|t |dS )Nr]   z https://www.youtube.com/playlistr  )r  r&   r  r!   r  r   )rD   r*   r  r   r+   r+   r,   r  z  s    
 zYoutubePlaylistIE._real_extract)r   r   r   r  r-   r   r^  rX   r  r  r   r  r  r+   r+   r   r,   r  1  s`   	
.r  c                   @   sZ   e Zd Zddeji Zddddddd	d
ddgeeeddddddddgZdd Z	dS )YoutubeYtBeIEzYhttps?://youtu\.be/(?P<id>[0-9A-Za-z_-]{11})/*?.*?\blist=(?P<playlist_id>%(playlist_id)s)r  zDhttps://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 & Activismr  T)rx  r   r   z4https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21r   c                 C   sD   t | j|}|d}|d}| jtd||ddt |dS )Nr   r  zhttps://www.youtube.com/watchzyoutu.be)r  r]   Zfeaturer  )r6   r?  r^  r  r  r!   r  r   )rD   r*   rS  r}   r  r+   r+   r,   r    s    

 zYoutubeYtBeIE._real_extractN)
r   r   r   r-   r   r^  r]   rd  r  r  r+   r+   r+   r,   r8    s0   r8  c                   @   s$   e Zd ZdZdddgZdd ZdS )YoutubeYtUserIEzytuser:(?P<id>.+)zytuser:phihagTr   c                 C   s"   |  |}| jd| t |dS )Nzhttps://www.youtube.com/user/%sr  )r  r  r  r   )rD   r*   Zuser_idr+   r+   r,   r    s    
 zYoutubeYtUserIE._real_extractN)r   r   r   r^  r  r  r+   r+   r+   r,   r9    s
   r9  c                   @   s8   e Zd ZdZdZdZdZddddddg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)?Tz:ytfavr   z:ytfavoritesc                 C   s   | j dt dS )Nz(https://www.youtube.com/playlist?list=LLr  r  r  r   rD   r*   r+   r+   r,   r    s    z!YoutubeFavouritesIE._real_extractN)	r   r   r   rX   r  r^  rU   r  r  r+   r+   r+   r,   r:    s   r:  c                   @   s8   e Zd ZdZedZdZdZdZg Z	dd Z
dd	 ZdS )
YoutubeSearchIEzYouTube.com searchesinfzyoutube:searchZytsearchNc              
   c   s@  ddddi|d}| j r$| j |d< d}tdD ]}| jd	d
| d| ddt|dddid}|sr q<t|dd dd ft}|s q<|D ]|}t|dd t}	|	sq|	D ]\}
t	|
t
sq|
d}t	|t
sq|d}|sq| |V  |d7 }||kr   d S qqt|dd t}|s2 q<||d< q2d S )Nrt   ru   rv   rw   )rs   r(   rV   r   r   zVhttps://www.youtube.com/youtubei/v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8z
query "%s"zDownloading page %srx   Fry   rz   r{   )r}   r1   r2   r3   r<   r=   c                 S   s   | d d d d d S )Nr  ZtwoColumnSearchResultsRendererZprimaryContentsr  r+   rK   r+   r+   r,   r:     r;   z*YoutubeSearchIE._entries.<locals>.<lambda>c                 S   s   | d d d d S )NZonResponseReceivedCommandsr   r  r  r+   rK   r+   r+   r,   r:     r;   c                 S   s   | d d S )Nr  r  r+   rK   r+   r+   r,   r:     r;   r  r   c                 S   s   | d d d d d S )NrP   r  r  r  r  r+   rK   r+   r+   r,   r:   
  r;   r  )_SEARCH_PARAMSr  r  rB   r@   rA   r   r   r]   rs  r  rW   r   r
   )rD   r(   nr<   totalr#  r  r  r   r!  r  videor}   r  r+   r+   r,   r&    sx    	
 



zYoutubeSearchIE._entriesc                 C   s   |  | |||S )z-Get a specified number of results for a query)r  r&  )rD   r(   rA  r+   r+   r,   _get_n_results  s    zYoutubeSearchIE._get_n_results)r   r   r   r  r  Z_MAX_RESULTSrX   _SEARCH_KEYr@  r  r&  rD  r+   r+   r+   r,   r>    s   :r>  c                   @   s"   e Zd Zejd ZdZdZdZdS )YoutubeSearchDateIEz:dateZytsearchdatez)YouTube.com searches, newest videos firstzCAI%3DN)r   r   r   r>  rX   rE  r  r@  r+   r+   r+   r,   rF    s   
rF  c                   @   s0   e Zd ZdZdZedd Zdd Zdd Zd	S )
YoutubeFeedsInfoExtractorz\
    Base class for feed extractors
    Subclasses must define the _FEED_NAME property.
    Tc                 C   s
   d| j  S )Nz
youtube:%s)
_FEED_NAMErH   r+   r+   r,   rX   ;  s    z!YoutubeFeedsInfoExtractor.IE_NAMEc                 C   s   |    d S r%   )rf   rH   r+   r+   r,   rr   ?  s    z*YoutubeFeedsInfoExtractor._real_initializec                 C   s   | j d| j t dS )Nzhttps://www.youtube.com/feed/%sr;  )r  rH  r  r   r=  r+   r+   r,   r  B  s    z'YoutubeFeedsInfoExtractor._real_extractN)	r   r   r   r   rU   propertyrX   rr   r  r+   r+   r+   r,   rG  4  s   
rG  c                   @   s,   e Zd ZdZdZdZdddgZdd ZdS )	YoutubeWatchLaterIEzyoutube:watchlaterzMYoutube watch later list, ":ytwatchlater" for short (requires authentication)z:ytwatchlaterTr   c                 C   s   | j dt dS )Nz(https://www.youtube.com/playlist?list=WLr;  r<  r=  r+   r+   r,   r  Q  s     z!YoutubeWatchLaterIE._real_extractNr   r   r   rX   r  r^  r  r  r+   r+   r+   r,   rJ  H  s   rJ  c                   @   s,   e Zd ZdZdZdZddddddgZdS )	YoutubeRecommendedIEzLYouTube.com recommended videos, ":ytrec" for short (requires authentication)z:ytrec(?:ommended)?Zrecommendedz:ytrecTr   z:ytrecommendedNr   r   r   r  r^  rH  r  r+   r+   r+   r,   rL  V  s   rL  c                   @   s,   e Zd ZdZdZdZddddddgZdS )	YoutubeSubscriptionsIEzJYouTube.com subscriptions feed, "ytsubs" keyword (requires authentication)z:ytsubs(?:criptions)?Zsubscriptionsz:ytsubsTr   z:ytsubscriptionsNrM  r+   r+   r+   r,   rN  c  s   rN  c                   @   s$   e Zd ZdZdZdZdddgZdS )YoutubeHistoryIEzGYoutube watch history, ":ythistory" for short (requires authentication)z
:ythistoryhistoryTr   NrM  r+   r+   r+   r,   rO  p  s   rO  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 )NzDid 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   r=  r+   r+   r,   r    s    z#YoutubeTruncatedURLIE._real_extractNrK  r+   r+   r+   r,   rQ  z  s.   rQ  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   )rD   r*   r}   r+   r+   r,   r    s
    

z"YoutubeTruncatedIDIE._real_extractNrK  r+   r+   r+   r,   rR    s   rR  )>
__future__r   r  r@   os.pathr  rn   r6   rA  commonr   r   compatr   r   r	   r
   r   r   r   r   Zjsinterpr   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  r8  r9  r:  r>  rF  rG  rJ  rL  rN  rO  rQ  rR  r+   r+   r+   r,   <module>   s`   (
\  $                   \S'I
1