U
    dS|                    @   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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 G d	d
 d
e
Z7G dd de7Z8G dd de7Z9G dd de
Z:G dd de
Z;G dd de
Z<G dd de7Z=G dd dee7Z>G dd de>Z?G dd de7Z@G dd de9ZAG dd  d e
ZBG d!d" d"eAZCG d#d$ d$eAZDG d%d& d&eAZEG d'd( d(e
ZFG d)d* d*e
ZGdS )+    )unicode_literalsN   )InfoExtractorSearchInfoExtractor   )
compat_chrcompat_HTTPError
compat_map
compat_strcompat_urllib_parsecompat_urllib_parse_parse_qs compat_urllib_parse_unquote_pluscompat_urllib_parse_urlparse)JSInterpreter)ExtractorError
clean_htmldict_geterror_to_compat_strfloat_or_noneextract_attributesget_element_by_attributeint_or_none
js_to_jsonmerge_dictsmimetype2extparse_codecsparse_durationparse_qs	qualitiesremove_startsmuggle_urlstr_or_none
str_to_inttraverse_objtry_getunescapeHTMLunified_strdateunsmuggle_url
update_urlupdate_url_queryurl_or_noneurlencode_postdataurljoinc                   @   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"d# Zed$d% Zi i g fd&d'Zi i g fd(d)Ze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.
        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checkedDomainshlZ
