U
    gv                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZddlmZmZ ddlmZ ddlmZ ddlmZm Z m!Z! 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM d	ZNd
ZOddddiddddddddidddddddidddddddiddddddiddddd d!d"d#d$d%id&d'dd(dd)d*d!d+d#d$d%id,d'dd(dd-d.d!d/d#d$d%id0d'dd(dd1d2d3d4d5d6d#d7d8id9d'd:dd;d<d!d=d#d$d%id!d'd>d?dd@dAdBdCdDdEdFdGidHd'd:ddIdJdBdCdKdEdFdGidLd'd:ddMd.dBdCdNdEdFdGidOd'd:ddPdQdiddddRdSdidTdddUdVdidWdddXdYdidZd'd:d[ZPd\d] ZQd^d_ ZRd`da ZSeS  G dbdc dcejTZUG ddde deeZVG dfdg dgeVZWG dhdi dieVZXG djdk dkeXZYG dldm dmeVZZG dndo doeVZ[G dpdq dqeVZ\G drds dseVZ]G dtdu dueVZ^G dvdw dweXZ_G dxdy dyeXeZ`G dzd{ d{eXeZaG d|d} d}eXZbG d~d deXZcG dd deVZdG dd deVZeG dd dedZfG dd dedZgG dd dedZhG dd deVZiG dd deVZjG dd deXZkG dd deVZlG dd deVZmdS )    N   )InfoExtractorSearchInfoExtractor)PhantomJSwrapper   )JSInterpreter)	HTTPErrorTransportErrornetwork_exceptions)+
NO_DEFAULTExtractorErrorLazyListUserNotLivebug_reports_messageclassproperty
clean_htmldatetime_from_strdict_getfilesize_from_tbrfilter_dictfloat_or_noneformat_field	get_firstint_or_noneis_htmljoin_nonempty
js_to_jsonmimetype2ext
orderedSetparse_codecsparse_countparse_durationparse_iso8601parse_qs	qualitiesremove_startsmuggle_urlstr_or_none
str_to_intstrftime_or_nonetime_secondstraverse_objtry_calltry_getunescapeHTMLunified_strdateunified_timestampunsmuggle_urlupdate_url_queryurl_or_noneurljoinvariadicZ__yt_dlp_clientZ__yt_dlp_po_tokenclientZWEBz2.20240726.00.00)
clientNameclientVersionT)INNERTUBE_CONTEXTINNERTUBE_CONTEXT_CLIENT_NAMEREQUIRE_PO_TOKENzMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15,gzip(gfe))r7   r8   	userAgentZWEB_EMBEDDED_PLAYERz1.20240723.01.008   )r9   r:   music.youtube.comZ	WEB_REMIXz1.20240724.00.00C   )INNERTUBE_HOSTr9   r:   ZWEB_CREATORz1.20240723.03.00>   ZANDROIDz19.29.37   z?com.google.android.youtube/19.29.37 (Linux; U; Android 11) gzipZAndroidZ11)r7   r8   androidSdkVersionr<   osName	osVersion   F)r9   r:   REQUIRE_JS_PLAYERr;   ZANDROID_MUSICz7.11.50zIcom.google.android.apps.youtube.music/7.11.50 (Linux; U; Android 11) gzip   ZANDROID_CREATORz	24.30.100zMcom.google.android.apps.youtube.creator/24.30.100 (Linux; U; Android 11) gzip   Z
ANDROID_VRz1.57.29ZOculuszQuest 3    ztcom.google.android.apps.youtube.vr.oculus/1.57.29 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzipZ12L)r7   r8   
deviceMakedeviceModelrC   r<   rD   rE      )r9   r:   rG   ZANDROID_TESTSUITEz1.9z:com.google.android.youtube/1.9 (Linux; U; Android 11) gzipZ2AMB)r9   r:   rG   PLAYER_PARAMSZIOSz19.29.1ZApplez
iPhone16,2zMcom.google.ios.youtube/19.29.1 (iPhone16,2; U; CPU iOS 17_5_1 like Mac OS X;)ZiPhonez17.5.1.21F90)r7   r8   rK   rL   r<   rD   rE      Z	IOS_MUSICz7.08.2zQcom.google.ios.youtubemusic/7.08.2 (iPhone16,2; U; CPU iOS 17_5_1 like Mac OS X;)   ZIOS_CREATORzQcom.google.ios.ytcreator/24.30.100 (iPhone16,2; U; CPU iOS 17_5_1 like Mac OS X;)   ZMWEBz2.20240726.01.00ZTVHTML5z7.20240724.13.00   ZTVHTML5_SIMPLY_EMBEDDED_PLAYERz2.0U   ZMEDIA_CONNECT_FRONTENDz0.1_   )webZ
web_safariweb_embedded	web_musicweb_creatorandroidZandroid_musicZandroid_creatorZ
android_vrZandroid_testsuiteiosZ	ios_musicZios_creatormwebtvtv_embeddedmediaconnectc                 C   sH   |  dd^}}|r"||d |fS | dd^}}| ||rB|d nd fS )N.r   r   _)rsplitsplit)client_namevariantbase rf   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/youtube.py_split_innertube_client,  s
    rh   c                 C   s<   t | d d^}}t|d d ddd |D  S )Nr   r`       c                 s   s   | ]}|d  V  qdS r   Nrf   .0xrf   rf   rg   	<genexpr>6  s     z$short_client_name.<locals>.<genexpr>)rh   rb   r   joinupper)rc   mainpartsrf   rf   rg   short_client_name4  s    rt   c                  C   s   ddi} d}t |d d d }tt D ]\}}|dd |dd |d	d
 |dd  |d d dd t|\}}}d|| |d< |dkr| |d d< |d  d8  < q*|r*|d  d8  < q*d S )NZembedUrlhttps://www.youtube.com/)rZ   rU   r\   r[   rY   r@   www.youtube.comrG   Tr;   FrN   r9   r6   hlen
   priorityembeddedZ
thirdPartyr   rF   )r$   tupleINNERTUBE_CLIENTSitems
setdefaultrh   )ZTHIRD_PARTYZBASE_CLIENTSr{   r6   ytcfgr`   base_clientrd   rf   rf   rg   build_innertube_clients9  s$     r   c                   @   sD   e Zd Ze Ze Ze Ze Ze Z	e Z
e ZdS )	BadgeTypeN)__name__
__module____qualname__enumautoAVAILABILITY_UNLISTEDAVAILABILITY_PRIVATEAVAILABILITY_PUBLICAVAILABILITY_PREMIUMAVAILABILITY_SUBSCRIPTIONLIVE_NOWVERIFIEDrf   rf   rf   rg   r   T  s   r   c                S   @   sd  e Zd ZdZdZdZdZdZdddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXgSZdYdZhZ	d[Z
d\Zd]Zd^d_ Zd`da Zdbdc Zddde Zejdfdg Zdhdi Zdjdk Zdldm Zdndo ZdpZi ZdqZdrZdsZdtZduZdvZe dwdx Z!dydz Z"d{d| Z#d}d~ Z$dd Z%e dd Z&dd Z'e dd Z(dd Z)dZ*dZ+dddZ,dddZ-dddZ.dddZ/dddZ0dddZ1dddZ2dpZ3dddZ4dddZ5dddZ6e7dd Z8dd Z9dd Z:dd Z;dd Z<ejdd Z=dd Z>dd Z?dpdpdpdpdddZ@dpdpdpdpdpddddZAdd ZBdd ZCe7dddZDeEdd ZFeEeGdddĄZHeEddƄ ZIeEddȄ ZJdddʄZKdd̄ ZLeMd͜ddτZNe7ddф ZOe7dpdҜddԄZPddք ZQe7dd؜ddڄZRe7dd܄ ZSddބ ZTdddZUe7dd ZVdd ZWdpS )YoutubeBaseInfoExtractorz-Provide base functions for Youtube extractorsa   channel|c|user|playlist|watch|w|v|embed|e|live|watch_popup|clip|shorts|movies|results|search|shared|hashtag|trending|explore|feed|feeds|browse|oembed|get_video_info|iframe_api|s/player|source|storefront|oops|index|account|t/terms|about|upload|signin|logoutzK(?:(?:PL|LL|EC|UU|FL|RD|UL|TL|PU|OLAK5uy_)[0-9A-Za-z-_]{10,}|RDMM|WL|LL|LM)F)}z!(?:www\.)?redirect\.invidious\.ioz(?:(?:www|dev)\.)?invidio\.usz$(?:www\.)?invidious\.pussthecat\.orgz(?:www\.)?invidious\.zee\.liz (?:www\.)?invidious\.ethibox\.frz(?:www\.)?iv\.ggtyler\.devz(?:www\.)?inv\.vern\.i2pzI(?:www\.)?am74vkcrjp2d5v36lcdqgsj2m6x36tbrkhsruoegwfcizzabnfgf5zyd\.onionz(?:www\.)?inv\.riverside\.rocksz(?:www\.)?invidious\.silur\.mez$(?:www\.)?inv\.bp\.projectsegfau\.ltzT(?:www\.)?invidious\.g4c3eya4clenolymqbpgwz3q3tawoxw56yhzk4vugqrl6dtu3ejvhjid\.onionz!(?:www\.)?invidious\.slipfox\.xyzzT(?:www\.)?invidious\.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd\.onionzN(?:www\.)?inv\.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad\.onionz$(?:www\.)?invidious\.tiekoetter\.comzM(?:www\.)?iv\.odysfvr23q5wgt7i456o5t3trw2cw5dgn56vbjfbq2m7xsc5vqbqpcyd\.onionz (?:www\.)?invidious\.nerdvpn\.dez"(?:www\.)?invidious\.weblibre\.orgz(?:www\.)?inv\.odyssey346\.devz(?:www\.)?invidious\.dhusch\.dez(?:www\.)?iv\.melmac\.spacez(?:www\.)?watch\.thekitty\.zonez$(?:www\.)?invidious\.privacydev\.netzI(?:www\.)?ng27owmagn5amdm7l5s3rsqxwscl5ynppnis5dqcasogkyxcfqn7psid\.onionz (?:www\.)?invidious\.drivet\.xyzz(?:www\.)?vid\.priv\.auzI(?:www\.)?euxxcnhsynwmfidvhjf6uzptsmh4dipkmgdmcmxxuo7tunp3ad2jrwyd\.onionz(?:www\.)?inv\.vern\.ccz%(?:www\.)?invidious\.esmailelbob\.xyzz((?:www\.)?invidious\.sethforprivacy\.comz (?:www\.)?yt\.oelrichsgarcia\.dez(?:www\.)?yt\.artemislena\.euz!(?:www\.)?invidious\.flokinet\.toz(?:www\.)?invidious\.baczek\.mez(?:www\.)?y\.com\.sbz"(?:www\.)?invidious\.epicsite\.xyzz'(?:www\.)?invidious\.lidarshield\.cloudz(?:www\.)?yt\.funami\.techzT(?:www\.)?invidious\.3o7z6yfxhbw7n3za4rss6l434kmv55cgw2vuziwuigpwegswvwzqipyd\.onionzI(?:www\.)?osbivz6guyeahrwp2lnwyjk2xos342h4ocsxyqrlaopqjuhwn2djiiyd\.onionzI(?:www\.)?u2cvlit75owumwpy4dj2hsmvkq7nvrclkpht7xgyye2pyoxhpmclkrad\.onionz(?:(?:www|no)\.)?invidiou\.shz((?:(?:www|fi)\.)?invidious\.snopyta\.orgz(?:www\.)?invidious\.kabi\.tkz#(?: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\.comz(?:www\.)?invidious\.13ad\.dez (?: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\.onionz(?:www\.)?piped\.kavin\.rocksz(?:www\.)?piped\.tokhmi\.xyzz(?:www\.)?piped\.syncpundit\.ioz(?:www\.)?piped\.mha\.fiz!(?:www\.)?watch\.whatever\.socialz!(?:www\.)?piped\.garudalinux\.orgz(?:www\.)?piped\.rivo\.lolz#(?:www\.)?piped-libre\.kavin\.rocksz(?:www\.)?yt\.jae\.fiz(?:www\.)?piped\.mint\.lgbtz(?:www\.)?il\.axz!(?:www\.)?piped\.esmailelbob\.xyzz"(?:www\.)?piped\.projectsegfau\.ltz (?:www\.)?piped\.privacydev\.netz%(?:www\.)?piped\.palveluntarjoaja\.euz(?:www\.)?piped\.smnz\.dez(?:www\.)?piped\.adminforge\.dez$(?:www\.)?watch\.whatevertinfoil\.dez(?:www\.)?piped\.qdi\.fiz(?:(?:www|cf)\.)?piped\.videoz(?:www\.)?piped\.aeong\.onez(?:www\.)?piped\.moomoo\.mez(?:www\.)?piped\.chauvet\.proz(?:www\.)?watch\.leptons\.xyzz(?:www\.)?pd\.vern\.ccz(?:www\.)?piped\.hostux\.netz(?:www\.)?piped\.lunar\.icuz(?:www\.)?hyperpipe\.surge\.shz%(?:www\.)?hyperpipe\.esmailelbob\.xyzz"(?:www\.)?listen\.whatever\.socialz(?:www\.)?music\.adminforge\.deafazidmsbscacsdadeetzen-INzen-GBry   eszes-419zes-USeuZfilfrzfr-CAglhrzuisitswlvlthunlnouzplzpt-PTptrosqskslzsr-LatnfisvvitrbebgkykkmkmnrusrukelZhyiwurarfanemrhiasZbnpaZguortateknmlsithloZmykaamkmzzh-CNzzh-TWzzh-HKjakoz1Unavailable videos will be hidden during playbackzUnavailable videos are hiddenz@[\w.-]{3,30}zUC[\w-]{22}youtubec                 C   s   | j d| j d|dd dS )N^()$zUC-iddefault_search_regex_YT_CHANNEL_UCID_RE)selfZucidrf   rf   rg   ucid_or_none	  s    z%YoutubeBaseInfoExtractor.ucid_or_nonec                 C   s   | j d| j d|dd dS )Nr   r   z@-handler   r   _YT_HANDLE_RE)r   handlerf   rf   rg   handle_or_none  s    z'YoutubeBaseInfoExtractor.handle_or_nonec                 C   s   | j d| j d|dd dS )N'^(?:https?://(?:www\.)?youtube\.com)?/()zchannel handler   r   r   urlrf   rf   rg   handle_from_url  s
      z(YoutubeBaseInfoExtractor.handle_from_urlc                 C   s   | j d| j d|dd dS )Nr   r   z
channel idr   r   r   rf   rf   rg   ucid_from_url  s
      z&YoutubeBaseInfoExtractor.ucid_from_urlc                 C   sp   | j ddddgdd }|s dS || jkrRtd| d	t| jd
di dddn|dkrl| d| d |S )z
        Returns a language code supported by YouTube for the user preferred language.
        Returns None if no preferred language set.
        langYoutubeTrj   )ie_key	casesenser   r   NzUnsupported language code: z-. Supported language codes (case-sensitive): delim, r_   expectedry   zPreferring "zQ" translated fields. Note that some metadata extraction may fail or be incorrect.)_configuration_arg_SUPPORTED_LANG_CODESr   r   report_warning)r   Zpreferred_langrf   rf   rg   _preferred_lang  s    

z(YoutubeBaseInfoExtractor._preferred_langc                 C   sL   |  d}|drd S |d}|r6|jds6d S | jddddd d S )	Nru   z__Secure-3PSIDZSOCSZCAA.youtube.comZCAIT)secure)_get_cookiesgetvalue
startswith_set_cookie)r   cookiesZsocsrf   rf   rg   _initialize_consent)  s    


z,YoutubeBaseInfoExtractor._initialize_consentc                 C   s   |  d}|d}i }|rXzttj|j}W n$ tk
rV   | dt	   Y nX |
| jpdddd | jddtj|d d S )	Nru   ZPREFz Failed to parse user PREF cookiery   UTC)rx   tzr   )namer   )r   r   dicturllibparse	parse_qslr   
ValueErrorr   r   updater   r   	urlencode)r   r   Zpref_cookieZprefrf   rf   rg   _initialize_pref2  s    

z)YoutubeBaseInfoExtractor._initialize_prefc                 C   s   |    |   |   d S N)r  r   _check_login_requiredr   rf   rf   rg   _real_initialize>  s    z)YoutubeBaseInfoExtractor._real_initializec                 C   s:   |pd d\}}}|dkr*t| jdd| || d S )Nrj   +oauthTr   )	partitionr   _youtube_login_hint_initialize_oauth)r   usernamepasswordZ	auth_typer`   userrf   rf   rg   _perform_loginC  s    z'YoutubeBaseInfoExtractor._perform_loginNr  zH861556708454-d6dlm3lh05idd8npek18k6be8ba3oc68.apps.googleusercontent.comZSboVhoG9s0rNafixCSGGKXATzMhttp://gdata.youtube.com https://www.googleapis.com/auth/youtube-paid-contentz)https://oauth2.googleapis.com/device/codez#https://oauth2.googleapis.com/tokenc                 C   s   d| j  S )NZoauth_refresh_token_)_OAUTH_PROFILEr  rf   rf   rg   _oauth_cache_keyh  s    z)YoutubeBaseInfoExtractor._oauth_cache_keyc                 C   s(   t | j|| j| jddtjhdthfS )NFfatalerror)r+   _webpage_read_content_OAUTH_TOKEN_ENDPOINT_OAUTH_DISPLAY_IDjsonloadsstr)r   responserf   rf   rg   _read_oauth_error_responsel  s    z3YoutubeBaseInfoExtractor._read_oauth_error_responsec              
   C   s|   t j| ji |d |d tt|dthfddd dd t|d	thf}|rx| j	
| j| j| |t j| j d	< d S )
Naccess_token
token_typeZ
expires_in,  r   rz   )seconds)r#  r$  expiryrefresh_token)r   _OAUTH_ACCESS_TOKEN_CACHEr   r  r  r*   r+   r   r   cachestore_NETRC_MACHINEr  )r   token_responser(  rf   rf   rg   _set_oauth_infoq  s    z(YoutubeBaseInfoExtractor._set_oauth_infoc              
   C   s$  |pd| _ | j tjkr4| | j d| j  d d S i tj| j < |rR|dpPd }|rj| j| j| j	| |p~| j
| j| j	}|r|tj| j  d< z| |}W q tk
r } z2t|jdd}| | j d|  | j}W 5 d }~X Y qX n| j}| | | | j d	| j  d d S )
Nr   z): Using cached access token for profile ""'r(  z Failed to refresh access token: rj   z": Failed to refresh access token: z: Logged in using profile ")r  r   r)  write_debugr  stripr*  r+  r,  r  load_refresh_tokenr   r   Zorig_msgreplacer   _oauth_authorizer.  )r   r  r(  r-  e	error_msgrf   rf   rg   r  }  s*    

z*YoutubeBaseInfoExtractor._initialize_oauthc                 C   s   z8| j | j| jdt| j| j|dd ddid}W nj tk
r } zLt	|j
tr| |j
j}|dkr|tdd	| jd
td| | jd W 5 d }~X Y nX |S )NzRefreshing access tokenr(  )	client_idclient_secretr(  
grant_typeContent-Typeapplication/jsonvideo_idnotedataheadersZinvalid_grantz]Failed to refresh access token: Refresh token is invalid, revoked, or expired (invalid_grant)Tr   r?  zDFailed to refresh access token: Authorization server returned error r?  )_download_jsonr  r  r  dumps_OAUTH_CLIENT_ID_OAUTH_CLIENT_SECRETencoder   
isinstancecauser   r"  r!  )r   r(  r-  r7  r  rf   rf   rg   r4    s8    

 z'YoutubeBaseInfoExtractor._refresh_tokenc           	      C   s  | j | j| jdt| j| jd ddid}t|dt	hf}t|dt	hf}|rX|sft
d| jd	| | j d
| d|  t|dthfdd}|  D ]R}z@| j | j| jddt| j| j|d dd ddid}W n t
k
r } zt|jtr||_W Y qnt|jtr| |jj}|sF||_W Y q|dkrdt| W Y |qnr|dkrt
dd| jdnV|dkrt
dd| jdn:|dkr|d7 }t| W Y qnt
d| | jd	 W 5 d }~X Y nX |  S qd S )NzInitializing authorization flow)r9  Zscoper<  r=  r>  verification_url	user_codezBAuthorization server did not provide verification_url or user_coderD  z0: To give yt-dlp access to your account, go to  z  and enter code  intervalrO   r   FzFailed to request access tokendevice_codez,urn:ietf:params:oauth:grant-type:device_code)r9  r:  rO  r;  )r?  r@  errnoterA  rB  Zauthorization_pendingZexpired_tokenzAuthorization timed outTrC  Zaccess_deniedzYou denied access to an accountZ	slow_downzCAuthorization server returned an error when fetching access token: )rE  $_OAUTH_DEVICE_AUTHORIZATION_ENDPOINTr  r  rF  rG  _OAUTH_SCOPErI  r+   r   r   	to_screenintRetryManagerr  rH  rJ  rK  r	   r  r   r"  r!  timesleep)	r   Zcode_responserL  rM  poll_intervalretryr-  r7  r  rf   rf   rg   r6    s    

 





  
  


z)YoutubeBaseInfoExtractor._oauth_authorizec                 C   sB   t j| j}|d ks&|d t kr*d S | | |d  d S )Nr'  r(  )r   r)  r   r  rV  r.  r4  )r   tokenrf   rf   rg   _update_oauth   s    z&YoutubeBaseInfoExtractor._update_oauthc                 C   s   d| j dddd   dS )NzOUse  --username=oauth[+PROFILE] --password=""  to log in using oauth, or else ur   methodr   z. See  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#logging-in-with-oauth  for more on how to use oauth. See  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#exporting-youtube-cookies  for help with cookies)Z_login_hintr  rf   rf   rg   r    s    z,YoutubeBaseInfoExtractor._youtube_login_hintc                 C   s&   | j r"| js"| jd| j d d d S )Nz3Login details are needed to download this content. r\  )_LOGIN_REQUIREDis_authenticatedZraise_login_requiredr  r  rf   rf   rg   r
    s
    
 z.YoutubeBaseInfoExtractor._check_login_requiredz@(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=zytInitialPlayerResponse\s*=rU   c                 C   s   t t| S r	  )copydeepcopyr~   r   r6   rf   rf   rg   _get_default_ytcfg  s    z+YoutubeBaseInfoExtractor._get_default_ytcfgc                 C   s   t | d S )Nr@   r~   rb  rf   rf   rg   _get_innertube_host  s    z,YoutubeBaseInfoExtractor._get_innertube_hostc                    s$    fdd}||p"||  |S )Nc                    s   t |  S r	  )r-   )yexpected_typegetterrf   rg   <lambda>      z:YoutubeBaseInfoExtractor._ytcfg_get_safe.<locals>.<lambda>)rc  )r   r   ri  rh  default_clientZ_funcrf   rg  rg   _ytcfg_get_safe  s    z(YoutubeBaseInfoExtractor._ytcfg_get_safec                 C   s   |  |dd dd ft|S )Nc                 S   s   | d S )NZINNERTUBE_CLIENT_NAMErf   rn   rf   rf   rg   rj  #  rk  z?YoutubeBaseInfoExtractor._extract_client_name.<locals>.<lambda>c                 S   s   | d d d S )Nr9   r6   r7   rf   rn  rf   rf   rg   rj  $  rk  rm  r   r   r   rl  rf   rf   rg   _extract_client_name!  s      z-YoutubeBaseInfoExtractor._extract_client_namec                 C   s   |  |dd dd ft|S )Nc                 S   s   | d S )NZINNERTUBE_CLIENT_VERSIONrf   rn  rf   rf   rg   rj  (  rk  zBYoutubeBaseInfoExtractor._extract_client_version.<locals>.<lambda>c                 S   s   | d d d S )Nr9   r6   r8   rf   rn  rf   rf   rg   rj  )  rk  ro  rp  rf   rf   rg   _extract_client_version&  s      z0YoutubeBaseInfoExtractor._extract_client_versionc                 C   s,   | j ddgt dd p*|p*| |p(dS )NZinnertube_hostrj   r   r   rU   )r   	YoutubeIEr   re  )r   Zreq_api_hostnamerl  rf   rf   rg   _select_api_hostname+  s
    z-YoutubeBaseInfoExtractor._select_api_hostnamec                 C   sD   t || |fdtd}t|dti d}|| jp4dddd |S )	Nr9   rh  r6   rh  r   ry   r   r   )rx   ZtimeZoneZutcOffsetMinutes)r   rc  r  r+   r  r   )r   r   rl  contextZclient_contextrf   rf   rg   _extract_context/  s      z)YoutubeBaseInfoExtractor._extract_contexthttps://www.youtube.comc                 C   s   t t }| jd kr|| d}t|d}|rv|jrv|j| _| d |ds|| d | jdd| jd|d d	 nd