deviceinfozf.reqZflowNameZ	flowEntryZ	bgRequestc                 S   s   t dd| S )Nz^[^[]* )resubs r<   B/mnt/sdb2/vscode/python/youtube-dl/youtube_dl/extractor/youtube.py<lambda>p       z>YoutubeBaseInfoExtractor._login.<locals>.req.<locals>.<lambda>Fz/application/x-www-form-urlencoded;charset=utf-8)zContent-TypezGoogle-Accounts-XSRF)r2   r3   transform_sourcer4   dataheaders)copyupdatejsondumps_download_jsonr+   )urlZf_reqr2   r3   rA   
login_formselfr<   r=   req`   s0       z,YoutubeBaseInfoExtractor._login.<locals>.reqc                    s    j |  d S N)_downloaderreport_warning)messagerK   r<   r=   warnw   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   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<   rU   r<   r<   r=   r>      r?   c                 S   s   | d S NrX   r<   rU   r<   r<   r=   r>      r?   ZINCORRECT_ANSWER_ENTEREDzUnable to login: %szInvalid passwordc                 S   s   | d d S )Nr   r<   rU   r<   r<   r=   r>      r?   zUnable to extract result entryc                 S   s   | d d S Nr   r<   rU   r<   r<   r=   r>      r?   c                 S   s   | d S Nr   r<   rU   r<   r<   r=   r>      r?   ZTWO_STEP_VERIFICATIONc                 S   s   | d S rY   r<   rU   r<   r<   r=   r>      r?   ZQUOTA_EXCEEDEDz*Exceeded the limit of TFA codes, try laterc                 S   s   | d d S )Nr   r   r<   rU   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 rW   r<   rU   r<   r<   r=   r>      r?   c                 S   s   | d S rY   r<   rU   r<   r<   r=   r>      r?   zUnable to finish TFA: %szInvalid TFA codec                 S   s   | d d d S )Nr   rZ   r   r<   rU   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 r\   r<   rU   r<   r<   r=   r>      r?   z!Unable to extract CheckCookie URLzChecking cookier4   zhttps://myaccount.google.com/)_get_login_info_LOGIN_REQUIREDrN   paramsgetr   IE_NAME_download_webpage
_LOGIN_URL_hidden_inputs_LOOKUP_URLr$   r
   _CHALLENGE_URLlist_get_tfa_infor   _TFA_URLformat)rK   usernamepasswordZ
login_pagerL   rR   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<   rI   r=   _loginH   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)_get_cookiesrb   value_search_regexrandomrandint_set_cookie)rK   cookiesZ
consent_idru   r<   r<   r=   _initialize_consent   s"    



   z,YoutubeBaseInfoExtractor._initialize_consentc                 C   s&   |    | jd krd S |  s"d S d S rM   )r   rN   rs   rQ   r<   r<   r=   _real_initialize  s
    
z)YoutubeBaseInfoExtractor._real_initializecontextclientWEB2.20201021.03.00
clientNameclientVersionzN(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=\s*({.+?})\s*;z)ytInitialPlayerResponse\s*=\s*({.+?})\s*;z(?:var\s+meta|</script|\n)TNc              
   C   sX   | j  }|| ddi}|r*|| | jd| |ddt|d||ddid	S )
Ncontent-typeapplication/jsonz&https://www.youtube.com/youtubei/v1/%szDownloading API JSONUnable to download API pageutf8keyZ'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8)video_idr2   r3   rA   r4   rB   query)_DEFAULT_API_DATArC   rD   rG   rE   rF   encode)rK   epr   r   r4   rB   rA   Zreal_headersr<   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_jsonr{   _YT_INITIAL_DATA_RE_YT_INITIAL_BOUNDARY_RErK   r   webpager<   r<   r=   _extract_yt_initial_data0  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{}rv   Fr^   )r   r{   r   r<   r<   r=   _extract_ytcfg7  s       z'YoutubeBaseInfoExtractor._extract_ytcfgc           	   
   C   s   |d }t |dd dd dd ft}t |dd t}tt |dd t}t |dd tp\d	}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<   rU   r<   r<   r=   r>   A  r?   z9YoutubeBaseInfoExtractor._extract_video.<locals>.<lambda>c                 S   s   | d d S Nr   
simpleTextr<   rU   r<   r<   r=   r>   B  r?   c                 S   s   | d d S )Nheadliner   r<   rU   r<   r<   r=   r>   C  r?   c                 S   s   | d d d d S )NZdescriptionSnippetr   r   r   r<   rU   r<   r<   r=   r>   E  r?   c                 S   s   | d d S )NZ
lengthTextr   r<   rU   r<   r<   r=   r>   H  r?   c                 S   s   | d d S )NZviewCountTextr   r<   rU   r<   r<   r=   r>   J  r?   r7   z	^([\d,]+)z\sz
view countrv   c                 S   s   | d d d d S )NZ	ownerTextr   r   r   r<   rU   r<   r<   r=   r>   P  r?   c                 S   s   | d d d d S )NZshortBylineTextr   r   r   r<   rU   r<   r<   r=   r>   Q  r?   rH   )	_typeie_keyidrH   r   descriptionduration
view_countuploader)	r$   r
   r   r"   r{   r8   r9   	YoutubeIEr   )	rK   rendererr   r   r   r   Zview_count_textr   r   r<   r<   r=   _extract_video=  sb           z'YoutubeBaseInfoExtractor._extract_videoc              
   c   s  ddddi|d}|r ||d< t dD ]}| jdd	| d
| ddt|dddid}|sh qt|dd dd ft}|s q|D ]b}t|dd t}|sq|D ]B}	t|	t	sq|	
d}
t|
t	sq|

d}|sq| |
V  qqt|dd t}|s q||d< q*d S )Nr   r   r   r   )r   r   ra   r   zVhttps://www.youtube.com/youtubei/v1/search?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8z
query "%s"zDownloading page %sr   Fr   r   r   )r   r2   r3   r4   rA   rB   c                 S   s   | d d d d d S )NcontentsZtwoColumnSearchResultsRendererZprimaryContentssectionListRendererr<   rU   r<   r<   r=   r>   v  r?   z:YoutubeBaseInfoExtractor._search_results.<locals>.<lambda>c                 S   s   | d d d d S )NZonResponseReceivedCommandsr   appendContinuationItemsActioncontinuationItemsr<   rU   r<   r<   r=   r>   w  r?   c                 S   s   | d d S )NitemSectionRendererr   r<   rU   r<   r<   r=   r>   ~  r?   videoRendererr   c                 S   s   | d d d d d S )NrZ   continuationItemRenderercontinuationEndpointcontinuationCommandtokenr<   rU   r<   r<   r=   r>     r?   continuation)	itertoolscountrG   rE   rF   r   r$   ri   
isinstancedictrb   r   r
   )rK   r   ra   rA   page_numsearchslr_contentsslr_contentisr_contentscontentvideor   r   r<   r<   r=   _search_results^  sp    	 



z(YoutubeBaseInfoExtractor._search_resultsc                   C   s   t dd ddddt gS )Nc                 S   s
   |  dS )NZSecondaryInfoRenderer)endswith)k_r<   r<   r=   r>     r?   z@YoutubeBaseInfoExtractor._owner_endpoints_path.<locals>.<lambda>)ownerZ
videoOwnerZvideoOwnerRendererr   r   )Ellipsisr<   r<   r<   r=   _owner_endpoints_path  s       z.YoutubeBaseInfoExtractor._owner_endpoints_pathc                 C   sZ   d }t |||frDt|dpBt|ddpBt||  dddg dd}|pX| jd|d	d d
S )N	channelIdZexternalChannelId
externalIdnavigationEndpointbrowseEndpointZbrowseIdFget_allz
channel idrv   )anyr#   r   _html_search_meta)rK   r   videodetailsmetadata	renderers
channel_idr<   r<   r=   _extract_channel_id  s(    

     z,YoutubeBaseInfoExtractor._extract_channel_idc                 C   s   d }ddddgfddddd	d
gfd}t |||fr~t||| d ddp|t||| d ddp|t||  || d  dd}|ptt| jdt| tdd|pdddd|| d S )Nr   author))ZownerChannelNameNr   r   hrefZownerProfileUrlZvanityChannelUrlr   r   ZcanonicalBaseUrl)namerH   r   Fr   r      z2(?s)(<link\b[^>]+\bitemprop\s*=\s*("|')%s\2[^>]*>)Zitempropr7   zauthor linkrv   r   )r   r#   r   r   r{   r8   escaper   )rK   r   Zvar_namer   r   r   resultpathsr<   r<   r=   _extract_author_var  s4     
z,YoutubeBaseInfoExtractor._extract_author_varc                 C   s
   t d| S )Nhttps://www.youtube.com)r,   )Zurl_or_pathr<   r<   r=   _yt_urljoin  s    z$YoutubeBaseInfoExtractor._yt_urljoinc                 C   s   | j d|pddd dS )Nz&/(?:(?:channel|user)/|(?=@))([^/?&#]+)r7   uploader idrv   )r{   )rK   uploader_urlr<   r<   r=   _extract_uploader_id  s      z-YoutubeBaseInfoExtractor._extract_uploader_id)TN)__name__
__module____qualname____doc__re   Z_TWOFACTOR_URLrg   rh   rk   _NETRC_MACHINEr`   _PLAYLIST_ID_RErs   r   r   r   r   _YT_INITIAL_PLAYER_RESPONSE_REr   r   r   r   r   r   staticmethodr   r   r   r   r   r<   r<   r<   r=   r-   9   sL    8	
!6
  

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dgdgd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dgdgdeed,d-d.id/d0d1d2d3dd4d5d6d4d7d8d.d9d:d;d<d=d>d3d?d@dAdBdCdDdEdF	d.dGd:dHdIdJddKdLdMdNdOdPdQdR	ddSdTdUddVdWdXdYdZd[d\d]d&d^gd_dYd`daeedbdcdddedfddgdhdidjdkdldmd&dngdodpgdjdqdreedsdcdtdudvddwdxdydzd{d|d&d}d~ddddgdngdzddeeddcddddddddddddddddddgdgddddeeddcddd.dddd.ddddddddddddddddgddddddddddddddgddddddddddg
dddeedŜdddddddddddddМ
dddddd6ddddלd-diddڜdddddddddddd
ddddddddddddd.dd:dddddddddddddddddd	idddd ddddddd	iddddddddddd	iddddddddddd	ig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.idH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/d0d1d2d3d4
d-d.idHd5d6dd7d8d9dd:d;d<d3d=
d-d.idHd>d.dd?d.dd@dAddBdCdDdEdFdGdHdI	d-d.idJdڜdKdLddMdNdOdPdQdRdSdTdddUd-d.idVgdWdXdYddZd[d\d]d^d_d`d	d-d.idadڜdbd.ddcd.dddd.dded.ddfd.ddgd.ddhdiddjdkdldmdndodpdqdr
d.ddsddڜdtduddvdwdxdydzd{dvd|d}d~dd-d.idHdd.ddddddddddddddd-d.iddڜddddd6ddddd-d.idHdddddddddd-d.idHdd.ddd.ddddddddddddddddd-d.idHdd.dddddddddddd-d.idHdddddddddd-d.idHg3ZdddddddddddddddddÐdĜddŐdƐddǐdÐdddȐdɐddʐdːddd̐d͐ddΐdːdddȐdɐddϐdːdddАdѐddϐdːdddҐddÐdӜddԐdՐddΐdːddd֐dאddΐdːddҐdȐdɐdؐdϐdِddҐdАdѐdؐdϐdِddҐd̐d͐dؐdΐdِddҐdԐdՐdؐdΐdِdddАdѐddϐdːdddАdѐddϐdːdddɐdڐddϐdːdېdܜddѐdڐddϐdːdېdܜdd͐dڐddΐdːdېdܜddՐdڐddΐdːdېdܜdҐdɐdڐdؐdϐdِdېdܜdҐdѐdڐdؐdΐdِdېdܜdҐd͐dڐdؐdΐdِdېdܜddƐdݐddސdːdߐdܜdddݐddސdːdߐdܜddɐdݐddϐdːdߐdܜddѐdݐddϐdːdߐdܜdd͐dݐdddːdߐdܜddՐdݐdddːdߐdܜdddݐddސdːdߐdܜdddݐddǐdːdߐdܜddddːdddɐddːdddѐddːddd͐ddːdddՐddːddddːdddƐddːdddѐddːdddddːddd͐ddːddddՐddːddddddːdd3dddސddd3dddϐddd3dddddd3ddddd3ddddd3ddddd3dddddҐdɐdȐddҐdِddҐdѐdАddҐdِddҐd͐d̐ddҐdِddҐdՐdԐddҐdِddҐdѐdАddҐdِddҐdѐdАddҐdِddҐdƐddҐdddҐdddddҐdɐddddҐdѐddddҐdѐddddҐdѐddddҐd͐ddddҐdՐddddҐdddddҐdddddҐd͐dddddҐdՐdddddҐddddddҐdddddҐddddddҐdؐddϐddҐdؐ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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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/
                             |shorts/
                             |(?:                                             # 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json3Zsrv1Zsrv2Zsrv3ttmlvttFr.   z6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9ZBaW_jenozKcmp4u#   youtube-dl test video "'/\ä↭𝕐zPhilipp Hagemeisterz@PhilippHagemeisterz6re:https?://(?:www\.)?youtube\.com/@PhilippHagemeisterZ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
   z4https://i.ytimg.com/vi/BaW_jenozKc/maxresdefault.jpgr   r]   )r   extr   r   uploader_idr   channelr   channel_urlupload_dater   
categoriestagsr   r   
like_count	thumbnail
start_timeend_time)rH   	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)rH   r2   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   skip_downloadT)rH   r2   r  ra   z+https://www.youtube.com/watch?v=a9LDPn-MO4Iz.256k DASH audio (format 141) via DASH manifestza9LDPn-MO4Im4aZ8KVIDEOz/re:https?://(?:www\.)?youtube\.com/user/8KVIDEOr7   zUHDTV TEST 8K VIDEO.mp4)r   r   r   r   r   r   r   r   141)youtube_include_dash_manifestrl   zformat 141 not served any more)rH   r2   r  ra   r  z+https://www.youtube.com/watch?v=IB3lcPjvWLAZIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree Wilsonz$md5:8f5e2b82460520b619ccac1f509d43bf   ZAfrojackVEVOz@AfrojackVEVOZ20131011gp=
/`@)	r   r   r   r   r   r   r   r   abrz141/bestaudio[ext=m4a]rH   r  ra   z+https://www.youtube.com/watch?v=T4XJQO3qol8ZT4XJQO3qol8   Z20100909zAmazing Atheistz@theamazingatheistz5re:https?://(?:www\.)?youtube\.com/@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(Age-gated video (No vevo, embed allowed)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@thewitcherz.re:https?://(?:www\.)?youtube\.com/@thewitcherZ20140605z4https://i.ytimg.com/vi/HtVdAasjOgU/maxresdefault.jpgZGamingzcount:17z8https://www.youtube.com/channel/UCzybXLxv08IApdjdN0mJhEgZUCzybXLxv08IApdjdN0mJhEg)r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   )r2   rH   r  z1Age-gated video with embed allowed in public sitez'https://youtube.com/watch?v=HsUATh_Nc2UZHsUATh_Nc2UzGodzilla 2 (Official Video)z$md5:bf77e03fcae5529475e500129b05668a   ZFlyingKittyz@FlyingKitty900Z20200408z4https://i.ytimg.com/vi/HsUATh_Nc2U/maxresdefault.jpgZEntertainmentZFlyingkittyz
godzilla 2z8https://www.youtube.com/channel/UCYQT13AtrJC0gsM1far_zJgZUCYQT13AtrJC0gsM1far_zJg)r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   z7Age-gated video embeddable only with clientScreen=EMBEDz'https://youtube.com/watch?v=Tq92D6wQ1mgZTq92D6wQ1mgz#[MMD] Adios - EVERGLOW [+Motion DL]z$md5:17eccca93a786d51bc67646756894066j   zProjekt Melodyz@ProjektMelodyZ20191227z0https://i.ytimg.com/vi/Tq92D6wQ1mg/sddefault.jpgZmmdZdanceZmikumikudanceZkpopZvtuberz8https://www.youtube.com/channel/UC1yoRdFoFJaCY-AGfD9W0wQzUC1yoRdFoFJaCY-AGfD9W0wQ)r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   z"Non-Age-gated non-embeddable videoz'https://youtube.com/watch?v=MeJVWBSsPAYZMeJVWBSsPAYz%OOMPH! - Such Mich Find Mich (Lyrics)z$Fan Video. Music & Lyrics by OOMPH!.   Z20130730z
Herr Lurikz
@HerrLurikz!http://www.youtube.com/@HerrLurikr   z0https://i.ytimg.com/vi/MeJVWBSsPAY/hqdefault.jpgZoomphzsuch mich find michZlyricszgerman industrialzmusica industrialZMusicz8https://www.youtube.com/channel/UCdR3RSDPqub28LjZx0v9-aAzUCdR3RSDPqub28LjZx0v9-aAzOOMPH!)r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   artistr   r   zNon-bypassable age-gated videoz'https://youtube.com/watch?v=Cr381pDsSsA)r2   rH   only_matchingzMAge-gated video only available with authentication (not via embed workaround)ZXgnwCQzjau8zHThis video has been removed for violating YouTube's Community Guidelines)r2   rH   r  r  Z__2ABJjxzNoi
  Z20100430z	@deadmau5z,re:https?://(?:www\.)?youtube\.com/@deadmau5Zdeadmau5z$md5:6cbcd3a92ce1bc676fc4d6ab4ace2336zDeadmau5 - Some Chords (HD)zSome Chords)r   r   r   r   r   r   creatorr   r   r   	alt_titlezDASH manifest missing)rH   r  expected_warningsZlqQg6PlCWgIz5Hockey - Women -  GER-AUS - London 2012 Olympic Gamesz_re:(?s)(?:.+\s)?HO09  - Women -  GER-AUS - Hockey - 31 July 2012 - London 2012 Olympic Games\s*i  Z20150827z	@Olympicsz,re:https?://(?:www\.)?youtube\.com/@Olympicszre:Olympics?z4https://i.ytimg.com/vi/lqQg6PlCWgI/maxresdefault.jpgZSportsZHockeyz
2012-07-31z31 July 2012zRiverbank ArenaZSessionZOlympicszOlympic GameszLondon 2012z2012 Summer OlympicszSummer Gamesz8https://www.youtube.com/channel/UCTl3QQTvqHFjurroKxexy2QZUCTl3QQTvqHFjurroKxexy2Q)r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   z+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0gqq?U   Z20110310z
@AllenMeowz-re:https?://(?:www\.)?youtube\.com/@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requires avconvzThis live event has ended.)rH   r  ra   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 any more)rH   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)rH   md5r  ra   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*  zNot multifeed any more)rH   r  playlistra   r  z+https://www.youtube.com/watch?v=gVfLd0zydloZgVfLd0zydloz/DevConf.cz 2016 Day 2 Workshops 1 14:00 - 15:30r   r   r   rH   r  playlist_countr  zhttps://vid.plus/FlRa-iH7PGwrH   r  z_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 Walkz$md5:8085699c11dc3f597ce0410b0dcbb34a   Z20151119z@IronSoulElfz/re:https?://(?:www\.)?youtube\.com/@IronSoulElfZIronSoulElfz8re:Todd Haberman[;,]\s+Daniel Law Heath and Aaron Kaplanz6Position Music - Production Music Vol. 143 - Dark Walk)r   r   r   r  r   r   r   r   r   r   r  trackr  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@BKCHarvardz.re:https?://(?:www\.)?youtube\.com/@BKCHarvardz/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@BernieSandersz1re:https?://(?:www\.)?youtube\.com/@BernieSanders)
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@Vsaucez*re:https?://(?:www\.)?youtube\.com/@Vsaucez
Mind Field)r   r   r   r   r   r   r   r   r   seriesseason_numberepisode_numberzSkipping DASH manifest)rH   r  ra   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@ElevageOrVert)r   r   r   r   r   r   r   z+https://www.youtube.com/watch?v=CHqg6qOn4noZCHqg6qOn4noz+Part 77   Sort a list of simple types in c#z$md5:b8746fa52e10cdbf47997903f13b20dcZ20130831Z	kudvenkatz@Csharp-video-tutorialsBlogspotz+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@walkaroundjapan7124z7re:https?://(?:www\.)?youtube\.com/@walkaroundjapan7124)r   r   r   r   r   r   r   r   z&https://youtube.com/shorts/4L2J27mJ3DcZ4L2J27mJ3DczMidwest Squid Game #Shortsz$md5:976512b8a29269b93bbd8a61edc45a6dZ20211025zCharlie Berensz@CharlieBerensflvi     mp3@   h263)r   widthheightacodecr
  vcodeci  i  3gpaacmp4v)r   r4  r5           i  ih  `   h264i   i        iV  i  i@  )r   r2  r4  r5  i  i8  i   i   vorbisvp8Z3Di)r   r3  format_noter4  r
  r5  
preferenceZHLS0   i   H   z
DASH video)r   r3  rB  r5  )r   rB  r5  i  <   )r   r3  rB  r5  fpsip  z
DASH audiom4a_dash)r   rB  r4  r
  	container)r   rB  r4  rJ  dtsezec-3)r   r3  r2  rB  rJ  r5  vp9)r   r3  rB  rJ  r5  )r   r4  rB  r
  opus2   )r   rB  r4  r
  F      protocolrtmpnonezav01.0.05M.08)r4  r5  )R56Z13Z17Z18Z22Z34Z3536Z37Z38Z43Z44Z45Z46Z59Z78Z82Z83Z84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*   t |dd gd rdS tt| |S )Nri   r   F)r   rb   superr   suitableclsrH   	__class__r<   r=   rY    s    zYoutubeIE.suitablec                    s"   t t| j|| i | _i | _d S rM   )rX  r   __init___code_cache_player_cache)rK   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 rM   r
   len).0partr<   r<   r=   	<genexpr>  s     z0YoutubeIE._signature_cache_id.<locals>.<genexpr>)joinsplit)rK   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_REr8   r   r   group)r[  
player_urlZ	player_reZid_mr<   r<   r=   _extract_player_info  s    
zYoutubeIE._extract_player_infoc                 C   sB   |s|  |}|| jkr8| j||d| d| d| j|< | j| S )NzDownloading player zDownload of %s failed)r2   r3   )rp  r_  rd   )rK   r   ro  	player_idr<   r<   r=   _get_player_code  s    

 zYoutubeIE._get_player_codec           
         s   |  |}d|| |f }tj||ks0t| jjd|  d k	rT fddS | 	|||}| 
|}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 )Nr7   c                 3   s   | ]} | V  qd S rM   r<   )rf  ir:   r<   r=   rh    s     zJYoutubeIE._extract_signature_function.<locals>.<lambda>.<locals>.<genexpr>)ri  r:   
cache_specr:   r=   r>     r?   z7YoutubeIE._extract_signature_function.<locals>.<lambda>r7   c                 S   s   g | ]}t |qS r<   ordrf  cr<   r<   r=   
<listcomp>  s     z9YoutubeIE._extract_signature_function.<locals>.<listcomp>)rp  rl  ospathbasenameAssertionErrorrN   cacheloadrr  _parse_sig_jsri  mapr   rangere  store)
rK   r   ro  rk  rq  Zfunc_idcodero   test_string	cache_resr<   rt  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   r7   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   rZ   )rZ   r   zs[%d])zip)Zidxsr  r  r  rs  prevr<   r<   r=   gen_sig_code  s$    "z/YoutubeIE._print_sig_code.<locals>.gen_sig_coder7   c                 S   s   g | ]}t |qS r<   rv  rx  r<   r<   r=   rz    s     z-YoutubeIE._print_sig_code.<locals>.<listcomp>z + z(%s), c                 s   s   | ]}t t|V  qd S rM   rd  )rf  pr<   r<   r=   rh  
  s     z,YoutubeIE._print_sig_code.<locals>.<genexpr>rc  z<if tuple(len(p) for p in s.split('.')) == %s:
    return %s
zExtracted signature function:
)ri  r  r   r  re  rj  	to_screen)
rK   funcrk  r  r  r  ru  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$]+)\(r  z)Initial JS player signature function namesig)rn  c                    s
    | gS rM   r<   r:   Zinitial_functionr<   r=   r>   %  r?   z)YoutubeIE._parse_sig_js.<locals>.<lambda>)r{   r   Zextract_function)rK   jscodefuncnamejsir<   r  r=   r    s      