| _| jsd S t	
| d| j d|   }d| d| S )Nrz  )z__Secure-3PAPISIDSAPISIDzExtracted SAPISID cookier{  z2Copying __Secure-3PAPISID cookie to SAPISID cookier   Ti  )r   expire_timeF zSAPISIDHASH r`   )roundrV  _SAPISIDr   r   r   r1  r   r   hashlibsha1rI  	hexdigest)r   originZtime_nowZ
yt_cookiesZsapisid_cookieZsapisidhashrf   rf   rg   _generate_sapisidhash_header9  s4    

 



    z5YoutubeBaseInfoExtractor._generate_sapisidhash_headerTDownloading API JSONUnable to download API pagec                 C   s   |rd|ind| j |di}|| | j|d}|ddi |rN|| | jd| |
| d| ||||t|d|t| j	d|	gt
 d	d
d dddd ddS )Nrx  rl  zcontent-typer=  https://z/youtubei/v1/utf8Zinnertube_keyTr   r   r   false)keyZprettyPrintc                 S   s   |S r	  rf   r`   vrf   rf   rg   rj  d  rk  z4YoutubeBaseInfoExtractor._call_api.<locals>.<lambda>)Zcndn)r?  r  r@  rP  rA  rB  query)ry  r  generate_api_headersrE  ru  r  rF  rI  r   r   rt  r   )r   epr  r?  r  rB  r@  rP  rx  Zapi_keyapi_hostnamerl  rA  Zreal_headersrf   rf   rg   	_call_apiR  s8    

       z"YoutubeBaseInfoExtractor._call_apic                 C   s   | j | j|d||dS )Nzyt initial datar  )_search_json_YT_INITIAL_DATA_RE)r   item_idwebpager  rf   rf   rg   extract_yt_initial_dataf  s    z0YoutubeBaseInfoExtractor.extract_yt_initial_datac                  G   s0   | D ]&}t t|dd }|dk	r|  S qdS )zr
        Index of current account in account list.
        See: https://github.com/yt-dlp/yt-dlp/pull/519
        c                 S   s   | d S )NZSESSION_INDEXrf   rn  rf   rf   rg   rj  p  rk  zAYoutubeBaseInfoExtractor._extract_session_index.<locals>.<lambda>N)r   r-   )rA  r   session_indexrf   rf   rg   _extract_session_indexi  s    z/YoutubeBaseInfoExtractor._extract_session_indexc                 C   s$   |sd S | d\}}}|r |S d S )Nz||)r  )r   data_sync_idZchannel_syncidr`   Zuser_syncidrf   rf   rg   %_data_sync_id_to_delegated_session_idt  s
    z>YoutubeBaseInfoExtractor._data_sync_id_to_delegated_session_idc                 G   s0   t |ddthtf }r|S | j| }| |S )z
        Extract current session ID required to download private playlists of secondary channels
        @params response and/or ytcfg
        .ZDELEGATED_SESSION_ID)r+   r   any_extract_data_sync_idr  )r   argsZdelegated_sidr  rf   rf   rg   _extract_account_syncid}  s    
z0YoutubeBaseInfoExtractor._extract_account_syncidc                 G   s4   | j ddgtddd  }r |S t|ddthtfS )z
        Extract current account dataSyncId.
        In the format DELEGATED_SESSION_ID||USER_SESSION_ID or USER_SESSION_ID||
        @params response and/or ytcfg
        r  NTr  r   .)ZDATASYNC_ID)responseContextZmainAppWebResponseContextZ
datasyncId)r   rt  r+   r   r  )r   r  r  rf   rf   rg   r    s     z.YoutubeBaseInfoExtractor._extract_data_sync_idc                 G   s0   | j ddgtddd  }r |S t|dgtdS )zv
        Extracts visitorData from an API response or ytcfg
        Appears to be used to track session state
        visitor_dataNTr  r   )ZVISITOR_DATA)r9   r6   visitorData)r  r  rv  )r   rt  r   r   )r   r  r  rf   rf   rg   _extract_visitor_data  s     z.YoutubeBaseInfoExtractor._extract_visitor_datac                 C   s   | j pt|  S r	  )r  boolr  r  rf   rf   rg   r_    s    z)YoutubeBaseInfoExtractor.is_authenticatedc                 C   s*   |si S | j | jd|ddd|ddp(i S )Nz"ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;r   {}r   Fr  )_parse_jsonr   )r   r?  r  rf   rf   rg   extract_ytcfg  s       z&YoutubeBaseInfoExtractor.extract_ytcfgc                 C   s8   |    tj| j}|si S d|d  d|d  iS )NAuthorizationr$  r}  r#  )r[  r   r)  r   r  )r   Zoauth_tokenrf   rf   rg   _generate_oauth_headers  s     z0YoutubeBaseInfoExtractor._generate_oauth_headersr   account_syncidr  r  c                K   sv   i }|p|  |}|r||d< |d kr0| |}|s<|d k	rP|d k	rH|nd|d< | |}|d k	rr||d< ||d< |S )NzX-Goog-PageIdr   zX-Goog-AuthUserr  zX-Origin)r  r  r  )r   r   r  r  r  kwargsrB  authrf   rf   rg   _generate_cookie_auth_headers  s    

z6YoutubeBaseInfoExtractor._generate_cookie_auth_headers)r   r  r  r  r  rl  c          
   	   K   sv   d|  || }t| j|dd |d| ||||p>| || j|dd |dd|  | j||||d}	t|	S )Nr  c                 S   s   | d S )Nr:   rf   rn  rf   rf   rg   rj    rk  z?YoutubeBaseInfoExtractor.generate_api_headers.<locals>.<lambda>r  c                 S   s   | d d d S )Nr9   r6   r<   rf   rn  rf   rf   rg   rj    rk  )zX-YouTube-Client-NamezX-YouTube-Client-VersionZOriginzX-Goog-Visitor-Idz
User-Agentr  )ru  r   rm  rr  r  r  r  r   )
r   r   r  r  r  r  rl  r  r  rB  rf   rf   rg   r    s    

z-YoutubeBaseInfoExtractor.generate_api_headersc                 C   s   |   S r	  )r  r  rf   rf   rg   _generate_webpage_headers  s    z2YoutubeBaseInfoExtractor._generate_webpage_headersc              	   C   s^   ddd| dd |}|s"i S | j||dd|dd	  d
|  d}| ||p\i S )Nrz  zhttps://music.youtube.comzhttps://www.youtube.com/embed/z?html5=1)rU   rW   rV   FzDownloading r`   r}  z client config)r  r@  rB  )r   _download_webpager5  r2  r  r  )r   r6   r?  r   r  rf   rf   rg   _download_ytcfg  s     
   z(YoutubeBaseInfoExtractor._download_ytcfgc                 C   s   d| i}|rd|i|d< |S )NcontinuationclickTrackingParamsZclickTrackingrf   )r  ctpr  rf   rf   rg   _build_api_continuation_query  s     z6YoutubeBaseInfoExtractor._build_api_continuation_queryc                 C   sH   t |dd dd ft}|s d S |d}|s2d S |d}| ||S )Nc                 S   s   | d d d S )Ncontinuationsr   ZnextContinuationDatarf   rn  rf   rf   rg   rj    rk  zJYoutubeBaseInfoExtractor._extract_next_continuation_data.<locals>.<lambda>c                 S   s   | d d S )Nr  reloadContinuationDatarf   rn  rf   rf   rg   rj    rk  r  r  )r-   r  r   r  )clsrenderernext_continuationr  r  rf   rf   rg   _extract_next_continuation_data  s     

z8YoutubeBaseInfoExtractor._extract_next_continuation_data)continuation_epc                 C   s<   t |tr8t|dd t}|s"d S |d}| ||S d S )Nc                 S   s   | d d S )NZcontinuationCommandrZ  rf   rn  rf   rf   rg   rj    rk  zHYoutubeBaseInfoExtractor._extract_continuation_ep_data.<locals>.<lambda>r  )rJ  r  r-   r   r   r  )r  r  r  r  rf   rf   rg   _extract_continuation_ep_data  s    
  
z6YoutubeBaseInfoExtractor._extract_continuation_ep_datac                 C   s$   |  |}|r|S t|dd| jdS )N))contentsr   rows.continuationItemRenderer)continuationEndpoint)buttonbuttonRenderercommandFget_allrh  )r  r+   r  )r  r  r  rf   rf   rg   _extract_continuation  s    
 z.YoutubeBaseInfoExtractor._extract_continuationc                 c   sb   t |dd tpg D ]H}t|ts$q| D ].}|d}|s@q,| |d}|r,||fV  q,qd S )Nc                 S   s   | d S )Nalertsrf   rn  rf   rf   rg   rj    rk  z:YoutubeBaseInfoExtractor._extract_alerts.<locals>.<lambda>typetext)r-   listrJ  r  valuesr   	_get_text)r  rA  Z
alert_dictalert
alert_typemessagerf   rf   rg   _extract_alerts  s    

z(YoutubeBaseInfoExtractor._extract_alertsc           	      C   s   g g  }}|D ]@\}}|  dkr6|r6|||g q|| jkr|||g q||d d  D ]"\}}| jd| d| |d q`|rtd|d d  |dd S )Nr  rv   zYouTube said:  - 	only_oncer   r   )lowerappend_IGNORED_WARNINGSr   r   )	r   r  r   r  r  errorswarningsr  Zalert_messagerf   rf   rg   _report_alerts#  s    

z'YoutubeBaseInfoExtractor._report_alertsc                 O   s   | j | |f||S r	  )r  r  )r   rA  r  r  rf   rf   rg   _extract_and_report_alerts0  s    z3YoutubeBaseInfoExtractor._extract_and_report_alerts)
badge_listc                 C   s   t jt jt jt jt jt jd}t jt jt jt jt jd}t jt jt jt jt jt jt jd}g }t|ddd fD ]}|	t|dt
dp|	t|d	}|r|d
|i qpt|dddddt
dd}| D ]&\}	}
|	| kr|d
|
i  qpqqp|S )zr
        Extract known BadgeType's from a list of badge renderers.
        @returns [{'type': BadgeType}]
        )PRIVACY_UNLISTEDPRIVACY_PRIVATEPRIVACY_PUBLICZCHECK_CIRCLE_THICKZOFFICIAL_ARTIST_BADGEZCHECK)ZBADGE_STYLE_TYPE_MEMBERS_ONLYZBADGE_STYLE_TYPE_PREMIUMZBADGE_STYLE_TYPE_LIVE_NOWZBADGE_STYLE_TYPE_VERIFIEDZ BADGE_STYLE_TYPE_VERIFIED_ARTIST)unlistedprivatezmembers onlyliveZpremiumZverifiedzofficial artist channel.c                 S   s   t d| S )Nz[bB]adgeRenderer$)research)r  r`   rf   rf   rg   rj  T  rk  z:YoutubeBaseInfoExtractor._extract_badges.<locals>.<lambda>)iconiconTyperv  styler  label)accessibilityDatar  ZtooltipZiconTooltipFrj   )r  rh  r   )r   r   r   r   r   r   r   r   r+   r   r   r  r   r  )r   r  Zicon_type_mapZbadge_style_mapZ	label_mapbadgesZbadge
badge_typer  matchZlabel_badge_typerf   rf   rg   _extract_badges3  sX    
	
       z(YoutubeBaseInfoExtractor._extract_badgesc                    s   t t|  fddS )Nc                    s   |d  kS )Nr  rf   r  r  rf   rg   rj  i  rk  z5YoutubeBaseInfoExtractor._has_badge.<locals>.<lambda>)r  r+   )r  r  rf   r  rg   
_has_badgeg  s    z#YoutubeBaseInfoExtractor._has_badgemax_runsc             	   G   s   |pd gD ]}|d kr| g}n*t | |g d}tdd t|D sH|g}|D ]}t|dd t}|rp|    S t|dd tpg }|st|tr|}|d tt||pt| }d	t |dtd	}|rL|    S qLq
d S )
Nr   c                 s   s$   | ]}|d kpt |ttfV  qdS ).N)rJ  r  r}   rm   r  rf   rf   rg   ro   r  s     z5YoutubeBaseInfoExtractor._get_text.<locals>.<genexpr>c                 S   s   | d S )N
simpleTextrf   rn  rf   rf   rg   rj  u  rk  z4YoutubeBaseInfoExtractor._get_text.<locals>.<lambda>c                 S   s   | d S )Nrunsrf   rn  rf   rf   rg   rj  x  rk  rj   ).r  rv  )
r+   r  r5   r-   r   r  rJ  minlenrp   )rA  r  	path_listpathobjitemr  r  rf   rf   rg   r  k  s"    z"YoutubeBaseInfoExtractor._get_textc                 G   sH   | j |f| pd}t|}|d krDt| jdtdd|dd d}|S )Nrj   z	^([\d,]+)z\scountr   )r  r    r(   r   r  sub)r   rA  r  Z
count_textr  rf   rf   rg   
_get_count  s    z#YoutubeBaseInfoExtractor._get_count
thumbnails	final_keyc             
   G   s   g }|pdgD ]p}t | t||dfD ]T}t|d}|s@q(d|krV|dd }||t|dt|dd	 q(q|S )
z
        Extract thumbnails from thumbnails dict
        @param path_list: path list to level that contains 'thumbnails' key
        rf   .r   maxresdefault?r   heightwidth)r   r  r  )r+   r5   r3   r   rb   r  r   )rA  r  r  r  r  	thumbnailthumbnail_urlrf   rf   rg   _extract_thumbnails  s    z,YoutubeBaseInfoExtractor._extract_thumbnailsc                 C   s`   t d| }|r\|d}|r&t|S ztd|d|dW S  tk
rZ   Y dS X dS )z
        Extracts a relative time from string and converts to dt object
        e.g. 'streamed 6 days ago', '5 seconds ago (edited)', 'updated today', '8 yr ago'
        z(?P<start>today|yesterday|now)|(?P<time>\d+)\s*(?P<unit>sec(?:ond)?|s|min(?:ute)?|h(?:our|r)?|d(?:ay)?|w(?:eek|k)?|mo(?:nth)?|y(?:ear|r)?)s?\s*agostartznow-{}{}rV  unitN)r  r  groupr   formatr  )Zrelative_time_textmobjr	  rf   rf   rg   extract_relative_time  s    
z.YoutubeBaseInfoExtractor.extract_relative_timec                 C   s   |sd S |  |}d }t|tjr0t| }|d krZt|pXt| jd|	 dd d}|r|d kr| j
dkr| jd| ddd |S )	N)z([a-z]+\s*\d{1,2},?\s*20\d{2})z<(?:.+|^)(?:live|premieres|ed|ing)(?:\s*(?:on|for))?\s*(.+\d)z	time textr   )Nry   z"Cannot parse localized time text "r/  Tr  )r  rJ  dtdatetimecalendartimegm	timetupler0   r   r  r   r   )r   r  Zdt_	timestamprf   rf   rg   _parse_time_text  s,    

  
 z)YoutubeBaseInfoExtractor._parse_time_textbrowsec                 C   s  t | jdtd}t| j|d}t|}t|  }t|}z*| j|d||||| ||
|	|
d	}W n tk
rj } zt	|j
ts| j||d W Y S t	|j
ts||_t| W Y q>|j
jd}t|s$t| j| j|j
jd ||dpd|d	dd
d t}|r$| jd|fgd	d |j
jdkrH||_t| W Y q>| j||d W Y S d }~X Y nX z| j|dd W n\ tk
r } z<d|j kr||_t| W Y q>| j||d W Y S d }~X Y nX t|ft| stddd|_t|d }|s>d S q>|S )NZraise_incomplete_datars  r  T)	r  r  rB  r?  r  r@  rx  r  rl  i   )prefixr  Fc                 S   s   | d d S )Nr  r  rf   rn  rf   rf   rg   rj    rk  z<YoutubeBaseInfoExtractor._extract_response.<locals>.<lambda>ERROR  i  r  zunknown errorzIncomplete data receivedr   )r  r   rt  iterrU  nextr  ry  r   rJ  rK  r
   _error_or_warningr   r  r!  readr   r-   r  r  r   r  statusr  msgr  r+   r5   )r   r  r  r@  rB  r   check_get_keysr  r  r  rl  Zraise_for_incompleteZicd_retriesZicd_rmZmain_retriesZmain_rmr!  r7  Zfirst_bytesZyt_errorZshould_retryrf   rf   rg   _extract_response  sr        
 
   $$
z*YoutubeBaseInfoExtractor._extract_responsec                 C   s   t d| d k	S )Nz (https?://)?music\.youtube\.com/)r  r  r   rf   rf   rg   is_music_url  s    z%YoutubeBaseInfoExtractor.is_music_urlc              +   C   s  | d}t|d}| |ddp,| |d}| |d}t| d}|d krbt| |dd	}|d krt| jd
t|ddtd|d dd}t|dtdd}|st|d}| |}t|ddtd}| t|d}	| t|d}
t	dt|dtdpd}d| }|dksd|kr&d| }| |dd pF| |d!pFd}t
t|d"dd#}|d k	rhd$n2d%| krzd&n |d'ks| |	tjrd(nd }| |d)d*d pd}d+| krd,n| d-|i}|d.krd/nd0}| |d1d2p| |d3}t|d4| jdd}d5d6d7t d8|d6|d|d9|d|d:|d;|d<|rLd=| nd d>|d?|d@t|d dAd dBdC| |dDdE| jdFtdGr| |nd dH|dI| |	tjrdJnP| j| |	tjpd | |	tjpd | |	tjpd | |	tjpd dK||dL|dM| |
tjrdNnd iS )ONvideoId)navigationEndpointreelWatchEndpointoverlayZreelPlayerOverlayRendererZ"reelPlayerHeaderSupportedRenderersZreelPlayerHeaderRenderertitleZheadlineZreelTitleTextdescriptionSnippetlengthSecondsZ
lengthText)thumbnailOverlays."thumbnailOverlayTimeStatusRendererr  z](?i)(ago)(?!.*\1)\s+(?P<duration>[a-z0-9 ,]+?)(?:\s+[\d,]+\s+views)?(?:\s+-\s+play\s+short)?$)r)  accessibilityr  r  rj   )r   rh  duration)r   r  )shortBylineTextr  .r&  browseEndpointbrowseIdFrh  r  )ZchannelNavigationEndpointr1  r2  )r,  .r-  r  r  r  ownerBadgesru   )r&  commandMetadatawebCommandMetadatar   rv   https://www.youtube.com/watch?v=ZSHORTSz/shorts/https://www.youtube.com/shorts/publishedTimeTextZ	videoInfoZtimestampText)ZupcomingEventDataZ	startTimer  is_upcomingZstreamedwas_liveZLIVEis_liveviewCountTextZshortViewCountTextzno viewsr   r  r=  r;  concurrent_view_count
view_count	ownerTextr0  ZchannelTitleText)r0  r  .r&  r5  r6  r   r1  canonicalBaseUrl_typer   r   r   description
channel_idchannelchannel_url https://www.youtube.com/channel/uploaderuploader_iduploader_urlhttps://www.youtube.com/%sr   r  r  r  approximate_daters  release_timestampavailabilitypublic)
is_privateneeds_premiumneeds_subscriptionis_unlistedlive_statuschannel_is_verifiedT)r   r+   r  r   r!   r   r   r   r  r4   r(   r  r  r   r   r  r   rt  r   r   r  r   YoutubeTabIEr  r   _availabilityr   r   r   r   r   )r   r  r?  Zreel_header_rendererr)  rH  r/  rI  Zoverlay_styler  owner_badgesZnavigation_urlr   	time_textZscheduled_timestamprY  Zview_count_textrA  Zview_count_fieldrJ  channel_handlerf   rf   rg   _extract_video  s    

      

   



               
    z'YoutubeBaseInfoExtractor._extract_video)rU   )rU   )NrU   )rU   )rU   )N)NrU   )rz  )TNr  r  NNNrU   )T)N)TTF)r  NNNr  TNrU   )Xr   r   r   __doc___RESERVED_NAMES_PLAYLIST_ID_REr^  _INVIDIOUS_SITESr   r  r   r   r,  r   r   r   r   	functoolscached_propertyr   r   r  r  r  r  r)  r  rG  rH  rR  rQ  r  propertyr  r"  r.  r  r4  r6  r[  r  r
  r  _YT_INITIAL_PLAYER_RESPONSE_RErc  re  rm  rq  rr  ru  ry  r  r  r  r  staticmethodr  r  r  r  r  r_  r  r  r  r  r  r  r  classmethodr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r$  r`  rf   rf   rf   rg   r   ^  s   
                                                                             

	

H








           



	

    
	



4

           
B
r   c                `       s\  e Zd ZdZdjdejdZddgZ	dZ
dZd	d
dddddd	ddddddddddddddddddddddddddddd ddd	dddd!ddd	d"d#dd!dddd$ddd%dd&d'dd dddd(d)dd ddd*ddd+d!d,dd*d"d#d+d!d,dd*ddd+d d,dd*d&d'd+d d,ddd"d#dd!dddd"d#dd!ddddd-dd!dd.d/dd#d-dd!dd.d/ddd-dd dd.d/dd'd-dd dd.d/d*dd-d+d!d,d.d/d*d#d-d+d d,d.d/d*dd-d+d d,d.d/ddd0dd1dd2d/ddd0dd1dd2d/ddd0dd!dd2d/dd#d0dd!dd2d/ddd0dd3dd2d/dd'd0dd3dd2d/ddd0dd1dd2d/dd4d0dddd2d/ddd5dd6ddd5dd6dd#d5dd6ddd5dd6dd'd5dd6dd5dd7ddd5dd6dd#d5dd6dd8d5dd6ddd5dd9d:dd'd5dd9d:dd;d5dd6d<d=dd1d>d?d<d=dd!d>d?d<d=dd3d>d?d<d=dd>d@d<d=dd>d@d<d=dAd>d@d<d=dBd>d@d*ddd5d*d,dCd*d#d"d5d*d,dCd*ddd5d*d,dCd*d'd&d5d*d,dCd*d#d"d5d*d,dCd*d#d"d5d*d,dCd*dd5d*dDdEd*dd5dDd6d*dd5dDd6d*d#d5dDd6d*d#d5dDd6d*d#d5dDd6d*dd5dDd6d*d'd5dDd6d*d8d5dDd6d*d;d5dDd6d*dd5dDd9d:d*d'd5dDd9d:d*d8d5dDd9d:d*d;d5dDd6d*d;d5dDd9d:d*d+d=d!dFd*d+d=d3dFd*d=dGdHdId*d=dGdJdId*d=dGdKdIdLdMiddd5dNd6ddd5dNd6ddd5dOd6dd#d5dPd6ddd5dQd6dd'd5dRd6dd8d5dSd6dd;d5dSd6dTVZdUZdVZdWZdXZdYdZdd[d\d]d^d_d`dagdbgdceedddedfdgdhdidjeed\dkdldmdndodpdqdrdsddtdudvdwdxdydzd{d|dZdd[d\d]d^d_d`dagdbgdceedddedfdgdheed\dkdldmdnd}d~deiddddd<d_ddddeddddddd<dddddeddededdgddddddgdhdedddddeddddddddddddwdgdddeddgdddeeedddededmddddddddddddwddddedgdgddgdeddeedddededddddddddddweddedddgdddddgdedgddeeddddd՜dddddddddddhdddddgedWddedddddgddddgdeddddddddeddddddddddddddedgddedddedhddgdedddddgddddd dddeddedgdddd	d
dddddddg
dddhdddededdddeddd~diddddddddd ded!dhd"d#d$d%ed&gedgd'eed!d(d)d*d+dpd,d,d*d-dd.d/d~did0d1d2d3d*d4d5d6d7d8d9d:d;d<d=d>dd?d@dAddedBdd0dCdDdEdFdGdHdIdJddKdGdLedMdddedNdgddOdPdQedhedRdSedTdSdUdVdWidIdEddXdddMdSedGdYdhedOdRdZedNd[dTdeddgedSdUdVd\idId]dd^d_dRedddedNdGedOdTedMdSdgd`ddhdaedSdUdVdbigd~deidcdddedfdgdhdidcdjdkdedldmdedldndoddpdqdrdsdtdudqdudvdwdxgedgdydzd{ddd|deedhed}d~deidd~dedlddddddd/d~deidd1ddedlddddddddddedhdddgdddedgddgdeeedddddd~deiddddddddddededdhdddgddedgdeeeddddedmddd~deidddedlddedlddddddddd~deidd1dddddddddididdedddhdddgdddededgedddededdÜd~deidgdŜdƐdddȐdɐdʐdːd̜d~deid͐d1ddedlddedlddedlddedlddedlddedldԐddd֐dאdؐdِdڐd9dedWdۜd:d1dܐdddސdߐddgdgdސdddedeedgddddddddhdd"dgedd~deidddedlddddddddddd~deidd1ddddddededg ddddhdgddedgdedddd dd~deiddddddddeddgdgddd	ddedhed
deeeddddedmddd~deidddedlddedldddddddddedgdddheddddddgdddddgdeededd~deidddedldddd d!d"d#d$dged%d&d'dd(d)gd*dwdd+edgdeed%d,d-eded.d/dd;d0d0dd1d2d3d4d5gd6ed7d8d9d:d;d<gd=dhddd>dgdeed7d?d@dAdBd~deiddCdedldDdedldEdedldFdGdHddIdJdKdLdMdgedNdOdPdQdRdSdTgdUdhddedgdeeedNdVdWededmdXdYdXdZd[giid\d]d1dded^dXd_d`giiidadbdedldcdddedfdgdhdidjedkdledmdeddddndgdodgdheedndpdqededmdrdsdfdedtdudvdwddxdydzd{d|edhdgd}dedgd~eddddeeddddmdddpddddddddedhdgddedgdd~d~eddddedddededmdddpddddeddgededddddhdddedededdddddddd~deidddddded'dddhdgeddddgdeedg ddddddpddddddg ededed'ddhddgdd&gddddddd~deidddddg ddgdded&gdddddhddedddddeddedXdÐdgiidŜdgdŜdǐddeddɐdʐdddgddgdedΐdϐddeedѐddhdddeg dАdԐdededmd֜dXdZdgiidؐdٜdudڐddd*dddedddddddgdeedgddwdededgdddddԐdݜdXdZdgiidߐdٜddddddhed{dddedddddddgdededddeddgddddddddedmdddpdddeddedhedgdddddddd ddddeededmdd^dXdgdgdiidgCZddd	dd
dddhddddddddgddedeeddgddddedageddddmddd~deidgZe fdd Z fd!d"Zd#d$ Zd%d& Zd'd(d)d*Zdd+d,Zd-d. Zed/d0 Zdd1d2Zd3d4 Zd5d6 Z d7d8 Z!d9d: Z"d;d< Z#d=d> Z$dd?d@Z%dAdB Z&dCdD Z'ddEdFZ(dGdH Z)e fdIdJZ*edKdL Z+dMdN Z,dOdP Z-dQdR Z.ddSdTZ/ddUdVZ0ddWdXZ1e2dYdZ Z3d[d\ Z4e2d]d^ Z5edd_d`Z6dadb Z7ddddeZ8ddfdgZ9e2dhdi Z:e2djdk Z;dldm Z<dndo Z=dpdq Z>drds Z?dtdu Z@dvdw ZAdxdy ZBdzd{ ZCdd|d}ZDd~d ZE  ZFS (  rt  ZYouTubea
  (?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}|
                            youtube\.googleapis\.com)/                        # the various hostnames, with wildcard subdomains
                         (?:.*?\#/)?                                          # handle anchor (#/) redirect urls
                         (?:                                                  # the various things that can precede the ID:
                             (?:(?:v|embed|e|shorts|live)/(?!videoseries|live_stream))  # v/ or embed/ or e/ or 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}
                         )/
                         |(?: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
                     (?:\#|$)|)	invidiousa  (?x)
            (?:
                <(?:[0-9A-Za-z-]+?)?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(?xs)
            <a\s[^>]*\bhref="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})"
            \s[^>]*\bclass="[^"]*\blazy-load-youtubevideo)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flvi     Zmp3@   Zh263)extr  r  acodecabrvcodeci  i  Z3gpZaacZmp4v)rp  rq  rs           mp4i  ih  `   Zh264i   i        iV  i  i@  )rp  r  rq  rs  i  i8  i   i   webmZvorbisZvp8Z3D)rp  r  format_noterq  rr  rs  
preferenceZHLS0      H   z
DASH video)rp  r  r}  rs  )rp  r}  rs  i  <   )rp  r  r}  rs  fpsip  Zm4az
DASH audioZm4a_dash)rp  r}  rq  rr  	container)rp  r}  rq  r  Zdtsezec-3)rp  r  r  r}  r  rs  Zvp9)rp  r  r}  r  rs  )rp  rq  r}  rr  Zopus2   )rp  r}  rq  rr  F      protocolZrtmpzav01.0.00M.08zav01.0.01M.08zav01.0.04M.08zav01.0.05M.08zav01.0.08M.08zav01.0.12M.08)V56Z1317Z1822Z34Z35Z36Z37Z38Z43Z44Z45Z46Z59Z78Z82Z83Z84Z85Z100Z101Z102Z91Z92Z93Z94Z95Z96Z132Z151Z133Z134135Z136Z137Z138Z160Z212Z264Z298Z299Z266Z139Z140141Z256Z258Z325Z328Z167Z168Z169Z170Z218Z219Z278Z242Z243Z244Z245Z246Z247Z248Z271Z272Z302Z303Z308Z313Z315Z171Z172Z249Z250Z251Z_rtmpZ394Z395Z396Z397Z398Z399Z400Z401)Zjson3Zsrv1Zsrv2Zsrv3ZttmlZvtt)rZ   r[   Fr   z6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9BaW_jenozKc#   youtube-dl test video "'/\ä↭𝕐Philipp HagemeisterUCLqxVugv74EIW3VWh2NOa3QzCre:https?://(?:www\.)?youtube\.com/channel/UCLqxVugv74EIW3VWh2NOa3QZ20121002z$md5:8fb536f4877b8a7455c2ec23794dbc22zScience & Technologyz
youtube-dlrz   rT  Tz4https://i.ytimg.com/vi/BaW_jenozKc/maxresdefault.jpgnot_liver   r   	   +https://www.youtube.com/@PhilippHagemeister@PhilippHagemeister	count:100i!kP)r   rp  r)  rJ  rI  rK  upload_daterH  
categoriestagsr/  rA  
like_countrS  playable_in_embedr  rY  	age_limit
start_timeend_timecomment_countchannel_follower_countrM  rO  rN  heatmapr  r   	info_dictz%//www.YouTube.com/watch?v=yZIXLfi8CZQzEmbed-only video (#1746)ZyZIXLfi8CZQZ20120608zCPrincipal Sexually Assaults A Teacher - Episode 117 - 8th June 2012z$md5:09b78bd971f1e3e289601dfba15ca4f7   )r   rp  r  r)  rH  r  zPrivate video)r   r@  r  skipz9https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQz!Use the first video ID in the URL)r   rp  r)  rJ  rI  rK  r  rH  r  r  r/  rA  r  rS  r  r  rY  r  r  r  rM  rO  rN  r  r  skip_download)r   r@  r  paramsz+https://www.youtube.com/watch?v=a9LDPn-MO4Iz.256k DASH audio (format 141) via DASH manifestza9LDPn-MO4Irj   zUHDTV TEST 8K VIDEO.mp4)r   rp  r  rH  r)  r  )youtube_include_dash_manifestr  zformat 141 not served anymore)r   r@  r  r  r  z+https://www.youtube.com/watch?v=IB3lcPjvWLAZIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree Wilsonz$md5:8f5e2b82460520b619ccac1f509d43bf   Z20131011gp=
/`@ZUChuZAo1RKL85gev3Eal9_zgz8https://www.youtube.com/channel/UChuZAo1RKL85gev3Eal9_zgz	The Sparkz:https://i.ytimg.com/vi_webp/IB3lcPjvWLA/maxresdefault.webpZAfrojackzcount:19ZMusicz!https://www.youtube.com/@Afrojackz	@Afrojack)r   rp  r)  rH  r/  r  rr  r  rI  r  rK  rA  trackrY  r  rJ  r  rS  r  r  	alt_titler  rM  rO  rN  z141/bestaudio[ext=m4a]r   r  r  zEmbed allowed age-gate videoz'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20140605Gamingz:https://i.ytimg.com/vi_webp/HtVdAasjOgU/maxresdefault.webp
needs_authz8https://www.youtube.com/channel/UCzybXLxv08IApdjdN0mJhEgzThe Witchercount:17ZUCzybXLxv08IApdjdN0mJhEgz#https://www.youtube.com/@thewitcherz@thewitcheriﱐS)r   rp  r)  rH  r/  r  r  r  r  rS  rK  r  rJ  rY  r  rI  r  rA  r  rM  rO  rN  r  rZ  r  r  z'Age-restricted; requires authentication)r@  r   r  r  z0Age-gate video with embed allowed in public sitez'https://youtube.com/watch?v=HsUATh_Nc2UZHsUATh_Nc2UzGodzilla 2 (Official Video)z$md5:bf77e03fcae5529475e500129b05668aZ20200408ZUCYQT13AtrJC0gsM1far_zJgZFlyingKittyz8https://www.youtube.com/channel/UCYQT13AtrJC0gsM1far_zJgEntertainmentZFlyingkittyz
godzilla 2z4https://i.ytimg.com/vi/HsUATh_Nc2U/maxresdefault.jpg   z'https://www.youtube.com/@FlyingKitty900z@FlyingKitty900)r   rp  r)  rH  r  r  rS  rI  rJ  rK  rA  r  rY  r  r  r  r/  r  r  rM  rO  rN  r  rZ  z5Age-gate video embedable only with clientScreen=EMBEDz'https://youtube.com/watch?v=Tq92D6wQ1mgZTq92D6wQ1mgz#[MMD] Adios - EVERGLOW [+Motion DL]Z20191228z$md5:17eccca93a786d51bc67646756894066zUC1yoRdFoFJaCY-AGfD9W0wQz6https://i.ytimg.com/vi_webp/Tq92D6wQ1mg/sddefault.webpzProjekt MelodyZmmdZdanceZmikumikudanceZkpopZvtuberj   z8https://www.youtube.com/channel/UC1yoRdFoFJaCY-AGfD9W0wQz&https://www.youtube.com/@ProjektMelodyz@ProjektMelodyit^)r   r)  rp  r  rH  r  r  rS  rI  rA  r  rJ  rY  r  r  r  r/  rK  r  r  rM  rO  rN  r  z!Non-Agegated 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Such mich find michZoomphzsuch mich find michZlyricszgerman industrialzmusica industrialzOOMPH!z0https://i.ytimg.com/vi/MeJVWBSsPAY/sddefault.jpg   z
Herr LurikzUCdR3RSDPqub28LjZx0v9-aAz8https://www.youtube.com/channel/UCdR3RSDPqub28LjZx0v9-aAz"https://www.youtube.com/@HerrLurikz
@HerrLurik)r   rp  r)  rH  r  r  r  r  r  r  creatorr  rA  r  r/  rJ  rI  r  rS  rK  rY  artistr  rM  rO  rN  )r@  r   r  zNon-bypassable age-gated videoz'https://youtube.com/watch?v=Cr381pDsSsAr@  r   only_matchingZ__2ABJjxzNoi
  Z20100430Zdeadmau5z$md5:6cbcd3a92ce1bc676fc4d6ab4ace2336zDeadmau5 - Some Chords (HD)zSome Chordszcount:14zUCYEK6xds6eo-3tr4xRdflmQz:https://i.ytimg.com/vi_webp/__2ABJjxzNo/maxresdefault.webpz8https://www.youtube.com/channel/UCYEK6xds6eo-3tr4xRdflmQz!https://www.youtube.com/@deadmau5z	@deadmau5)r   rp  r/  r  r  rH  r)  r  rS  r  rI  rA  rY  rJ  r  r  r  r  r  r  rK  r  albumr  rM  rO  rN  zDASH manifest missing)r   r  expected_warningsZlqQg6PlCWgIi  Z20150827z$md5:04bbbf3ccceb6795947572ca36f45904z5Hockey - Women -  GER-AUS - London 2012 Olympic GamesiDPZSportsZ20120731ZOlympicsZHockeyz