zYoutubeIE._parse_sig_jsc              
   C   s   |dkrt dz^|| |f}|| jkrB| |||}|| j|< | j| }| jjdrf| || ||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_urlyoutube_print_sig_codezSignature extraction failed: )cause)r   rl  r`  r  rN   ra   rb   r  	Exception	traceback
format_exc)rK   r;   r   ro  rq  r  etbr<   r<   r=   _decrypt_signature'  s*    
  


 zYoutubeIE._decrypt_signaturec                 C   sN   | j d|pdddd}|sd S |dr2d| }ntd|sJtd	|}|S )
Nz)"(?:PLAYER_JS_URL|jsUrl)"\s*:\s*"([^"]+)"r7   z
player URLFr^   z//zhttps:z	https?://r   )r{   
startswithr8   matchr   r,   )rK   r   ro  r<   r<   r=   _extract_player_url=  s       

 zYoutubeIE._extract_player_urlc                 C   s   d}|  d|f |d}t||dd\}}|s8|S t|dkrp|  dt|f |djf t }|rp|S | j|  d	t|f |d
jf t |t	dt
| S )Nz0(?P<nfunc>[a-zA-Z_$][\w$]*)(?:\[(?P<idx>\d+)\])?z"\.get\("n"\)\)&&\(b=(%s)\([\w$]+\)z!Initial JS player n function namenfuncidxr   z$var %s\s*=\s*\[([a-zA-Z_$][\w$]*)\];z3Initial JS player n function alias ({nfunc}[{idx}])zvar %s\s*=\s*(\[.+?\]);z2Initial JS player n function name ({nfunc}[{idx}]))r@   )r{   r8   r  rn  r   r   rl   localsr   r   int)rK   r  targetZnfunc_and_idxr  r  Z
real_nfuncr<   r<   r=   _extract_n_function_nameO  s6        z"YoutubeIE._extract_n_function_namec                    s   |  |}| jjd|  r(t n<| |||}| |}t|| | jjd|  | jj	
dr| d| d   fddS )Nzyoutube-nsigr  z&Extracted nsig function from {0}:
{1}
r   c                    s   j   | gS rM   )Zextract_function_from_coder:   Z	func_coder  r<   r=   r>   q  r?   z/YoutubeIE._extract_n_function.<locals>.<lambda>)rp  rN   r  r  r   rr  r  Zextract_function_coder  ra   rb   r  rl   )rK   r   ro  rq  r  r  r<   r  r=   _extract_n_functiona  s    



zYoutubeIE._extract_n_functionc           	      C   s   d|f}|| j kr| j | S zd|f}|| j krB| ||| j |< | j | }||}|drftd|| j |< | jjddr| jd| jd	|| j | f  | j | W S  t
k
r } z&| jd	| jd
t|t f  W 5 d}~X Y nX dS )a  Compute the response to YT's "n" parameter challenge,
           or None

        Args:
        n_param     -- challenge string that is the value of the
                       URL's "n" query parameter
        player_url  -- URL of YT player JS
        video_id
        Z
nsig_valueZnsigZenhanced_except_zUnhandled exception in decodeverboseFz[debug] [%s] %szDecrypted nsig {0} => {1}z[%s] %s (%s %s)z=Unable to decode n-parameter: download likely to be throttledN)r`  r  r  r   rN   ra   rb   r  rc   rl   r  rO   r   r  r  )	rK   n_paramro  r   Zsig_idrq  r  retr  r<   r<   r=   _n_descrambles  s0    





$zYoutubeIE._n_descramblec           	      C   s   |D ]}t |d }t|jd}|s,q|d }| |||}|d krN qt|d d dtffftdD ]}t	|d d|gid|d< qhqd S )NrH   nrZ   	fragmentsexpected_typequery_update)
r   urlparsecompat_parse_qsr   rb   r  r#   r   r   r(   )	rK   r   ro  r  fmtZparsed_fmt_urlr  Z
n_responseZfmt_dctr<   r<   r=   _unthrottle_format_urls  s     z!YoutubeIE._unthrottle_format_urlsc                 C   st   t |trt|dnd}|sp|dkrHd}|r8t|| j| dS | ||}t| jd|pbddd|d}|S )	zr
        Extract signatureTimestamp (sts)
        Required to tell API what sig/player version is in use.
        ZSTSNz6Cannot extract signature timestamp without player_url.z2(?:signatureTimestamp|sts)\s*:\s*(?P<sts>[0-9]{5})r7   zJS player signature timestampsts)rn  r4   )	r   r   r   rb   r   rN   rO   rr  r{   )rK   r   ro  r   r4   r  	error_msgr  r<   r<   r=   _extract_signature_timestamp  s"       z&YoutubeIE._extract_signature_timestampc                    sj   t t|dd }|sd S d d fddtddD }t|d	g|gd
d}| j||dddd d S )Nc                 S   s   | d d d S )NZplaybackTrackingZvideostatsPlaybackUrlbaseUrlr<   rU   r<   r<   r=   r>     r?   z)YoutubeIE._mark_watched.<locals>.<lambda>z@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_r7   c                 3   s"   | ]} t d dd@  V  qdS )r   rE  ?   N)r|   r}   )rf  r   ZCPN_ALPHABETr<   r=   rh    s     z*YoutubeIE._mark_watched.<locals>.<genexpr>r      2)vercpnr  zMarking watchedzUnable to mark watchedFr^   )r*   r$   ri  r  r(   rd   )rK   r   player_responseZplayback_urlr  r<   r  r=   _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 )rH   r%   rn  )rf  mobjr<   r<   r=   rz    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 )rZ   Nr<   rf  mr<   r<   r=   rh    s     z*YoutubeIE._extract_urls.<locals>.<genexpr>)r8   finditerextendri   r  r%   findall)r   entriesmatchesr<   r<   r=   _extract_urls  s    
zYoutubeIE._extract_urlsc                 C   s   t | }|r|d S d S r[   )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   )r8   r  
_VALID_URLVERBOSEr   rn  )r[  rH   r  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<   rU   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<   rU   r<   r<   r=   r>     r?   zMYoutubeIE._extract_chapters_from_json.<locals>.chapter_time.<locals>.<lambda>  )scale)r   r$   r  )chapterr<   r<   r=   chapter_time  s    z;YoutubeIE._extract_chapters_from_json.<locals>.chapter_timer   r  c                 S   s   | d d d S )Nr  r   r   r<   rU   r<   r<   r=   r>     r?   r   r   r   )r$   ri   	enumeratere  r
   append)rK   rA   r   r   Zchapters_listr  r  next_numr  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   rv   Fr^   )r   r{   r   )rK   r   regexr   r   r<   r<   r=   _extract_yt_initial_variable%  s       z&YoutubeIE._extract_yt_initial_variablec           }         s  t |i \}}|} d }|d | }j|d |ddd }d }rbj|d}|sxdd|i|}d	d
 }dd }	|	|}
||
r^tjj	
ddddkr^  ddi}}|}|||}|r||d< d|idddddddddid|d}dddd }jd||d|d!}|	|}|
d"d#kr^|}|}
t|
d$d% t}|r| |S d&d' rfd(d%nd)d% }|
d*pi }t|d+d% tpi }|
d,p|
d,p|d-d.d,g}|
d/}|
d0ds
jj	
d1st|d2d% t}|r
g }g }|d3D ]}tt|fd4d5}|d6}|sxqJ|d,}|}|r|d7| 7 }|d8d9t|d d6 d:  d0di|d; || qJd<d=||f  ||||S nd>|  g } g }!i }"td?d@dAdBdCdDdEdFdGdHg
}#|
dIp@i }$|$
dJpPg }%|%|$
dKpdg  |%D ]}&|&
dLsl|&
dMrqlt|&
dN}'|&
dO}(|'r|(r|(|"|'< |&
dPdQkrΐql|&
dR})|)szt|&
dS}*tt|*dTd% })t|*dUd% }+|*rl|)rl|+s"ql|s2}|s<ql |*dV d: ||},t|*dWd% pddX}-|)dY|- dZ |, 7 })|'r|!|' t!|&
d[p|&
d\d]}.t|&
d^t|&
d_|'|&
d`p|(t|&
dat|&
db|#|(|.|)|&
dcdd
|&
de}/|/rFt"#df|/}0|0rFt$|0%dgdh< &t'|0%di 
djdkk}1
dldkk}2|1rp|.dm< |2r~|.dn< |1s|2rdo &dp rdq fdrdst(d:dp  D dtn
dudv ii 
dhrdh dw dx< |  ql|$
dy}3|3rRj)|3|dzddD ]4}4j*d{|4dR dNd d}'|'rD|'|4d|< | |4 qjj	
d}dr|$
d~}5|5rj+|5|ddD ]t}4|4d| }'|'|!krq|'|"kr|#|"|' |4dO< tj*d|4
dp|4dR dd d}6|6r|6|4dp< | |4 q| s|$
drt,dddt|
dd% tp,i }7|7
dpF|

d}8|7
d}9|9rt-|9}9|9dkr|
d}:|:s|d};|;r|;d3nd }:.|9|: |8d|9 7 }8|8rt,|8dd/|  |
dpg }<|<srdds t"01dD }<|<D ]}=|=2dr
t"3d|=}0|0r
dd |04 D \}>}?|>d:kr
|?d:kr
|>|? }@| D ]}4|4
dldkkrb|@|4d< qb qq
g }A||fD ]x}Bt|Bdd% t5pg D ]N}Ct|C
dR}D|Dsΐq|At|C
dbt6|Dd d dt|C
dcd q|Ar 	q.q|ddg}C|C	r.dR|Cig}A|
d	p@|d}Ej7||d}Ft|
d	ph|
d	pxt8|d}G|
d}H9j:dR||d}Ij:d||d}J|	s};|||  ||H	rވ<|n|| |A|t=|
d	p|d|d j*d|Idd d|I|F|Gt|
d
p8|
d
p8|dt!|
d|
ddk
sr|ddk
sr|ddk
rvdnd:||E
r|Egnd |<|Hd}Kt|dd% t}L|Lrlfdd}Mi }N|L
d
pg D ]}O|O
d}|
s
q|O
ddkr|O
d}P|Ps
q|M|N||Pi  
qi }Q|L
dp(g D ],}R|R
d}S|SsBq*|M|Q||Sd|Si q*|Q|Kd< 
q|N|Kd< t>|}T|Tj?|Tj@fD ]b}Ut|U}|A D ]J\}V}WdD ]:\}X}Y|Xd7 }X|X|Kkr|V|Ykrt8||V d: |K|X< qqq|rt"3d|}0|0r|0%d}Z|0%d}[|[r4|[Bdd}[|Zs4|[d d }Z|K&|0%dC |0%d¡pnd=dd |0%dġdšD |0%dơC |[t|Zdǜ d }\rjD|dȡ}\|\sjdd|i|dd}\|\r^E|\||G}]|]s|\
dʡpg D ]}^t|^dd% t5}_|_s
qfdd̈́}`g }]tF|_dgd΍D ]~\}a|a
dϡp<i }b|`|b}ctG|_k rj|`t|_fdd%n|G}d|cd ks&|dd krq&|]|c|d|b
d,dќ q&|]r qq|]r|]|Kd< t|\dd% t5pg }_|Kd sj7d|_dՍ}F|Kd sj:dd|_dՍ|Kd< |Is,9j:ddR|_dՍ}I|_D ]f}a|a
dס}e|er|e
dء}f|fr|f}ft|edd% dkr||f|Kd< n>t"3d|f}0|0r|K&|0%dgtH|0%ditH|0%dݡdޜ t|edd% t5pg D ]}gtI|gddpi }.dd% dfdd% dd% gdffD ]\\}h}it|.|htpi 
d}j|jrt"#|i|j}0|0rtJ|0%d|K|0%dPd <  qАqqt|edd% }k|kr|kd\}l}m|K&tJ|ltJ|md |a
d}n|nr0t|ndd% t5pg }od}p|oD ]$}qt|qdd% dkrd}p qq|oD ]}q|q
dpi }r|r
d,}s|ss"q|rd, }s|rd d: }t|sdkrR|t|Kd< n@|ps|sdkrl|t|Kd< n&|sdkr|t|Kd< n|sdkr|t|Kd< qq0tI|\dtKddddtKddtKf
tdpg }ud}vtG|udgkr|vdd  }vtI|ud:d dtKdftdD ]^}wtI|wd}xtI|wddd}y|ys,q|vD ](\}z}{|z|xkr0|K
|{s0|y|K|{< q0qdD ]"\}|}X|K
||}W|Wrd|W|K|X< qdL|| tM|KN|I|I|F|Fo9d|F |Kd dS (	  Nz//www.youtube.com/zwatch?v=z &bpctr=9999999999&has_verified=1Fr^   zinitial player responseplayerr   c                    sN   t  tsd S  drdS td  fdddD d}tfdd|D S )NZdesktopLegacyAgeGateReasonTc                 3   s   | ]}  |V  qd S rM   )rb   rf  r)playabilityr<   r=   rh  C  s     z?YoutubeIE._real_extract.<locals>.is_agegated.<locals>.<genexpr>)rp   reason)zconfirm your agezage-restrictedZinappropriateZage_verification_requiredZage_check_requiredc                 3   s    | ]} D ]}||kV  q
qd S rM   r<   )rf  r1   r  )reasonsr<   r=   rh  H  s       )r   r   rb   filterr   )r  ZAGE_GATE_REASONSr<   )r  r  r=   is_agegated<  s    

z,YoutubeIE._real_extract.<locals>.is_agegatedc                 S   s   t | dd tpi S )Nc                 S   s   | d S )NZplayabilityStatusr<   rU   r<   r<   r=   r>   K  r?   zIYoutubeIE._real_extract.<locals>.get_playability_status.<locals>.<lambda>)r$   r   )responser<   r<   r=   get_playability_statusJ  s    z7YoutubeIE._real_extract.<locals>.get_playability_statusr  r  rv   Zhtml5PreferenceZHTML5_PREF_WANTSZsignatureTimestampZcontentPlaybackContextTZTVHTML5_SIMPLY_EMBEDDED_PLAYERz2.0r5   ZEMBED)r   r   r6   ZclientScreenZembedUrlzhttps://google.com)r   Z
thirdParty)ZplaybackContextZcontentCheckOkZracyCheckOkr   r   rW  r   )zX-YouTube-Client-NamezX-YouTube-Client-VersionOrigin)r4   rB   rp   OKc                 S   s   | d d d S )NerrorScreenZ%playerLegacyDesktopYpcTrailerRendererZtrailerVideoIdr<   rU   r<   r<   r=   r>   v  r?   z)YoutubeIE._real_extract.<locals>.<lambda>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   r7   c                 S   s$   g | ]}t |d tr|d  qS )r   )r   rb   r
   r  r<   r<   r=   rz    s      z=YoutubeIE._real_extract.<locals>.get_text.<locals>.<listcomp>)rb   r   r
   ri   ri  )rV   r   r   r<   r<   r=   get_text|  s    


z)YoutubeIE._real_extract.<locals>.get_textc                    s    j | d dS )Nrv   )r   rU   )rK   r   r<   r=   r>     r?   c                 S   s   d S rM   r<   rU   r<   r<   r=   r>     r?   ZvideoDetailsc                 S   s   | d d S )NmicroformatZplayerMicroformatRendererr<   rU   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<   rU   r<   r<   r=   r>     r?   ,c                    s   t  fddtS )Nc                    s   |   d S r[   r<   rU   r   r<   r=   r>     r?   z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>)r$   r
   r  )	feed_datar  r=   
feed_entry  s
     
 z+YoutubeIE._real_extract.<locals>.feed_entryr   z (%s)url_transparentYoutuber   )r   r   rH   r   zNDownloading multifeed video (%s) - add --no-playlist to just download video %sr  2Downloading just video %s because of --no-playlistZtinyZsmallmediumZlargeZhd720Zhd1080Zhd1440Zhd2160Zhd2880ZhighresZstreamingDatar  ZadaptiveFormatsZtargetDurationSecZdrmFamiliesitagqualitytypeZFORMAT_STREAM_TYPE_OTFrH   ZsignatureCipherc                 S   s   | d d S )NrH   r   r<   rU   r<   r<   r=   r>     r?   c                 S   s   | d d S )Nr;   r   r<   rU   r<   r<   r=   r>     r?   r;   c                 S   s   | d d S )Nspr   r<   rU   r<   r<   r=   r>     r?   	signature&=ZaverageBitratebitrater  ZaudioSampleRatecontentLengthZqualityLabelrH  r3  r2  )
asrfilesize	format_idrB  rH  r3  r   tbrrH   r2  mimeTypez.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?r   r   r   r4  rS  r5  vbrr
  i   r	  http_dash_segmentsc                    s<   g | ]4}d t d  dd|t|  d d iiqS )rH   r  z{0}-{1}r   r	  )r)   rl   min)rf  range_start)
CHUNK_SIZEdctr<   r=   rz    s     z+YoutubeIE._real_extract.<locals>.<listcomp>)rQ  r  downloader_optionshttp_chunk_size_dashrJ  ZhlsManifestUrlr   z/itag/(\d+)r
  r  ZdashManifestUrlz/clen/(\d+)fragment_base_urlz	file sizeZlicenseInfoszThis video is DRM protected.r0   c                 S   s   | d d S )Nr  ZplayerErrorMessageRendererr<   rU   r<   r<   r=   r>   5  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 )r   r  r  r<   r<   r=   rz  J  s   zog:video:tagzyt:stretch=z(\d+)\s*:\s*(\d+)c                 s   s   | ]}t |V  qd S rM   )float)rf  vr<   r<   r=   rh  R  s     z*YoutubeIE._real_extract.<locals>.<genexpr>r  c                 S   s   | d d S )Nr   
thumbnailsr<   rU   r<   r<   r=   r>   ^  r?   )r   fragment)r3  rH   r2  zog:imageztwitter:imagecategorygenre)r   r   ZlengthSecondsr   isLiver   
uploadDater   z#/(?:channel/|user/|(?=@))([^/?&#]+)r   Z	viewCountinteractionCountZaverageRatingZisFamilySafeisFamilyFriendlyfalsezog:restrictions:agez18+)r   r   r  r  r   r   r   r   r   r   r   r   average_ratingr  webpage_urlr   r   is_livec                 S   s   | d d S )NcaptionsZplayerCaptionsTracklistRendererr<   rU   r<   r<   r=   r>     r?   c                    s@   g } j D ](}|d|i ||t||d q
|| |< d S )Nr  )r   rH   )_SUBTITLE_FORMATSrD   r  r)   )rJ  base_url	lang_coder   Z	lang_subsr  rQ   r<   r=   process_language  s    
 