2012-07-31z31 July 2012zRiverbank ArenaSessionzOlympic GameszLondon 2012z2012 Summer OlympicszSummer GamesZUCTl3QQTvqHFjurroKxexy2Qz4https://i.ytimg.com/vi/lqQg6PlCWgI/maxresdefault.jpgr<  z8https://www.youtube.com/channel/UCTl3QQTvqHFjurroKxexy2Qz!https://www.youtube.com/@Olympicsz	@OlympicsiZtU)r   rp  r/  r  rH  r)  r  rR  r  r  release_daterJ  r  rI  r  r  rS  rY  rA  rK  r  rM  rO  rN  rZ  r  zrequires avconvz+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0gqq?rS   Z20110310uu   made by Wacom from Korea | 字幕&加油添醋 by TY's Allen | 感謝heylisa00cavey1001同學熱情提供梗及翻譯u8   [A-made] 變態妍字幕版 太妍 我就是這樣的人u	   孫ᄋᄅzcount:11z8https://www.youtube.com/channel/UCS-xxCmRaA6BFdmgDPA_BIwzUCS-xxCmRaA6BFdmgDPA_BIwz4https://i.ytimg.com/vi/_b-2C3KPAM0/maxresdefault.jpgPeople & Blogsr  z"https://www.youtube.com/@AllenMeowz
@AllenMeowiyM)r   rp  stretched_ratior/  r  rH  r)  r  rJ  r  r  rK  rI  r  rA  r  r  rY  rS  r  r  rM  rO  rN  r  ZqEJwOuvDf7Iu   Обсуждение судебной практики по выборам 14 сентября 2014 года в Санкт-ПетербургеZ20150404)r   rp  r)  rH  r  zThis live event has ended.)r   r  r  r  z+https://www.youtube.com/watch?v=FIl7x6_3R5YZFIl7x6_3R5Yz$md5:7b81415841e02ecd4313668cde88737az$md5:116377fd2963b81ec4ce64b542173306   Z20150625zmincount:31)r   rp  r)  rH  r/  r  formatsznot actual anymore)r   r  r  z)https://www.youtube.com/embed/CsmdDsKjzN8Z 8ce563a1d667b599d21064e982ab9e31ZCsmdDsKjzN8Z20150501uA   Retransmisión en directo de la XVIII media maratón de Zaragoza.u1   Retransmisión XVIII Media maratón Zaragoza 2015r  )r   md5r  r  r  z+https://www.youtube.com/watch?v=zaPI8MvL8pgZzaPI8MvL8pgz/Terraria 1.2 Live Stream | Let's Play - Part 04z$md5:563ccbc698b39298481ca3c571169519)r   r)  rH  r  Zj5yGuxZ8lLUz7Terraria 1.2 Live Stream | Let's Play - Part 04 (Chris)i'  z8https://www.youtube.com/channel/UCN2XePorRokPB9TEgRZpddgZ20131105zcount:24iyRz4https://i.ytimg.com/vi/j5yGuxZ8lLU/maxresdefault.jpgZUCN2XePorRokPB9TEgRZpddgZWiiLikeToPlayZ20131106z@WLTPzhttps://www.youtube.com/@WLTP)r   rp  r)  rH  r/  r  rK  rS  r  r  r  rY  r  rR  r  r  r  r  rI  rJ  rA  r  rM  rN  rO  z7Terraria 1.2 Live Stream | Let's Play - Part 04 (Tyson)i|'  iyRz4https://i.ytimg.com/vi/zaPI8MvL8pg/maxresdefault.jpg)r   rp  r)  rS  rK  rJ  r  rH  r/  r  r  r  rI  rR  r  r  r  r  r  rY  r  rA  rM  rN  rO  ZR7r3vfO7Haoz9Terraria 1.2 Live Stream | Let's Play - Part 04 (Spencer)z4https://i.ytimg.com/vi/R7r3vfO7Hao/maxresdefault.jpgiyRi'  )r   rp  r)  r  rI  r  rS  r  r  rH  r  r  r  r  rK  rJ  r  rR  rY  r  r/  rA  rM  rN  rO  zNot multifeed anymore)r   r  playlistr  r  z+https://www.youtube.com/watch?v=gVfLd0zydloZgVfLd0zydloz/DevConf.cz 2016 Day 2 Workshops 1 14:00 - 15:30r   r)  r   r   r  playlist_countr  zhttps://vid.plus/FlRa-iH7PGwr   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20151119z0Todd Haberman;
Daniel Law Heath and Aaron Kaplanz6Position Music - Production Music Vol. 143 - Dark Walkz:https://i.ytimg.com/vi_webp/lsguqyKfVQg/maxresdefault.webpzFilm & Animationz8https://www.youtube.com/channel/UCTSRgz5jylBvFt_S7wnsqLQZUCTSRgz5jylBvFt_S7wnsqLQcount:13ZIronSoulElf)r   rp  r)  r  rH  r/  r  r  r  r  r  r  r  rA  rY  rK  rI  r  rS  rJ  r  r  r  r  z+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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20150128z4Creative Commons Attribution license (reuse allowed)ZUCuLGmD72gJDBwmLw06X58SAz8https://www.youtube.com/channel/UCuLGmD72gJDBwmLw06X58SAzCopyright (Legal Subject)zLaw (Industry)zWilliam W. Fisher (Author)z/The Berkman Klein Center for Internet & SocietyZ	Educationz:https://i.ytimg.com/vi_webp/M4gD1WSo5mA/maxresdefault.webpz@BKCHarvardz#https://www.youtube.com/@BKCHarvardi<pT)r   rp  r)  rH  r/  r  licenserI  rK  r  r  r  rJ  rS  rA  r  r  rY  r  r  chaptersrM  rN  rO  r  z+https://www.youtube.com/watch?v=eQcmzGIKrzgZeQcmzGIKrzgz8Democratic Socialism and Foreign Policy | Bernie Sandersz$md5:13a2503d7b5904ef4b223aa101628f39i  Z20151120count:12ZUCH1dpzjCEiGAt8CXkryhkZgNews & PoliticszBernie Sandersz:https://i.ytimg.com/vi_webp/eQcmzGIKrzg/maxresdefault.webpz8https://www.youtube.com/channel/UCH1dpzjCEiGAt8CXkryhkZgz&https://www.youtube.com/@BernieSandersz@BernieSandersiNV)r   rp  r)  rH  r/  r  r  r  r  r  rI  r  rS  r  rJ  r  rA  rY  rK  r  r  r  rM  rO  rN  rZ  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20150811Standard YouTube License)r   rp  r)  rH  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
Mind Fieldz:https://i.ytimg.com/vi_webp/iqKdEhx-dD4/maxresdefault.webpZVsaucez	Episode 1zSeason 1zUC6nSFpj9HTCZ5t-N3Rm3-HAz8https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HAzhttps://www.youtube.com/@Vsaucez@VsauceiקX)r   rp  r)  rH  r/  r  seriesseason_numberepisode_numberr  r  rA  rS  r  rJ  Zepisoder  ZseasonrI  rK  r  r  rY  r  rM  rO  rN  r  rZ  r  zSkipping DASH manifestr   r  r  r  z+https://www.youtube.com/watch?v=6SJNVb0GnPIZ6SJNVb0GnPIz Race Differences in Intelligencez$md5:5d161533167390427a1f8ee89a1fc6f1i  Z20140124)r   rp  r)  rH  r/  r  zJThis 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maxcount:10)r  r  z-https://music.youtube.com/watch?v=MgNrAu2pzNsZMgNrAu2pzNszVoyeur Girlz$md5:7ae382a65843d6df2685993e90a8628fZ20190312ZStephenz"it's too much love to know my dearZ20190313z8https://www.youtube.com/channel/UC-pWHpBjdGG69N9mM2auIAA   z:https://i.ytimg.com/vi_webp/MgNrAu2pzNs/maxresdefault.webpzUC-pWHpBjdGG69N9mM2auIAA)r   rp  r)  rH  r  artistscreatorsr  r  r  r  rA  r  r  r  rK  rJ  rM  rS  r/  r  r  rI  r  rY  r  z/https://www.youtubekids.com/watch?v=3b8nCWDgZ6QZDJztXj2GPflZDJztXj2GPfkz9Panjabi MC - Mundian To Bach Ke (The Dictator Soundtrack)z$md5:bf577a41da97918e94fa9798d9228825Z20090125z
Panjabi MCz@Beware of the Boys (Mundian to Bach Ke) - Motivo Hi-Lectro Remixz'Beware of the Boys (Mundian To Bach Ke))r   rp  r)  rH  r  r  r  r  zVideo unavailablez+https://www.youtube.com/watch?v=x41yOUIvK2kZx41yOUIvK2kzIMG 3456Z20170613z:https://i.ytimg.com/vi_webp/x41yOUIvK2k/maxresdefault.webpZUCo03ZQPBW5U4UC3regpt1nwz8https://www.youtube.com/channel/UCo03ZQPBW5U4UC3regpt1nwzPets & AnimalsrR   zl'Or Vert asblz&https://www.youtube.com/@ElevageOrVertz@ElevageOrVerti?Y)r   rp  r)  rH  r  rA  r  r  rI  r  rK  rS  r  r  r/  r  rY  rJ  r  rM  rO  rN  r  z+https://www.youtube.com/watch?v=CHqg6qOn4noZCHqg6qOn4noz+Part 77   Sort a list of simple types in c#z$md5:b8746fa52e10cdbf47997903f13b20dcZ20130831ZUCCTVrRB5KpIiK6V2GGVsR1Qz8https://www.youtube.com/channel/UCCTVrRB5KpIiK6V2GGVsR1Qz0https://i.ytimg.com/vi/CHqg6qOn4no/sddefault.jpgi
  Z	kudvenkatz7https://www.youtube.com/@Csharp-video-tutorialsBlogspotz@Csharp-video-tutorialsBlogspoti@"R)r   rp  r)  rH  r  rI  r  rK  rY  r  rS  r  r  r  r  rA  r/  rJ  r  r  r  rM  rO  rN  rZ  r  r  z+https://www.youtube.com/watch?v=gVfgbahppCYz1https://www.youtube.com/watch_popup?v=63RmMXCd_bQZOtqTfy26tG0zBurn Outz$md5:8d07b84dcbcbfb34bc12a56d968b6131Z20141120zThe Cinematic Orchestraz	Every Dayif  z8https://www.youtube.com/channel/UCIzsJBIyo8hhpFm1NK0uLgwZUCIzsJBIyo8hhpFm1NK0uLgwz4https://i.ytimg.com/vi/OtqTfy26tG0/maxresdefault.jpg)r   rp  r)  rH  r  r  r  r  r  rY  r  r/  r  rA  rK  r  rJ  r  rI  rS  r  r  r  r  rM  r  z+https://www.youtube.com/watch?v=nGC3D_FkCmgz+https://www.youtube.com/watch?v=SZJvDhaSDncZSZJvDhaSDnczESan Diego teen commits suicide after bullying over embarrassing videozUC-SJ6nODDmufqBzPBwCvYvQZ20140716z$md5:acde3a73d3f133fc97e837a9f76b53b7   zCBS MorningsZsuicideZbullyingZcbsnewsz0https://i.ytimg.com/vi/SZJvDhaSDnc/hqdefault.jpgz8https://www.youtube.com/channel/UC-SJ6nODDmufqBzPBwCvYvQz$https://www.youtube.com/@CBSMorningsz@CBSMorningsi6oS)r   rp  r)  rI  r  rH  r/  r  rA  rJ  r  r  r  rS  rK  r  rY  r  r  rM  rO  rN  r  rZ  r  ZcBvYw8_A0vQu:   4K Ueno Okachimachi  Street  Scenes  上野御徒町歩きz$md5:ea770e474b7cd6722b4c95b833c03630Z20201120i  zTravel & EventsZUC3o_t8PzBmXf5S9b7GLx1MwzWalk around Japanz
Ueno TokyozOkachimachi TokyozAmeyoko StreetzTokyo attractionzTravel in Tokyoz0https://i.ytimg.com/vi/cBvYw8_A0vQ/hqdefault.jpgz8https://www.youtube.com/channel/UC3o_t8PzBmXf5S9b7GLx1Mwz,https://www.youtube.com/@walkaroundjapan7124z@walkaroundjapan7124i ڷ_)r   rp  r)  rH  r  r/  r  rI  rA  rJ  r  r  r  rS  rK  rY  r  r  rM  rO  rN  r  ZWaOKSUlf4TMz-https://music.youtube.com/watch?v=XclachpHxisz+https://www.youtube.com/watch?v=wsQiKKfKxugz+https://www.youtube.com/watch?v=YOelRv7fMxYZYOelRv7fMxYzDIGGING A SECRET TUNNEL Part 1Z20210624zUCp68_FLety0O-n9QU6phsgwzCre:https?://(?:www\.)?youtube\.com/channel/UCp68_FLety0O-n9QU6phsgwz$md5:5d5991195d599b56cd0c4148907eec50iT  Z
colinfurzeZColinZfurzeZTerryZtunnelZundergroundZbunkerz4https://i.ytimg.com/vi/YOelRv7fMxY/maxresdefault.jpgz#https://www.youtube.com/@colinfurzez@colinfurze)r   r)  rp  r  rI  rK  rH  r/  r  rA  rJ  r  r  r  rS  r  rY  r  r  r  rM  rO  rN  r  rZ  r  r  player_clientrY   )r  extractor_argszandroid client brokenr  player_skipconfigs)r   r  r  z*https://www.youtube.com/shorts/BGQWPY4IigYZStoryboardsz+https://www.youtube.com/watch?v=5KLPxDtMqe8Z5KLPxDtMqe8mhtmlZsb0zYour Brain is Plasticz$md5:89cd86034bdb5466cd87c6ba206cd2bcZ20140324zUCZYTClx2T1of7BRZ86-8fowz8https://www.youtube.com/channel/UCZYTClx2T1of7BRZ86-8fowz4https://i.ytimg.com/vi/5KLPxDtMqe8/maxresdefault.jpgZSciShow   z https://www.youtube.com/@SciShowz@SciShowiOx0S)r   rp  	format_idr)  rH  r  r  rI  rK  rA  r  r  r  rS  rJ  rY  r/  r  r  r  r  rM  rO  rN  r  rZ  r  r  )r  r  )r@  r   r  r  z+https://www.youtube.com/watch?v=2NUZ8W2llS4Z2NUZ8W2llS4u,   The NP that test your phone performance 🙂z$md5:144494b24d4f9dfacb97c1bbef5de84dZUCRqNBSOHgilHfAczlUmlWHAz8https://www.youtube.com/channel/UCRqNBSOHgilHfAczlUmlWHArH   zcount:23Z20220103zLeon Nguyenz:https://i.ytimg.com/vi_webp/2NUZ8W2llS4/maxresdefault.webpz#https://www.youtube.com/@LeonNguyenz@LeonNguyeniGa)r   rp  r)  rH  rI  rK  r/  rA  r  r  r  r  rY  r  r  rS  rJ  r  r  r  rM  rO  rN  r  r  z+https://www.youtube.com/watch?v=mzZzzBU6lrMZmzZzzBU6lrMz$I Met GeorgeNotFound In Real Life...z$md5:978296ec9783a031738b684d4ebf302dZUC_8NknAFiyhOUaZqHR3lq3Qz8https://www.youtube.com/channel/UC_8NknAFiyhOUaZqHR3lq3Qi  zcount:26iNaZQuackityz4https://i.ytimg.com/vi/mzZzzBU6lrM/maxresdefault.jpgz	@Quackityz!https://www.youtube.com/@Quackity)r   rp  r)  rH  rI  rK  r/  rA  r  r  r  r  rY  rR  r  r  r  rS  rJ  r  r  rM  rN  rO  r  rZ  r  r  z+https://www.youtube.com/watch?v=jfKfPfyJRdkZjfKfPfyJRdkZUCSJ4gkVC6NrvII8umztf0Owz	Lofi Girli-ebZ20220712z8https://www.youtube.com/channel/UCSJ4gkVC6NrvII8umztf0Owz$md5:13a6f76df898f5674f9127139f3df6f7z4https://i.ytimg.com/vi/jfKfPfyJRdk/maxresdefault.jpgibbz!https://www.youtube.com/@LofiGirlu5   re:^lofi hip hop radio 📚 - beats to relax/study tor=  zcount:32z	@LofiGirl)r   rp  rI  r  rM  r  r@  r  r  r  rK  rH  r  r  rR  rO  r  rZ  r)  rA  rY  r  rJ  rS  r  rN  z+https://www.youtube.com/watch?v=tjjjtzRLHvAZtjjjtzRLHvAu*   ハッシュタグ無し };if window.ytcsiZ20220323Z
Lesmiscorezre:^https?://.*\.jpgz8https://www.youtube.com/channel/UCdqltm_7iv1Vs6kp6Syke5AZUCdqltm_7iv1Vs6kp6Syke5A   z@lesmiscorez#https://www.youtube.com/@lesmiscorei:b)r   rp  r)  r  r  rS  rJ  r  r  r  rA  rH  rK  rI  rY  r  r  r/  r  rN  rM  rO  r  z+https://www.youtube.com/watch?v=el3E4MbxRqQZel3E4MbxRqQz%dlp test video 2 - primary sv no desccole-dlp-test-acc8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrArO   Z20220908UCiu-3thuViMebBjw_5nWYrA"https://www.youtube.com/@coletdjnz
@coletdjnziqc)r   rp  r)  rH  rJ  r  rA  rK  r  r  rS  r  r  r/  rY  r  r  rI  rO  rN  rM  r  z+https://www.youtube.com/watch?v=gHKT4uU8ZngZgHKT4uU8ZngZ20220729z$dlp test video title translated (fr)z*dlp test video description translated (fr)irb)r   rp  rJ  r  r/  rY  rI  r  rA  r  r  r)  rS  r  rH  r  rK  rO  rN  rM  r  r  r   r   r  r  z!Preferring "fr" translated fieldsz6 channel audioz+https://www.youtube.com/watch?v=zgdo7-RRjgoz#Multiple HLS formats with same itagz+https://www.youtube.com/watch?v=kX3nB4PpJkoZkX3nB4PpJkoz$md5:e8031ff6e426cdb6a77670c9b81f6fa6i  z:https://i.ytimg.com/vi_webp/kX3nB4PpJko/maxresdefault.webpz$Last To Take Hand Off Jet, Keeps It!ZMrBeastZ20221112z8https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVAZUCX6OQ3DkcsbYNE6H8uQQuVAz https://www.youtube.com/@MrBeastz@MrBeast)r   rp  r  rH  rY  r/  r  r  r)  rJ  r  rA  r  rK  r  rS  rI  r  r  rM  rO  rN  r  rZ  r  rZ   z233-1)r  r  z,Audio formats with Dynamic Range Compressionz+https://www.youtube.com/watch?v=Tq92D6wQ1mgz0https://i.ytimg.com/vi/Tq92D6wQ1mg/sddefault.jpg)r   rp  r)  rK  rI  r  rH  r  r  r  r  r  r  r  rJ  rA  rS  r  rY  r/  rM  rN  rO  r  r]   z251-drc)r@  r   r  r  r  z(https://www.youtube.com/live/qVv6vCqciTMqVv6vCqciTM202212234https://i.ytimg.com/vi/qVv6vCqciTM/maxresdefault.jpg8https://www.youtube.com/channel/UCIdEIHpS0TdkqRkHL5OkLtAVtuber   月ノ美兎   名取さな   にじさんじ   クリスマス   3D配信   【 #インターネット女クリスマス 】3Dで歌ってはしゃぐインターネットの女たち【月ノ美兎/名取さな】V  UCIdEIHpS0TdkqRkHL5OkLtAc   さなちゃんねる$md5:6aebf95cc4a1d731aebc01ad6cc9806d$https://www.youtube.com/@sana_natori@sana_natorii`c)r   rp  r  r  r  r  r  rK  r  r  r  r)  rA  r  r/  rS  r  rI  r  rY  rR  rJ  rH  rM  rO  rN  rZ  r  r  z+https://www.youtube.com/watch?v=wSSmNUl9SnwZwSSmNUl9Snwzcount:2zScott ManleyZ20170831i  zcount:8z$https://www.youtube.com/@scottmanleyz$md5:f4bed7b200404b72a394c2f97b782c02z@scottmanleyz&The Computer Hack That Saved Apollo 14zUCxzC4EngIsMrPmbm6Nxvb-Are:^https?://.*\.webpz8https://www.youtube.com/channel/UCxzC4EngIsMrPmbm6Nxvb-A)r   rp  rA  r  rJ  r  r  r  rY  r  r/  r  rO  rH  rM  rN  r)  rI  r  rK  r  r  rZ  r  r  )r  r  zehttp://www.improbable.com/2017/04/03/untrained-modern-youths-and-ancient-masters-in-selfie-portraits/Z 873c81d308b979f0e23ee7e620b312a3zmsN87y-iEx0z!Feynman: Mirrors FUN TO IMAGINE 6Z20080526z$md5:873c81d308b979f0e23ee7e620b312a3ZfeynmanZmirrorZscienceZphysicsZimaginationZfunZcoolZpuzzlezUCCeo--lls1vna5YJABWAcVAz0https://i.ytimg.com/vi/msN87y-iEx0/hqdefault.jpgzChristopher Sykesz8https://www.youtube.com/channel/UCCeo--lls1vna5YJABWAcVA   z6https://www.youtube.com/@ChristopherSykesDocumentariesz@ChristopherSykesDocumentariesi :H)r   rp  r)  r  rH  r  r  rI  r  r  r  r  rJ  rY  rK  rS  r/  rA  r  r  rM  rO  rN  r  r  )r   r  r  r  c                    s6   ddl m} ||}|dd gd r*dS t |S )Nr   r#   r  r   F)utilsr#   r   supersuitabler  r   r#   qs	__class__rf   rg   r    s
    zYoutubeIE.suitablec                    s   t  j|| i | _i | _d S r	  )r  __init___code_cache_player_cache)r   r  r  r  rf   rg   r    s    zYoutubeIE.__init__c              
      s   t  t dd  D   	fdd fdd} D ]\}	|	d< tj|	d || o~|	 }
r|
|	d	< d
|	d< qRt|
i |	d	< |	d= qRd S )Nc                 S   s   g | ]}| d r|qS )is_from_startr   rm   frf   rf   rg   
<listcomp>  s     
 z>YoutubeIE._prepare_live_from_start_formats.<locals>.<listcomp>c                    sx   t   | krd S \}}}}t|dtd}t|dtd}||||\}}} }|dkt   d S )N.videoDetailsrv  .microformatZplayerMicroformatRendererr=  )rV  _download_player_responsesr+   r  _list_formats)r  delayr`   prs
player_urlvideo_detailsmicroformatsrY  )r  r=  r   smuggled_datar  r   r?  webpage_urlrf   rg   refetch_manifest  s     zDYoutubeIE._prepare_live_from_start_formats.<locals>.refetch_manifestc              
      s   j ddD ]t}  | W 5 Q R X t fddD d}|slsX d|_qd  t  |_q|d |d	 f  S dS )
zZ
            @returns (manifest_url, manifest_stream_number, is_live) or None
            Fr  c                 3   s   | ]}|d   kr|V  qdS )r  Nrf   r	  r  rf   rg   ro     s      zOYoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feed.<locals>.<genexpr>Nz: Video is no longer livez*Cannot find refreshed manifest for format Zmanifest_urlmanifest_stream_number)rU  r  r  r   )r  r  rY  r
  )r  r=  lockr  r   r?  r  rg   mpd_feed  s    z<YoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feedr=  r  	fragmentsZhttp_dash_segments_generatorr  r  )	threadingLockrV  re  partial_live_dash_fragmentsr`  r   )r   r  r?  live_start_timer   r  r  r=  r  r
  genrf   )
r  r=  r  r  r   r  r  r   r?  r  rg    _prepare_live_from_start_formats  s"      
z*YoutubeIE._prepare_live_from_start_formatsc                 #   sP  d\}}d\d}	  dp&t }
|
|p0|
 |k}|rR
jtddd d}|	dd   }	}d\ 	
fd	d
}
d| d  rLt }	dkrd S |rz
j|d dddd}W n tk
r   d }Y nX t|dd d kr>	d7 	d }qn"|d	dk\}	d7 	|s>q|krNd }qd7 |	dk rr|dk rr|	 }|rt|t	|d d   }zrt
|D ]F}|dd\}}|s|d }tdtd| }|dV  q|kr	d7 	nd	}W n tk
r"   Y qY nX r.qLttd|| t   qd S )N)rO   i )NNTr   r	  zStarting download from the last 120 hours of the live stream since YouTube does not have data before that. If you think this is wrong,Tr  NNc           	         s  }  dd }|p*|o*t|to*|jdk}|r8dndpFdf\| sr|rbsbdfS |krrdfS r|}n`z
jd dddd\}}W n tk
r   d }Y nX |sƈ	d7 	dfS tfd	d
|D }|d |d sttt	
dd d d}d|fS )N
last_errorr  rO   iPF  FTr@  rP  r  r   c                 3   s   | ]}|d   kr|V  qdS )r  Nrf   rl   )stream_numberrf   rg   ro   S  s      zUYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd.<locals>.<genexpr>r  fragment_base_urlz(?:/|^)sq/(\d+)rv   r  r   )poprJ  r   r  "_extract_mpd_formats_and_subtitlesr   r  AssertionErrorrT  r  r  r  )	Zrefresh_sequenceZ	immediateZold_mpd_urlr'  Zexpire_fastZfmt_infofmtsr`   Z	_last_seqctxr  r*  r  r=  Zlast_seqmanifestless_orig_fmtr  Zmpd_urlZno_fragment_scorer   r)  rf   rg   _extract_sequence_from_mpd;  s@        
zBYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd[z"] Generating fragments for format rB   Fr(  c                 S   s   t | jd S )NzX-Head-Seqnum)r   rB  rn  rf   rf   rg   rj  g  rk  z0YoutubeIE._live_dash_fragments.<locals>.<lambda>r   rQ   r   rv   r/  zbreaking out of outer loopzsq/)r   fragment_countrO   )r   rV  r   r   r1  Z_request_webpager   r-   maxrT  ranger4   rW  )r   r?  r  r#  r  r1  r0  Z
FETCH_SPANZMAX_DURATIONZbegin_indexZdownload_start_timeZlack_early_segmentsZ	known_idxZlast_segment_urlr2  Z
fetch_timeZurlhZshould_continueidxr`   rf   r/  rg   r"  )  s    
"     






zYoutubeIE._live_dash_fragmentsNr  c                G   s$   t |dddtd}|sd S td|S )N).ZPLAYER_JS_URL).ZWEB_PLAYER_CONTEXT_CONFIGS.ZjsUrlFr  rz  )r+   r   r4   )r   r  Zytcfgsr  rf   rf   rg   _extract_player_url  s       zYoutubeIE._extract_player_urlc                 C   s<   | j dd||d}|r8| jd|d|d}|r8d| dS d S )	Nz"https://www.youtube.com/iframe_apizDownloading iframe API JS)r@  r?  r  zplayer\\?/([0-9a-fA-F]{8})\\?/zplayer versionr  z!https://www.youtube.com/s/player/z /player_ias.vflset/en_US/base.js)r  r   )r   r?  r  resZplayer_versionrf   rf   rg   _download_player_url  s         zYoutubeIE._download_player_urlc                 C   s   d dd |dD S )z/ Return a string representation of a signature r_   c                 s   s   | ]}t t|V  qd S r	  r   r  )rm   partrf   rf   rg   ro     s     z0YoutubeIE._signature_cache_id.<locals>.<genexpr>)rp   rb   )r   example_sigrf   rf   rg   _signature_cache_id  s    zYoutubeIE._signature_cache_idc                 C   s8   | j D ]}t||}|r q.qtd||dS )NzCannot identify player r   )_PLAYER_INFO_REr  r  r   r  )r  r  Z	player_reZid_mrf   rf   rg   _extract_player_info  s    
zYoutubeIE._extract_player_infoc                 C   sT   |  |}|| jkrH| j|||d| d| d|  d}|rH|| j|< | j|S )NzDownloading player zDownload of z failed)r  r@  rP  rB  )rA  r  r  r  r   )r   r?  r  r  	player_idcoderf   rf   rg   _load_player  s    

  

zYoutubeIE._load_playerc           	         s   |  |}d| d| | }tj||ks4t| d|  | jd|d   } sh| 	||}|r| 
|}dtttt|}dd ||D  | jd|   fdd	S )
NZjs_r`   zExtracting signature function zyoutube-sigfuncsrj   c                 S   s   g | ]}t |qS rf   ordrm   crf   rf   rg   r    s     z9YoutubeIE._extract_signature_function.<locals>.<listcomp>c                    s   d  fddD S )Nrj   c                 3   s   | ]} | V  qd S r	  rf   rm   isrf   rg   ro     s     zJYoutubeIE._extract_signature_function.<locals>.<lambda>.<locals>.<genexpr>)rp   rK  
cache_specrK  rg   rj    rk  z7YoutubeIE._extract_signature_function.<locals>.<lambda>)rA  r?  osr  basenamer-  r1  r*  r3  rD  _parse_sig_jsrp   mapchrr6  r  r+  )	r   r?  r  r>  rB  Zfunc_idrC  r:  test_stringrf   rM  rg   _extract_signature_function  s    

z%YoutubeIE._extract_signature_functionc           
      C   s   |  dsd S dd }dtttt|}||}dd |D }d||}dd	d
d |dD }d| d| d}	| d|	  d S )Nyoutube_print_sig_codec                 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   sX   | dkrdnt | }|| dkr,d||  nd}|dkr<dnd| }d| | | dS )Nr   rj   z:%d:r   zs[])r   )r	  endstepZstartsZendsZstepsrf   rf   rg   	_genslice  s    zBYoutubeIE._print_sig_code.<locals>.gen_sig_code.<locals>._genslicez(Never used)r   rv   )rv   r   zs[%d])zip)Zidxsr[  rZ  r	  rJ  prevrf   rf   rg   gen_sig_code  s$    "z/YoutubeIE._print_sig_code.<locals>.gen_sig_coderj   c                 S   s   g | ]}t |qS rf   rE  rG  rf   rf   rg   r    s     z-YoutubeIE._print_sig_code.<locals>.<listcomp>z + z({})r   c                 s   s   | ]}t t|V  qd S r	  r<  rm   prf   rf   rg   ro     s     z,YoutubeIE._print_sig_code.<locals>.<genexpr>r_   z*if tuple(len(p) for p in s.split('.')) == z:
    return 
zExtracted signature function:
)		get_paramrp   rR  rS  r6  r  r  rb   rS  )
r   funcr>  r^  rT  Z	cache_resrN  Z	expr_codeZsignature_id_tuplerC  rf   rf   rg   _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+\))?zS(?P<sig>[a-zA-Z0-9$]+)\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)z0("|\')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$]+)\(zS\bc\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(z)Initial JS player signature function namesigr  c                    s
    | gS r	  rf   rK  Zinitial_functionrf   rg   rj    rk  z)YoutubeIE._parse_sig_js.<locals>.<lambda>)r   r   Zextract_function)r   jscodefuncnamejsirf   rg  rg   rQ    s      
zYoutubeIE._parse_sig_jsc                    s    fdd}|S )Nc               
      s    j krz| |j  < W nb tk
rJ } z|j  < W 5 d }~X Y n8 tk
r } ztt |dj  < W 5 d }~X Y nX j   }t|tr||S )NrK  )r  r   	Exception	traceback
format_excrJ  )r  r  r7  retcache_idrc  r   rf   rg   inner  s    
(

z YoutubeIE._cached.<locals>.innerrf   )r   rc  rq  rr  rf   rp  rg   _cached  s    zYoutubeIE._cachedc                 C   s8   |  | jd|| |}||||}| || ||S )z3Turn the encrypted s field into a working signaturere  )rs  rU  r?  rd  )r   rL  r?  r  Zextract_sigrc  rf   rf   rg   _decrypt_signature&  s       zYoutubeIE._decrypt_signaturec                 C   sp  |dkrt dtd|}z| ||\}}}W n. t k
r^ } zt d|dW 5 d}~X Y nX | dr| d| d|d	  d
 z"| | jd|}||||}	W n tjk
rT } zzt	| dd}W n t k
r   |Y nX | 
d| d| | | j|dd |\}
}|jdd|
 d| d|d|dd }	W 5 d}~X Y nX | d| d|	  |	S )z3Turn the encrypted n field into a working signatureNz&Cannot decrypt nsig without player_urlrz  z$Unable to extract nsig function coderk  rV  zExtracted nsig function from z:
r   ra  z	nsig funci  )timeoutzBNative nsig extraction failed: Trying with PhantomJS
         n =  ; player = Tr  zconsole.log(function(r   z) { z }(z));zExecuting signature code)r?  r@  zDecrypted nsig z => )r   r4   _extract_n_function_coderb  rS  rs  _extract_n_function_from_coder   rl  r   r   r1  executerp   r2  )r   rL  r?  r  rj  rB  	func_coder7  extract_nsigro  r  Z	func_bodyrf   rf   rg   _decrypt_nsig.  s<    


 zYoutubeIE._decrypt_nsigc                 C   s   | j d|dddd\}}|sL| td|o0d| dd	 | j d
|dddS |sT|S tt|  dt| d|d| d| dt| S )Nar  (?x)
            (?:
                \.get\("n"\)\)&&\(b=|
                (?:
                    b=String\.fromCharCode\(110\)|
                    (?P<str_idx>[a-zA-Z0-9_$.]+)&&\(b="nn"\[\+(?P=str_idx)\]
                )
                (?:
                    ,[a-zA-Z0-9_$]+\(a\))?,c=a\.
                    (?:
                        get\(b\)|
                        [a-zA-Z0-9_$]+\[b\]\|\|null
                    )\)&&\(c=|
                \b(?P<var>[a-zA-Z0-9_$]+)=
            )(?P<nfunc>[a-zA-Z0-9_$]+)(?:\[(?P<idx>\d+)\])?\([a-zA-Z]\)
            (?(var),[a-zA-Z0-9_$]+\.set\("n"\,(?P=var)\),(?P=nfunc)\.length)zn function name)Znfuncr7  r&  )r  r   z)Falling back to generic n function searchz         player = ra  r   z(?xs)
                ;\s*(?P<name>[a-zA-Z0-9_$]+)\s*=\s*function\([a-zA-Z0-9_$]+\)
                \s*\{(?:(?!};).)+?["']enhanced_except_z!Initial JS player n function namer   rf  zvar z\s*=\s*(\[.+?\])\s*[,;]z#Initial JS player n function list (r_   r   )	r   r   r   r  r  r   r  escaperT  )r   rh  r  ri  r7  rf   rf   rg   _extract_n_function_nameP  s8       
   
 z"YoutubeIE._extract_n_function_namec                 C   st   |  |}| jjd|dd}|p*| ||}t|}|rB|||fS | j||d}||}| jd|| |||fS )Nzyoutube-nsigz
2024.07.09)Zmin_ver)r  )rA  r*  r3  rD  r   r  Zextract_function_coder+  )r   r?  r  rB  rz  rh  rj  	func_namerf   rf   rg   rw  z  s    


z"YoutubeIE._extract_n_function_codec                    s   |j |   fdd}|S )Nc              
      sr   z | g}W nJ t jk
r&    Y n4 tk
rX } zt jt |dW 5 d }~X Y nX |drnt d|S )Nrk  Zenhanced_except_z(Signature function returned an exception)r   rl  rm  rn  r   )rL  ro  r7  rc  rf   rg   r{    s    $

z=YoutubeIE._extract_n_function_from_code.<locals>.extract_nsig)Zextract_function_from_code)r   rj  rz  r{  rf   r  rg   rx    s    
z'YoutubeIE._extract_n_function_from_codec                 C   sv   d}t |trt|d}|sr|dkrFd}|r8t|| | dS | j|||d}|rrt| jd|dd|d}|S )	zr
        Extract signatureTimestamp (sts)
        Required to tell API what sig/player version is in use.
        NZSTSz6Cannot extract signature timestamp without player_url.r  z2(?:signatureTimestamp|sts)\s*:\s*(?P<sts>[0-9]{5})zJS player signature timestampsts)r  r  )rJ  r  r   r   r   r   rD  r   )r   r?  r  r   r  r  r8  rC  rf   rf   rg   _extract_signature_timestamp  s(    

   z&YoutubeIE._extract_signature_timestampc              	      s  t dD ]\}}|rdnd}t|d|dftd}|sN| d| d  d S tj|}tj|j}d	 d	 fd
dt
dD }	tt|dpdgd d g}
|dg|	g|
dd |r|d|
d tj|jtj|dd}| j||d| ddd|  d qd S )N)ZvideostatsPlaybackUrlZvideostatsWatchtimeUrlzfully rj   ZplaybackTrackingbaseUrlrv  zUnable to mark Zwatchedz@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_c                 3   s"   | ]} t d dd@  V  qdS )r   r  ?   N)randomrandint)rm   r`   ZCPN_ALPHABETrf   rg   ro     s     z*YoutubeIE._mark_watched.<locals>.<genexpr>   r  z1.5r   r   2Z
detailpage)vercpnZcmtr   )str   T)r  zMarking zUnable to mark watchedF)r  rB  )	enumerater   r3   r   r  r  urlparser#   r  rp   r6  r   floatr   r  
urlunparse_replacer  r  r  )r   r?  player_responsesZis_fullr  r  r   
parsed_urlr  r  Zvideo_lengthrf   r  rg   _mark_watched  sF    "  
 zYoutubeIE._mark_watchedc                 #   s   t d|}|r*| |d| V  | jt ||E d H  t d|D ]}| t|| |V  qJt d|D ]}| |d | |d V  qpd S )NzZ<link rel="alternate" href="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})"r   z(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)rv   )	r  r  
url_resultr  ZStopExtractionr  _extract_from_webpagefindallr.   )r  r   r  r  Zid_mr  rf   rg   r    s    zYoutubeIE._extract_from_webpagec                 C   s    |  |}|std| |S )NzInvalid URL: )Zget_temp_idr   )r  r   r?  rf   rf   rg   
extract_id  s    
zYoutubeIE.extract_idc                 C   s(   t |dtd}| j|dd dd |dS )N)ZplayerOverlaysZplayerOverlayRendererdecoratedPlayerBarRendererr  Z	playerBarZchapteredPlayerBarRendererr  rv  c                 S   s   t t| dddS )N)chapterRendererZtimeRangeStartMillis  Zscale)r   r+   Zchapterrf   rf   rg   rj    s    z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>c                 S   s   t | dtdS )N)r  r)  r  rv  )r+   r   r  rf   rf   rg   rj    s     )Zstart_functionZtitle_functionr/  )r+   r  _extract_chapters_helper)r   rA  r/  Zchapter_listrf   rf   rg   _extract_chapters_from_json  s     z%YoutubeIE._extract_chapters_from_jsonc                    sJ   t |dtd}fdd fddttd  fdd|D g S )N)engagementPanels."engagementPanelSectionListRenderercontentZmacroMarkersListRendererr  rv  c                    s   t  | dS )NZtimeDescription)r!   r  r  r  rf   rg   rj    rk  zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>c                    s     | dS )Nr)  )r  r  r  rf   rg   rj    rk  c                 3   s$   | ]} t|d  V  qdS )).ZmacroMarkersListItemRendererN)r  r+   )rm   r  Zchapter_timeZchapter_titler/  r   rf   rg   ro     s     zDYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<genexpr>)r+   r  r  filter)r   rA  r/  Zcontent_listrf   r  rg   '_extract_chapters_from_engagement_panel  s    z1YoutubeIE._extract_chapters_from_engagement_panelc                 C   sJ   t |ddddd dddd	d
dtjtddhfdd hdthfdf
pHd S )NframeworkUpdatesentityBatchUpdate	mutationsc                 S   s   |d d d d dkS )NpayloadmacroMarkersListEntitymarkersListZ
markerTypeZMARKER_TYPE_HEATMAPrf   r  rf   rf   rg   rj    rk  z,YoutubeIE._extract_heatmap.<locals>.<lambda>r  r  r  markers.startMillisr  r  c                 S   s   t | d t | d  d S )Nr  ZdurationMillisr  )rT  rn  rf   rf   rg   rj    rk  ZintensityScoreNormalized)r  r  r   )r+   re  r!  r   )r   rA  rf   rf   rg   _extract_heatmap  s"          zYoutubeIE._extract_heatmapc                 C   s   t |ddthf}t|ddthf }s,d S t |ddthf}t|ddthfpRd}||p\dd	t|dd
d
thfddthfdd| jhfddthfddthfddthfddthfdddddd hfddd|d krd n|ddk|| 	|dS )Nr  ZcommentEntityPayloadZ
properties	commentIdZ#engagementToolbarStateEntityPayloadZpublishedTimerj   root)r   parentr  ZtoolbarZlikeCountA11yauthor	channelIddisplayNameZavatarThumbnailUrlZ	isCreatorZ
isVerifiedZchannelCommandinnertubeCommandrE  rD  c                 S   s
   t d| S )Nrz  )r4   rn  rf   rf   rg   rj  7  rk  z,YoutubeIE._extract_comment.<locals>.<lambda>)r  r  	author_idr  author_thumbnailauthor_is_uploaderauthor_is_verified
author_urlFr:  Z
heartStateZTOOLBAR_HEART_STATE_HEARTED)is_favorited
_time_textr  )
r   r  r+   r   r    r   r3   r  r   r  )r   entitiesr  Zcomment_entity_payload
comment_idZtoolbar_entity_payloadr^  rf   rf   rg   _extract_comment"  s6    




zYoutubeIE._extract_commentc                 C   s,  | d}|sd S || |d| |dt|ddd| jhf| |dt|dd	d
dthf|p`dd}| |dptd}| |}|||d tdt|dt	dd|d< t|d}|d k	r||d< t|dt
d}|d k	rd|k|d< | t|dg}	| |	tjrd|d< t|d}
|
r(d|d < |S )!Nr  contentTextZ	voteCountauthorEndpointr1  r2  Z
authorTextZauthorThumbnailr  rv   r   r  )r   r  r  r  r  r  r  r9  rj   )r  r  rz  )r  r  Fr3  r  ZauthorIsChannelOwnerr  )ZactionButtonsZcommentActionButtonsRendererrv  ZcreatorHeartr  ZauthorCommentBadgeTr  ZpinnedCommentBadge	is_pinned)r   r  r  r+   r   r3   r  r  r4   r   r  r  r  r   r   )r   comment_rendererr  r  infor^  r  r  Zcomment_abrr  r  rf   rf   rg   _extract_comment_old?  sR    




  
  
zYoutubeIE._extract_comment_oldc                 #   s"  fdd  fdd}fdd}sRdd dddt  t  dt d	}|rnjd
 |dkr~r~d S dd ddgd  D ^}	}
|}d }d}d k}|r|s܈}d}d}t	dD ]}|s q؈j
|d}dd  dd  d}|dkrP|r>d}ndd |f }n$dr^dndrjdnd||}d }|sd dkrd dks|d |rd!nd"fg}zjd |d#|||d$}W np tk
r> } zPd%t| kr,r,d&d'kr d( W Y  d S td)dd* W 5 d }~X Y nX d}d }t|d+d,d-d thf}t||tg d.D ]f}|r||}d}|rn qqn|||D ]}|s   d S |V  qd/|i}|rn qqnqj|d0dd1}|rsd dkrjd2| dd3 jd S )4Nc                    s     | dgd S )Nrj   r   )r   )rH  r  rf   rg   rj  r  rk  z,YoutubeIE._comment_entries.<locals>.<lambda>c                    s   d }| D ]}t |d}|dd}|d k	rF|d< d| d tddk t| fd	d
tpli }|dpzi }|p|}|sqt	|d}|s dkrdnd}d|
    qq|S )NcommentsHeaderRendererZ	countTextZcommentsCount	est_totalzDownloading ~z	 commentsZcomment_sorttopc                    s   | d d d   S )NZsortMenuZsortFilterSubMenuRendererZsubMenuItemsrf   rn  Zcomment_sort_indexrf   rg   rj    rk  zDYoutubeIE._comment_entries.<locals>.extract_header.<locals>.<lambda>ZserviceEndpointr)  r   ztop commentsznewest firstzSorting comments by )r+   r  rS  rT  r-   r  r   r  r  r'   r  )r  Z_continuationr  Zcomments_header_rendererZexpected_comment_countZsort_menu_itemZsort_continuation_epZ	sort_text)get_single_config_argr   trackerr  rg   extract_headert  s:    
  
 z2YoutubeIE._comment_entries.<locals>.extract_headerc                 3   s  sdd< | D ]}s,d kr,d V  t |dd }|sft||fddggti d}|}nrt|d	d	thfpt|d	thf}t|d
thf  sqt| fdd}|}|rt|dthfd k	|d< |sq|d }|drd | |d krL|d kr(|ds(q	dr8dnd d d V  nd |d  d  d7  < rzdnd  d7  < |V  t |dd t}	|	rd  d7  < j
|	|dd}
t|
ttdd  E d H  qd S )Nr   current_page_threadtotal_parent_commentsc                 S   s   | d S )NcommentThreadRendererrf   rn  rf   rf   rg   rj    rk  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>commentRenderer)commentr  rw  commentViewModel)Z
commentKeyZtoolbarStateKeyc                    s   |d  kS )NZ	entityKeyrf   r  Zcomment_keysrf   rg   rj    rk  Z
pinnedTextr  r   pinned_comment_idsseen_comment_idsz?Detected YouTube comments looping. Stopping comment extraction zfor this threadrj   z$ as we probably cannot get any more.running_totalr   total_reply_commentsc                 S   s   | d d S )NZrepliesZcommentRepliesRendererrf   rn  rf   rf   rg   rj    rk  )r  r  )r-   r   r  r  r+   r   r  r   addr   _comment_entries	itertoolsislicer  r5  )r  Zentity_payloadsr  Zcomment_thread_rendererr  r  Z
view_modelr  r  Zcomment_replies_rendererZcomment_entries_iter)max_parentsmax_repliesmax_replies_per_threadr  r   r  r?  r   r  rg   extract_thread  st    
  
      z2YoutubeIE._comment_entries.<locals>.extract_threadr   )r  r  r  r  r  r  r  Zmax_comment_depthz|[youtube] max_comment_depth extractor argument is deprecated. Set max replies in the max-comments extractor argument insteadr   c                 s   s   | ]}t |tjd V  qdS )r   N)r   sysmaxsizer_  rf   rf   rg   ro     s    z-YoutubeIE._comment_entries.<locals>.<genexpr>max_commentsrj   ri   FT)onResponseReceivedEndpoints.)ZreloadContinuationItemsCommandappendContinuationItemsActioncontinuationItemsr   r  (r  z/~r  r   z$Downloading comment section API JSONz3    Downloading comment API JSON reply thread %d %sr  z+{}Downloading comment{} API JSON page {} {}z       z replies.r  )r  r  r  r  )r  r  r  r   rB  r@  r!  zincomplete dataZignoreerrors)TZonly_downloadzReceived incomplete data for a comment reply thread and retrying did not help. Ignoring to let other comments be downloaded. Pass --no-ignore-errors to not ignore.zyIncomplete data received for comment reply thread. Pass --ignore-errors to ignore and allow rest of comments to download.r   r  r  r  rw  r  )r  .ZmessageRendererr  r  zYoutube said: r?  r  )setr   _downloaderdeprecated_featurer   r  r  _generate_comment_continuationr  r  r  r  r  r"  r   r   r  rb  r   r+   r  r  r  ZCommentsDisabled)r   Zroot_continuation_datar   r?  r  r  r  r  Z	max_depthr  r`   r  r!  Zis_forced_continuationZis_first_continuationZcontinuation_items_pathpage_numrB  Zcomment_prog_strZnote_prefixr!  r7  r  continuation_itemsentryr  rf   )	r  r  r  r  r  r   r  r?  r   rg   r  p  s    B

   "    