z1YoutubeIE._real_extract.<locals>.process_languageZcaptionTracksr  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+  -r7   rT   r$  Zclean_artistc                 s   s   | ]}|  V  qd S rM   )strip)rf  ar<   r<   r=   rh    s     r     ·r#  )r$  r  r#  r+  r,  r   nextZengagementPanelsc                 S   s   | d d d d S )N"engagementPanelSectionListRendererr   ZmacroMarkersListRendererr   r<   rU   r<   r<   r=   r>     r?   c                    s   t  | dS )NZtimeDescription)r   rb   )mmlir)r  r<   r=   r    s    z-YoutubeIE._real_extract.<locals>.chapter_timer  macroMarkersListItemRendererc                    s   |   d S )Nr9  r<   rU   )r  r<   r=   r>     r?   r  r  c                 S   s   | d d d d d S )Nr   twoColumnWatchNextResultsresultsr<   rU   r<   r<   r=   r>   	  r?   r   r   r   ZvideoPrimaryInfoRendererZsuperTitleLinkc                 S   s   | d d S )NZsuperTitleIconZiconTyper<   rU   r<   r<   r=   r>   	  r?   ZLOCATION_PINlocationu;   ([^\xa0\s].*?)[\xa0\s]*S(\d+)[\xa0\s]*[•]?[\xa0\s]*E(\d+)r   )r(  r)  r*  c                 S   s   | d d d S )NZvideoActionsZmenuRendererZtopLevelButtonsr<   rU   r<   r<   r=   r>   +	  r?   )Z"segmentedLikeDislikeButtonRendererZ
likeButtontoggleButtonRendererr>  c                 S   s   | d d d S )NZdefaultTextaccessibilityaccessibilityDatar<   rU   r<   r<   r=   r>   /	  r?   z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                 S   s   | d S )Nr?  r<   rU   r<   r<   r=   r>   1	  r?   c                 S   s   | d d S )Nr@  r<   rU   r<   r<   r=   r>   2	  r?   zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peoplelabelr   _countc                 S   s   | d d d S )NZsentimentBarZsentimentBarRendererZtooltipr<   rU   r<   r<   r=   r>   ;	  r?   z / )r   dislike_countZvideoSecondaryInfoRendererc                 S   s   | d d d S )NZmetadataRowContainerZmetadataRowContainerRendererrowsr<   rU   r<   r<   r=   r>   G	  r?   c                 S   s   | d d S )NmetadataRowRendererZhasDividerLiner<   rU   r<   r<   r=   r>   K	  r?   rE  r   ZLicenser%  ZAlbumZArtistZSongr7  r   Z$structuredDescriptionContentRendereritemsZ$videoDescriptionMusicSectionRendererZcarouselLockupsr  ))ZALBUMr$  )ZARTISTr  )ZSONGr#  )ZLICENSESr%  rZ   ZcarouselLockupRendererZinfoRowsZinfoRowRenderer)r   r   ZdefaultMetadataZexpandedMetadata))r  r  )r#  r  z	/channel/)r   r   r   r   r   )Or'   	_match_idhttp_schemerd   r  r   r   r   rN   ra   rb   report_age_confirmationr  r   r  r$   r
   
url_resultr   r   rj  r  r   r  r    r  ri  playlist_resultr   r  r!   r*   r  r   r8   r  r   rn  rD   r   r  _extract_m3u8_formatsr{   _extract_mpd_formatsr   r   raise_geo_restricted_sort_formatsr  _meta_regexr  r   groupsri   r(   r   r   r   r   r  _live_titler&   r   r  r   rF  replacer3  r   r  r  re  r  r#   r"   r   mark_watchedr   r   )}rK   rH   smuggled_datar   r*  r&  r  ro  r  r  Zplayability_statusZ
pb_contextr   r  r   rB   
video_infoZage_gate_statusZtrailer_video_idZsearch_metaZvideo_detailsr  video_titleZvideo_descriptionZmultifeed_metadata_listr  Zfeed_idsfeedr  feed_idZ
feed_titler   r  ZitagsZitag_qualitiesqZstreaming_dataZstreaming_formatsr  r  r   Zfmt_urlscZencrypted_sigr  r  r  mimetyper  Zno_audioZno_videoZhls_manifest_urlfZdash_manifest_urlr	  Zpemrr  r  	countriesZregions_allowedr  keywordwhZratior  rJ  r   thumbnail_urlr  r   r   r'  Zowner_profile_urlr   infoZpctrr,  r/  Zcaption_trackr+  r.  Ztranslation_languageZtranslation_language_codeZ
parsed_urlZ	componentr   r  Zd_kZs_ksr,  r+  Zinitial_datar  Zengagment_pannelr   r  r   r8  r   r   ZvpirZstlZtlbgetterr  rA  Zsbr_tooltipr   rC  ZvsirrD  Zmultiple_songsrowZmrrZ	mrr_titleZmrr_contents_textZcarousel_lockupsfieldsZinfo_rowZ	row_titleZrow_textr   fieldZs_kr<   )r  r  r  r  r  rK   r   r=   _real_extract*  s   
      

  
   




 
  
   
   
  


    


 

 

  

      


 

   
   

*        
 







 









     

zYoutubeIE._real_extract)N)NF)'r   r   r   IE_DESCZ_INVIDIOUS_SITESri  r  rm  r)  _GEO_BYPASSrc   r  _TESTSZ_formatsclassmethodrY  r^  rl  rp  rr  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  rh  __classcell__r<   r<   r\  r=   r     s  ;" $ 	
 
2 @	 
        
 
   
                           
j	'#(r   c                7       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/d0d1d2d3d4d5d6d7d8d0d1d2d3d9d5d:d;d<d=d>d?dd@dAdBd;dCd=d>d?ddDdAdEd;dCd=d>d?ddFdAdGd;dHd=d>d?ddIdAdJd;dKd=d>d?ddLdAdMd;dNd=d>d?ddOdAdPd+d,dQd+d,dRd+d,dSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdZdddedfd+d,dgdhdidjdkdldmdZdndedodpdqdrdsdtdZdudAdvd+d,dwdxdydzd{d|d}d~dddgeeeddd+ide	 gddd+d,dd+d,ddddddddddgeeddd+iddddddddddddgdddgeddd+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ddAdd+d,dddddd d!d"dddg.Z
e f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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|results)\b)
                        )
                        (?P<id>[^/?\#&]+)
                    zyoutube:tabz1https://www.youtube.com/@SuperCooperShorts/shortsrX   z&Short clips from Super Cooper Sundays!ZUCKMA8kHZ8bPYpnMNaUSxfEQzSuper Cooper Shorts - ShortszSuper Cooper Shortsz@SuperCooperShorts)r   r   r   r   r   rH   playlist_mincountr  z0https://www.youtube.com/@emergencyawesome/shortsz$md5:592c080c06fef4de3c902c4a8eecd850ZUCDiFRMQWpcp8_KD4vwIVicwzEmergency Awesome - Home)r   r   r   z<new test page needed to replace `Emergency Awesome - Shorts`)rH   r  rp  r  uM   https://www.youtube.com/c/ИгорьКлейнер/playlists?view=1&flow=grid^   ZUCqj7Cz7revf5maW9g5pgNcgzIgor Kleiner - Playlistsz$md5:be97ee0f14ee314f1f002cf187166ee2zIgor Kleinerz@IgorDataScience)r   r   r   r   r   z>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=ddzJhttps://www.youtube.com/c/3blue1brown/playlists?view=50&sort=dd&shelf_id=3ZUCYO_jab_esuFRV4b17AJtAwz3Blue1Brown - Playlistsz$md5:e1384e8a133307dd10edee76e875d62fZ3Blue1Brownz@3blue1brownz7https://www.youtube.com/user/ThirstForScience/playlistsrT   ZUCAEtajcuhQ6an9WEzY9LEMQzThirstForScience - Playlistsz$md5:609399d937ea957b0f53cbffb747a14cZThirstForSciencez@ThirstForSciencez3https://www.youtube.com/c/ChristophLaimer/playlistsTr!  zHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcZ"PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczyoutube-dl public playlistz	Sergey M.z@sergeym.6173ZUCmlqkdCBesrv2Lak1mF_MxA)r   r   r   r   r   r   )rH   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:2163c5d0ff54ed5f598d6a7e6211e488zlex willz@lexwill718r   )rH   r  rp  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 - ChannelsK   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@ChRiStIaAn008ZUCEPzS1rYsrkqzSLNp76nrcgr   r   r   r   r   r<  )r2   rH   r  r   zLarge playlistz>https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0QzUploads from CauchemarZUUBABnxM4Ar9ten8Mdjj1j0QZ	Cauchemarz@Cauchemar89ZUCBABnxM4Ar9ten8Mdjj1j0Qic  r2   rH   r  rp  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@InterstellarMoviezUCXw-G3eDE9trcvY2sBMM_aA   zHhttps://www.youtube.com/playlist?list=PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz Data Analysis with Dr Mike PoundZ"PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baZComputerphilez@ComputerphilezUC9-y-6csu5WGm29I7JiwpnA   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'  )rH   r  ra   r  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re:[\da-zA-Z_-]{8,}r   zre:(?s)[A-Z].{20,}zSky Newsz@SkyNewsz+re:https?://(?:www\.)?youtube\.com/@SkyNewszre:\d{8}zhre:(?s)(?:.*\n)+SUBSCRIBE to our YouTube channel for more videos: http://www\.youtube\.com/skynews *\n.*zNews & Politics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   )rH   r  ra   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_ZUz
Search tabzChttps://www.youtube.com/c/3blue1brown/search?query=linear%20algebra   z%3Blue1Brown - Search - linear algebra)r   r   r   r   r   r   r2   rH   rp  r  c                    s   t | ott| |S rM   )r   rY  rX  rn  rZ  r\  r<   r=   rY  
  s     zYoutubeTabIE.suitablec                 C   sL   t | tst|  D ]0\}}|dr|ds4qt |ts@q|  S d S )NZgridZRenderer)r   r   r~  rF  r  r   )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 )NrF  c                 S   s   | d d d d S r   r<   rU   r<   r<   r=   r>     r?   z,YoutubeTabIE._grid_entries.<locals>.<lambda>c                 S   s   | d d S r   r<   rU   r<   r<   r=   r>     r?   