zYoutubeIE._comment_entriesc                 C   s$   d|  d|  d}t |  S )zZ
        Generates initial comment section continuation token from given video id
        zz2'""z0 x0 Bcomments-section)base64	b64encoderI  decode)r?  rZ  rf   rf   rg   r  ;  s    z(YoutubeIE._generate_comment_continuationc                    s8    fdd}t  ddgd }t||d|S )zEntry for comment extractionc                 3   s6   t dd t| di dD d } |E d H  d S )Nc                 s   s    | ]}| d dkr|V  qdS )ZsectionIdentifiercomment-item-sectionNr  )rm   r  rf   rf   rg   ro   F  s   zIYoutubeIE._get_comments.<locals>._real_comment_extract.<locals>.<genexpr>).itemSectionRendererr   )r  r+   r  )r  r  r   r?  r   rf   rg   _real_comment_extractE  s    z6YoutubeIE._get_comments.<locals>._real_comment_extractr  rj   r   )r   r   r  r  )r   r   r?  r  r  r  r  rf   r  rg   _get_commentsC  s    zYoutubeIE._get_commentsc                   C   s
   dddS )NT)ZcontentCheckOkZracyCheckOkrf   rf   rf   rf   rg   _get_checkok_paramsN  s    zYoutubeIE._get_checkok_paramsc                 C   s,   ddi}|d k	r||d< dd|ii|   S )NZhtml5PreferenceZHTML5_PREF_WANTSZsignatureTimestampZplaybackContextZcontentPlaybackContext)r  )r  r  rx  rf   rf   rg   _generate_player_contextR  s      z"YoutubeIE._generate_player_contextc                 C   s\   | j dg tdd}|D ]@}|d\}}}|sF| jd| ddd q||kr|  S qd S )Npo_tokenTr  r  zHInvalid po_token configuration format. Expected "client+po_token", got "r/  r  )r   rt  r  r   )r   r6   Zpo_token_strsZ	token_strZpo_token_clientsepr  rf   rf   rg   _get_config_po_token`  s    
 zYoutubeIE._get_config_po_tokenrU   c                 K   s   |s$| j s$|r$| d| d d S | |}|rV|sR| j rR|rR| d| d |S |sz| j rz|rz| d| d d S | jf ||||d|S )NzUnable to fetch PO Token for zz client: Missing required Visitor Data. You may need to pass Visitor Data with --extractor-args "youtube:visitor_data=XXX"zGot a PO Token for z client, but missing Data Sync ID for account. Formats may not work.You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX"z client: Missing required Data Sync ID for account. You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX"r6   r  r  r  )r_  r   r  _fetch_po_token)r   r6   r  r  r  r  Zconfig_po_tokenrf   rf   rg   fetch_po_tokenk  s2    



zYoutubeIE.fetch_po_tokenc                 K   s   dS )zExternal PO Token fetch stubNrf   )r   r6   r  r  r  r  rf   rf   rg   r    s    zYoutubeIE._fetch_po_tokenc                    s2   t | drdS t | d d}t fdd|D S )N)playabilityStatusZdesktopLegacyAgeGateReasonT)r  )r  reason)zconfirm your agezage-restrictedZinappropriateZage_verification_requiredZage_check_requiredc                 3   s    | ]} D ]}||kV  q
qd S r	  rf   )rm   r   r  Zreasonsrf   rg   ro     s       z)YoutubeIE._is_agegated.<locals>.<genexpr>)r+   r  )player_responseZAGE_GATE_REASONSrf   r  rg   _is_agegated  s
    

zYoutubeIE._is_agegatedc                 C   s   t | ddkS )N)r  r  Z
UNPLAYABLEr+   )r  rf   rf   rg   _is_unplayable  s    zYoutubeIE._is_unplayablec
                 C   s   | j |||| ||| |p*| |||d}
d|i}ttt|d dthf}| jd|gddd  }rt||d< |	rd	|	i|d
< |r| j	|||ddnd }|
| | | j|d|||
d|d|dd dpd S )N)r   rl  r  r  r  r%  r   rN   player_paramsTr   r  ZpoTokenZserviceIntegrityDimensionsFr  ZplayerzDownloading {} player API JSONr`   r}  )r  r  r  r   rB  r  rl  r@  )r  r  r  r  r+   r~   rh   r   r   r  r  r  r"  r  r5  r2  )r   r6   r?  master_ytcfgplayer_ytcfgr  
initial_prr  r  r  rB  Zyt_queryZ
default_ppr
  r  rf   rf   rg   _extract_player_response  sB    

      z"YoutubeIE._extract_player_responsec                 C   s8  g }g }t dd tD dd dd}| dD ]r}|dkrH|| j q.|d	kr\|| q.|d
rz||dd   q.||kr| d| d q.|| q.|s|| j |D ]}||kr|| q|st	ddd|
ds| |r0|D ]6}t|\}	}
}|
 d}|dkr|tkr|| qt|S )Nc                 s   s"   | ]}|d d dkr|V  qd S )Nr   r`   rf   )rm   r6   rf   rf   rg   ro     s      z3YoutubeIE._get_requested_clients.<locals>.<genexpr>c                 S   s   t |  d S )Nr{   rd  )r6   rf   rf   rg   rj    rk  z2YoutubeIE._get_requested_clients.<locals>.<lambda>T)r  reverser  r   all-r   zSkipping unsupported client "r/  z%No player clients have been requestedr   r$  Z_musicZmusic)sortedr~   r   extend_DEFAULT_CLIENTSr   r  r   remover   r   r$  rh   r   )r   r   r  Zrequested_clientsZexcluded_clientsZallowed_clientsr6   Zexcluded_clientZrequested_clientr`   r   rd   Zmusic_clientrf   rf   rg   _get_requested_clients  s>     

z YoutubeIE._get_requested_clientsc                 C   s   t |d }|kr|S d S )Nr  r%  )r  r%  r  )r   prr?  pr_idrf   rf   rg   _invalid_player_response  s    z"YoutubeIE._invalid_player_responsec                    s`  d }|r| j | j|d|dd}g }g }|rH| ||sH||dd i t d d d  fdd}	d}
d  } }}i }rd}t \}}}|dkr|ni }d	| d
kr|dkr| ||p|}|p| j	|||d}| 
|d}d| d
krd}d }|s.|
s.|r.| |}d}
|p@| |||}|pT| |||}| j||| jrj|nd |rv|nd d}| 
|d}|s|r| jd| d| d| ddd d}|dkr|nd }z,|p| j|||p|||||||d	}W n6 tk
r4 } z| | W Y qW 5 d }~X Y nX | || }rR|||< nr|rt|dthfpli }||t< ||t< t|ddthfD ]}||t< ||t< q|r|| n
|| | jr| |r| j| ddd |	dd q|| |rJ| dd| ddt|  d| d  |sXtd!dd"n|sXtd#||fS )$Nzinitial player responseFr  streamingDatarv   c                     sD   | D ]:}t |d }|tkr| kr|  |  dS qdS )z? Append the first client name that exists but not already used r   N)rh   r~   r  r  )Zclient_namesrc   Zactual_clientZall_clientsclientsrf   rg   append_client  s    

z:YoutubeIE._extract_player_responses.<locals>.append_clientrU   r  r  r8  rG   ZjsTr   r;   zNo PO Token provided for z' client, which is required for working zc formats. You can manually pass a PO Token for this client with --extractor-args "youtube:po_token=z+XXX"r  )r  r  r  r  r  r  r  r  ZadaptiveFormats.zm: This video is age-restricted and YouTube is requiring account age-verification; some formats may be missingrX   r^   zSkipping player responses from /z* clients (got player responses for video "z" instead of "z")zLAll player responses are invalid. Your IP is likely being blocked by Youtuber   z%Failed to extract any player response)r  rh  r  r  r  rh   r+  r   r  r9  rc  r   r;  r  r  r  r_  r   r  r   r+   r  STREAMING_DATA_CLIENT_NAMESTREAMING_DATA_PO_TOKENr  rS  r  rp   r  )r   r  r?  r  r  r  r  r  Zdeprioritized_prsr  Ztried_iframe_fallbackr  r  r  Zskipped_clientsZdeprioritize_prr6   r   rd   r  Zrequire_js_playerr  Zrequire_po_tokenr  r7  r  sdr
  rf   r  rg   _extract_player_responses  s        

 
 
	



* z#YoutubeIE._extract_player_responsesc                 C   s.   |dkr|  ds&|dkr*|p ddkr*|S d S )Nr=  Zlive_from_start	post_liver   i   )rb  )r   rY  r/  rf   rf   rg   _needs_live_processingb  s    
z YoutubeIE._needs_live_processingc           0      #   s<	  d dd t tg  }i dd i 	tdddddd	d
dddddddgt|d}
d}d|k
drd
jd  fdd}	|D ]R}
|
drqt	|
d}|
dpi }||d|
df}s||krq|
d}t
|
d }|dks|s$|
d!d" p"|}|d#kr2d}|rT|rF||< |rT|	|< |d$}d%|d&pnd" k}|dd"d'd }|r|r||
d(d)krq|
d*}|sztj|
d+}tt|d,d- }t|d.d- }t||||fsqz*|d/t|d0pd1
||7 }W nJ tk
rx } z*
jd2dd3 
j|dd4 W Y qW 5 d }~X Y nX t|}|d5r|z:

jd6|d5 d }t|d5||d5 d |i}W n tk
rz } zd"}t|tjrd7
jd8
jjj  d9t!j" d:}|rR
jd;| d<|d5 d  d=| dd3 
j|dd4 n
jd>dd3 W Y qW 5 d }~X Y nX t#|
d?p|
d@dA}t|
dBdCd- hft$fdDd-}|r؈
j dEdd4 |
t% }|
t&}|rt|dF|i}| o
'|dG}|r6
j dH| dIdd4 |
dJpR|(dKd"pRd"}t
|
dLpfd} t
|
dMt
|
dN| |
drdOnd" t)t)|d&|odPd"dQ||
dodRt|
dSd- t|
dTd- |odU|odV
*dWsot+|dXdQ	|dYkrdZnd[d\|kr(d]nd | d^kr:| nd |
d_||t,|
dd`  t,|
da|t-||t
|
dbt)||rdcnd"pd |rn|rddnd[|rden|rddn|d#krdfnd dg}!t./dh|
dipd"}"|"rt0|"1d^|!dj< |!2t3|"1d` |rF| 4dk|!dlf |5| dm|!dn|!dofk}#|#r|!djr|!dj dp |!dq< sdr|kr|!ds r|!r|!dt  dun|!dt dv|	|!dwV  sdr|krdx i|!dy< |!V  q
6|}$dz|k}%
d{rd|}%
jd} t
d~}&
*ddrL|$dksL|$rV|%rV|&4d 
*ddsn|&4d 
dr
jd n$|%r|dkr|$dkr|&4d 	
f	dd}'i }(|D ]^})|)t% }|)t&}d|&ko|)d}*|*rz|r|*7dd|  }*
j8|*dd||dkd\}+},
9|,|(}(|+D ]0}-|'|-d|
j:d|-d* dd d|rH|-V  qHd|&ko|)d}.|.r|r|.7dd|  }.
j;|.d|d\}/},
9|,|(}(|/D ]Z}-|'|-d||-dt |rt

j:d|-d	p|-d* dd d|-ds< |$	r$d|-d< |-V  qҐq|(V  d S )Ni   rz   r   ZtinyZaudio_quality_ultralowZaudio_quality_lowZaudio_quality_mediumZaudio_quality_highsmallZmediumZlargeZhd720Zhd1080Zhd1440Zhd2160Zhd2880Zhighres).r  .r  Z	duplicateZinclude_duplicate_formatsTzv[youtube] include_duplicate_formats extractor argument is deprecated. Use formats=duplicate extractor argument insteadc                    s$   t  fddtd d D S )Nc                 3   s@   | ]8}d t d  d| dt|  d d  iiV  qdS )r   r6  r  r   filesizeN)r2   r  )rm   Zrange_start)
CHUNK_SIZEr
  rf   rg   ro   }  s     zTYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments.<locals>.<genexpr>r   r(  )r   r6  r
  )r)  r*  rg   build_fragments|  s    zAYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragmentsZtargetDurationSecitagZ
audioTrackr   ZisDrcqualityr  ZaudioQualityrj   r  ZaudioIsDefaultZdescriptiver  r_   r  ZFORMAT_STREAM_TYPE_OTFr   ZsignatureCipherc                 S   s   | d d S )Nr   r   rf   rn  rf   rf   rg   rj    rk  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>c                 S   s   | d d S )NrL  r   rf   rn  rf   rf   rg   rj    rk  z&{}={})sprv   	signaturez8Signature extraction failed: Some formats may be missingr  r  nZnsigz         Install Z	PhantomJSz to workaround the issue. ra  z4nsig extraction failed: Some formats may be missing
z         n = rv  zCCannot decrypt nsig without player_url: Some formats may be missingZaverageBitrateZbitrater  ZapproxDurationMsc                 S   s
   t | dS )Nr  )r   rn  rf   rf   rg   rj    rk  c                      s    d k S )Nr   rf   rf   )r/  format_durationrf   rg   rj    rk  z?: Some formats are possibly damaged. They will be deprioritizedZpotr;   : zv client formats require a PO Token which was not provided. They will be deprioritized as they may yield HTTP Error 403ZqualityLabelZaudio_quality_r  ZaudioSampleRateZcontentLengthz-drcz
 (default)r}  ZDRCc                 S   s   | d  dd S )NZprojectionTypeZRECTANGULARrj   r5  r  rn  rf   rf   rg   rj    rk  c                 S   s   | d  dd S )NZspatialAudioTypeZSPATIAL_AUDIO_TYPE_rj   r3  rn  rf   rf   rg   rj    rk  ZDAMAGEDBROKENverboser   r  rv   Premiumd   r   ZaudioChannelsr   ZdrmFamiliesr  descr  r|  )asrr(  r  r}  source_preferencer  Zaudio_channelsr  r-  has_drmtbrZfilesize_approxr   r  languagelanguage_preferencer~  z.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?ZmimeTyperp  httpsr?  nonerq  rs  Z_dashr  Zdashyr(  r  z-dashyhttp_dash_segments)r  r  r  Zhttp_chunk_sizeZdownloader_options
incompleteZinclude_incomplete_formatsFzx[youtube] include_incomplete_formats extractor argument is deprecated. Use formats=incomplete extractor argument insteadr  Zyoutube_include_hls_manifestr=  hlsr  ZdashZinclude_live_dashzo[youtube] include_live_dash extractor argument is deprecated. Use formats=incomplete extractor argument insteadc                    sB    df}s"|| kr"dS | |   dd krFd d< |s	| drdkr	j
 d| d d	d
d t  dddd d<  d  d8  < |rƈr| d  d< n<tfdd| D r| d  d< n|r| d< r8  dkr8t  dddd d<  d< |dkrjt  dddd d<  d  d7  <  t dd d d<  d dkr  drt fddd  d< 	d sԈrt  dt	|d!d d<   d"r d" d#kr d"= dkr>  d$r>d% d$<  d  d&8  < d
S )'Nr?  Fr<  rv   r;   rE  r2  z client zo formats require a PO Token which was not provided. They will be deprioritized as they may yield HTTP Error 403Tr  r}  r4  r}  r}     r  r  c                 3   s   | ]\}}| kV  qd S r	  rf   )rm   r`  r`   )protorf   rg   ro   G  s     z\YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<genexpr>z	(default)r@  )Z616Z235r7  r8  c                 S   s   | d  dd S )Nr  r  r   )rb   r*  rf   rf   rg   rj  T  rk  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>r-  r  c                    s   t |  d  S )Nr  )absrn  r*  rf   rg   rj  V  rk  )r  r5  r   r  r   r=  mayberO   )
r   r  rc  r   r   r  r-   r  rb  rt   )r
  rG  rc   r,  r  r  )	PREFERRED_LANG_VALUEall_formatsitag_qualitiesitagsoriginal_languageqres_qualitiesr   r?  )r
  rG  rg   process_manifest_format3  sP    
   
zIYoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_formatZhlsManifestUrlr   z/pot/rw  )r  r  z/itag/(\d+)r   ZdashManifestUrlr  z/clen/(\d+)r*  z	file sizer  )<collectionsdefaultdictr  r$   r+   r   r  r  r   r'   r   r  rb   r  r  r#   r3   r-   r  r  rt  r   r   r1  rs  r|  r2   rJ  r   rl  Z_format_errZStylesZEMPHASISr   ZINSTALL_HINTr   r,   r!  r"  rc  r5  r   rb  rt   r  r   r  r  r   r  r  r   r  r  r&  rstripZ#_extract_m3u8_formats_and_subtitlesZ_merge_subtitlesr   r,  )0r   streaming_datar?  r  rY  r/  Z
stream_idsZstreaming_formatsZformat_typesr+  fmtr,  Zaudio_trackZ	stream_idr-  r  Z
is_defaultZis_descriptiveZlanguage_codeZfmt_urlZscZencrypted_sigr7  r  Zdecrypt_nsigZphantomjs_hintr>  Z
is_damagedrc   r  Z	is_brokenr   r  dctZ	mime_mobjZsingle_streamneeds_live_processingZskip_bad_formatsZskip_manifestsrQ  	subtitlesr#  Zhls_manifest_urlr.  subsr
  Zdash_manifest_urlr  rf   )r)  rJ  rK  r/  r1  rL  rM  rN  rO  rP  r   r?  rg   _extract_formats_and_subtitlesg  s              









  
$   
  	"$ 




/

    
   
   z(YoutubeIE._extract_formats_and_subtitlesc                 #   sX  t |ddddd d d }ttd| p.d }|s<d S t|d }t|D ] \}}|d}ttt	|d d	 }t|d
kst
|s| d| dd| t   qP|\}	}
}}}|dd  \}}|dt|| d|d|  |||  } | d| ddddd|	|
|  || fddtt|D dV  qPd S )N)ZstoryboardsZplayerStoryboardSpecRendererspecrj   r   rk  rv   zhttps://i.ytimg.com/r   #rO      zMalformed storyboard r2  r  z$Lz$Nz&sigh=ZsbZ
storyboardr  rB  c                    s0   g | ](} d t|t |  dqS )z$M)r   r/  )r5  r   r  )rm   jr/  Zfragment_durationr   rf   rg   r    s   z1YoutubeIE._extract_storyboard.<locals>.<listcomp>)r  r}  rp  r  rq  rs  r   r  r  r  r  columnsr  )r   rb   r3   r4   r+  r  r  r  rR  r   r  r   rp   r   r5  r   r6  mathceil)r   r  r/  r\  base_urlLrJ  r  countsr  r  Zframe_countcolsr  NZsighr4  rf   r`  rg   _extract_storyboard  sP      
"&zYoutubeIE._extract_storyboardc                 C   s   d }d|  dkrVddd}| j dd gddd	 }|r>||d
< | j||d||  d}| ||ph|  }| | ||||||\}	}
|||	|
fS )Nr  r  Z
99999999991)ZbpctrZhas_verifiedr
  Tr  r   ppF)r  r  rB  )r   r  r  r  rc  r$  r  )r   r   r  r?  r  r  r  rk  r  r  r  rf   rf   rg   r    s,    
    
   z$YoutubeIE._download_player_responsesc                 C   s   t |d}t|d}|d kr&t|d}t|d}	t|d}
t|d}|rLdn*|rTdn"|
r\d	n|	rdd
nd||	fkrtdnd }t |d}| |||||^ }}tdd |D r|D ]}d|d< q|||||fS )N).ZliveBroadcastDetailsisLiveZ	isLiveNowZisLiveContentZ
isUpcomingZisPostLiveDvrr%  r=  r;  r<  Fr  ).r  c                 s   s   | ]}| d V  qdS )r=  Nr  r	  rf   rf   rg   ro     s     z*YoutubeIE._list_formats.<locals>.<genexpr>Tr=  )r+   r   r[  r  )r   r?  r  r  r  r  r/  live_broadcast_detailsr=  Zlive_contentr;  r%  rY  rU  r  rY  r
  rf   rf   rg   r    s(    







zYoutubeIE._list_formatsc           l         s  t |i \}}| d }|d  }|||\}}}t|dtd}t|dtd}	|	rz|		 |	S rfddndd }
t|d	td}t|d
td}
|d}jr|pt|dp|p|
dddg}
|d}t|d}|d k	rjr|p|n|}t|dtd}|r&|ds&drXd d ng }g }|dD ]}tjtj|fdd}|d}|sqj|d}|}|r|d| d7 }|ddtd|d d dd i|d! || qjd"d#| |||S tt|d$pVtt|d$pVt|
d%pVd }|||||\}}}}d&kr d' |shd(st|d)r t|d*tdpi }
|d+pt|d+} t
|d,pd-}!|!rT|!d.krFt|d/}"|"s6|
d0}#|#r2|#dnd }"j|!|"d d1 | d2|! 7 } | rhj | d d3 t|d4t!dpzg }$|$srd5d6 t"#$d7D }$|$D ]}%|%%d8rt"&d9|%}&|&rd:d; |&' D \}'}(|'dkr|(dkr|'|( })|D ]}*|*d<d=kr |)|*d>< q  q*q(||fd?}+|
d@dAg},|,rZ|+dB|,i |+) }-dCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUg}.t*|.}/|++fdVd;|.D  |+D ]Ft,fdWd;t-|.D |/}0dXdB krdndYdZ|0  d[< q.|+ j/0|- t|d\p"|
d]}11t2t|d^pHt|d_pH|
d^}2t|d`}3t3t|da}4t3t|db}5|s|5r|4r|5|4 }4|fdcdd}6t5|6|D ]6}7|7d[pdYde |7d[< t6|7dfdgdhdi|7df< qr
7||4|||djk |+8|| 9|3}8|||+t|-dk||2t:|2d dld dm|tt||fdnpb|
dot;t|dpt|dqdrks|
dsdtks|
dudvkrdwnd||1r|1gnd |$t|dx|4dydz}9i }:t|d{td};|;rd|d} fd~dt|;dD }<fddt|;dD }=fdd}>d<dkoJddrpJd}?|<= D ]`\}@}A|Ad}t|dd gdY }B|sqTj
|Addd}C|Addkr|@sqT|>|:||@|Ci  |AdsҐqT|== D ]\}D}E|Dsq|D}F|Addkr2|Ddkr2|?sq|Dd|@ 7 }D|Et:|Cd d7 }E|@d|F kr|D ]*}*|*dd=krF|*dsF|F|*d< qF|>|||D d|E di  |>|||D|E|B|Fkri nd|Di qڐqT||9d< |:|9d< tj>|}G|Gj?|Gj@fD ]b}Htj|H}I|I= D ]F\}J}KdD ]6\}L}M|Ld7 }L|L|9k	r|J|Mk	rt|Kd |9|L< 	qqq|	pLd-A Bd	rt"&d|}&|&	r|&Cd}N|&Cd}O|O	r|ODdd-}O|N	s|Od d }N|9E|&CdA |&Cd }P	r|Pgndd6 |&CddD |&CdA |Ot|Nd d }Q
r2jFdrd}Qt|Qd
s2Gd d }Q|Q
spdi}I|IEH  jIddr||IdjJ|ddd}Qd t|Qdd fddddddfjKdrd|9d< z(|Qd d d d d d d d  W n tLtMtNfk

r   Y n4X d dÝdĈdkrdnddȜg|9Odi d< |Qr^P|Q|pJQ|Q|pJR||pJd |9d< S|Q|9d< t|Qdt!g d͍}Rt|Rd΃}S|Sr$|Sdϡ}T|Tr
|T}TtT|Sdd dkr|T|9d< n>t"&d|T}&|&r|9E|&CdtU|&CdZtU|&Cdԡd՜ tT|Sdd t!pg D ]}UtVt|Udd؃}V|VD ]}Wdd dfdd dd gdffD ]\\}X}YtT|W|Xtp^i dޡ}Z|ZrFt"W|Y|Z}&|&rFtX|&Cdߡ|9|&Cdd <  q"qFq"q
t|SddddddddddddtYhfdrd|9d< t|Sd}[|[r$K|[d}\|[dr|\|9d< n|9dd kr$|\|9d< t|Rd}]|]rt|]d}^|9E
|^dK|^dd |8s9t|^ddthfdrd}8tT|]dd t!pg }_dr}`|_D ]$}atT|add d krd }` qĐq|_D ]}a|adpi }b|bd}c|csqȈ
|bd}c
|bd}d|cdkr|d|9d< nR|`s|cdkr6|d|9d< n8|cd krZ|drN|dgnd |9d< n|cdkr|d|9d< qȈZt|]d}e[|et\j]rd |9d< |9E|9d|8t:|8d dd dmd t3t|dt^d	pt3|
dt^d	}f|frt_j`a|ft_jbjcdd
ntet|dp2te|
d}g|grL|fsjdkrjtfg
|Sdph|g}g|g|9d< |f|9d< |grdkrth|gjDt_jbjcd}h|hthdkr|9d D ]$}7|7ddkrd |7d< qdD ]"\}i}L|9|i}K|Kr|K|9|L< qZt|Sd}j[|jt\jip@t|dtjd}k[|jt\jkrXdnjl|k|Qr|kd k	r[|jt\jmpdrnd |Qr|kd k	r[|jt\jnpdrnd |9d dwk|kd krd n[|jt\jopt|dtjdd|9d< p||R|9d< q| |9S (  Nz//www.youtube.com/zwatch?v=).r  rv  )errorScreenZ%playerLegacyDesktopYpcTrailerRendererZtrailerVideoIdc                    s    j | d dS )Nr   )Z_html_search_metarn  )r   r  rf   rg   rj    rk  z)YoutubeIE._real_extract.<locals>.<lambda>c                 S   s   d S r	  rf   rn  rf   rf   rg   rj    rk  r  r  ).r)  r)  zog:titleztwitter:title).rH  ZshortDescription)ZmulticameraZplayerLegacyMulticameraRendererZmetadataListZforce_singlefeed
noplaylistzDownloading just video z because of --no-playlist,c                    s   t  fddtS )Nc                    s   |   d S )Nr   rf   rn  r   rf   rg   rj    rk  z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>)r-   r   rq  )	feed_datarq  rg   
feed_entry  s
     
 z+YoutubeIE._real_extract.<locals>.feed_entryr    (r   url_transparentr   z{}watch?v={}r   T)rG  r   r   r)  zNDownloading multifeed video ({}) - add --no-playlist to just download video {}r   r+  r/  r%  z): Video is in Post-Live Manifestless modeZallow_unplayable_formats).ZlicenseInfos)rn  ZplayerErrorMessageRendererr  	subreasonrj   z?The uploader has not made this video available in your country.ZavailableCountriesZregionsAllowed)Zmetadata_availablez. r   keywordsc                 S   s   g | ]}t |d qS )r  )r.   r  )rm   r  rf   rf   rg   r  C  s   z+YoutubeIE._real_extract.<locals>.<listcomp>zog:video:tagzyt:stretch=z(\d+)\s*:\s*(\d+)c                 s   s   | ]}t |V  qd S r	  )r  )rm   r  rf   rf   rg   ro   K  s     z*YoutubeIE._real_extract.<locals>.<genexpr>rs  rB  r  )..r  zog:imageztwitter:imager   r  Zhq720Z	sddefaultZ	hqdefault0Z	mqdefaultr   Zsd1Zsd2Zsd3Zhq1Zhq2Zhq3Zmq1Zmq2Zmq3rj  r  3c              
   3   sH   | ]@}d D ]6}ddj |||dkr&dnd dkr4dnddiV  q
qd	S )
)webpZjpgr   z:https://i.ytimg.com/vi{webp}/{video_id}/{name}{live}.{ext}rz  Z_webprj   r=  Z_live)r?  r   rp  rz  r  N)r  )rm   r   rp  )rY  r?  rf   rg   ro   d  s         c                 3   s.   | ]&\}}d  d |  d kr|V  qdS )r   r   Nrf   )rm   rJ  t)thumbr?  rf   rg   ro   j  s      z.webprv   r   r~  categoryZgenrer  ZexternalChannelIdZownerProfileUrlZstartTimestampZendTimestampc                    s8   r|  dsdS  dkr4dkr4|  ddkr4dS d S )Nr  Tr=  r  rC  r  )rV  )rY  rX  rf   rg   is_bad_format}  s    z.YoutubeIE._real_extract.<locals>.is_bad_formatrz   r}  z(Last 2 hours)r}  r}  r=  )rv   r   "https://www.youtube.com/channel/%sr   ).	viewCountZinteractionCountZaverageRatingZisFamilySafeFZisFamilyFriendlyr  zog:restrictions:agez18+r  ZplayableInEmbed)
r-  r:  r  hdr:12sourcevcodec:vp9.2channelsrq  r   rG  )r   r)  r  r  r  rH  rI  rK  r/  rA  Zaverage_ratingr  r  r  r  r  rY  rR  _format_sort_fields).captionsZplayerCaptionsTracklistRendererc                 S   s&   t | dpddddp$| dS )NZvssIdrj   r_   r  languageCode)r%   r   r5  )r  rf   rf   rg   get_lang_code  s    z.YoutubeIE._real_extract.<locals>.get_lang_codec                    s   i | ]} ||qS rf   rf   )rm   r  )r  rf   rg   
<dictcomp>  s    z+YoutubeIE._real_extract.<locals>.<dictcomp>).ZcaptionTracks.c                    s(   i | ] }| d  j| dddqS )r  ZlanguageNamer   r  )r   r  )rm   r   r  rf   rg   r    s    ).ZtranslationLanguages.c              	      sH   |  |g } jD ]0}|d|i ||tdt|||d qd S )NrV  rz  )rp  r   r   )r   _SUBTITLE_FORMATSr  r  r4   r2   )r  rd  	lang_codeZsub_namer  Z	lang_subsrV  r  rf   rg   process_language  s    
 z1YoutubeIE._real_extract.<locals>.process_languageZtranslated_subsr  ZwriteautomaticsubZlistsubtitlesr  r   r   r   r  kindr;  ZisTranslatableZundr  z from %sza-rq  r?  z-origz (Original)Ztlangautomatic_captionsrY  ))r	  )r	  r{  )rY  )rY  _timez
Auto-generated by YouTube.u  (?xs)
                    (?=(?P<track>[^\n·]+))(?P=track)·
                    (?=(?P<artist>[^\n]+))(?P=artist)\n+
                    (?=(?P<album>[^\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]+))(?P=clean_artist)\n
                    )?.+\nAuto-generated\ by\ YouTube\.\s*$
                release_yearr  ri   r  Zclean_artistc                 S   s   g | ]}|  qS rf   )r2  )rm   arf   rf   rg   r    s     r     ·r  )r  r  r  r  r  r  r  zIIncomplete data received in embedded initial data; re-fetching using API.r%  r  )r   z!Downloading initial data API JSON)r  r  r  r   r  r!  rB  r@  )r  z!engagement-panel-comments-section)r  twoColumnWatchNextResultsresultsr  r  .r  r  .Z commentsEntryPointHeaderRendererZcommentCountr  c                    s   |d d  kS )Nr  ZpanelIdentifierrf   r  )COMMENTS_SECTION_IDSrf   rg   rj  0  rk  r  headerZ"engagementPanelTitleHeaderRendererZcontextualInfor3  r  r  ZconversationBarZliveChatRendererr  r  r  r7  z &bpctr=9999999999&has_verified=1r  r?  Zyoutube_live_chatZyoutube_live_chat_replay)r   r?  rp  r  Z	live_chatr  r  )r  r  r  r  r  rw  ZvideoPrimaryInfoRendererZsuperTitleLinkc                 S   s   | d d S )NZsuperTitleIconr  rf   rn  rf   rf   rg   rj  V  rk  ZLOCATION_PINlocationu   (.+?)\s*S(\d+)\s*•?\s*E(\d+)rF   )r  r  r  c                 S   s   | d d d S )NvideoActionsmenuRenderertopLevelButtonsrf   rn  rf   rf   rg   rj  b  rk  )toggleButtonRenderer.)Z"segmentedLikeDislikeButtonRenderer.r  c                 S   s   | d d d S )NZdefaultTextr.  r  rf   rn  rf   rf   rg   rj  j  rk  z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                 S   s   | d S )Nr.  rf   rn  rf   rf   rg   rj  l  rk  c                 S   s   | d d S )Nr  rf   rn  rf   rf   rg   rj  m  rk  zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peopler  r  r  _countr  r  r  .Z#segmentedLikeDislikeButtonViewModelZlikeButtonViewModelZtoggleButtonViewModelZdefaultButtonViewModelZbuttonViewModelZaccessibilityTextr:  r  )r  ZvideoViewCountRendererr  rl  r@  rA  ZvideoSecondaryInfoRenderer)ownervideoOwnerRenderersubscriberCountText)rJ  r  )r&  )r)  r  .r&  rC  c                 S   s   | d d d S )NZmetadataRowContainerZmetadataRowContainerRendererr  rf   rn  rf   rf   rg   rj    rk  c                 S   s   | d d S )NmetadataRowRendererZhasDividerLinerf   rn  rf   rf   rg   rj    rk  r  )r  r   ZLicenser  ZAlbumZArtistr  ZSong)r  r  r  rZ  rJ  rP  )rM  rN  rO  Z
uploadDate)timezonez%Y%m%d)r  NZdateTextr  r  )r=  r%  r;  )tzinfoztoday-2daysr  r  Zm3u8_nativeZ__needs_testing))r  r  )r  r  r  Z	isPrivaterT  r  Z
isUnlisted)rU  rV  rW  r  rX  rS  Z__post_extractor)rr1   	_match_idZhttp_schemer  r+   r  r   r   r  r   r  r   r   rb  rS  rb   r  r  r#   unquote_plusr  r&   r  rp   playlist_resultr   r!   r  r1  Z
report_drmr   Zraise_geo_restrictedZraise_no_formatsr  r  finditerZ_meta_regexr   r  groupsr  r`  r  r  r  r  Z_remove_duplicate_formatsr  Z_sort_thumbnailsr   r'   r"   r&  r  r   r%  ri  r   r   r   r   r   r  fragmentr  r2  endswithr  r5  r  r  r   r  r"  r  r  KeyError
IndexError	TypeErrorr   r  r  Z"_extract_chapters_from_descriptionr  r-   rT  r5   r  r(   r    r  r  r   r   r   r  r  fromtimestampr  utcstrftimer/   r)   r  r   r   r  r   r\  r   r   r   Zextract_commentsZmark_watched)lr   r   r  rd  r  r  r  r  Zplayability_statusesZtrailer_video_idZsearch_metar  r  Ztranslated_titlevideo_titleZtranslated_descriptionZoriginal_descriptionZvideo_descriptionZmultifeed_metadata_listentriesZfeed_idsfeedrs  Zfeed_idZ
feed_titler)  r/  rm  rU  r  r  Zpemrr  rv  Z	countriesZregions_allowedrw  keywordr  whZratior
  r  r  Zoriginal_thumbnailsZthumbnail_namesZn_thumbnail_namesrJ  r}  rI  Zowner_profile_urlr#  Zlive_end_timer~  rV  r_  r  rY  Zpctrr  Ztranslation_languagesr  Zget_translated_subsr  Zcaption_trackZ	orig_langZ	lang_nameZ
trans_codeZ
trans_nameZorig_trans_coder  	componentr  kr  Zd_kZs_ksr  r  r  Zinitial_datar  ZvpirstlZtlbZtbrsr>  ri  regexr  ZvcrZvcZvsirZvorr  Zmultiple_songsrowZmrrZ	mrr_titleZmrr_contents_textr]  r  r  Zupload_datetimeZs_kr  rU  rf   )	r  rr  r  rY  rX  r   r|  r?  r  rg   _real_extract  sZ   
     


    


 


                  &

      





        
	

	
    
 
    
(
	

  



          















	 


zYoutubeIE._real_extract)F)T)N)NF)N)N)NN)N)rU   NNN)NNN)N)Gr   r   r   IE_DESCr  rp   r   rd  
_VALID_URLZ_EMBED_REGEXZ_RETURN_TYPEr@  _formatsr  r  Z_GEO_BYPASSIE_NAMErT  r  _TESTSZ_WEBPAGE_TESTSrj  r  r  r%  r"  r9  r;  r?  rA  rD  rU  rd  rQ  rs  rt  r|  r  rw  rx  r  r  r  r  r  r  r  r  r  r  ri  r  r  r  r  r  r  r  r  r	  r  r  r  r$  r&  r[  ri  r  r  r  __classcell__rf   rf   r  rg   rt  r  s  !
$

m! #$"  !%* $  	Uc	 &  # %	 ! -	 
 %  % ) %"  ' 	# $! !$                      /" &0o
	)"**
1 L"!"y  &rt  c                   @   s8  e Zd Zedd Zedd Zdd Zdd Zd	d
 Zdd Z	dCd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edDd#d$Zed%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zeefd1d2Zd3d4 Zejd5d6 Z dEd7d8Z!dFd9d:Z"dGd=d>Z#dHd?d@Z$d;Z%e&d<fdAdBZ'd;S )IYoutubeTabBaseInfoExtractorc                    s$   dd  t  fdd}|S )Nc                 S   sr   |  ddkr| S | drXtj| d }|jdkrX|d tj|jdd| d< |rnt| d || d< | S )NrG  )r   ru  r$  r   )rw   r>   r>   netloc)	r   r  r  r  r  r+  r  r  r&   )r  r  r  rf   rf   rg   _smuggle  s    


zGYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>._smugglec                    sd   t |i \} | |r d d< | | } r`|  |dr` fdd|d D |d< |S )NTr$  r  c                 3   s   | ]} |  V  qd S r	  )r`  rI  )r  r  rf   rg   ro     s     zYYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper.<locals>.<genexpr>)r1   r$  r   )r   r   r  r  rc  )r  rg   wrapper  s    


zFYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper)re  wraps)rc  r  rf   r  rg   passthrough_smuggled_data  s    
z5YoutubeTabBaseInfoExtractor.passthrough_smuggled_datac                 C   sT   d}|   D ]B\}}t|ts"qq||kr2|  S |dr|dr|  S qd S )N)playlistRenderervideoRendererchannelRendererZshowRendererreelItemRendererZgridZRenderer)r   rJ  r  r   r  )r  Zknown_basic_renderersr  r  rf   rf   rg   _extract_basic_item_renderer  s    
z8YoutubeTabBaseInfoExtractor._extract_basic_item_rendererc                 C   s   |  |d }| |d}t|d dd d}| t|ddthfdd}|s\| | |d	}d
||t ||||||t|d dd dt|d	d| j	d| 
|d| 	|d	d k	r| 	|dnd | |d| | t|dtjrdnd dS )Nr  r)  r  r   r&  rC  Fr:  r  r   rP  ZvideoCountTextrv  r  r*  r4  T)rG  r   r   r   rJ  rM  rI  rK  r)  rN  rO  r  r  r  rH  rZ  )r   r  r   r   r+   r   r   r[  r   r  r  r  r  r   r   )r   r  rI  r)  rK  r_  rf   rf   rg   _extract_channel_renderer!  sT        

 z5YoutubeTabBaseInfoExtractor._extract_channel_rendererc           
      c   s   |d D ]}t |tsq| |}t |ts.q| |d}|d}|rh| jd| t ||dV  q|d}|r| |V  q|d}|r| 	|V  qt
dt|d	d
 t}|rtttfD ]0}	|	|r| j||	 |	||dV   qqqd S )Nr   r)  
playlistId&https://www.youtube.com/playlist?list=ier?  r  r%  r  ru   c                 S   s   | d d d d S )Nr&  r5  r6  r   rf   rn  rf   rf   rg   rj  d  rk  z;YoutubeTabBaseInfoExtractor._grid_entries.<locals>.<lambda>)rJ  r  r  r  r   r  r[  r   r`  r  r4   r-   r   YoutubePlaylistIErt  r  r  )
r   Zgrid_rendererr  r  r)  playlist_idr?  rI  ep_urlr  rf   rf   rg   _grid_entriesG  sN    



 

 
   z)YoutubeTabBaseInfoExtractor._grid_entriesc                 C   s   t |d}|r4t |d}| jd| t ||dS t |d}|rt |d}|rp| jd| d| t |dS | jd	| t |dS t |d
}|r| jd| t |dS d S )N)ZplaylistItemDatar%  )ZflexColumnsr   Z)musicResponsiveListItemFlexColumnRendererr  r  r   r  z"https://music.youtube.com/watch?v=)r  r?  r)  )r&  watchEndpointr  r&  r  r%  z&list=r  r?  (https://music.youtube.com/playlist?list=)r&  r1  r2  z!https://music.youtube.com/browse/)r+   r  rt  r   r[  )r   r  r?  r)  r  Z	browse_idrf   rf   rg   _music_reponsive_list_entrym  s4    

  

  
 z7YoutubeTabBaseInfoExtractor._music_reponsive_list_entryc                 c   sR   | d}t|tsd S | dp*| d}|r@| |E d H  | d}|rNd S )Nr  gridRendererZexpandedShelfContentsRendererZhorizontalListRenderer)r   rJ  r  r  )r   shelf_rendererr  r  rf   rf   rg   _shelf_entries_from_content  s    


z7YoutubeTabBaseInfoExtractor._shelf_entries_from_contentFc                 c   s^   t |dd t}td|}|rJ|r.d|kr.d S | |d}| j||dV  | |E d H  d S )Nc                 S   s   | d d d d S Nendpointr5  r6  r   rf   rn  rf   rf   rg   rj    rk  z<YoutubeTabBaseInfoExtractor._shelf_entries.<locals>.<lambda>rz  z
/channels?r)  )r  )r-   r   r4   r  r  r  )r   r  Zskip_channelsr  Z	shelf_urlr)  rf   rf   rg   _shelf_entries  s     
z*YoutubeTabBaseInfoExtractor._shelf_entriesc                 c   sZ   |d D ]L}t |tsq|dp*|d}t |ts8q|d}|sHq| |V  qd S )Nr  playlistVideoRendererplaylistPanelVideoRendererr%  )rJ  r  r   r`  )r   Zvideo_list_rendererr  r  r?  rf   rf   rg   _playlist_entries  s    


z-YoutubeTabBaseInfoExtractor._playlist_entriesc              
   c   s   t |ddtfpi }|d}|r2| |V  d S |d}|rj| jd| t || |ddV  d S |d}|rt |d	d
ddthf}|sd S | jd| ft	|dt |dddthfddt
hfdfd| j|dddiV  d S d S )Nr  )r  r  r  ZshortsLockupViewModelr%  r  r  r)  r  ZentityIdZonTapr  r'  r8  r  ZoverlayMetadataZprimaryTextZsecondaryText)r)  rA  r  r  sourcesr   )r+   r  r   r`  r  r[  r   r  r   rt  r    r  )r   Zrich_grid_rendererr  r?  r  Z	entity_idrf   rf   rg   _rich_entries  sL    

 

 


z)YoutubeTabBaseInfoExtractor._rich_entriesc                 C   s   | d}|r| |S d S )Nr%  )r   r`  )r   video_rendererr?  rf   rf   rg   _video_entry  s    
z(YoutubeTabBaseInfoExtractor._video_entryc                 C   s4   t dt|d}|r0| j|t | |ddS d S )Nhttps://youtube.com)ZonTapCommandr5  r6  r   hashtag)r  r)  )r4   r+   r  r[  r   r  )r   Zhashtag_tile_rendererr   rf   rf   rg   _hashtag_tile_entry  s       
z/YoutubeTabBaseInfoExtractor._hashtag_tile_entryc                 c   s   t |dd t}|sd S t |dd tp*i }|d}|rN| |}|rN|V  t |dd t}|r~| jd| t |dV  t |dd tpg }|D ]\}t	|tsqt |d	d t}	|	sqt
|	sqt
|	}
||
krq| j|	t
 |
dV  qd S )
Nc                 S   s   | d d S )NpostZbackstagePostRendererrf   rn  rf   rf   rg   rj    rk  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>c                 S   s   | d d S )NbackstageAttachmentr  rf   rn  rf   rf   rg   rj    rk  r%  c                 S   s   | d d d S )Nr  r  r  rf   rn  rf   rf   rg   rj    rk  r  r  c                 S   s   | d d S )Nr  r  rf   rn  rf   rf   rg   rj    rk  c                 S   s   | d d d S )Nr&  ZurlEndpointr   rf   rn  rf   rf   rg   rj    rk  )r-   r  r   r`  r   r  r[  r   r  rJ  rt  r  r  )r   Zpost_thread_rendererZpost_rendererr  r?  r  r  r  runr  Zep_video_idrf   rf   rg   _post_thread_entries  s^        

   
  

z0YoutubeTabBaseInfoExtractor._post_thread_entriesc                 c   sl   | d}t|tsd S |D ]J}| d}t|trF| |E d H  q| d}t|tr| |V  qd S )Nr  backstagePostThreadRendererr  )r   rJ  r  r  r  r  )r   Zpost_thread_continuationr  r  r  rf   rf   rg   !_post_thread_continuation_entries  s    





z=YoutubeTabBaseInfoExtractor._post_thread_continuation_entriesc                 c   s(   t |dD ]}| td|tV  q
d S )N)r  .reportHistoryTableRowRenderercells.ZreportHistoryTableCellRenderercellZ"reportHistoryTableTextCellRendererr  r  .r&  r5  r6  r   rz  )r+   r  r4   rt  )r   r  r   rf   rf   rg   _report_history_entries  s    z3YoutubeTabBaseInfoExtractor._report_history_entriesc                 #   s  d g d d < t |dd tp g }|D ]z}t|ts8q&t|dddtd}|s|dr|d D ]
}|V  qf| d< q&|d	r&t|d
}|E d H  | d< q&t |dd tpg }|D ]}	t|	tsqΈj	j
j
jfddjfddfddfddfdd fddd}
|	 D ]J\}}||
krTq>|
| |D ]}|r`|V  q`| d<  qΐq>qΈ d s&| d< q& d s| d< d S )Nc                 S   s   | d S Nr  rf   rn  rf   rf   rg   rj    rk  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>r  ZmusicShelfRendererZmusicShelfContinuationrv  richItemRendererr   reportHistorySectionRenderer)r  tableZtableRendererc                 S   s   | d S r  rf   rn  rf   rf   rg   rj  /  rk  c                    s     | gS r	  )r  rn  r  rf   rg   rj  9  rk  c                    s     | gS r	  )r  rn  r  rf   rg   rj  ;  rk  c                    s     dd| igiS )Nr   r  r  rn  r  rf   rg   rj  <  rk  c                    s     dd| igiS )Nr   r  r  rn  r  rf   rg   rj  =  rk  c                    s     | gS r	  )r  rn  r  rf   rg   rj  >  rk  c                    s    |  S r	  _extract_entriesrn  continuation_listr   rf   rg   rj  ?  rk  )ZplaylistVideoListRendererr  ZreelShelfRendererZshelfRendererZmusicResponsiveListItemRendererr  r  r  r  ZhashtagTileRendererrichGridRenderer)r-   r  rJ  r  r+   r   r  r  r  r  r  r  r  r   )r   parent_rendererr  r  r  Zis_rendererr  r  Zisr_contentsZisr_contentknown_renderersr  r  rf   r  rg   r    sd    

   












z,YoutubeTabBaseInfoExtractor._extract_entriesc                 #   s  d g  fdd}t |dd t}|s,d S t |dd tpNt |dd tpNi }||E d H   d }	t }
tdD ]}|	s q|	d}|d k	r||
krd	  q|
| j|||d
}j	| d| |	||dd}|s q
|p|}jdfjdfjdfjdfjdf|df|dfjdfjdfjd fjd fjd f|d fd}t|dddd}t|dd ti d}d }|D ]Z}||krq|| \}}|r||in|}d g ||E d H   d p|}	q|sv qqvd S )Nc                    s    |  S r	  r  rn  r  rf   rg   rj  R  rk  z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>c                 S   s   | d S )Nr  rf   rn  rf   rf   rg   rj  S  rk  c                 S   s   | d S )NsectionListRendererrf   rn  rf   rf   rg   rj  W  rk  c                 S   s   | d S )Nr   rf   rn  rf   rf   rg   rj  X  rk  r   r   r  z5Detected YouTube feed looping - assuming end of feed.r   r  r   page )continuationContentsonResponseReceivedActionsr  )r  r  rB  r   r!  r   r  r  )r  ZgridPlaylistRendererZgridVideoRendererZgridChannelRendererr  r  r  r  r  ZplaylistVideoListContinuationZgridContinuationZitemSectionContinuationZsectionListContinuation))r  r  .r  r  r  Fr:  rw  )r-   r  r  r  r  r   r1  r  r  r"  r  r  r  r  r  r+   r  )r   tabr  r   r  r  Zextract_entriesZtab_contentr  r  Zseen_continuationsr  Zcontinuation_tokenrB  r!  r  r  Zcontinuation_itemZvideo_items_rendererr  rc  Z
parent_keyrf   r  rg   _entriesP  s    


     
z$YoutubeTabBaseInfoExtractor._entriesTc                 C   s,   | D ]}| dr|  S q|r(tdd S )NselectedzUnable to find selected tab)r   r   )tabsr  Ztab_rendererrf   rf   rg   _extract_selected_tab  s
    

z1YoutubeTabBaseInfoExtractor._extract_selected_tabc                 C   s   t | dtdS )N)r  twoColumnBrowseResultsRendererr  .)tabRendererZexpandableTabRendererrv  )r+   r  )r!  rf   rf   rg   _extract_tab_renderers  s
      z2YoutubeTabBaseInfoExtractor._extract_tab_renderersc                 C   sv   |  ||}| |}|d  t|dd7  < |d  t|dd7  < | j| ||d || ||| ||f|S )Nr)  z - %sZexpandedTextr   )_extract_metadata_from_tabsr  r   r  r	  r  r  )r   r  r   rA  r  metadataselected_tabrf   rf   rg   _extract_from_tabs  s    
  

z.YoutubeTabBaseInfoExtractor._extract_from_tabsc                 C   s  d|i}t |dtd}|rbt |d| jhfd| jhf}||d|d |d rp|d |d< nt |d	td}t |d
dddthf}dd }| |d}|r||d d }	|	r||	ddd | |dp| j|ddd}
|
D ]}d|d< q|
r ||
d d }|r |
|ddd | |d}t |dtd}| |d }| |d!}|t |dpv| 	|d"pv|d | 
|| |d#pt |d$d%d&d'd(d)d* d+dthtf
t|d,d* t |d-d.d/d'thfpt |d0d1d* hd'f|p|| |
 d2 t |d3| jhfd4d5p.t |d
d'd6| jhfd4d5}|rR||t|d d7d d8d9 | t |d:d4d5}| |tjr~d;|d<< t||fd=}| | 	|d>p| 	|d?}t||d@< | |d|dA< |dA d kr| |dB|dA< |dA d kr| |dC|dA< | |d|dD< |dD d kr2| |dE|dD< |dst |dF}|s`t | |dGdH}| 	|}t |dIpxi }|| jdJ|dK|d8| |dL| tdM|dNdO ||dP t|dd dQd d8t|dRd d7d d8dS |S )TNr   )r  ZchannelMetadataRendererrv  Z
externalIdZ
channelUrlr)  )rJ  rI  rI  r  ZplaylistMetadataRendererr  ZpageHeaderRendererr  ZpageHeaderViewModelc                 S   s   t | pddd d S )Nrj   =r   z=s0)r3   rb   r#  rf   rf   rg   _get_uncropped  s    zOYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>._get_uncroppedZavatarr   r   Zavatar_uncroppedr   )r   r   r~  )r  .)bannerZmobileBannerZtvBanner)r  ZimageBannerViewModelimager  r   r  r~  Zbanner_uncroppedr6  "playlistSidebarPrimaryInfoRendererr  ZplaylistHeaderRenderer)ZthumbnailRenderer)ZplaylistVideoThumbnailRendererZplaylistCustomThumbnailRendererr  )ZplaylistHeaderBannerZheroPlaylistThumbnailRendererr  )r  ZhashtagHeaderRendererr  )r  .r  r  ZcontentMetadataViewModelZmetadataRows.ZmetadataPartsc                 S   s   d|d d kS )NZsubscribersr  r  rf   r  rf   rf   rg   rj    rk  zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>r  c                 S   s   |  ddS )NrH  rj   r  rn  rf   rf   rg   rj    rk  r  microformatDataRendererr  rw  c                 S   s   | ot | S r	  )shlexrb   rn  rf   rf   rg   rj    rk  )r)  rS  r  rH  r  r  )ZvanityChannelUrl)Z	ownerUrls.Fr:  ZchannelHandleTextrP  r   )rN  rO  )r  .r  TrZ  ))statsZ
briefStatsZnumVideosTextr   )byliner   playlistBylineRendererr  modified_daterA  r>  )r  r  r  .r  r  r  r  .r  r  .Z channelAboutFullMetadataRendererr>  r  )r  r   r  r  rB  Z$playlistSidebarSecondaryInfoRenderer)Z
videoOwnerr  r)  )r  r   r&  r1  z^by (.+) and \d+ others?$rM  r2  rz  rF  )rJ  rI  rN  rJ  r  rN  )rM  rK  rO  )r+   r  r   r   r  r   r  r  _extract_sidebar_info_rendererr  _extract_availabilityr  r    r  r-   r   r   r   r   r  r  r   r   r   r  r)   r   r4   )r   r  rA  r  Zmetadata_rendererrI  Zpage_header_view_modelr  Zavatar_thumbnailsZuncropped_avatarZchannel_bannersr  Zuncropped_bannerZprimary_sidebar_rendererplaylist_header_rendererZprimary_thumbnailsZplaylist_thumbnailsr_  Zchannel_badgesZplaylist_statsZlast_updated_unixr  Z
owner_text	browse_eprf   rf   rg   r    s   
      
  
         



z7YoutubeTabBaseInfoExtractor._extract_metadata_from_tabsc              	   #   s*  d  }  }t dD ]}t| |}|s4 d S t fddt|D dd }	|	t|krf d S ||	d  E d H  |p|d d }|d d  t|dd }
| j|| 	||| 
|||d	}||
d
p҈ |
dpt||
dpdd}| j| d| |d||dd}t|dd t}qd S )Nr   c                 3   s"   | ]\}}|d   kr|V  qdS )r   Nrf   )rm   rJ  r  Zlast_idrf   rg   ro   :  s      zGYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>rv   r   r   c                 S   s   | d d d d d S )Nr  rv   r  r&  r  rf   rn  rf   rf   rg   rj  A  rk  zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>r  r%  indexr  zOAE%3D)r  r%  r&  r  r  r  r  )r  r  r  rB  r   r!  c                 S   s   | d d d d S )Nr  r  r  rf   rn  rf   rf   rg   rj  Q  rk  )r  r  r  r  r  r  r  r-   r  r  r  r   r"  r  )r   r  r  rA  r   Zfirst_idr!  r  videosr	  Zwatch_endpointrB  r  rf   r%  rg   _extract_inline_playlist4  sL       
     z4YoutubeTabBaseInfoExtractor._extract_inline_playlistc           
      C   s   | dpt|dd t}| dp&|}t|t|dd t}td|}	|rp||krp|	sp| j|t ||dS | j	| 
||||||dS )	Nr)  c                 S   s   | d d S )NZ	titleTextr  rf   rn  rf   rf   rg   rj  U  rk  zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>r  c                 S   s   | d d d d S r  rf   rn  rf   rf   rg   rj  Z  rk  zMLCT|RLTD[\w-]{22}r  )r  Zplaylist_title)r   r-   r   r4   r  	fullmatchr  r[  r   r  r(  )
r   r  r   rA  r  r   r)  r  Zplaylist_urlZis_known_unviewablerf   rf   rg   _extract_from_playlistS  s0          z2YoutubeTabBaseInfoExtractor._extract_from_playlistc                 C   s,  |  |dpi }t|dpi }|d}| t|d}t||fddddd	d
d dddf	td}t|dtd}| |tj	s|dks|dkrdS | j
|dk	r| |tjp|dkn|dk	r|dknd|dk	r| |tjp|dkn|dk	r|dkn|dk	r|nd| |tjpd| |tjp$dddS )z
        Gets the availability of a given playlist/tab.
        Note: Unless YouTube tells us explicitly, we do not assume it is public
        @param data: response
        r  r  Zprivacyr  ZprivacyFormZdropdownFormFieldRendererZdropdownZdropdownRendererr  c                 S   s   |d d S )NprivacyDropdownItemRendererZ