playlistIdz(https://www.youtube.com/playlist?list=%sier   rW  r   r   c                 S   s   | d d S r   r<   rU   r<   r<   r=   r>   '  r?   z"https://www.youtube.com/channel/%s)r  rW  rt   c                 S   s   | d d d d S )Nr   commandMetadatawebCommandMetadatarH   r<   rU   r<   r<   r=   r>   .  r?   )r   r   r~  r$   r
   rb   rJ  rn  r   r   r,   YoutubePlaylistIEr   rY  rG  )
rK   grid_rendererr}  r   r   playlist_idr   r   ep_urlr  r<   r<   r=   _grid_entries  sl    


 
 

    
   zYoutubeTabIE._grid_entriesc                 c   sN   | d}t|tsd S | d}|r<| |D ]
}|V  q0| d}|rJd S )Nr   gridRendererZhorizontalListRenderer)rb   r   r   r  )rK   shelf_rendererr   r   entryr<   r<   r=   _shelf_entries_from_content7  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  rH   r<   rU   r<   r<   r=   r>   I  r?   z-YoutubeTabIE._shelf_entries.<locals>.<lambda>r   z
/channels?c                 S   s   | d d d d S r   r<   rU   r<   r<   r=   r>   S  r?   )rW  )r$   r
   r,   rJ  r  )rK   r  Zskip_channelsr   Z	shelf_urlr   r  r<   r<   r=   _shelf_entriesG  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   )r   r   rb   r   )rK   video_list_rendererr   r   r   r<   r<   r=   _playlist_entriesY  s    


zYoutubeTabIE._playlist_entriesc                 C   s   | d}|r| |S d S )Nr   )rb   r   )rK   video_rendererr   r<   r<   r=   _video_entrye  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<   rU   r<   r<   r=   r>   l  r?   z3YoutubeTabIE._post_thread_entries.<locals>.<lambda>c                 S   s   | d d S )NZbackstageAttachmentr   r<   rU   r<   r<   r=   r>   q  r?   c                 S   s   | d d S )NZcontentTextr   r<   rU   r<   r<   r=   r>   x  r?   c                 S   s   | d d d S )Nr   ZurlEndpointrH   r<   rU   r<   r<   r=   r>   }  r?   r  r   )r$   r   r  ri   r   r
   r   rY  rG  rJ  r   )
rK   Zpost_thread_rendererZpost_rendererr  r   r  r   runr  Zep_video_idr<   r<   r=   _post_thread_entriesj  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)rb   r   ri   r   r  )rK   Zpost_thread_continuationr   r   r   r  r<   r<   r=   !_post_thread_continuation_entries  s    



z.YoutubeTabIE._post_thread_continuation_entriesc                 c   s>   |D ]4}t |dd dd ft}|r| |}|r|V  qd S )Nc                 S   s   | d d d S )NrichItemRendererr   r   r<   rU   r<   r<   r=   r>     r?   z1YoutubeTabIE._rich_grid_entries.<locals>.<lambda>c                 S   s   | d d d S )Nr  r   ZreelItemRendererr<   rU   r<   r<   r=   r>     r?   )r$   r   r  )rK   r   r   r  r  r<   r<   r=   _rich_grid_entries  s    
zYoutubeTabIE._rich_grid_entriesNc                 C   s   | | d}|r||d< |S )N)Zctokenr   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<   rU   r<   r<   r=   r>     r?   z>YoutubeTabIE._extract_next_continuation_data.<locals>.<lambda>r   clickTrackingParams)r$   r   rb   rn  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   rF  c                    s   |   S rM   r<   rU   r   r<   r=   r>     r?   z4YoutubeTabIE._extract_continuation.<locals>.<lambda>c                 S   s   | d d S )Nr   r   r<   rU   r<   r<   r=   r>     r?   c                 S   s   | d d S )Nr   r   r<   rU   r<   r<   r=   r>     r?   r  )
r  r  r$   ri   r   r   r
   rb   rn  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<   rU   r<   r<   r=   r>     r?   z'YoutubeTabIE._entries.<locals>.<lambda>c                 S   s   | d S )Nr   r<   rU   r<   r<   r=   r>     r?   r   Channelsc                 S   s   | d S Nr   r<   rU   r<   r<   r=   r>     r?   c                 S   s   | d S )Nr   r<   rU   r<   r<   r=   r>     r?   c                 S   s   | d S r  r<   rU   r<   r<   r=   r>     r?   ZplaylistVideoListRendererr  ZshelfRendererr  r   ZrichGridRendererr   c                 S   s   | d S )NZINNERTUBE_CLIENT_VERSIONr<   rU   r<   r<   r=   r>   	  r?   z2.20210407.08.001r   )zx-youtube-client-namezx-youtube-client-versionr   c                 S   s   | d S )NZINNERTUBE_CONTEXTr<   rU   r<   r<   r=   r>     r?   r   r   r   c                 S   s   | d d S )Nr   visitorDatar<   rU   r<   r<   r=   r>     r?   zx-youtube-identity-tokenr   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)r7   r   )rB   rA   )i  i  c                 S   s   | d d S )NZresponseContextr  r<   rU   r<   r<   r=   r>   ?  r?   c                 S   s   | d S )NZcontinuationContentsr<   rU   r<   r<   r=   r>   B  r?   ZplaylistVideoListContinuationZgridContinuationZitemSectionContinuation)ZonResponseReceivedActionsZonResponseReceivedEndpointsc                 S   s   | d d d S )Nr   r   r   r<   rU   r<   r<   r=   r>   Y  r?   rF  r  r   r  )r$   r   rb   ri   r   r  r  r  r  r  r  r  r   r
   _extract_identity_tokenr   r   rG   rE   rF   r   r   r  r   r  r  r   r~  )#rK   tabitem_idr   Ztab_contentZslr_rendererZis_channels_tabr   r   r   Zis_rendererr   Zisr_contentr   r  Zrich_grid_rendererr   client_versionrB   r   Zvisitor_dataZidentity_tokenrA   r   r   retriesr  r  Zcontinuation_contentsZcontinuation_rendererZon_response_receivedZcontinuation_itemsZcontinuation_itemr  r  r<   r<   r=   _entries  sf   
















    
  


    









  









zYoutubeTabIE._entriesc                 C   s:   | D ](}t |dpi }|ddkr|  S qtdd S )N)ZtabRendererZexpandableTabRendererselectedTzUnable to find selected tab)r   rb   r   )tabsr  r   r<   r<   r=   _extract_selected_tab|  s
    
z"YoutubeTabIE._extract_selected_tabc                 C   s   i }t |d}| jd||d|d< | jdd|dp@| jdd|d|d< | | jdd	||d|d
< | |d
 |d< |d |d< |S )N)ZsidebarZplaylistSidebarRendererrF  r7   )r   r   r   r   r<  )r   r   rH   r   r   r   )r#   r   r   r   r   )rK   r   rA   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<   rU   r<   r<   r=   r>     r?   z-YoutubeTabIE._extract_alert.<locals>.<lambda>c                 S   s   | d d S )NZalertRendererr   r<   rU   r<   r<   r=   r>     r?   c                 S   s   | d S )Nr   r<   rU   r<   r<   r=   r>     r?   c                 S   s   | d d d S )Nr   r   r   r<   rU   r<   r<   r=   r>     r?   r  )r$   ri   r   r   r
   r  ri  )rA   r  alertZ
alert_textr   r<   r<   r=   _extract_alert  s&    
  zYoutubeTabIE._extract_alertc                 C   s   |  |}t|dd t}|}d  }}	|r|dp6|}
|d}|
pH|}|rZ|d| 7 }|drt|d|d  7 }|d}	|d}nBt|dd t}|r|d}n"t|d	d t}|rt|d
d }| j| ||||||	d}t|| ||S )Nc                 S   s   | d d S )Nr   ZchannelMetadataRendererr<   rU   r<   r<   r=   r>     r?   z1YoutubeTabIE._extract_from_tabs.<locals>.<lambda>r   z - %sZexpandedTextr   r   c                 S   s   | d d S )Nr   ZplaylistMetadataRendererr<   rU   r<   r<   r=   r>     r?   c                 S   s   | d d S )NheaderZhashtagHeaderRendererr<   rU   r<   r<   r=   r>     r?   c                 S   s   | d d S )NZhashtagr   r<   rU   r<   r<   r=   r>     r?   )r  playlist_titleplaylist_description)r  r$   r   rb   rK  r  r   r  )rK   r  r   rA   r  Zselected_tabr   r  r   r   channel_titleZ	tab_titler  r<   r<   r=   _extract_from_tabs  sN    
  


     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<   rU   r<   r<   r=   r>     r?   z5YoutubeTabIE._extract_from_playlist.<locals>.<lambda>r  c                 S   s   | d d d d S r  r<   rU   r<   r<   r=   r>     r?   r  )r  r  )	rb   r$   r
   r,   rJ  rn  r   rK  r  )rK   r  rH   rA   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<   rU   r<   r<   r=   r>     r?   z6YoutubeTabIE._extract_identity_token.<locals>.<lambda>z%\bID_TOKEN["\']\s*:\s*["\'](.+?)["\']zidentity tokenrv   )r$   r
   r{   )rK   r   r   r   r<   r<   r=   r    s      z$YoutubeTabIE._extract_identity_tokenc                 C   sB  |  |}t|dd}t|}|dd gd }|dd gd }|r|r| jjdrz| 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 | |}
|
r6t|
ddtdd S )Nzwww.youtube.com)netlocr  r   ri   r  r  r  zEDownloading playlist %s - add --no-playlist to just download video %sc                 S   s   | d d d S )Nr   ZtwoColumnBrowseResultsRendererr  r<   rU   r<   r<   r=   r>     r?   z,YoutubeTabIE._real_extract.<locals>.<lambda>c                 S   s   | d d d d S )Nr   r:  r  r<   rU   r<   r<   r=   r>     r?   c                 S   s   | d d d S )NZcurrentVideoEndpointZwatchEndpointr   r<   rU   r<   r<   r=   r>     r?   Tr0   zUnable to recognize tab page)rG  r(   r   rb   rN   ra   r  rJ  r   r   rd   r   r$   ri   r  r   r  r
   r  r   )rK   rH   r  qsr   r  r   rA   r  r  r  r<   r<   r=   rh    sN    
     
zYoutubeTabIE._real_extract)F)N)#r   r   r   ri  r  rc   ri   r  r   r   rk  rl  rY  r   r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rh  rm  r<   r<   r\  r=   rn  	  s         e
	+
	

 2

 	rn  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'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Wickmanz
@WickmanVTzUCKSpbfbl5kRQpTdL7kMc-1Qru     rv  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
@milan5503zUCEI1-PVPcYXjB73Hfelbmawr|  zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIli  z'2018 Chinese New Singles (11/6 updated)Z"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlZLBKz@music_kingZUC21nz3_MesPLqtDqwdvnoxAro  ZTLGGrESM50VT6acwMjAyMjAxNwTr!  Z)OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                    s8   t |rdS t|dd gd r(dS tt| |S )NFr  r   )rn  rY  r   rb   rX  r  rZ  r\  r<   r=   rY  G  s
    
zYoutubePlaylistIE.suitablec                 C   s8   |  |}t|}|sd|i}| jtd|t |dS )Nri   z https://www.youtube.com/playlistr  )rG  r   rJ  r)   rn  r   )rK   rH   r  r  r<   r<   r=   rh  O  s    
 zYoutubePlaylistIE._real_extract)r   r   r   ri  r-   r   r  rc   rk  rl  rY  rh  rm  r<   r<   r\  r=   r    sf   	3r  c                   @   sX   e Zd Zddeji Zddddddd	d
ddg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@backuspagemuseumz4re:https?://(?:www\.)?youtube\.com/@backuspagemuseumZ20161008z$md5:800c0c78d5eb128500bffd4f0b4f2e8azNonprofits & Activismrz  T)r  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  ri   featurer  )r8   r  r  rn  rJ  r)   rn  r   )rK   rH   r  r   r  r<   r<   r=   rh  s  s    

 zYoutubeYtBeIE._real_extractN)
r   r   r   r-   r   r  ri   r  rk  rh  r<   r<   r<   r=   r  Y  s.   r  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  )rG  rJ  rn  r   )rK   rH   Zuser_idr<   r<   r=   rh    s    
 zYoutubeYtUserIE._real_extractN)r   r   r   r  rk  rh  r<   r<   r<   r=   r    s
   r  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  rJ  rn  r   rK   rH   r<   r<   r=   rh    s    z!YoutubeFavouritesIE._real_extractN)	r   r   r   rc   ri  r  r`   rk  rh  r<   r<   r<   r=   r    s   r  c                   @   s@   e Zd ZdZdZdZdZedZddddd	d
gZ	dd Z
dS )YoutubeSearchIEzYouTube.com searcheszyoutube:searchZytsearchzEgIQAQ%3D%3Dinfz ytsearch10:youtube-dl test videor   youtube-dl test videor  rH   r   r  c                 C   s6   t | || jd|tdkr"dn|}| |||S )z-Get a specified number of results for a queryr   r  N)r   islicer   _SEARCH_PARAMSr  rK  )rK   r   r  r  r<   r<   r=   _get_n_results  s    (zYoutubeSearchIE._get_n_resultsN)r   r   r   ri  rc   _SEARCH_KEYr  r  _MAX_RESULTSrk  r  r<   r<   r<   r=   r    s   	r  c                   @   s6   e Zd Zejd ZdZdZdZdddddd	gZd
S )YoutubeSearchDateIEz:dateZytsearchdatez)YouTube.com searches, newest videos firstZCAISAhABz$ytsearchdate10:youtube-dl test videor   r  r  r  N)	r   r   r   r  rc   r  ri  r  rk  r<   r<   r<   r=   r    s   
r  c                   @   sH   e Zd ZdZejd ZdZdddddddid	d
ddgZdd ZdS )YoutubeSearchURLIEz3YouTube search URLs with sorting and filter supportZ_urlzUhttps?://(?:www\.)?youtube\.com/results\?(.*?&)?(?:search_query|q)=(?:[^&]+)(?:[&]|$)zchttps://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=videorX   r  r  playlistend)rH   rp  r  ra   z2https://www.youtube.com/results?q=test&sp=EgQIBBgBTr!  c                 C   sF   t |}|dp|dd }|ddd }| | ||||S )NZsearch_queryrZ  rZ   r  )r7   )r   rb   rK  r   )rK   rH   r  r   ra   r<   r<   r=   rh    s    z YoutubeSearchURLIE._real_extractN)	r   r   r   ri  r  rc   r  rk  rh  r<   r<   r<   r=   r    s   
	r  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_NAMErQ   r<   r<   r=   rc     s    z!YoutubeFeedsInfoExtractor.IE_NAMEc                 C   s   |    d S rM   )rs   rQ   r<   r<   r=   r     s    z*YoutubeFeedsInfoExtractor._real_initializec                 C   s   | j d| j t dS )Nzhttps://www.youtube.com/feed/%sr  )rJ  r  rn  r   r  r<   r<   r=   rh    s    z'YoutubeFeedsInfoExtractor._real_extractN)	r   r   r   r   r`   propertyrc   r   rh  r<   r<   r<   r=   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 )	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=   rh    s     z!YoutubeWatchLaterIE._real_extractNr   r   r   rc   ri  r  rk  rh  r<   r<   r<   r=   r    s   r  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   ri  r  r  rk  r<   r<   r<   r=   r    s   r  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:ytsubscriptionsNr  r<   r<   r<   r=   r    s   r  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!  Nr  r<   r<   r<   r=   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 )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  .Tr0   )r   r  r<   r<   r=   rh  I  s    z#YoutubeTruncatedURLIE._real_extractNr  r<   r<   r<   r=   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.Tr0   )rG  r   )rK   rH   r   r<   r<   r=   rh  ]  s
    

z"YoutubeTruncatedIDIE._real_extractNr  r<   r<   r<   r=   r  S  s   r  )H
__future__r   r   rE   os.pathr{  r|   r8   r  commonr   r   compatr   r   r	   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)   r*   r+   r,   r-   r   rn  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r<   r<   r<   r=   <module>   sh   (
|!                  J       T&
1