isSelectedrf   r  rf   rf   rg   rj  z  rk  zCYoutubeTabBaseInfoExtractor._extract_availability.<locals>.<lambda>r+  r  r  rv  )r  r  r  ZPUBLICr  rT  NZPRIVATEr  ZUNLISTEDr  F)rU  rX  rW  rV  r  )r!  r+   r   r  r   r   r  r  r   r   r\  r   r   r   r   )r   rA  sidebar_rendererr#  Zplayer_header_privacyr  Zprivacy_setting_iconZmicroformats_is_unlistedrf   rf   rg   r"  j  sT    

     z1YoutubeTabBaseInfoExtractor._extract_availabilityc                    sB   t | dd tpg }|D ]$}t | fdd|}|r|  S qd S )Nc                 S   s   | d d d S )NZsidebarZplaylistSidebarRendererr   rf   rn  rf   rf   rg   rj    rk  zLYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>c                    s   |   S r	  rf   rn  info_rendererrf   rg   rj    rk  )r-   r  )rA  r.  rh  r,  r  r  rf   r-  rg   r!    s      z:YoutubeTabBaseInfoExtractor._extract_sidebar_info_rendererc              	   C   s`   t t|dd}|sdS | j|| ||| ||d}dd| d}| j|||dd	|d
dS )zf
        Reload playlists with unavailable videos (e.g. private videos, region blocked, etc.)
        r  r  Nr  zwgYCCAA=VL)r  r2  r  Fz7Redownloading playlist API JSON with unavailable videos)r  rB  r  r!  r  r   r@  )r  r+   r  r  r  r"  )r   r  rA  r   Zis_playlistrB  r  rf   rf   rg   _reload_with_unavailable_videos  s0       

    z;YoutubeTabBaseInfoExtractor._reload_with_unavailable_videosc                 C   s   d| j dt dkS )Nr  r  rs  )r   r[  r   r  rf   rf   rg   skip_webpage  s    z(YoutubeTabBaseInfoExtractor.skip_webpagec                 C   s2  d\}}| j |dD ]}z2| j||d|  d}| j||p>d|dpHi }W nn tk
r } zPt|jtrt|jtr|jj	dkr||_
W Y  q| j||d W Y 
 q*W 5 d }~X Y nX z| | W n> tk
r } z| j||d W Y 
 q*W 5 d }~X Y nX t|ddd	std
|_
d }qq||fS )Nr&  r  zDownloading webpage)r@  rB  rj   r  r  currentVideoEndpointr  z#Incomplete yt initial data received)rU  r  r  r  r   rJ  rK  r
   r   r  r  r  r  r+   )r   r   r  r  r  rA  rY  r7  rf   rf   rg   _extract_webpage  s,    
z,YoutubeTabBaseInfoExtractor._extract_webpagec                 C   sL   |sH| j rHd}d| jdt dkr:|r:t| ddd| j|dd d	S )
z>Use if failed to extract ytcfg (and data) from initial webpagezePlaylists that require authentication may not extract correctly without a successful webpage downloadZ	authcheckr  rs  z. If you are not downloading private content, or your cookies are only for the first account and channel, pass "--extractor-args youtubetab:skip=authcheck" to skip this checkTr   r  N)r_  r   r[  r   r   r   )r   r   r  r   rf   rf   rg   _report_playlist_authcheck  s    
z6YoutubeTabBaseInfoExtractor._report_playlist_authcheckNrU   c                 C   s   d }| j s| j|||d\}}|p,| ||}| j| |ddpDi }	|dkr|	ddkrd| dg krd}
|rt|
d	d
| j|
d	d |s| j	||d | j
|||||d}||fS )Nr  F(https://www.youtube.com/feed/recommendedtabIdentifierZFEwhat_to_watchno-youtube-channel-redirectcompat_optszSThe channel/playlist does not exist and the URL redirected to youtube.com home pageTr   r  )r  rl  )r1  r3  r  r  r  r   rb  r   r   r4  _extract_tab_endpoint)r   r   r  r   r  webpage_fatalrl  rA  r  r  r   rf   rf   rg   _extract_data  s$    z)YoutubeTabBaseInfoExtractor._extract_datac                    s   | j ||d}| j|d|id|||dd|d	}ddd	}| D ]>\ }	t| fd
dt}
|
r@| j||
|	||||dd  S q@d}|rt|dd| || d S )N)r   rl  r   r  znavigation/resolve_urlz#Downloading API parameters API JSON)	r  r  r!  rB  r   r  r  r@  rl  r  r  )r1  r  c                    s   | d   S )Nr  rf   rn  Zep_keyrf   rg   rj    rk  zCYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>)r  r2  r  )r  r  r  rB  r   r  rl  r!  z0Failed to resolve url (does the playlist exist?)Tr   )r  r"  r   r-   r  r   r   )r   r   r  r   r  rl  rB  Zresolve_responseZ	endpointsr  r  Zerr_noterf   r<  rg   r9    s<           
     z1YoutubeTabBaseInfoExtractor._extract_tab_endpointc              
   c   s
  d|i}|t kr| j}|r"||d< d}d| d}tdd |D }| jsV| ||ni }| j|dd	 d g}	d }
td
D ]}||	d pi  | j	|| 
|
|d}| j| d| d|||||d}
t|
f| }| dtt|i|	E d H  |	d s| qq|d S )Nr  r  ))r  ZtwoColumnSearchResultsRendererZprimaryContentsr  r  )ZonResponseReceivedCommandsr   r  r  )r  ZtabbedSearchResultsRendererr  r   r  r  r  r  )r  zquery "r/  c                 S   s   h | ]}|d  qS )r   rf   )rm   keysrf   rf   rg   	<setcomp>  s     z>YoutubeTabBaseInfoExtractor._search_results.<locals>.<setcomp>Fr  r   r   )r   r  rl  r  r  )r  r  r  rl  r!  r   rB  r  )r   _SEARCH_PARAMSr}   r1  r  r4  r  r  r  r  r  r"  r+   r  r  r5   )r   r  r  rl  rA  Zcontent_keys
display_idr!  r   r  r  r  rB  Zslr_contentsrf   rf   rg   _search_results  s@           z+YoutubeTabBaseInfoExtractor._search_results)F)T)T)T)NTFrU   )NTrU   )(r   r   r   ri  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!  r0  re  rf  r1  r3  r4  r;  r9  r?  r   rA  rf   rf   rf   rg   r    sN   

&&
$6D
 )




r  c                m       s  e Zd ZdZdjejdejdZ	dZ
dddd	d
dddddd	ddddgdedddddd	d
ddddddddgd	ddedddddddddd dd!d"d d#ged$d%dd&d'd(d)d*d+d,d-d.d)d/d0d,ed1dd2d$d3d4d5d6d7d8g ed9d:d;d<d=d:d>d?d@dAdBdCdDdEdFg d:d8dGd;d<dHd>d?d:dIdJdBdKdLdMdNdOdPdQdPdRdSdTgdUdVdMedWdXdYdZd[dMd\dOdPdQdRdSdTgdVdMdUdPed]d^dYd_d`dMd\dOdPdQdMdUdPdRdSdTgdVedadbdYdcdddMdedOdPdQdUdPdVdMdRdSdTgedfdgdYdhdidMdjdOdPdVdMdRdSdTgedUdQdPdkdldYdmdndMdodOdPdVdMdRdSdTgedUdQdPdkdpdYdqdrdsddtddd#gd ded"d!d d$duddvd$d3dwd$d3dxd$d3dydzd{d|d}g ed~dddd=ddddddBdddddg dded8dd=ddddddgdddd$dddddg edddd8dd=ddddddYddddedg d8dddd=ddddddgddddddddeg dd8d=ddddddgddddddg edddd=dddddÜddYdd$d3dddddddddgeeedϜ
dd$ide gdҜdd$d3dd$d3dddededgeeedddJedd$dd=ddeedddd$ddd$idgdddddddddgdddged	dd$id$ddd$d3dd$d3ddd$ddd$d3dd$d3dd$d3dd$d3dd$d3ddd$dddd$ddd$d3dd$d3dd$d3dd$d3dd dg ddddd$d3ddd$ddd	d$dd
ddddddedg dd=dddddddgdddddg ddeddd8d=dddddgdd d!d!g dd"dd#d$d%d&g ed8dHdd'd(dgd)d*d+d,d-dHg d.d/ed8d0d1d2d3d/d4d5d6d7d8d9d:d;d<ed=d>d?d@d>dAigdAdBd$idCdDddEdEg dd(d$dFdGdHgiidIdJdKdLdMdNdOdPdMg dQedRdSd$dFdGdHgiidIdTdUdVdddddd8dg ded=ddWdd$dFdGdHgiidIddgdXdYdZd$dd[d\d]d^d_g dHd`dadbdcedddedadfdXdYdgdhdig djdkdldidmdndodmdp
dAdqdrdsdtgiiidugdXdvdwdxg edjdmdidydzd=dndodmd{dAdqdrdsdtgiiidugdXd|d}d}g dd(dd~ddg ddddddg ddddddg ddddddeddddddddd$dddddddddedddddd$dd:ddddddddeddddddddd$d3dd$d3dddddddeddddddddddg ddddddg dddddiddmdkdidjg dndodmd
d5d8d9dddeedigdBd$iddddg dd5d8d9deedeeeeeeeedÜigd$dĐdŜdAdƜdǐdidȐdmdkdidjg dndodmd
d5d8dɐdʐdːdːd̐d̐deeed̐d͐dd$dϜigdBd$iddd!d#gd edd ddd"d!d d$dќdJddҐdӐdӐdԐdՐd֐dedg dאdِdڜdJddېdܐdݐdސdߐddݐdd0dded$dd:ddddedd8ddddg d=dddddgddddddddedddddd$ddddddddddd dddddgddgPZe fdd	Zed
e	 dZdd ZdddZdd Zdd Zejdd Z  ZS (  r[  zYouTube Tabsa  (?x:
        https?://
            (?!consent\.)(?:\w+\.)?
            (?:
                youtube(?:kids)?\.com|
                {invidious}
            )/
            (?:
                (?P<channel_type>channel|c|user|browse)/|
                (?P<not_channel>
                    feed/|hashtag/|
                    (?:playlist|watch)\?.*?\blist=
                )|
                (?!(?:{reserved_names})\b)  # Direct URLs
            )
            (?P<id>[^/?\#&]+)
    )rk  )reserved_namesrl  zyoutube:tabzplaylists, multipageuM   https://www.youtube.com/c/ИгорьКлейнер/playlists?view=1&flow=grid^   ZUCqj7Cz7revf5maW9g5pgNcgzIgor Kleiner Ph.D. - Playlistsz$md5:15d7dd9e333cb987907fcb0d604b233azIgor Kleiner Ph.D.z@IgorDataSciencez(https://www.youtube.com/@IgorDataScienceu'   критическое мышлениеu   наука простоu   математикаu   анализ данныхz8https://www.youtube.com/channel/UCqj7Cz7revf5maW9g5pgNcg)r   r)  rH  rM  rN  rO  rJ  rI  r  rK  r  )r@  r   playlist_mincountr  z%playlists, multipage, different orderz>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd)r   r)  rH  rM  rN  rO  r  rI  rJ  rK  r  zplaylists, serieszJhttps://www.youtube.com/c/3blue1brown/playlists?view=50&sort=dd&shelf_id=3rO   ZUCYO_jab_esuFRV4b17AJtAwz3Blue1Brown - Playlistsz$md5:4d1da95432004b7ba840ebc895b6b4c9z8https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAwZ3Blue1Brownz@3blue1brownz$https://www.youtube.com/@3blue1brownZMathematicsT)r   r)  rH  rK  rJ  rI  rN  rO  rM  r  r  rZ  zplaylists, singlepagez7https://www.youtube.com/user/ThirstForScience/playlistsri   ZUCAEtajcuhQ6an9WEzY9LEMQzThirstForScience - Playlistsz$md5:609399d937ea957b0f53cbffb747a14cZThirstForSciencez)https://www.youtube.com/@ThirstForSciencez@ThirstForSciencez8https://www.youtube.com/channel/UCAEtajcuhQ6an9WEzY9LEMQr  )r   r)  rH  rM  rO  rN  rI  rK  r  rJ  r  z3https://www.youtube.com/c/ChristophLaimer/playlistsr  zbasic, single video playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcZ"PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczyoutube-dl public playlistrj   Z20201130z	Sergey M.ZUCmlqkdCBesrv2Lak1mF_MxAz8https://www.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxArT  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   r)  rH  r  rA  r   rJ  rI  rK  rS  rM  rO  rN  r   )r@  r   r  r  zempty playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlistZ20230921r  )r   r)  r  rJ  rH  r   rI  rK  rS  rO  rN  rM  r   zHome tabzAhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/featuredZUCKfVa3S1e4PHvxWcwyMMg8wzlex will - Homez$md5:2163c5d0ff54ed5f598d6a7e6211e488zlex willz@lexwill718ZbiblehistoryZprophesyz#https://www.youtube.com/@lexwill718z8https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w)r   r)  rH  rM  rN  rJ  r  rO  rK  rI  r  r   r@  r   r  rD  z
Videos tabz?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videos)r   r)  rH  rM  rN  r  rK  rI  rO  rJ  r  i  zVideos tab, sorted by popularzWhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videos?view=0&sort=p&flow=grid)r   r)  rH  rM  rN  rI  rO  rJ  r  rK  r     zPlaylists tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists)r   r)  rH  rM  rN  rO  rJ  rK  rI  r  r     zCommunity tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Community)r   r)  rH  rJ  rK  rI  r  r  rO  rN  rM  r  zChannels tabzAhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/channelszlex will - Channels   z
Search tabzChttps://www.youtube.com/c/3blue1brown/search?query=linear%20algebra(   z%3Blue1Brown - Search - linear algebra)r   r)  rH  rK  r  rJ  rI  r  rO  rN  rM  rZ  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$md5:a14dc1a8ef8307a9807fe136a0660268Z20150605ZUCEPzS1rYsrkqzSLNp76nrcgz8https://www.youtube.com/channel/UCEPzS1rYsrkqzSLNp76nrcgZChristiaan008z@ChRiStIaAn008z&https://www.youtube.com/@ChRiStIaAn008)r)  r   rH  r  rA  r   rI  rK  rJ  rS  rN  rM  rO  rx  zLarge playlistz>https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0QzUploads from CauchemarZUUBABnxM4Ar9ten8Mdjj1j0Qz8https://www.youtube.com/channel/UCBABnxM4Ar9ten8Mdjj1j0Qre:\d{8}Z	CauchemarZUCBABnxM4Ar9ten8Mdjj1j0Qz@Cauchemar89z$https://www.youtube.com/@Cauchemar89)r)  r   rK  r  r   rJ  rA  rH  rI  rS  rN  rM  rO  ic  *[Uu]navailable videos (are|will be) hidden)r@  r   r  rD  r  z!even larger playlist, 8832 videosz/http://www.youtube.com/user/NASAgovVideo/videosr  zTBuggy playlist: the webpage has a "Load more" button but it doesn't have more videosz>https://www.youtube.com/playlist?list=UUXw-G3eDE9trcvY2sBMM_aAzUploads from Interstellar MoviezUUXw-G3eDE9trcvY2sBMM_aAzUCXw-G3eDE9trcvY2sBMM_aAz8https://www.youtube.com/channel/UCXw-G3eDE9trcvY2sBMM_aAzInterstellar Moviez@InterstellarMoviez*https://www.youtube.com/@InterstellarMovie)r)  r   r  rA  rI  rK  rJ  rH  r   rS  rN  rM  rO  rH   z.Playlist with "show unavailable videos" buttonz>https://www.youtube.com/playlist?list=UUTYLiWFZy8xtPwxFwX9rV7Qu*   Uploads from Phim Siêu Nhân Nhật BảnZUUTYLiWFZy8xtPwxFwX9rV7Qu   Phim Siêu Nhân Nhật Bảnz8https://www.youtube.com/channel/UCTYLiWFZy8xtPwxFwX9rV7QZUCTYLiWFZy8xtPwxFwX9rV7Qz,https://www.youtube.com/@phimsieunhannhatbanz@phimsieunhannhatban)r)  r   rA  rJ  r  rH  rK  rI  r   rS  rO  rN  rM     z*Playlist with unavailable videos in page 7z>https://www.youtube.com/playlist?list=UU8l9frL61Yl5KFOl87nIm2wzUploads from BlankTVZUU8l9frL61Yl5KFOl87nIm2wZBlankTVz8https://www.youtube.com/channel/UC8l9frL61Yl5KFOl87nIm2wZUC8l9frL61Yl5KFOl87nIm2wz@blanktvz https://www.youtube.com/@blanktv)r)  r   rJ  rK  rI  rA  r  r   rH  rS  rN  rM  rO  r  z3https://github.com/ytdl-org/youtube-dl/issues/21844zHhttps://www.youtube.com/playlist?list=PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz Data Analysis with Dr Mike PoundZ"PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz$md5:7f567c574d13d3f8c0954d9ffee4e487zUC9-y-6csu5WGm29I7JiwpnAz8https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnAZComputerphileZ20190712z@Computerphilez&https://www.youtube.com/@Computerphile)r)  r   rH  r  rA  rI  rK  rJ  rS  r   rN  rM  rO     zChttps://invidio.us/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcz4Playlist URL that does not actually serve a playlistzThttps://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4ZFqZTN594JQwr{  z6Smiley's People 01 detective, Adventure Series, ActionZ20150526r  z$md5:507cdcb5a49ac0da37a920ece610be80r  )
r   rp  r)  r  r  rH  r  r  rA  r  r  r  )r@  r   r  r  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hGkQjiJLjWQrw  r  zSky NewszUCoMdktPbSTixAyNGwb-UYkQz?re:https?://i\.ytimg\.com/vi/[^/]+/maxresdefault(?:_live)?\.jpgzre:\d+r=  z8https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQz https://www.youtube.com/@SkyNewsz@SkyNews)r   rp  r)  r  rH  r  r  r  rR  rJ  rI  r  rA  r  r  r  rS  rY  rK  r  r@  rO  rN  rM  rZ  z"Ignoring subtitle tracks found in r  z/https://www.youtube.com/user/TheYoungTurks/liveZa48o2S1cPooz The Young Turks - Live Main ShowZ20150715z$md5:438179573adcdff3c97ebb1ee632b891zCenk Uygur (TV Program Creator)z$The Young Turks (Award-Winning Work)zTalk Show (TV Genre))	r   rp  r)  r  r  rH  r  r  r  )r   r  r  r  z=https://www.youtube.com/channel/UC1yBKRuGpC1tSM73A0ZjYjQ/livez/https://www.youtube.com/c/CommanderVideoHq/livez.A channel that is not live. Should raise errorz-https://www.youtube.com/user/numberphile/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%Recommended - redirects to home page.r5  z5inline playlist with not always working continuationszChttps://www.youtube.com/watch?v=UC6u0Tct-Fo&list=PL36D642111D65BE7Cz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cctv9 - All)r   r)  r  r%  )r   r  rD  zdhttps://www.youtube.com/watch?list=PLW4dVinRY435CBE_JD3t-0SRXKfnZHS1P&feature=youtu.be&v=M9cJMXmQ_ZUziRequires Premium: should request additional YTM-info webpage (and have format 141) for videos in playlistzJhttps://music.youtube.com/playlist?list=PLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkqz%/browse/ should redirect to /channel/z9https://music.youtube.com/browse/UC1a8OFewdjuLq6KlF8M_8Ngz,VLPL, should redirect to playlist?list=PL...zEhttps://music.youtube.com/browse/VLPLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkqZ"PLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkqz]Providing you with copyright free / safe music for gaming, live streaming, studying and more!u   NCS : All Releases 💿z8https://www.youtube.com/channel/UC_aEa8K-EOJ3D6gOs7HcyNgzUC_aEa8K-EOJ3D6gOs7HcyNgZNoCopyrightSoundsz*https://www.youtube.com/@NoCopyrightSoundsz@NoCopyrightSounds)r   rH  r)  rK  r   rA  rI  r  rJ  rS  rO  rM  rN     z'YouTube Music is not directly supportedz-Topic, should redirect to playlist?list=UU...z9https://music.youtube.com/browse/UC9ALqqC4aIeG5iDs7i90BfwZUU9ALqqC4aIeG5iDs7i90Bfwz'Uploads from Royalty Free Music - TopicZUC9ALqqC4aIeG5iDs7i90BfwzRoyalty Free Music - Topicz8https://www.youtube.com/channel/UC9ALqqC4aIeG5iDs7i90Bfw)r   r)  r  rI  rJ  rA  rK  r   rH  rS  rM  e   z8https://www.youtube.com/channel/UCtFRv9O2AHqOZjjynzrv-xgzUCtFRv9O2AHqOZjjynzrv-xgr  zYoutube music Albumz2https://music.youtube.com/browse/MPREb_gTAcphH99wEZ)OLAK5uy_l1m0thk3g31NmIIz_vMIbWtyv7eZixlH0z0Album - Royalty Free Music Library V2 (50 Songs))r   r)  r  rA  rH  rS  r   r  )r@  r   r  r  r  zunlisted single video playlistzHhttps://www.youtube.com/playlist?list=PLwL24UFy54GrB3s2KMMfjZscDi1x5DajfZ"PLwL24UFy54GrB3s2KMMfjZscDi1x5Dajfzyt-dlp unlisted playlist testZ20220418Z	colethedjzUC9zHu_mHU96r19o-wV5Qs1Qz8https://www.youtube.com/channel/UC9zHu_mHU96r19o-wV5Qs1Qz&https://www.youtube.com/@colethedj1894z@colethedj1894)r   r)  rS  r  r   rJ  rA  rH  rI  rK  rO  rN  rM  r  r  r  r   r   rz   r  z8https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Qz+https://www.youtube.com/watch?v=BaW_jenozKcr  r  r  )r)  r   rG  r   r/  rI  rK  rA  r   rJ  rN  rO  rM  extract_flat)r@  r   r  r  r  r  zHAPI Fallback: Recommended - redirects to home page. Requires visitorDatarecommendedZ
youtubetabr  r  r  )r@  r   r  rD  r  z1API Fallback: /videos tab, sorted by oldest firstzJhttps://www.youtube.com/user/theCodyReeder/videos?view=0&sort=da&flow=gridZUCu6mSoMNzHQiBIOCkHUa2AwzCody'sLab - Videosz$md5:d083b7c2f0c67ee7a6c74c3e9b4243faz	Cody'sLabz8https://www.youtube.com/channel/UCu6mSoMNzHQiBIOCkHUa2Aw)r   r)  rH  rJ  rI  r  rK  r  i  z!Query for sorting no longer works)r@  r   r  rD  r  r  z;API Fallback: Topic, should redirect to playlist?list=UU...)r   r)  r   rI  rH  rK  r  rJ  rA  rS  rM  )r@  r   r  rD  r  r  z)non-standard redirect to regional channelz8https://www.youtube.com/channel/UCwVVpHQ2Cs9iGJfpdFngePQzQcollaborative playlist (uploader name in the form "by <uploader> and x other(s)")zHhttps://www.youtube.com/playlist?list=PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx6z"PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx6Z20220407z8https://www.youtube.com/channel/UCKcqXmCcyqnhgpA5P0oHH_QZUCKcqXmCcyqnhgpA5P0oHH_QZ	pukkandanzTest for collaborative playlistz$yt-dlp test - collaborative playlistz"https://www.youtube.com/@pukkandanz
@pukkandan)r   r   rK  r  rS  rI  rJ  rH  r)  rA  rO  rN  rM  ztranslated tab namezBhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/playlistsr  r  ztest descriptionu#   cole-dlp-test-acc - 再生リストr  r  r  )
r   r  rK  rH  r)  rI  rJ  rO  rN  rM  r  r   r   r   zPreferring "ja"z=preferred lang set with playlist with translated video titleszHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0z"PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0testzdlp test playlist)r   r  rA  rK  rJ  rI  rH  r)  rS  rO  rN  rM  zphttps://www.youtube.com/feed/sfv_audio_pivot?bp=8gUrCikSJwoLMkd0VmtzQk1ZRk0SCzJHdFZrc0JNWUZNGgsyR3RWa3NCTVlGTQ==Zsfv_audio_pivotz=https://www.youtube.com/channel/UCEH7P7kyJIkS_gJf93VYbmg/liveZUCEH7P7kyJIkS_gJf93VYbmgzUCEH7P7kyJIkS_gJf93VYbmg - LiverF  zAhttps://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/letsplayZUCQvWX73GQygcwXOTSf_VDVgz%UCQvWX73GQygcwXOTSf_VDVg - Let's playr^  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/homezUCQvWX73GQygcwXOTSf_VDVg - Homez8https://www.youtube.com/channel/UCK9V2B22uJYu3N7eR_BT9QAZUCK9V2B22uJYu3N7eR_BT9QAu   Polka Ch. 尾丸ポルカz$md5:49809d8bf9da539bc48ed5d1f83c33f2zcount:35z#https://www.youtube.com/@OmaruPolkaz@OmaruPolka)r   r)  r  rI  rK  rH  rJ  r  rO  rM  rN  rZ  rF   )r   r  r  z,https://www.youtube.com/@NotJustBikes/shortszUC0intLFzLaudFG-xAvUEO-AzNot Just Bikes - Shortszcount:10z8https://www.youtube.com/channel/UC0intLFzLaudFG-xAvUEO-Az$md5:5e82545b3a041345927a92d0585df247zNot Just Bikesz%https://www.youtube.com/@NotJustBikesz@NotJustBikes)r   r)  r  rK  rH  r  rI  rJ  rO  rM  rN  rZ  z@https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sig/streamsZUC3eYAvjCVwNHgkaGbXX3sigu   中村悠一 - Livezcount:7z8https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sigu   中村悠一z$md5:e744f6c93dafa7a03c0c6deecb157300z(https://www.youtube.com/@Yuichi-Nakamuraz@Yuichi-Nakamura)r   r)  r  rI  rK  rJ  r  rH  rO  rN  rM  r  z8https://www.youtube.com/channel/UC2yXPzFejc422buOIzn_0CAzhttps://www.youtube.com/newsz#https://www.youtube.com/c/TKFShortsZUCgJ5_1F6yJhYLnyMszUdmUgzShorts Break - Shortszcount:48zShorts Breakz$md5:6de33c5e7ba686e5f3efd4e19c7ef499z8https://www.youtube.com/channel/UCgJ5_1F6yJhYLnyMszUdmUgz-https://www.youtube.com/@ShortsBreak_Officialz@ShortsBreak_Official)r   r)  r  rI  rJ  rH  r  rK  rO  rM  rN  rB   Ztrendingztrending - NowzYhttps://www.youtube.com/feed/trending?bp=4gIcGhpnYW1pbmdfY29ycHVzX21vc3RfcG9wdWxhcg%3D%3Dztrending - Gamingz?https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/shortszcole-dlp-test-acc - Shorts)
r   r)  rJ  rH  rI  rK  r  rO  rN  rM  z*https://www.youtube.com/shorts/sSM9J5YH_60ZsSM9J5YH_60zSHORT short)rG  r   r   r   r)  rA  r  )r   r  r  r  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/livezUCQvWX73GQygcwXOTSf_VDVg - Livez+startswith:https://www.youtube.com/watch?v=)rG  r   r   r   r)  rY  rI  rK  r@  rJ  rM  rO  rN  rZ  rj  rR  playlist_itemsr   r  r  r  rD  zAhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/channelszcole-dlp-test-acc - Channels
YoutubeTabz8https://www.youtube.com/channel/UC-lHJZR3Gqxm24_Vd_AJ5YwzUC-lHJZR3Gqxm24_Vd_AJ5YwZ	PewDiePiez"https://www.youtube.com/@PewDiePiez
@PewDiePie)rG  r   r   r   rI  r)  rJ  rK  r  r  r  rM  rO  rN  rZ  z*https://www.youtube.com/@3blue1brown/about)r   r  r)  r  rI  rJ  rK  rH  rO  rN  rM  rZ  z;https://www.youtube.com/@99percentinvisiblepodcast/podcastsZUCVMF2HD4ZgC0QHpU9Yq5Xrwz2https://www.youtube.com/@99percentinvisiblepodcastz$md5:3a0ed38f1ad42a68ef0428c04a15695cz99 Percent Invisible - Podcastsz99 Percent Invisiblez8https://www.youtube.com/channel/UCVMF2HD4ZgC0QHpU9Yq5Xrwz@99percentinvisiblepodcast)r   rI  rO  rH  r)  rM  r  rK  r  rJ  rN  z*https://www.youtube.com/@AHimitsu/releaseszUCgFwu-j5-xNJml2FtTrrB3Az	A Himitsuz!https://www.youtube.com/@AHimitsuzA Himitsu - Releasesz	@AHimitsuzI make musicz8https://www.youtube.com/channel/UCgFwu-j5-xNJml2FtTrrB3A)r   rJ  rO  r)  rN  rM  rI  r  rH  rK  r  rZ  z>https://www.youtube.com/playlist?list=UUxqPAgubo4coVn9Lx1FuKcgZUUxqPAgubo4coVn9Lx1FuKcgz8https://www.youtube.com/channel/UCxqPAgubo4coVn9Lx1FuKcgz@BangyShortsz$https://www.youtube.com/@BangyShortsZUCxqPAgubo4coVn9Lx1FuKcgzBangy ShortszUploads from Bangy Shorts)r   rK  rA  rN  rH  rO  rI  rJ  rM  r  rS  r   r)  r8  )r   r  rD  r  zTags containing spacesz8https://www.youtube.com/channel/UC7_YxT-KID8kRbqZo7MyscQzUC7_YxT-KID8kRbqZo7MyscQZ
Markiplierz$md5:0c010910558658824402809750dc5d97z@markiplierz#https://www.youtube.com/@markiplierZ
markiplierZcomedyZgamingzfunny videoszfunny momentszsketch comedyZlaughingz	lets playzchallenge videosZ	hilariousZ
challengesZsketcheszscary gameszfunny gamesz
rage gameszmark fischbach)r   rJ  rI  r)  r  rH  rN  rO  rM  rK  rZ  r  r@  r   r  r  c                    s   t |rdS t |S )NF)rt  r  r  )r  r   r  rf   rg   r  R  s    zYoutubeTabIE.suitablez(?P<pre>z1)(?(not_channel)|(?P<tab>/[^?#/]+))?(?P<post>.*)$c                 C   s,   | j | }|dd | D  |S )Nc                 s   s"   | ]\}}|d kr|dfV  qd S )Nrj   rf   rm   r  r  rf   rf   rg   ro   Z  s      z-YoutubeTabIE._get_url_mobj.<locals>.<genexpr>)_URL_REr  	groupdictr  r   )r   r   r  rf   rf   rg   _get_url_mobjX  s    zYoutubeTabIE._get_url_mobjrz  c                 C   s   | dpd }t|t|d}|r<| |d dd  pHt|dtd}|rbdd	i |||fS |rv| d
|  ddd |||fS )Nr)  rj   )r  r5  r6  r   r  r   r6  rv  ZTAB_ID_SPONSORSHIPSZ
membershipz#Falling back to selected tab name: Zfeaturedstreams)homer  )r   r  r4   r+   r]  r   r1  )r   r  rd  Ztab_nameZtab_urltab_idrf   rf   rg   _extract_tab_id_and_name]  s6        z%YoutubeTabIE._extract_tab_id_and_namec                    s   t  fdd|D S )Nc                 3   s    | ]}  |d  kV  qdS rk   )ra  )rm   r  r   r`  rf   rg   ro   t  s     z(YoutubeTabIE._has_tab.<locals>.<genexpr>)r  )r   r  r`  rf   rb  rg   _has_tabs  s    zYoutubeTabIE._has_tabc                 C   s   | j g |f| ||S r	  )r  r  )r   r  rA  rf   rf   rg   _empty_playlistv  s    zYoutubeTabIE._empty_playlistc                    s   |}tjtj|jdd}dg }|}|d |d |d |d  f\}}}}	|	r |dr |d d	 d
kr	d|d	d   t
|d	d  S |d d	 dkrjd| |dd}
t|
ddtd}|std	|t
S |d dkr 	d| | | t
|S |dd  | |  }}|	r^|s^d|kr^| d| }|drzd|  t|  fdddD \}}|s|d dr|stddd d!|  	d"| t
|S ||s	d#| t|S ||\}}t|d$dd%}|rfd|krfd&td'|||f}d(|  	|t
S |g  }}|	rN|rNd|krN|}||\}}d)|d*| d+| |d,kr؈||S |s|rd- |d.r|d&|d/|f |d0r6|d&|d1|f |s|d2kr|d d	 d3krd||S d4|d	d   }d"| }zj|||ddd5\}}W n" tk
r   || Y S X || }}d6| d7 n"|rN|d2krN| | d  }}nL|p
d2|krN|d8kr(t|d9n|rBtd:| d;dd | | }d<|krl |||pj|}j!|dd= |g  }}|r"||||g}|d> #t
$ t
j%|d? d@dAkr|&fdBd|D  n|&t'j(| t)|dkr|d> S |rl*||}dC}t+|dDdE rLdF|dG d	d   }dH|  j,||f|S t|dIt-dJ}|r.|||||S t|dKtdJp|}|r|dLkrƈdM|  	d#| t|S tdNd S )ONrw   r  r8  prer  r  Znot_channelr$  r   r/  r  ZMPz"https://music.youtube.com/channel/rW   r  )r  r  ZurlCanonicalFr  z#Failed to resolve album to playlistZchannel_typer  r   r7  z/videosz8YouTube Music is not directly supported. Redirecting to c                 3   s   | ]}t  |d fV  qdS rk   r  r  )r  rf   rg   ro     s     z-YoutubeTabIE._real_extract.<locals>.<genexpr>)r  r  Zwatchz&A video URL was given without video IDTr   zDA video URL was given without video ID. Trying to download playlist r  r7  )r  .ZnavigateActionr  r5  r6  r   r:  rj   rz  zXThis playlist is likely not available in your region. Following conditional redirect to zSelected tab: rt  z), Requested tab: ZaboutziDownloading all uploads of the channel. To download only the videos in a specific tab, pass the tab's URLr^  z/streamsZshortsz/shortsr'  UCZUU)r   r  r:  zQThe channel does not have a videos, shorts, or live tab. Redirecting to playlist z insteadr  rD  zThis channel does not have a z tabzno-youtube-unavailable-videosr  r   )Zextractor_keyZ	extractorr  rV  rx  c                 3   s   | ]}  |tV  qd S r	  )r  r[  )rm   ur  rf   rg   ro     s     zthe Uploads (UU) playlist URLc                 S   s   | d  dS )NrI  rf  )r   rn  rf   rf   rg   rj    rk  z,YoutubeTabIE._real_extract.<locals>.<lambda>z(https://www.youtube.com/playlist?list=UUrI  zeDownloading as multiple playlists, separated by tabs. To download as a single playlist instead, pass )r  r  r  r  rv  r2  r  r%  /livez5Unable to recognize playlist. Downloading just video zUnable to recognize tab page)/r  r  r  r  r  r  rb  r]  r   r  r[  r9  r+   r   r   r   r#   r   Z_yes_playlistrt  r;  rp   r4   rS  r  r  ra  r1  rd  rc  r  r   r0  r  r  r  r   r  r  rR  r  r  r  r-   r  r  r*  )r   r   r  r  r8  r  re  r  r  Z
is_channelZmdataZmurlZoriginal_tab_idr@  r?  r  rA  r   redirect_urlr  Z
extra_tabsr  Zselected_tab_idZselected_tab_nameZpl_idZpl_urlr  r  Zuploads_urlr  rf   )r  r   rg   r  y  s   

&  
           







    
zYoutubeTabIE._real_extract)rz  )r   r   r   r  r  r   rb  rp   rd  r  r  rT  r  rt  r   r   r  r  rj  r  r  compiler[  r]  ra  rc  rd  r  r  r  r  rf   rf   r  rg   r[  &  s  


  " 		&
$                       r[  c                       s   e Zd ZdZdjejdejdZ	dZ
ddddd	d
dedddd	g ddddddddddddddddddd d!d"g d#edd$d%dd&d'd(d)gd*d+d,d-d.d/d0d1d/ed2g d3d4ddd5d6gd7d8d9d:d;d9d:gZe fd<d=Zd>d? Z  ZS )@r  zYouTube playlistsa  (?x)(?:
                        (?:https?://)?
                        (?:\w+\.)?
                        (?:
                            (?:
                                youtube(?:kids)?\.com|
                                {invidious}
                            )
                            /.*?\?.*?\blist=
                        )?
                        (?P<id>{playlist_id})
                     )rk  )r  rl  zyoutube:playlistz
issue #673ZPLBB231211A4F62143z%[OLD]Team Fortress 2 (Class-based LP)ZWickmanz
@WickmanVTz$md5:8fa6f52abb47a9552002fa3ddfc57fc2z"https://www.youtube.com/@WickmanVTrK  zUCKSpbfbl5kRQpTdL7kMc-1Qz8https://www.youtube.com/channel/UCKSpbfbl5kRQpTdL7kMc-1QrT  )r)  r   rM  rN  rH  rA  rO  r   rI  rJ  r  rK  rS     rF  Z"PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlZYDL_safe_search)r)  r   r   zThis playlist is privater  r|   zQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEuri   ZJODA15Z"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEuZmilanz
@milan5503rj   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73HfelbmawZ20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)r)  r   rM  rN  rH  rK  r  r   rA  rJ  rI  rO  rS  z.[Uu]navailable videos? (is|are|will be) hiddenRetryingz	Giving up)r@  r   r  r  r  zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIli  z'2018 Chinese New Singles (11/6 updated)Z"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlZLBKz@music_kingz$md5:da521864744d60a198e3a88af4db0d9dz8https://www.youtube.com/channel/UC21nz3_MesPLqtDqwdvnoxAz#https://www.youtube.com/@music_kingZUC21nz3_MesPLqtDqwdvnoxA)r)  r   rM  rN  rH  rJ  rA  rK  r  rO  rI  r   rS  rL  )r   rD  r  r  ZTLGGrESM50VT6acwMjAyMjAxNwTr  Z)OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                    sD   t |rdS ddlm} ||}|dd gd r8dS t |S )NFr   r  r  r   )r[  r  r  r#   r   r  r   r  rf   rg   r  s  s    
zYoutubePlaylistIE.suitablec                 C   sP   |  |}t|}tdt|p&d|i}|r<t|ddi}| j|t |dS )Nz https://www.youtube.com/playlistr  r$  Tr  )	r  r   r$  r2   r#   r&   r  r[  r   )r   r   r  r$  rf   rf   rg   r  }  s    

zYoutubePlaylistIE._real_extract)r   r   r   r  r  r   rc  rp   rd  r  r  rT  r  rj  r  r  r  rf   rf   r  rg   r    s   
	K	r  c                   @   st   e Zd ZdZdej dZdddddd	d
dddgeeddddddedddeeddddddddgZ	dd Z
dS )YoutubeYtBeIEyoutu.bezIhttps?://youtu\.be/(?P<id>[0-9A-Za-z_-]{11})/*?.*?\blist=(?P<playlist_id>r   zDhttps://youtu.be/yeWKywCrFtk?list=PL2qgrgXsNUG5ig9cat4ohreBjYLAPC0J5ZyeWKywCrFtkrw  z#Small Scale Baler and Braiding RugszBackus-Page House Museumz@backuspagemuseumz4re:https?://(?:www\.)?youtube\.com/@backuspagemuseumZ20161008z$md5:800c0c78d5eb128500bffd4f0b4f2e8azNonprofits & Activismr   Tr  ZUCEfMCQ9bs3tjvjy1s451zawr  z8https://www.youtube.com/channel/UCEfMCQ9bs3tjvjy1s451zawrT  ;   )r   rp  r)  rM  rN  rO  r  rH  r  r  r  r  r  r  rJ  rI  rY  rA  rK  rS  r/  r  r  )ro  r  r  z4https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21r  c                 C   s@   |  |}|d}|d}| jtd||ddt |dS )Nr   r  zhttps://www.youtube.com/watchro  )r  r  Zfeaturer  )Z_match_valid_urlr  r  r2   r[  r   )r   r   r  r?  r  rf   rf   rg   r    s    


 zYoutubeYtBeIE._real_extractN)r   r   r   r  r   rc  r  r  rT  r  r  rf   rf   rf   rg   rn    sH    $rn  c                   @   s(   e Zd ZdZdZdddgZdd ZdS )	YoutubeLivestreamEmbedIEzYouTube livestream embedszVhttps?://(?:\w+\.)?youtube\.com/embed/live_stream/?\?(?:[^#]+&)?channel=(?P<id>[^&#]+)zJhttps://www.youtube.com/embed/live_stream?channel=UC2_KI6RB__jGdlnK6dvFEZATr  c                 C   s&   |  |}| jd| dt |dS )NrL  ri  r  )r  r  r[  r   )r   r   rI  rf   rf   rg   r    s    

 z&YoutubeLivestreamEmbedIE._real_extractN)r   r   r   r  r  r  r  rf   rf   rf   rg   rq    s   rq  c                   @   s,   e Zd ZdZdZdZdddgZdd Zd	S )
YoutubeYtUserIEz%YouTube user videos; "ytuser:" prefixzyoutube:userzytuser:(?P<id>.+)zytuser:phihagTr  c                 C   s   |  |}| d| t|S )Nzhttps://www.youtube.com/user/)r  r  r[  )r   r   Zuser_idrf   rf   rg   r    s    
zYoutubeYtUserIE._real_extractN)r   r   r   r  r  r  r  r  rf   rf   rf   rg   rr    s   rr  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:favoritesz9YouTube liked videos; ":ytfav" keyword (requires cookies)z:ytfav(?:ou?rite)?s?Tz:ytfavr  z:ytfavoritesc                 C   s   | j dt dS )Nz(https://www.youtube.com/playlist?list=LLr  r  r[  r   r   rf   rf   rg   r    s    z!YoutubeFavouritesIE._real_extractN)	r   r   r   r  r  r  r^  r  r  rf   rf   rf   rg   rs    s   rs  c                   @   sP   e Zd ZdZdZdZdZddddddgZdd	 Zd
d Z	dd Z
dd ZdS )YoutubeNotificationsIEzyoutube:notifz<YouTube notifications; ":ytnotif" keyword (requires cookies)z:ytnotif(?:ication)?s?Tz:ytnotifr  z:ytnotificationsc                 c   sZ   t |ddtdpg }d |d< |D ]4}| |d}|r>|V  |d}|r ||d< q d S )N)	actionsr   openPopupActionpopupZmultiPageMenuRenderersectionsr   Z(multiPageMenuNotificationSectionRendererr   )rw  r   r  r  rv  r   ZnotificationRendererr  )r+   r  _extract_notification_rendererr   )r   r!  r  Znotification_listr  r  r  rf   rf   rg   _extract_notification_menu  s     
z1YoutubeNotificationsIE._extract_notification_menuc                 C   s  t |dtd}d| }d }|szt |dtd}| t |dtd}| jdt |dtddd d	}|rf|sjd S d
| d| }t |dtd}| |d}|r|dd}| jt|pd d|dd d	}	| j	dt
dr| | |dnd }
d||rtnt
 ||	|||| |d|
d
S )Nr  rv  r7  )r&  r1  r2  z
/post/(.+)rF  zpost idr   rL  z/community?lb=)	ZcontextualMenur  r   r   ZmenuServiceItemRendererr  r  r   r  ZshortMessage   ­rj   z[^:]+: (.+)zvideo titlerQ  rs  ZsentTimeTextr   ZvideoThumbnail)
rG  r   r   r?  r)  rI  rJ  rM  r  r  )r+   r   r  r   r   r  r5  r  r~  r   r[  r  rt  r   r  )r   Znotificationr?  r   rI  r$  Zpost_idrJ  Znotification_titler)  r  rf   rf   rg   r{    sh      
       
z5YoutubeNotificationsIE._extract_notification_rendererc                 c   s   d g}d }t dD ]h}t|dtd}| jd| |r>d|ini |dd| j|| |dd	}| ||E d H  |d
 s q~qd S )Nr   )r   r  ZgetNotificationMenuEndpointctokenrv  zpage r~  z"notification/get_notification_menurw  r  )r  r  r   r  r!  rB  r   )r  r  r+   r   r"  r  r  r|  )r   r   r  r!  pager~  rf   rf   rg   _notification_menu_entries2  s&         z1YoutubeNotificationsIE._notification_menu_entriesc                 C   s8   d}| j s| d|ni }| | | | |||S )NZnotificationsrU   )r1  r  r4  r  r  )r   r   r@  r   rf   rf   rg   r  @  s    
z$YoutubeNotificationsIE._real_extractN)r   r   r   r  r  r  r^  r  r|  r{  r  r  rf   rf   rf   rg   rv    s   +rv  c                   @   sB   e Zd ZdZdZdZdZdddddd	d
ddddddgZdS )YoutubeSearchIEzYouTube searchzyoutube:searchZytsearchzEgIQAfABAQ==zytsearch5:youtube-dl test videorO   youtube-dl test videor  r   r  r  z Suicide/self-harm search warningz'ytsearch1:i hate myself and i wanna dier   zi hate myself and i wanna dierY  N)r   r   r   r  r  _SEARCH_KEYr?  r  rf   rf   rf   rg   r  G  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 search, newest videos firstZCAISAhAB8AEBz#ytsearchdate5:youtube-dl test videorO   r  r  r  N)	r   r   r   r  r  r  r  r?  r  rf   rf   rf   rg   r  ^  s   
r  c                   @   s   e Zd ZdZej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eddddedigddddddddgZ	d d! Z
d"S )#YoutubeSearchURLIEz3YouTube search URLs with sorting and filter support_urlzchttps?://(?:www\.)?youtube\.com/(?:results|search)\?([^#]+&)?(?:search_query|q)=(?:[^&]+)(?:[&#]|$)zchttps://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=videorO   r  r  )r   rD  r  zGhttps://www.youtube.com/results?search_query=python&sp=EgIQAg%253D%253Dpythonz4https://www.youtube.com/results?search_query=%23catsr   z#catszKhttps://www.youtube.com/results?search_query=kurzgesagt&sp=EgIQAg%253D%253DZ
kurzgesagtr  r   ZUCsXVk37bltHxD1rDPwtNM8Qz8https://www.youtube.com/channel/UCsXVk37bltHxD1rDPwtNM8QrX  u   Kurzgesagt – In a Nutshellz$md5:4ae48dfa9505ffc307dad26342d06bfcz@kurzgesagtz#https://www.youtube.com/@kurzgesagtT)rG  r   r   r   rJ  rH  r)  rI  rK  r  rN  rO  rM  rZ  r  rj  rU  rW  z2https://www.youtube.com/results?q=test&sp=EgQIBBgBr  c              	   C   sB   t |}|dp|dd }| | ||ddd ||S )Nsearch_queryrO  r   r.  r	  )r#   r   r  rA  )r   r   r  r  rf   rf   rg   r    s    z YoutubeSearchURLIE._real_extractN)r   r   r   r  r  r  r  r  rT  r  r  rf   rf   rf   rg   r  m  sf   
=r  c                   @   sr   e Zd ZdZdZdZddddddd	d
dddddiddd
dddddidgZdddddddZdd ZdS )YoutubeMusicSearchURLIEz?YouTube music search URLs with selectable sections, e.g. #songszyoutube:music:search_urlzThttps?://music\.youtube\.com/search\?([^#]+&)?(?:search_query|q)=(?:[^&]+)(?:[&#]|$)z5https://music.youtube.com/search?q=royalty+free+musicr  zroyalty free musicr  r  zYhttps://music.youtube.com/search?q=royalty+free+music&sp=EgWKAQIIAWoKEAoQAxAEEAkQBQ%3D%3DrB   zroyalty free music - songsrR  Zin_playlist)r   rD  r  r  zIhttps://music.youtube.com/search?q=royalty+free+music#community+playlistsz(royalty free music - community playlistszEgWKAQIYAWoKEAoQAxAEEAkQBQ==zEgWKAQIgAWoKEAoQAxAEEAkQBQ==ZEgeKAQQoAEABagoQChADEAQQCRAFz!EgeKAQQoADgBagwQAxAJEAQQDhAKEAU==zEgWKAQIIAWoKEAoQAxAEEAkQBQ==zEgWKAQIQAWoKEAoQAxAEEAkQBQ==)Zalbumsr  zcommunity playlistszfeatured playlistsZsongsr'  c                    s   t |}|dp|dd }|ddd   rTt fdd| j D  }n2tj|ddd
 	 }| j|  sd }t
||dd}| | j| dd||S )Nr  rO  r   r.  r	  c                 3   s   | ]\}}| kr|V  qd S r	  rf   rZ  r  rf   rg   ro     s      z8YoutubeMusicSearchURLIE._real_extract.<locals>.<genexpr>r]  rj   r   r  r}  rW   r  )rj   )r#   r   r  	_SECTIONSr   r  r  r  rb   r  r   r  rA  )r   r   r  r  sectionr)  rf   r  rg   r    s     z%YoutubeMusicSearchURLIE._real_extractN)	r   r   r   r  r  r  r  r  r  rf   rf   rf   rg   r    s@   		r  c                   @   s,   e Zd ZdZdZdZedd Zdd ZdS )	YoutubeFeedsInfoExtractorz_
    Base class for feed extractors
    Subclasses must re-define the _FEED_NAME property.
    TZfeedsc                 C   s   d| j  S )Nzyoutube:)
_FEED_NAME)r  rf   rf   rg   r    s    z!YoutubeFeedsInfoExtractor.IE_NAMEc                 C   s   | j d| j t dS )Nzhttps://www.youtube.com/feed/rt  )r  r  r[  r   r   rf   rf   rg   r    s    
 z'YoutubeFeedsInfoExtractor._real_extractN)	r   r   r   ra  r^  r  r   r  r  rf   rf   rf   rg   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:watchlaterzDYoutube watch later list; ":ytwatchlater" keyword (requires cookies)z:ytwatchlaterTr  c                 C   s   | j dt dS )Nz(https://www.youtube.com/playlist?list=WLrt  ru  r   rf   rf   rg   r    s     z!YoutubeWatchLaterIE._real_extractNr   r   r   r  r  r  r  r  rf   rf   rf   rg   r    s   r  c                   @   s8   e Zd ZdZdZdZdZddddddd	ddgZd
S )YoutubeRecommendedIEz,YouTube recommended videos; ":ytrec" keywordz?https?://(?:www\.)?youtube\.com/?(?:[?#]|$)|:ytrec(?:ommended)?rS  Fz:ytrecTr  z:ytrecommendedr  N)r   r   r   r  r  r  r^  r  rf   rf   rf   rg   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 )	YoutubeSubscriptionsIEz@YouTube subscriptions feed; ":ytsubs" keyword (requires cookies)z:ytsub(?:scription)?s?Zsubscriptionsz:ytsubsTr  z:ytsubscriptionsNr   r   r   r  r  r  r  rf   rf   rf   rg   r    s   r  c                   @   s$   e Zd ZdZdZdZdddgZdS )YoutubeHistoryIEz:Youtube watch history; ":ythis" keyword (requires cookies)z:ythis(?:tory)?rE  z
:ythistoryTr  Nr  rf   rf   rf   rg   r  &  s   r  c                   @   s8   e Zd ZdZdZdZdddgZedd Zd	d
 Z	dS )YoutubeShortsAudioPivotIEz@YouTube Shorts audio pivot (Shorts using audio of a given video)zyoutube:shorts:pivot:audioz?https?://(?:www\.)?youtube\.com/source/(?P<id>[\w-]{11})/shortsz1https://www.youtube.com/source/Lyj-MZSAA9o/shortsTr  c                 C   s(   d|   fd  }tjt| S )zK
        Generates sfv_audio_pivot browse params for this video id
        s   +
)'
%b%b%brF   )rI  r  r  quoter  r  r  )r?  Z	pb_paramsrf   rf   rg   _generate_audio_pivot_params9  s    z6YoutubeShortsAudioPivotIE._generate_audio_pivot_paramsc                 C   s$   |  |}| jd| | tdS )Nz0https://www.youtube.com/feed/sfv_audio_pivot?bp=rt  )r  r  r  r[  r   r   r?  rf   rf   rg   r  A  s
    
z'YoutubeShortsAudioPivotIE._real_extractN)
r   r   r   r  r  r  r  ri  r  r  rf   rf   rf   rg   r  0  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  yt-dlp "https://www.youtube.com/watch?feature=foo&v=BaW_jenozKc"  or simply  yt-dlp BaW_jenozKc  .Tr   )r   r   rf   rf   rg   r  o  s    z#YoutubeTruncatedURLIE._real_extractNr  rf   rf   rf   rg   r  H  s.   r  c                   @   sb   e Zd ZdZdZddddddd	d
dgddddeddddddddedededddgZdd ZdS )YoutubeClipIEzyoutube:clipz4https?://(?:www\.)?youtube\.com/clip/(?P<id>[^/?#]+)z7https://www.youtube.com/clip/UgytZKpehg-hEMBSn3F4AaABCQzUgytZKpehg-hEMBSn3F4AaABCQrw  g      =@gC@gffffff%@r   rT  r  zScott The WozZUC4rqhyiTs7XyuODcECvuiiQz8https://www.youtube.com/channel/UC4rqhyiTs7XyuODcECvuiiQz$md5:7a4517a17ea9b4bd98996399d8bb36e7Tr  z:https://i.ytimg.com/vi_webp/ScPX26pdQik/maxresdefault.webpz'Mobile Games on Console - Scott The WozZ20210920z@ScottTheWozz$https://www.youtube.com/@ScottTheWozr  zcount:20r  )r   rp  section_startsection_endr/  r  rS  r  rJ  rI  rK  rH  r  r  r  r  r)  r  rM  rN  rO  rA  rY  r  r  r  r  r  c                 C   st   |  |}| ||\}}t|d}|s0tdt|ddd}dd| t |t|d d	 t|d
 d	 ddS )Nrh  zUnable to find video ID)r  .r  r  ZclipSectionRendererr  .ZclipAttributionRendererZonScrubExitcommandExecutorCommandcommands.rx  ry  ZnotificationActionRendererZactionButtonr  r  r  r  .ZloopCommandFr:  ru  r7  ZstartTimeMsr  Z	endTimeMs)
zproto:httpsr-  r:  r  r  r  r  r  rq  r   )rG  r   r   r   r  r  r  )r  r3  r+   r   rt  r   rT  )r   r   Zclip_idr`   rA  r?  Z	clip_datarf   rf   rg   r    s     

zYoutubeClipIE._real_extractN)r   r   r   r  r  rT  r  r  rf   rf   rf   rg   r  y  sB   "r  c                   @   s~   e Zd ZdZdZdZddddded	d
ddded
ddddddgdedddeddgddddddddd gd!d id"gZd#d$ Zd%S )&YoutubeConsentRedirectIEzyoutube:consentFz"https?://consent\.youtube\.com/m\?zhttps://consent.youtube.com/m?continue=https%3A%2F%2Fwww.youtube.com%2Flive%2FqVv6vCqciTM%3Fcbrd%3D1&gl=NL&m=0&pc=yt&hl=en&src=1r  rw  r   r  r  r  r  r  r  r  r  r  r  r  r  r  Tr  rT  r  r  r<  r  r  r  r  )r   rp  r  rN  r  r  r  r  rK  rO  r  r  r  r)  rA  r  r/  rS  r  rI  r  rY  rR  rJ  rH  rM  rZ  r  r   r  )r   r  rO  r  c                 C   s4   t t|dd gd }|s*tddd| |S )Ncontinuerv   z#Invalid cookie consent redirect URLTr   )r3   r#   r   r   r  )r   r   rj  rf   rf   rg   r    s    z&YoutubeConsentRedirectIE._real_extractN)	r   r   r   r  r  r  rT  r  r  rf   rf   rf   rg   r    sJ   $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| d| dddd S )NzIncomplete YouTube ID z. URL z looks truncated.Tr   )r  r   r  rf   rf   rg   r    s
    
z"YoutubeTruncatedIDIE._real_extractNr  rf   rf   rf   rg   r    s   r  )nr  r  rR  r`  r  r  r   re  r  r  r  rb  os.pathrO  r  r  r  r  r  rV  rm  urllib.parser  commonr   r   Zopenloadr   Zjsinterpr   Znetworking.exceptionsr   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%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r!  r"  r~   rh   rt   r   Enumr   r   rt  r  r[  r  rn  rq  rr  rs  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rf   rf   rf   rg   <module>   s6  .




  a
                                     "      5         yr3\G5
1?/