U
    Mfb                    @   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  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK d	ZLd
ddddiddd
d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 d!d"id#d$d%d&dd'dd d!d"id(d$d%d)dd*d+d d,d"id-d$d%d.dd/d0d d1d"id2d$d%d3dd4d5d6d7d8id9d$d%dd:d5d6d7d8id;d$d<d=dd>d?d6d@d8idAd$d%ddBdCd6dDd8idEd$d<d
ddFddiddd
ddGdHdidIdddJdKdidLdMdNZMdOdP ZNdQdR ZOdSdT ZPeP  G dUdV dVejQZRG dWdX dXeZSG dYdZ dZeSZTG d[d\ d\eSZUG d]d^ d^eUZVG d_d` d`eZWG dadb dbeZXG dcdd ddeZYG dedf dfeZZG dgdh dheSZ[G didj djeUZ\G dkdl dleUeZ]G dmdn dneUeZ^G dodp dpeUZ_G dqdr dreUZ`G dsdt dteZaG dudv dveZbG dwdx dxeaZcG dydz dzeaZdG d{d| d|eaZeG d}d~ d~eZfG dd deZgG dd deUZhG dd deSZiG dd deZjdS )    N   )InfoExtractorSearchInfoExtractor)PhantomJSwrapper   )JSInterpreter)	HTTPError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traverse_objtry_calltry_getunescapeHTMLunified_strdateunified_timestampunsmuggle_urlupdate_url_queryurl_or_noneurljoinvariadicZ__yt_dlp_clientZ'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8clientZWEBz2.20220801.00.00)
clientNameclientVersion)INNERTUBE_API_KEYINNERTUBE_CONTEXTINNERTUBE_CONTEXT_CLIENT_NAMEZWEB_EMBEDDED_PLAYERz1.20220731.00.008   z'AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30music.youtube.comZ	WEB_REMIXz1.20220727.01.00C   )r7   INNERTUBE_HOSTr8   r9   z'AIzaSyBUPetSUmoZL-OhlxA7wSac5XinrygCqMoZWEB_CREATORz1.20220726.00.00>   z'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39wZANDROIDz19.09.37   z?com.google.android.youtube/19.09.37 (Linux; U; Android 11) gzip)r5   r6   ZandroidSdkVersion	userAgent   F)r7   r8   r9   REQUIRE_JS_PLAYERZ'AIzaSyCjc_pVEDi4qsv5MtC2dMXzpIaDoRFLsxwZANDROID_EMBEDDED_PLAYER7   z'AIzaSyAOghZGza2MQSZkY_zfZ370N-PUdXEo8AIZANDROID_MUSICz6.42.52zIcom.google.android.apps.youtube.music/6.42.52 (Linux; U; Android 11) gzip   Z'AIzaSyD_qjV8zaaUMehtLkrKFgVeSX_Iqbtyws8ZANDROID_CREATORz	22.30.100zMcom.google.android.apps.youtube.creator/22.30.100 (Linux; U; Android 11) gzip   z'AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAcZIOSz19.09.3z
iPhone14,3zJcom.google.ios.youtube/19.09.3 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X))r5   r6   ZdeviceModelr@      ZIOS_MESSAGES_EXTENSIONB   )r8   r9   rB   Z'AIzaSyBAETezhkwP0ZWA02RsqT1zu78Fpt0bC_sZ	IOS_MUSICz6.33.3zNcom.google.ios.youtubemusic/6.33.3 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)   ZIOS_CREATORz	22.33.101zNcom.google.ios.ytcreator/22.33.101 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)   ZMWEBZTVHTML5_SIMPLY_EMBEDDED_PLAYERz2.0U   ZMEDIA_CONNECT_FRONTENDz0.1_   )r8   r9   )webweb_embedded	web_musicZweb_creatorandroidZandroid_embeddedZandroid_musicZandroid_creatoriosZios_embeddedZ	ios_musicZios_creatormwebtv_embeddedZ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 rZ   </tmp/pip-unpacked-wheel-zk9bgjdq/yt_dlp/extractor/youtube.py_split_innertube_client   s
    r\   c                 C   sD   t | d ddd^}}t|d d ddd |D  S )	Nr   embedscreenZe_srT       c                 s   s   | ]}|d  V  qdS r   NrZ   .0xrZ   rZ   r[   	<genexpr>
  s     z$short_client_name.<locals>.<genexpr>)r\   replacerV   r   joinupper)rW   mainpartsrZ   rZ   r[   short_client_name  s    rj   c            	      C   s  ddi} d}t |d d d }tt D ]\}}|dd |dd |d	d
 |d d dd t|\}}}d|| |d< |st| t| d< }d|d d d< | |d d< |d  d8  < q*|dkr| |d d< |d  d8  < q*|d  d8  < q*d S )NZembedUrlhttps://www.youtube.com/)rP   rO   rL   tvrQ   r7   z'AIzaSyDCU8hByM-4DrUqRUYnGn-3llEO78bcxq8r=   www.youtube.comrB   Tr8   r4   hlen
   priorityZ_embedscreenZEMBEDZclientScreenZ
thirdPartyrA   embeddedr   )r#   tupleINNERTUBE_CLIENTSitems
setdefaultr\   copydeepcopy)	ZTHIRD_PARTYZBASE_CLIENTSrr   r4   ytcfgrT   base_clientrX   r]   rZ   rZ   r[   build_innertube_clients  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VERIFIEDrZ   rZ   rZ   r[   r}   ,  s   r}   c                S   @   s  e Zd ZdZdZdZdZdZdddd	d
ddddddddddddddddddd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]d^ Zd_d` Zdadb Zdcdd Zejdedf Zdgdh Zdidj Zdkdl Zdmdn ZdoZdpZddrdsZddtduZddwdxZddydzZdd{d|Zdd}d~ZdddZdddZ dvZ!dddZ"dddZ#dddZ$e%dd Z&dddZ'e%dd Z(e%dd Z)ejdd Z*dd Z+dvdvdvdvdvdvdqdddZ,dd Z-e%dddZ.e/dd Z0e/e1dddZ2e/dd Z3e/dd Z4dddZ5dd Z6e7dddZ8e%dd Z9e%dvdddZ:dd Z;e%ddddZ<e%dd Z=dd Z>dddZ?e%ddÄ Z@ddń ZAdvS )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-GBrp   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}c                 C   s   | j d| j d|dd dS )N^()$zUC-iddefault_search_regex_YT_CHANNEL_UCID_RE)selfZucidrZ   rZ   r[   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   handlerZ   rZ   r[   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   urlrZ   rZ   r[   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   rZ   rZ   r[   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YoutubeTr_   )ie_key	casesenser   r   NzUnsupported language code: z-. Supported language codes (case-sensitive): delim, rS   expectedrp   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_langrZ   rZ   r[   _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 )	Nrk   z__Secure-3PSIDZSOCSZCAA.youtube.comZCAIT)secure)_get_cookiesgetvalue
startswith_set_cookie)r   cookiesZsocsrZ   rZ   r[   _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 )	Nrk   ZPREFz Failed to parse user PREF cookierp   UTC)ro   tzr   )namer   )r   r   dicturllibparse	parse_qslr   
ValueErrorr   r   updater   r   	urlencode)r   r   Zpref_cookieZprefrZ   rZ   r[   _initialize_pref  s    

z)YoutubeBaseInfoExtractor._initialize_prefc                 C   s   |    |   |   d S N)r   r   _check_login_requiredr   rZ   rZ   r[   _real_initialize  s    z)YoutubeBaseInfoExtractor._real_initializec                 C   s   | j r| js| jddd d S )Nz1Login details are needed to download this contentr   )method)_LOGIN_REQUIREDZ_cookies_passedZraise_login_requiredr  rZ   rZ   r[   r    s    z.YoutubeBaseInfoExtractor._check_login_requiredz@(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=zytInitialPlayerResponse\s*=rL   c                 C   s   t t| S r  )rx   ry   ru   r   r4   rZ   rZ   r[   _get_default_ytcfg   s    z+YoutubeBaseInfoExtractor._get_default_ytcfgc                 C   s   t | d S )Nr=   ru   r  rZ   rZ   r[   _get_innertube_host#  s    z,YoutubeBaseInfoExtractor._get_innertube_hostNc                    s$    fdd}||p"||  |S )Nc                    s   t |  S r  )r+   )yexpected_typegetterrZ   r[   <lambda>(      z:YoutubeBaseInfoExtractor._ytcfg_get_safe.<locals>.<lambda>)r  )r   rz   r  r  default_clientZ_funcrZ   r  r[   _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_NAMErZ   rc   rZ   rZ   r[   r  -  r  z?YoutubeBaseInfoExtractor._extract_client_name.<locals>.<lambda>c                 S   s   | d d d S )Nr8   r4   r5   rZ   r  rZ   rZ   r[   r  .  r  r  strr   rz   r  rZ   rZ   r[   _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_VERSIONrZ   r  rZ   rZ   r[   r  2  r  zBYoutubeBaseInfoExtractor._extract_client_version.<locals>.<lambda>c                 S   s   | d d d S )Nr8   r4   r6   rZ   r  rZ   rZ   r[   r  3  r  r  r  rZ   rZ   r[   _extract_client_version0  s      z0YoutubeBaseInfoExtractor._extract_client_versionc                 C   s,   | j ddgt dd p*|p*| |p(dS )NZinnertube_hostr_   r   r   rL   )r   	YoutubeIEr   r
  )r   Zreq_api_hostnamer  rZ   rZ   r[   _select_api_hostname5  s
    z-YoutubeBaseInfoExtractor._select_api_hostnamec                 C   s   |  |dd t|S )Nc                 S   s   | d S )Nr7   rZ   r  rZ   rZ   r[   r  :  r  z;YoutubeBaseInfoExtractor._extract_api_key.<locals>.<lambda>r  r  rZ   rZ   r[   _extract_api_key9  s    z)YoutubeBaseInfoExtractor._extract_api_keyc                 C   sD   t || |fdtd}t|dti d}|| jp4dddd |S )	Nr8   r  r4   r  r   rp   r   r   )ro   ZtimeZoneZutcOffsetMinutes)r   r  r   r)   r   r   )r   rz   r  contextZclient_contextrZ   rZ   r[   _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 )Nr!  )z__Secure-3PAPISIDSAPISIDzExtracted SAPISID cookier"  z2Copying __Secure-3PAPISID cookie to SAPISID cookier   Ti  )r   expire_timeF zSAPISIDHASH rT   )roundtime_SAPISIDr   r   r   write_debugr   r   hashlibsha1encode	hexdigest)r   originZtime_nowZ
yt_cookiesZsapisid_cookieZsapisidhashrZ   rZ   r[   _generate_sapisidhash_headerF  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gt ddd	 px|	px| j|d}	| jd
| |
| d| ||||t	
|d||	dddS )Nr  r  zcontent-typezapplication/jsonZinnertube_keyr_   T)r   r   r   https://z/youtubei/v1/utf8false)keyZprettyPrint)video_idfatalnoteerrnotedataheadersquery)r   r   generate_api_headersr   r  r   r  Z_download_jsonr  jsondumpsr+  )r   epr<  r6  r7  r;  r8  r9  r  api_keyapi_hostnamer  r:  Zreal_headersrZ   rZ   r[   	_call_api_  s*    


    z"YoutubeBaseInfoExtractor._call_apic                 C   s   | j | j|d||dS )Nzyt initial datar7  )_search_json_YT_INITIAL_DATA_RE)r   item_idwebpager7  rZ   rZ   r[   extract_yt_initial_dataq  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_INDEXrZ   r  rZ   rZ   r[   r  {  r  zAYoutubeBaseInfoExtractor._extract_session_index.<locals>.<lambda>N)r   r+   )r:  rz   session_indexrZ   rZ   r[   _extract_session_indext  s    z/YoutubeBaseInfoExtractor._extract_session_indexc                 C   s8   |rt |dd t}|r|S |r4| jd|dd ddS d S )Nc                 S   s   | d S )NZID_TOKENrZ   r  rZ   rZ   r[   r    r  zBYoutubeBaseInfoExtractor._extract_identity_token.<locals>.<lambda>z%\bID_TOKEN["\']\s*:\s*["\'](.+?)["\']zidentity tokenF)r   r7  )r+   r  r   )r   rz   rH  tokenrZ   rZ   r[   _extract_identity_token  s       z0YoutubeBaseInfoExtractor._extract_identity_tokenc                  G   sl   | D ]b}t |dd t}|r$|  S t |dd dd ftp>dd}t|dkr|d r|d	   S qd
S )z
        Extract syncId required to download private playlists of secondary channels
        @params response and/or ytcfg
        c                 S   s   | d S )NZDELEGATED_SESSION_IDrZ   r  rZ   rZ   r[   r    r  zBYoutubeBaseInfoExtractor._extract_account_syncid.<locals>.<lambda>c                 S   s   | d d d S )NresponseContextZmainAppWebResponseContextZ
datasyncIdrZ   r  rZ   rZ   r[   r    r  c                 S   s   | d S )NZDATASYNC_IDrZ   r  rZ   rZ   r[   r    r  r_   z||r   r   r   N)r+   r  rV   len)argsr:  Zdelegated_sidZsync_idsrZ   rZ   r[   _extract_account_syncid  s"     z0YoutubeBaseInfoExtractor._extract_account_syncidc                  G   s   t | dgtdS )zv
        Extracts visitorData from an API response or ytcfg
        Appears to be used to track session state
        )ZVISITOR_DATA)r8   r4   visitorData)rN  rR  r  )r   r  )rP  rZ   rZ   r[   _extract_visitor_data  s
     z.YoutubeBaseInfoExtractor._extract_visitor_datac                 C   s   t |  S r  )boolr.  r  rZ   rZ   r[   is_authenticated  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*;rz   {}r   FrD  )_parse_jsonr   )r   r6  rH  rZ   rZ   r[   extract_ytcfg  s       z&YoutubeBaseInfoExtractor.extract_ytcfg)rz   account_syncidrJ  visitor_dataidentity_tokenrB  r  c                C   s   d|  || }t| j|dd |d| ||||p>| ||pJ| ||pV| || j|dd |dd}	|d kr| |}|s|d k	r|d k	r|nd|	d< | |}
|
d k	r|
|	d	< ||	d
< t	|	S )Nr2  c                 S   s   | d S )Nr9   rZ   r  rZ   rZ   r[   r    r  z?YoutubeBaseInfoExtractor.generate_api_headers.<locals>.<lambda>r1  c                 S   s   | d d d S )Nr8   r4   r@   rZ   r  rZ   rZ   r[   r    r  )zX-YouTube-Client-NamezX-YouTube-Client-VersionZOriginzX-Youtube-Identity-TokenzX-Goog-PageIdzX-Goog-Visitor-Idz
User-Agentr   zX-Goog-AuthUserAuthorizationzX-Origin)
r  r  r  r  rM  rQ  rS  rK  r.  r   )r   rz   rY  rJ  rZ  r[  rB  r  r-  r;  authrZ   rZ   r[   r=    s(    



z-YoutubeBaseInfoExtractor.generate_api_headersc              	   C   sX   ddd| dd |}|s"i S | j||dd|dd	  d
d}| ||pVi S )Nr!  zhttps://music.youtube.comzhttps://www.youtube.com/embed/z?html5=1)rL   rN   rM   FzDownloading rT   r$  z client config)r7  r8  )r   _download_webpagere   striprX  )r   r4   r6  r   rH  rZ   rZ   r[   _download_ytcfg  s    
   z(YoutubeBaseInfoExtractor._download_ytcfgc                 C   s   d| i}|rd|i|d< |S )NcontinuationclickTrackingParamsZclickTrackingrZ   )ra  ctpr<  rZ   rZ   r[   _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nextContinuationDatarZ   r  rZ   rZ   r[   r    r  zJYoutubeBaseInfoExtractor._extract_next_continuation_data.<locals>.<lambda>c                 S   s   | d d S )Nra  reloadContinuationDatarZ   r  rZ   rZ   r[   r    r  ra  rb  )r+   r   r   rd  )clsrenderernext_continuationra  rc  rZ   rZ   r[   _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continuationCommandrL  rZ   r  rZ   rZ   r[   r    r  zHYoutubeBaseInfoExtractor._extract_continuation_ep_data.<locals>.<lambda>rb  )
isinstancer   r+   r  r   rd  )rg  rk  ra  rc  rZ   rZ   r[   _extract_continuation_ep_data  s    
  
z6YoutubeBaseInfoExtractor._extract_continuation_ep_datac                 C   s$   |  |}|r|S t|dd| jdS )N))contentsrv   rows.continuationItemRenderer)continuationEndpoint)buttonbuttonRenderercommandFget_allr  )rj  r)   rm  )rg  rh  ri  rZ   rZ   r[   _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alertsrZ   r  rZ   rZ   r[   r  	  r  z:YoutubeBaseInfoExtractor._extract_alerts.<locals>.<lambda>typetext)r+   listrl  r   valuesr   	_get_text)rg  r:  Z
alert_dictalert
alert_typemessagerZ   rZ   r[   _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 )Nerrorrm   zYouTube said:  - 	only_oncer   r   )lowerappend_IGNORED_WARNINGSr   r   )	r   rx  r   r7  r  errorswarningsr  Zalert_messagerZ   rZ   r[   _report_alerts  s    

z'YoutubeBaseInfoExtractor._report_alertsc                 O   s   | j | |f||S r  )r  r  )r   r:  rP  kwargsrZ   rZ   r[   _extract_and_report_alerts!  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)r5  rT   rZ   rZ   r[   r  E  r  z:YoutubeBaseInfoExtractor._extract_badges.<locals>.<lambda>)iconiconTyper  stylery  label)accessibilityDatar  ZtooltipZiconTooltipFr_   )rv  r  r   )r}   r   r   r   r   r   r   r   r)   r   r  r  rv   r  )r   r  Zicon_type_mapZbadge_style_mapZ	label_mapbadgesZbadge
badge_typer  matchZlabel_badge_typerZ   rZ   r[   _extract_badges$  sX    
	
       z(YoutubeBaseInfoExtractor._extract_badgesc                    s   t t|  fddS )Nc                    s   |d  kS )Nry  rZ   rT   vr  rZ   r[   r  Z  r  z5YoutubeBaseInfoExtractor._has_badge.<locals>.<lambda>)rT  r)   )r  r  rZ   r  r[   
_has_badgeX  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)rl  r{  rt   rb   r5  rZ   rZ   r[   rd   c  s     z5YoutubeBaseInfoExtractor._get_text.<locals>.<genexpr>c                 S   s   | d S )N
simpleTextrZ   r  rZ   rZ   r[   r  f  r  z4YoutubeBaseInfoExtractor._get_text.<locals>.<lambda>c                 S   s   | d S )NrunsrZ   r  rZ   rZ   r[   r  i  r  r_   ).rz  r  )
r)   anyr3   r+   r  r{  rl  minrO  rf   )r:  r  	path_listpathobjitemrz  r  rZ   rZ   r[   r}  \  s"    z"YoutubeBaseInfoExtractor._get_textc                 G   sH   | j |f| pd}t|}|d krDt| jdtdd|dd d}|S )Nr_   z	^([\d,]+)z\scountr   )r}  r   r'   r   r  sub)r   r:  r  Z
count_textr  rZ   rZ   r[   
_get_countr  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
        rZ   .r   maxresdefault?r   heightwidth)r   r  r  )r)   r3   r1   r   rV   r  r   )r:  r  r  r  r  	thumbnailthumbnail_urlrZ   rZ   r[   _extract_thumbnailsz  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-{}{}r&  unitN)r  r  groupr   formatr   )Zrelative_time_textmobjr  rZ   rZ   r[   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   )Nrp   z"Cannot parse localized time text ""Tr  )r  rl  dtdatetimecalendartimegm	timetupler.   r   r  r   r   )r   rz  Zdt_	timestamprZ   rZ   r[   _parse_time_text  s,    

  
 z)YoutubeBaseInfoExtractor._parse_time_textbrowsec                 C   s"  t | jdtd}t| j|d}t|}t|  }t|}z4| j|d||||| ||
| ||
|	|
d
}W n t	k
rv } zt
|jts| j||d W Y S t
|jts||_t| W Y q>|jjd}t|s0t| j| j|jjd ||dpd|d	dd
d t}|r0| jd|fgd	d |jjdkrT||_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_datar  rD  T)
r@  r7  r;  r6  r<  r8  r  rA  rB  r  i   )prefixrV  Fc                 S   s   | d d S )Nr  r  rZ   r  rZ   rZ   r[   r    r  z<YoutubeBaseInfoExtractor._extract_response.<locals>.<lambda>ERROR  i  r  zunknown errorzIncomplete data receivedr   )rT  r   r  iterRetryManagernextrC  r   r  r   rl  causer	   _error_or_warningr   r  responsereadr   r+   rW  Z_webpage_read_contentr  r  statusr  msgr  r)   r3   )r   rG  r<  r8  r;  rz   check_get_keysr@  r7  rB  r  Zraise_for_incompleteZicd_retriesZicd_rmZmain_retriesZmain_rmr  eZfirst_bytesZyt_errorZshould_retryrZ   rZ   r[   _extract_response  st        

 
   $$
z*YoutubeBaseInfoExtractor._extract_responsec                 C   s   t d| d k	S )Nz (https?://)?music\.youtube\.com/)r  r  r   rZ   rZ   r[   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)navigationEndpointZreelWatchEndpointoverlayZreelPlayerOverlayRendererZ"reelPlayerHeaderSupportedRenderersZreelPlayerHeaderRenderertitleZheadlineZreelTitleTextdescriptionSnippetlengthSecondsZ
lengthText)thumbnailOverlays."thumbnailOverlayTimeStatusRendererrz  z](?i)(ago)(?!.*\1)\s+(?P<duration>[a-z0-9 ,]+?)(?:\s+[\d,]+\s+views)?(?:\s+-\s+play\s+short)?$)r  accessibilityr  r  r_   )r   r  duration)r   r  )shortBylineTextr  .r  browseEndpointbrowseIdFr  rv  )ZchannelNavigationEndpointr  r  )r  .r  r  ru  r  ownerBadgesrk   )r  commandMetadatawebCommandMetadatar   r   https://www.youtube.com/watch?v=ZSHORTSz/shorts/zhttps://www.youtube.com/shorts/publishedTimeTextZ	videoInfoZtimestampText)ZupcomingEventDataZ	startTimerv  is_upcomingZstreamedwas_liveZLIVEis_liveviewCountTextZshortViewCountTextzno viewsr   r  r  r  concurrent_view_count
view_count	ownerTextr  ZchannelTitleText)r  r  .r  r  r  r   r  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_dater  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  r2   r'   r  r  r}   r   r  r   r  r   r   r  r   YoutubeTabIEr  r   _availabilityr   r   r   r   r   )r   rh  r6  Zreel_header_rendererr  r  r  r  Zoverlay_styler  owner_badgesZnavigation_urlr   	time_textZscheduled_timestampr  Zview_count_textr  Zview_count_fieldr   channel_handlerZ   rZ   r[   _extract_video  s    

      

   



               
    z'YoutubeBaseInfoExtractor._extract_video)rL   )rL   )NrL   )rL   )rL   )N)NrL   )NrL   )r!  )TNr/  r0  NNNrL   )T)NN)N)TTF)r/  NNNr  TNrL   )Br~   r   r   __doc___RESERVED_NAMES_PLAYLIST_ID_REr  _INVIDIOUS_SITESr   r  r   r   r   r   r   r   	functoolscached_propertyr   r   r   r  r  rF  _YT_INITIAL_PLAYER_RESPONSE_REr  r
  r  r  r  r  r  r   r'  r.  rC  rI  staticmethodrK  rM  rQ  rS  rU  rX  r=  r`  rd  classmethodrj  r   rm  rw  r  r  r  r{  r  r  r}  r  r  r  r  r  r  r  rZ   rZ   rZ   r[   r   6  sh   
                                                                             

	








           






	
	     
	



4

           
C
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dXdYddZd[d\d]d^d_d`gdagdbeedcdddedfdgdhdieed[djdkdldmdndodpdqdrddsdtdudvdwdxdydzd{dYddZd[d\d]d^d_d`gdagdbeedcdddedfdgeed[djdkdldmd|d}ddid~dddd<d^dddddddddddd<dddddeddddeddfddddcdgdgdeddddddddddddddddddvdgdddeddfddddeedddedddldddddddddddvddddedgdfddgdedddedddeddddddddddddveddedddfdddddgdddgddeedddddӜddddddddddgdddddgedVddedddddgdcddfdeddddddddddddddddddddcddedfddedddddgddgdedddddgdddddddd eddddgddddddd	dd
dddg
dddgdcdededddddddd}didddddddddddddgdd d!d"ed#gedfd$eedd%d&d'd(dod)d)d*d*dd+d,d}did-d.d/d0d*d1d2d3d4d5d6d7d8d9d:d;dd<d=d>dddd?dd-d@dAdBdCdDdEdFdGddHdDdIedJdcdddKdgddLdMdNedgedOdPedQdPdRdSdTidFdBddUdcdJdPedDdVdgedLdOdWedKdXdQddddgedPdRdSdYidFdZdd[d\dOedcdddKdDedLdQedJdPdgd]ddgd^edPdRdSd_igd}ddid`dadbdcdddedfd`dgdhdddidjdddidkdlddmdndodpdqdrdndrdsdtdugedfdvdwdxdcdyddedgedzd}ddidd{dddid|d}dd~ddd,d}ddidd.ddddiddddddddddedgdddgddcedgddfddeedddddd}ddiddddddddddddeddgdcdgddedfdeeeddddddlddd}ddidddddiddddiddddddddd}ddidd.dddddddddhdhddedcdgdddgdddedddfedddeddddd}ddidgddÐdddŐdƐdǐdȐdɜd}ddidʐd.ddddiddddiddddiddddiddddiddddidѐdddӐdԐdՐd֐dאd6dddVd؜d7d.dِdddېdܐdݐdgdgdېdߐddeddedgddސddcdddgdddfedd}ddidddddiddddddddddd}ddidd.ddddddededg ddcdgdgddddfdedddddd}ddiddd dddddeddfdgdcdddddgeddeeedd	d
dddlddd}ddidddddiddddidddddddddedfdddgeddddddgddcddgddededd}ddidddddiddddddd d!dged"d#d$dd%d&gd'dvdd(edfdded"d)d*eddd+d,dod-d-dd.d/d0d1d2gd3ed4d5d6d7d8d9gd:dgdcd;dfdded4d<d=d>d?d}ddidd@dddidAdddidBdddidCdDdEddFdGdHdIdJdgedKdLdMdNdOdPdQgdRdgdcedfddeedKdSdTedddldUdVdWdWdXgiidYdZd.dddd[dWd\d]giiid^d_dddid`dadbdcdddedfdgedhdiedjddddcdkdfdldgdgeedkdmdnedddldodpdcdddqdrdsdtddudvdwdxdyedgdgdzdddfd{edcd|d}eed|d~ddldddoddddddddedgdgddddfdd{d{edcddedddedddldddoddddeddgedddddddgdddedddeddddcdddd}ddidddddded$dddgdgeddddfddedg ddddddoddddddg ededdd$ddgddfdd#gddddddd}ddidddddg ddfdded#gdddcdgddddddddeddddWddgiiddgddĐdddddƐdǐdddgddfdedːd̐dddedΐddgdcdeg d͐dѐdedddldӜdWdWdgiidՐd֜drdאddd*dddedddddddgddedgddvdededfdddddҐdڜdWdWdgiidܐd֜drdݐdddgedxdߐddedߐddddddgdeddddceddgddddddddddldddodddeddedgedfdddddddddddddedddld d[dWdgdgdiidgCZddddddddgd	d
ddddddgddddeeddfddcded`geddddlddd}ddidgZe fddZ fddZdd  Zd!d" Zd#d$d%d&Zdud'd(Zd)d* Zed+d, Zdvd-d.Zd/d0 Zd1d2 Zd3d4 Z d5d6 Z!d7d8 Z"d9d: Z#d;d< Z$d=d> Z%d?d@ Z&dwdAdBZ'dCdD Z(e fdEdFZ)edGdH Z*dIdJ Z+dKdL Z,dMdN Z-dxdOdPZ.dydQdRZ/dzdSdTZ0e1dUdV Z2dWdX Z3e1dYdZ Z4ed{d[d\Z5e1d]d^ Z6e1d_d` Z7dadb Z8dcdd Z9dedf Z:dgdh Z;didj Z<dkdl Z=dmdn Z>dodp Z?d|dqdrZ@dsdt ZA  ZBS (}  r  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)r%  r&  r(           mp4i  ih  `   Zh264i   i        iV  i  i@  )r%  r  r&  r(  i  i8  i   i   webmZvorbisZvp8Z3D)r%  r  format_noter&  r'  r(  
preferenceZHLS0      H   z
DASH video)r%  r  r2  r(  )r%  r2  r(  i  <   )r%  r  r2  r(  fpsip  Zm4az
DASH audioZm4a_dash)r%  r2  r&  r'  	container)r%  r2  r&  r:  Zdtsezec-3)r%  r  r  r2  r:  r(  Zvp9)r%  r  r2  r:  r(  )r%  r&  r2  r'  Zopus2   )r%  r2  r&  r'  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vttFyoutubez6https://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-dlrq   r
  Tz4https://i.ytimg.com/vi/BaW_jenozKc/maxresdefault.jpgnot_liver   r   	   +https://www.youtube.com/@PhilippHagemeister@PhilippHagemeister	count:100i!kP)r   r%  r  r   r  r  upload_dater  
categoriestagsr  r  
like_countr	  playable_in_embedr  r  	age_limit
start_timeend_timecomment_countchannel_follower_countr  r  r  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   r%  rO  r  r  rT  zPrivate video)r   r8  r[  skipz9https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQz!Use the first video ID in the URL)r   r%  r  r   r  r  rO  r  rP  rQ  r  r  rR  r	  rS  r  r  rT  rW  rX  r  r  r  rY  r  skip_download)r   r8  r[  paramsz+https://www.youtube.com/watch?v=a9LDPn-MO4Iz.256k DASH audio (format 141) via DASH manifestza9LDPn-MO4Ir_   zUHDTV TEST 8K VIDEO.mp4)r   r%  rO  r  r  rD  )youtube_include_dash_manifestr  zformat 141 not served anymore)r   r8  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   r%  r  r  r  rO  r'  rR  r  rS  r  r  trackr  r  r   rQ  r	  rP  rT  	alt_titlerX  r  r  r  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   r%  r  r  r  rO  rT  rP  r  r	  r  rR  r   r  rQ  r  rS  r  rX  r  r  r  rW  r  rY  r  )r8  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   r%  r  r  rO  rT  r	  r  r   r  r  rP  r  rQ  r  rR  r  rS  rX  r  r  r  rW  r  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  r%  rO  r  rT  rR  r	  r  r  r  r   r  rQ  rS  rP  r  r  rW  rX  r  r  r  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   r%  r  r  rO  rb  rT  rQ  rR  rS  creatorr  r  rc  r  r   r  rP  r	  r  r  artistrX  r  r  r  zNon-bypassable age-gated videoz'https://youtube.com/watch?v=Cr381pDsSsAr8  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   r%  r  rO  rm  r  r  rc  r	  rQ  r  r  r  r   r  rR  rb  rn  rS  rT  r  rP  albumrX  r  r  r  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   r%  r  rO  r  r  rR  r  rS  rP  release_dater   rQ  r  r  rT  r	  r  r  r  rX  r  r  r  r  r  zrequires avconvz+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0gqq?rJ   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   r%  stretched_ratior  rO  r  r  rS  r   rT  rQ  r  r  r  r  rP  rR  r  r	  rW  rX  r  r  r  r  ZqEJwOuvDf7Iu   Обсуждение судебной практики по выборам 14 сентября 2014 года в Санкт-ПетербургеZ20150404)r   r%  r  r  rO  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   r%  r  r  r  rO  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 2015rC  )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  r  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   r%  r  r  r  rX  r  r	  rS  rO  rP  r  rQ  r  r  rW  rT  rR  r  r   r  rt  r  r  r  z7Terraria 1.2 Live Stream | Let's Play - Part 04 (Tyson)i|'  iyRz4https://i.ytimg.com/vi/zaPI8MvL8pg/maxresdefault.jpg)r   r%  r  r	  r  r   rX  r  r  rT  rR  rQ  r  r  rW  rO  r  rt  rS  r  rP  r  r  r  r  ZR7r3vfO7Haoz9Terraria 1.2 Live Stream | Let's Play - Part 04 (Spencer)z4https://i.ytimg.com/vi/R7r3vfO7Hao/maxresdefault.jpgiyRi'  )r   r%  r  r  r  rR  r	  rS  rO  r  rX  rQ  rt  rW  r  r   rP  r  r  rT  r  r  r  r  r  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   rp  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   r%  r  rc  r  r  rO  rm  rb  rn  rq  r  rP  r  r  r  r  rQ  r	  r   rS  rR  rT  rX  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   r%  r  r  r  rO  licenser  r  rR  rT  rQ  r   r	  r  rP  r  r  rS  rX  chaptersr  r  r  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   r%  r  r  r  rO  r  rS  rQ  rR  r  rT  r	  rP  r   r  r  r  r  rW  rX  r  r  r  r  r  rY  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   r%  r  r  rO  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   r%  r  r  r  rO  seriesseason_numberepisode_numberr  rQ  r  r	  rT  r   ZepisoderP  Zseasonr  r  rR  rS  r  rX  r  r  r  rW  r  r  zSkipping DASH manifestr   r[  r_  rr  z+https://www.youtube.com/watch?v=6SJNVb0GnPIZ6SJNVb0GnPIz Race Differences in Intelligencez$md5:5d161533167390427a1f8ee89a1fc6f1i  Z20140124)r   r%  r  r  r  rO  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   r%  r  r  rO  artistscreatorsrb  rq  rt  rc  r  rS  rR  rP  r  r   r  r	  r  r  rT  r  rQ  r  rX  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   r%  r  r  rO  rn  rb  rq  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 & Animals   zl'Or Vert asblz&https://www.youtube.com/@ElevageOrVertz@ElevageOrVerti?Y)r   r%  r  r  rO  r  r  rR  r  rQ  r  r	  rT  rP  r  rS  r  r   rX  r  r  r  r  z+https://www.youtube.com/watch?v=CHqg6qOn4noZCHqg6qOn4noz+Part 77   Sort a list of simple types in c#z$md5:b8746fa52e10cdbf47997903f13b20dcZ20130831Z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   r%  r  r  rO  r  rR  r  r  rP  r	  r  rQ  rS  rT  r  r  r   rW  rX  r  r  r  r  r  rY  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   r%  r  r  rO  rn  rb  rq  rR  r  rc  r  rT  r  r  rm  r   rQ  r  r	  r  rP  rS  rX  r  rW  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   r%  r  r  rO  r  r  rP  r  r   rQ  r  rT  r	  r  rR  r  rS  rX  r  r  r  rW  r  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   r%  r  r  rO  r  rP  r  r  r   rQ  r  rT  r	  r  r  rS  rX  r  r  r  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  r%  rO  r  r  r  r  rP  r  r   rQ  r  rT  r	  rR  r  rS  rX  r  r  r  r  rW  r  rY  rA  player_clientrO   )r  extractor_argszandroid client brokenr  player_skipconfigs)r   rp  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   r%  	format_idr  r  rO  rR  r  r  r  r  rS  rQ  r	  r   r  r  rP  rT  rX  r  r  r  r  rW  r  rY  r  )r  r^  )r8  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/UCRqNBSOHgilHfAczlUmlWHArD   zcount:23Z20220103zLeon Nguyenz:https://i.ytimg.com/vi_webp/2NUZ8W2llS4/maxresdefault.webpz#https://www.youtube.com/@LeonNguyenz@LeonNguyeniGa)r   r%  r  r  r  r  r  r  rT  rP  rQ  rS  r  rO  rR  r	  r   r  rW  rX  r  r  r  rY  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   r%  r  r  r  r  r  r  rT  rP  rQ  rS  r  r  rt  rO  rR  r	  r   r  rX  r  r  r  rW  r  rY  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   r%  r  rR  r  rP  r  rS  r  rt  r  r  rT  r  r  r  rX  r  r  r  r  rQ  r   r	  rO  r  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   r%  r  rO  rR  r	  r   r  rT  rP  r  r  r  r  r  rS  rX  r  rQ  r  r  r  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_5nWYrArF   Z20220908UCiu-3thuViMebBjw_5nWYrA"https://www.youtube.com/@coletdjnz
@coletdjnziqc)r   r%  r  r  r   rQ  r  r  rR  rS  r	  r  rT  r  r  rO  rP  r  r  r  r  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   r%  r   rQ  r  r  r  rO  r  rP  r  r  r	  rT  r  rS  r  r  r  r  r  rR  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   r%  rP  r  r  r  rX  r  r  r   rS  r  rO  r  rT  r	  r  rR  rQ  r  r  r  rW  r  rY  rP   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   r%  r  r  r  rX  r  rO  rQ  rS  rR  rP  r  rT  r   r  r	  rW  r  r  r  r  r  r  rR   z251-drcz(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   r%  rT  rW  r  rO  r  r  rR  rt  rQ  r  r  rS  r  r	  rX  r  rP  r  r  r   r  r  r  r  r  rY  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   r%  r  r  r   rR  rT  rX  r  rO  r  rQ  r  r  r  r  r  r  r  r  rS  rW  r  rY  rH  )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   r%  r  rO  r  rT  rQ  r  rS  r  rR  rW  r   r  r  r	  r  r  rP  rX  r  r  r  rY  r  )r   ry  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rg  r   r"   qs	__class__rZ   r[   r  
  s
    zYoutubeIE.suitablec                    s   t  j|| i | _i | _d S r  )r  __init___code_cache_player_cache)r   rP  r  r  rZ   r[   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   rb   frZ   rZ   r[   
<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.videoDetailsr  .microformatZplayerMicroformatRendererr  )r&  _download_player_responsesr)   r   _list_formats)r  delayrT   prs
player_urlvideo_detailsmicroformatsr  )rx  r  r   smuggled_datarU  r   r6  webpage_urlrZ   r[   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
            FrD  c                 3   s   | ]}|d   kr|V  qdS )r  NrZ   r  r  rZ   r[   rd      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)r  r  r  r   )r  r  retryr  )rx  r  lockr  r   r6  r  r[   mpd_feed
  s    z<YoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feedr  r  	fragmentsZhttp_dash_segments_generatorr>  r  )	threadingLockr&  r  partial_live_dash_fragmentsrx   r   )r   rx  r6  live_start_timer   r  r  r  r  r  genrZ   )
rx  r  r  r  r   r  rU  r   r6  r  r[    _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)rF   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  rF   iPF  FTr8  r9  r7  r   c                 3   s   | ]}|d   kr|V  qdS )r  NrZ   ra   )stream_numberrZ   r[   rd   ?  s      zUYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd.<locals>.<genexpr>r  fragment_base_urlz(?:/|^)sq/(\d+)rm   r  r   )poprl  r   r  "_extract_mpd_formats_and_subtitlesr   r  AssertionErrorintr  r  r  )	Zrefresh_sequenceZ	immediateZold_mpd_urlr  Zexpire_fastZfmt_infofmtsrT   Z	_last_seqctxr  r  r  r  Zlast_seqmanifestless_orig_fmtr  Zmpd_urlZno_fragment_scorer   r  rZ   r[   _extract_sequence_from_mpd'  s@        
zBYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd[z"] Generating fragments for format r?   Fr  c                 S   s   t | jd S )NzX-Head-Seqnum)r   r;  r  rZ   rZ   r[   r  S  r  z0YoutubeIE._live_dash_fragments.<locals>.<lambda>r   rI   r   rm   r  zbreaking out of outer loopzsq/)r   fragment_countrF   )r   r&  r   r   r(  Z_request_webpager   r+   maxr  ranger2   sleep)r   r6  r  r  r  r  r  Z
FETCH_SPANZMAX_DURATIONZbegin_indexZdownload_start_timeZlack_early_segmentsZ	known_idxZlast_segment_urlr  Z
fetch_timeZurlhZshould_continueidxrT   rZ   r  r[   r    s    
"     






zYoutubeIE._live_dash_fragmentsNrH  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jsUrlFru  r!  )r)   r  r2   )r   rH  Zytcfgsr  rZ   rZ   r[   _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)r8  r6  r7  zplayer\\?/([0-9a-fA-F]{8})\\?/zplayer versionrD  z!https://www.youtube.com/s/player/z /player_ias.vflset/en_US/base.js)r^  r   )r   r6  r7  resZplayer_versionrZ   rZ   r[   _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 rS   c                 s   s   | ]}t t|V  qd S r  r  rO  )rb   partrZ   rZ   r[   rd     s     z0YoutubeIE._signature_cache_id.<locals>.<genexpr>)rf   rV   )r   example_sigrZ   rZ   r[   _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  )rg  r  Z	player_reZid_mrZ   rZ   r[   _extract_player_info  s    
zYoutubeIE._extract_player_infoc                 C   sN   |  |}|| jkrB| j|||d| d| dd}|rB|| j|< | j|S )NzDownloading player zDownload of z failed)r7  r8  r9  )r  r  r^  r   )r   r6  r  r7  	player_idcoderZ   rZ   r[   _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_rT   zExtracting signature function zyoutube-sigfuncsr_   c                 S   s   g | ]}t |qS rZ   ordrb   crZ   rZ   r[   r    s     z9YoutubeIE._extract_signature_function.<locals>.<listcomp>c                    s   d  fddD S )Nr_   c                 3   s   | ]} | V  qd S r  rZ   rb   isrZ   r[   rd     s     zJYoutubeIE._extract_signature_function.<locals>.<lambda>.<locals>.<genexpr>)rf   r  
cache_specr  r[   r    r  z7YoutubeIE._extract_signature_function.<locals>.<lambda>)r  r  osr  basenamer  r(  cacheloadr  _parse_sig_jsrf   mapchrr  rO  store)	r   r6  r  r  r  Zfunc_idr  r  test_stringrZ   r  r[   _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   r_   z:%d:r   zs[])r  )r  endstepZstartsZendsZstepsrZ   rZ   r[   	_genslice  s    zBYoutubeIE._print_sig_code.<locals>.gen_sig_code.<locals>._genslicez(Never used)r   rm   )rm   r   zs[%d])zip)Zidxsr  r  r  r  prevrZ   rZ   r[   gen_sig_code  s$    "z/YoutubeIE._print_sig_code.<locals>.gen_sig_coder_   c                 S   s   g | ]}t |qS rZ   r  r  rZ   rZ   r[   r    s     z-YoutubeIE._print_sig_code.<locals>.<listcomp>z + z({})r   c                 s   s   | ]}t t|V  qd S r  r  rb   prZ   rZ   r[   rd     s     z,YoutubeIE._print_sig_code.<locals>.<genexpr>rS   z*if tuple(len(p) for p in s.split('.')) == z:
    return 
zExtracted signature function:
)		get_paramrf   r  r  r  rO  r  rV   	to_screen)
r   funcr  r  r  Z	cache_resr  Z	expr_codeZsignature_id_tupler  rZ   rZ   r[   _print_sig_code  s    
 zYoutubeIE._print_sig_codec                    s0   | j d|ddd}t|}||  fddS )N)zX\b[cs]\s*&&\s*[adf]\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(zg\b[a-zA-Z0-9]+\s*&&\s*[a-zA-Z0-9]+\.set\([^,]+\s*,\s*encodeURIComponent\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(z;\bm=(?P<sig>[a-zA-Z0-9$]{2,})\(decodeURIComponent\(h\.s\)\)z=\bc&&\(c=(?P<sig>[a-zA-Z0-9$]{2,})\(decodeURIComponent\(c\)\)z(?:\b|[^a-zA-Z0-9$])(?P<sig>[a-zA-Z0-9$]{2,})\s*=\s*function\(\s*a\s*\)\s*{\s*a\s*=\s*a\.split\(\s*""\s*\)(?:;[a-zA-Z0-9$]{2}\.[a-zA-Z0-9$]{2}\(a,\d+\))?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  rZ   r  Zinitial_functionrZ   r[   r    r  z)YoutubeIE._parse_sig_js.<locals>.<lambda>)r   r   Zextract_function)r   jscodefuncnamejsirZ   r%  r[   r    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r  )r  r   	Exception	traceback
format_excrl  )rP  r  r  retcache_idr!  r   rZ   r[   inner  s    
(

z YoutubeIE._cached.<locals>.innerrZ   )r   r!  r/  r0  rZ   r.  r[   _cached  s    zYoutubeIE._cachedc                 C   s8   |  | jd|| |}||||}| || ||S )z3Turn the encrypted s field into a working signaturer#  )r1  r  r  r"  )r   r  r6  r  Zextract_sigr!  rZ   rZ   r[   _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_urlr!  z$Unable to extract nsig function coder)  r  zExtracted nsig function from z:
r   r  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)r6  r8  zDecrypted nsig z => )r   r2   _extract_n_function_coder  r   r1  _extract_n_function_from_coder   r*  r   r   r(  executerf   r_  )r   r  r6  r  r(  r  	func_coder  extract_nsigr-  rP  Z	func_bodyrZ   rZ   r[   _decrypt_nsig  s<    


 zYoutubeIE._decrypt_nsigc                 C   sZ   | j d|ddd\}}|s|S tt|  dt| d|d| d| d	t| S )
Nz(?x)(?:\.get\("n"\)\)&&\(b=|b=String\.fromCharCode\(110\),c=a\.get\(b\)\)&&\(c=)
            (?P<nfunc>[a-zA-Z0-9$]+)(?:\[(?P<idx>\d+)\])?\([a-zA-Z0-9]\)z!Initial JS player n function name)Znfuncr  r$  zvar z\s*=\s*(\[.+?\])\s*[,;]z#Initial JS player n function list (rS   r   )r   r>  loadsr   r  escaper  )r   r&  r'  r  rZ   rZ   r[   _extract_n_function_name;  s      

 z"YoutubeIE._extract_n_function_namec                 C   sp   |  |}| jjd|dd}|p*| ||}t|}|rB|||fS | |}||}| jd|| |||fS )Nzyoutube-nsigz	2022.09.1)Zmin_ver)r  r  r  r  r   r=  Zextract_function_coder  )r   r6  r  r  r8  r&  r(  	func_namerZ   rZ   r[   r5  G  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 )Nr)  Zenhanced_except_z(Signature function returned an exception)r   r*  r+  r,  r   )r  r-  r  r!  rZ   r[   r9  Z  s    $

z=YoutubeIE._extract_n_function_from_code.<locals>.extract_nsig)Zextract_function_from_code)r   r(  r8  r9  rZ   r?  r[   r6  W  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.rD  z2(?:signatureTimestamp|sts)\s*:\s*(?P<sts>[0-9]{5})zJS player signature timestampsts)r  r7  )rl  r   r   r   r   r   r  r   )r   r6  r  rz   r7  r@  	error_msgr  rZ   rZ   r[   _extract_signature_timestamph  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 r_   ZplaybackTrackingbaseUrlr  zUnable to mark Zwatchedz@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_c                 3   s"   | ]} t d dd@  V  qdS )r   r6  ?   N)randomrandint)rb   rT   ZCPN_ALPHABETrZ   r[   rd     s     z*YoutubeIE._mark_watched.<locals>.<genexpr>   rO  z1.5r   r   2Z
detailpage)vercpnZcmtr   )str   T)r<  zMarking zUnable to mark watchedFrD  )	enumerater   r1   r   r   r   urlparser"   r<  rf   r  r  floatr   r   
urlunparse_replacer   r^  )r   r6  player_responsesZis_fullr5  r  r   
parsed_urlr  rK  Zvideo_lengthrZ   rG  r[   _mark_watched  sD    "  
 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)rm   )	r  r  
url_resultr  ZStopExtractionr  _extract_from_webpagefindallr,   )rg  r   rH  r  Zid_mr  rZ   r[   rV    s    zYoutubeIE._extract_from_webpagec                 C   s    |  |}|std| |S )NzInvalid URL: )Zget_temp_idr   )rg  r   r6  rZ   rZ   r[   
extract_id  s    
zYoutubeIE.extract_idc                 C   s(   t |dtd}| j|dd dd |dS )N)ZplayerOverlaysZplayerOverlayRendererdecoratedPlayerBarRendererrZ  Z	playerBarZchapteredPlayerBarRendererr  r  c                 S   s   t t| dddS )N)chapterRendererZtimeRangeStartMillis  Zscale)r   r)   ZchapterrZ   rZ   r[   r    s    z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>c                 S   s   t | dtdS )N)r[  r  r  r  )r)   r  r^  rZ   rZ   r[   r    s     )Zstart_functionZtitle_functionr  )r)   r{  _extract_chapters_helper)r   r:  r  Zchapter_listrZ   rZ   r[   _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macroMarkersListRendererrn  r  c                    s   t  | dS )NZtimeDescription)r    r}  r^  r  rZ   r[   r    r  zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>c                    s     | dS )Nr  )r}  r^  r  rZ   r[   r    r  c                 3   s$   | ]} t|d  V  qdS )).ZmacroMarkersListItemRendererN)r_  r)   )rb   rn  Zchapter_timeZchapter_titler  r   rZ   r[   rd     s     zDYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<genexpr>)r)   r{  r  filter)r   r:  r  Zcontent_listrZ   rd  r[   '_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_HEATMAPrZ   r  rZ   rZ   r[   r    r  z,YoutubeIE._extract_heatmap.<locals>.<lambda>rj  rk  rl  markers.startMillisr\  r]  c                 S   s   t | d t | d  d S )Nrn  ZdurationMillisr\  )r  r  rZ   rZ   r[   r    r  ZintensityScoreNormalized)rU  rV  r   )r)   r  r  r   )r   r:  rZ   rZ   r[   _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 )Nrj  ZcommentEntityPayloadZ
properties	commentIdZ#engagementToolbarStateEntityPayloadZpublishedTimer_   root)r   parentrc  ZtoolbarZlikeCountA11yauthor	channelIddisplayNameZavatarThumbnailUrlZ	isCreatorZ
isVerifiedZchannelCommandZinnertubeCommandr  r  c                 S   s
   t d| S )Nr!  )r2   r  rZ   rZ   r[   r    r  z,YoutubeIE._extract_comment.<locals>.<lambda>)rz  rR  	author_idrs  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   r1   rT  r   r  )r   entitiesrr  Zcomment_entity_payload
comment_idZtoolbar_entity_payloadr  rZ   rZ   r[   _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 )!Nrp  contentTextZ	voteCountauthorEndpointr  r  Z
authorTextZauthorThumbnailr  rm   r   rq  )r   rz  rR  rw  rs  rx  rr  r  r_   )r}  r  r!  )r  rv  Fr  r{  ZauthorIsChannelOwnerry  )ZactionButtonsZcommentActionButtonsRendererr  ZcreatorHeartr|  ZauthorCommentBadgeTrz  ZpinnedCommentBadge	is_pinned)r   r}  r  r)   r   r1   r  r   r2   r  r   r  r  r}   r   )r   comment_rendererrr  r  infor  r  ry  Zcomment_abrr  r  rZ   rZ   r[   _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 )Nr_   r   )r   )r  r  rZ   r[   r  >  r  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subMenuItemsrZ   r  Zcomment_sort_indexrZ   r[   r  N  r  zDYoutubeIE._comment_entries.<locals>.extract_header.<locals>.<lambda>ZserviceEndpointr  r   ztop commentsznewest firstzSorting comments by )r)   r  r   r  r+   r   r   rm  rw  r&   r  )rn  Z_continuationrc  Zcomments_header_rendererZexpected_comment_countZsort_menu_itemZsort_continuation_epZ	sort_text)get_single_config_argr   trackerr  r[   extract_header@  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commentThreadRendererrZ   r  rZ   rZ   r[   r  b  r  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>commentRenderer)commentr  r  commentViewModel)Z
commentKeyZtoolbarStateKeyc                    s   |d  kS )NZ	entityKeyrZ   r  Zcomment_keysrZ   r[   r  t  r  Z
pinnedTextr  r   pinned_comment_idsseen_comment_idsz?Detected YouTube comments looping. Stopping comment extraction zfor this threadr_   z$ as we probably cannot get any more.running_totalr   total_reply_commentsc                 S   s   | d d S )NZrepliesZcommentRepliesRendererrZ   r  rZ   rZ   r[   r    r  )rr  r  )r+   r   r   r  r)   r  r  r   addr   _comment_entries	itertoolsislicer  r  )rn  Zentity_payloadsrc  Zcomment_thread_rendererr  r  Z
view_modelr~  r  Zcomment_replies_rendererZcomment_entries_iter)max_parentsmax_repliesmax_replies_per_threadrr  r   r  r6  rz   r  r[   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  rZ   rZ   r[   rd     s    z-YoutubeIE._comment_entries.<locals>.<genexpr>max_commentsr_   r^   FT)onResponseReceivedEndpoints.)ZreloadContinuationItemsCommandappendContinuationItemsActioncontinuationItemsrz   rZ  (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  )rG  r<  r@  rz   r;  r8  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   rg  rh  ri  r  rn  )rn  .ZmessageRendererrz  r  zYoutube said: r6  r  )setr   _downloaderdeprecated_featurer   rw  rd  _generate_comment_continuationr  r  r=  rS  r  r  r   r  r  r  r   r)   r   r{  r}  ZCommentsDisabled)r   Zroot_continuation_datarz   r6  rr  r  r  r  Z	max_depthr  rT   ra  r  Zis_forced_continuationZis_first_continuationZcontinuation_items_pathpage_numr;  Zcomment_prog_strZnote_prefixr  r  ri  continuation_itemsentryr  rZ   )	r  r  r  r  rr  r   r  r6  rz   r[   r  <  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	b64encoder+  decode)r6  rL  rZ   rZ   r[   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  )rb   r  rZ   rZ   r[   rd     s   zIYoutubeIE._get_comments.<locals>._real_comment_extract.<locals>.<genexpr>).itemSectionRendererr   )r  r)   r  )rn  rh  r   r6  rz   rZ   r[   _real_comment_extract  s    z6YoutubeIE._get_comments.<locals>._real_comment_extractr  r_   r   )r   r   r  r  )r   rz   r6  rn  rH  r  r  rZ   r  r[   _get_comments  s    zYoutubeIE._get_commentsc                   C   s
   dddS )NT)ZcontentCheckOkZracyCheckOkrZ   rZ   rZ   rZ   r[   _get_checkok_params  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  )rg  r@  r  rZ   rZ   r[   _generate_player_context  s      z"YoutubeIE._generate_player_contextc                    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  rZ   )rb   r   r  ZreasonsrZ   r[   rd   6  s       z)YoutubeIE._is_agegated.<locals>.<genexpr>)r)   r  )player_responseZAGE_GATE_REASONSrZ   r  r[   _is_agegated,  s
    

zYoutubeIE._is_agegatedc                 C   s   t | ddkS )N)r  r  Z
UNPLAYABLEr)   )r  rZ   rZ   r[   _is_unplayable8  s    zYoutubeIE._is_unplayablec                 C   s   |  ||}| |||}	|r0| j|||ddnd }
| j||	||d}d|i}| jdd gddd }|rp||d	< || |
 | j|d
|||d|d|	dd
 dpd S )NFrD  )rz   rY  rJ  r  r  player_paramsTr   r   r_  ZplayerzDownloading {} player API JSONrT   r$  )rG  r@  r<  rz   r;  r7  r  r8  )rK  rQ  rB  r=  r   r   r  r  r  re   r_  )r   r4   r6  master_ytcfgplayer_ytcfgr  
initial_prr  rJ  Zsyncidr@  r;  Zyt_queryZpp_argrZ   rZ   r[   _extract_player_response<  s8            z"YoutubeIE._extract_player_responsec                 C   s   g }g }ddg}t dd tD dd dd}| d	D ]f}|d
krN|| q6|dkrb|| q6||kr|| d|  q6|dr|| q6|| q6|| |s|}|ds| |r|dd |D  t	|S )NrP   rL   c                 s   s"   | ]}|d d dkr|V  qd S )Nr   rT   rZ   rb   r4   rZ   rZ   r[   rd   Y  s      z3YoutubeIE._get_requested_clients.<locals>.<genexpr>c                 S   s   t |  d S )Nrr   r	  )r4   rZ   rZ   r[   r  Z  r  z2YoutubeIE._get_requested_clients.<locals>.<lambda>T)r5  reverser  r   allzSkipping unsupported client rO   r  c                 s   s&   | ]}| d t kr| d V  qdS )Z_musicNr	  r  rZ   rZ   r[   rd   l  s     )
sortedru   r   extendr   r   r  r   r  r   )r   r   r  Zrequested_clientsZandroid_clientsr   Zallowed_clientsr4   rZ   rZ   r[   _get_requested_clientsT  s4     


z YoutubeIE._get_requested_clientsc                 C   s   t |d }|kr|S d S )Nr  r  )r  r  r  )r   prr6  pr_idrZ   rZ   r[   _invalid_player_responseq  s    z"YoutubeIE._invalid_player_responsec              
      s  d }|r| j | j|d|dd}g }|rD| ||sD||dd i t d d d  fdd}d}	d }
i }rtt \}}}|dkr|ni }d	| d
kr|dkr| ||p|}|
p| j	|||d}
| 
|d}d| d
krd}d }
|
s|	s|r| |}
d}	z>|dkr2|r2|n$| |||pB|||rN|
nd ||}W n6 tk
r } z| | W Y qtW 5 d }~X Y nX | || }r|||< nX|rt|}t|dthfpi }||t< t|ddthfD ]}||t< q|| |dkr4| |r4| jr4|| d qt| |rt|dkrX|| d qt|st|d| | d qt|r| dd| ddt|  d| d |stdddn|std||
fS )Nzinitial player responseFrD  streamingDatarm   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)r\   ru   r  r  )Zclient_namesrW   Zactual_clientZall_clientsclientsrZ   r[   append_client  s    

z:YoutubeIE._extract_player_responses.<locals>.append_clientrL   r  r  r  rB   ZjsTrx  ZadaptiveFormats.rs   Z_creatorrR   Z	_embeddedztv_embedded.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)rE  r  r  r  r  r\   r  r   r`  r  r  r   r  r  r   r   rj   r)   r   STREAMING_DATA_CLIENT_NAMEr  rU  r  rf   r|  )r   r  r6  rH  r  r  r  r  r  Ztried_iframe_fallbackr  Zskipped_clientsr4   r{   rX   r  Zrequire_js_playerr  r  r  r   sdr  rZ   r  r[   _extract_player_responsesw  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   )r  )r   r  r  rZ   rZ   r[   _needs_live_processing  s    
z YoutubeIE._needs_live_processingc           /      #   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 ](}
|
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%}|o|&t'dF}|r
j| dGdd4 |
dHp,|(dId"p,d"}t
|
dJp@d}t
|
dKt
|
dL| |
drndMnd" t)t)|d&|odNd"dO||
dodPt|
dQd- t|
dRd- |odS|odT
*dUs؈o|dVdO	|dWkrdXndYdZ|krd[nd |d\kr|nd |
d]||t+|
dd^  t+|
d_|t,||t
|
d`t)||rfdand"ppd |rzn|rdbndY|rdcn|rdbn|d#krddnd de} t-.df|
dgpd"}!|!rt/|!0d\| dh< | 1t2|!0d^ |r| 3di| djf |4| dk| dl| dmfk}"|"rV| dhrV| dh dn | do< sfdp|kr| dq r| r| dr  dsn| dr dt|	| duV  sdp|krdv i| dw< | V  q
5|}#dx|k}$
dyrdz}$
jd{ t
d|}%
*d}dr"|#d~ks"|#r,|$r,|%3d 
*ddsD|%3d 
dr^
jd n$|$r|d~kr|#d~kr|%3d 	
fdd}&i }'|D ]}(|(t%}d|%ko|(d})|)r*
j6|)|ddz|d~kd\}*}+
7|+|'}'|*D ].},|&|,d|
j8d|,d* dd dr|,V  qd|%ko<|(d}-|-r
j9|-|dzd\}.}+
7|+|'}'|.D ]X},|&|,d||,dr rht

j8d|,dp|,d* dd d|,dq< |#rd|,d< |,V  qhq|'V  d S )Ni   rq   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  .rx  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   r  -r   filesizeN)r0   r  )rb   Zrange_start)
CHUNK_SIZEr  rZ   r[   rd     s     zTYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments.<locals>.<genexpr>r   r  )r   r  r  )r  r  r[   build_fragments  s    zAYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragmentsZtargetDurationSecitagZ
audioTrackr   ZisDrcqualityr  ZaudioQualityr_   rA  ZaudioIsDefaultZdescriptiveru  rS   ry  ZFORMAT_STREAM_TYPE_OTFr   ZsignatureCipherc                 S   s   | d d S )Nr   r   rZ   r  rZ   rZ   r[   r    r  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>c                 S   s   | d d S )Nr  r   rZ   r  rZ   rZ   r[   r    r  z&{}={})sprm   	signaturez8Signature extraction failed: Some formats may be missingr  r  nZnsigz         Install Z	PhantomJSz to workaround the issue. r  z4nsig extraction failed: Some formats may be missing
z         n = r4  zCCannot decrypt nsig without player_url: Some formats may be missingZaverageBitrateZbitrater\  ZapproxDurationMsc                 S   s
   t | dS )Nr\  )r   r  rZ   rZ   r[   r  ;  r  c                      s    d k S )Nr   rZ   rZ   )r  format_durationrZ   r[   r  @  r  z?: Some formats are possibly damaged. They will be deprioritizedrO   z\: Android client formats are broken and may yield HTTP Error 403. They will be deprioritizedZqualityLabelZaudio_quality_r9  ZaudioSampleRateZcontentLengthz-drcz
 (default)r   ZDRCc                 S   s   | d  dd S )NZprojectionTypeZRECTANGULARr_   re   r  r  rZ   rZ   r[   r  W  r  c                 S   s   | d  dd S )NZspatialAudioTypeZSPATIAL_AUDIO_TYPE_r_   r  r  rZ   rZ   r[   r  X  r  ZDAMAGEDZBROKENverboser   rB  rm   Premiumd   r   ZaudioChannelsr   ZdrmFamiliesr  descr5  r1  )asrr  r  r2  source_preferencer9  Zaudio_channelsr  r  has_drmtbrZfilesize_approxr   r  languagelanguage_preferencer3  z.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?ZmimeTyper%  httpsr  noner&  r(  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                    s    df}s"|| kr"dS | | |rLrL| d  d< n:tfdd| D rz| d  d< n|r| d< r  dkrt  ddd	d
 d<  d<   dd krd d< |dkrt  ddd	d
 d<  d  d7  <  t dd d d<  d dkrV  drVt fddd  d< 	dshrt  d|dd
 d<   dr d dkr d= dkrΈ  drd d<  d  d8  < dS ) Nr  Fr  r  c                 3   s   | ]\}}| kV  qd S r  rZ   )rb   r  rT   )protorZ   r[   rd     s     z\YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<genexpr>r2  z	(default)r$  r  r  r  rm   )Z616Z235r  r  c                 S   s   | d  dd S )Nr  r  r   )rV   r  rZ   rZ   r[   r    r  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>r  r  c                    s   t |  d  S )Nr  )absr  r  rZ   r[   r    r  )r5  r  r   r9  r   r  r  mayberF   T)r   r  r  r   r+   r  r  )r  r  rW   r  r5  )PREFERRED_LANG_VALUEall_formatsitag_qualitiesitagsoriginal_languageqres_qualitiesr   )r  r  r[   process_manifest_format  s:     zIYoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_formatZhlsManifestUrlr,  )r7  r  z/itag/(\d+)r   ZdashManifestUrlrD  z/clen/(\d+)r  z	file sizer  ):collectionsdefaultdictr  r#   r)   r   r  r  r   r&   r   r  rV   r   r   r"   r1   r+   r  r  r2  r   r   r(  r1  r:  r0   rl  r   r*  Z_format_errZStylesZEMPHASISr   ZINSTALL_HINTr   r*   r  r   rj   re   r   r  rT  r   r  r  r   r  r   r   r  r  r  Z#_extract_m3u8_formats_and_subtitlesZ_merge_subtitlesr   r  )/r   streaming_datar6  r  r  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_sigr  r<  Zdecrypt_nsigZphantomjs_hintr  Z
is_damagedrW   Z	is_brokenr   r9  dctZ	mime_mobjZsingle_streamneeds_live_processingZskip_bad_formatsZskip_manifestsr  	subtitlesr  Zhls_manifest_urlr  subsr  Zdash_manifest_urlrx  rZ   )r  r  r  r  r  r   r  r  r  r  r   r[   _extract_formats_and_subtitles  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specr_   r   r   rm   zhttps://i.ytimg.com/r   #rF      zMalformed storyboard z: r  z$Lz$Nz&sigh=ZsbZ
storyboardr  r  c                    s0   g | ](} d t|t |  dqS )z$M)r   r  )re   r  r  )rb   jr  Zfragment_durationr   rZ   r[   r    s   z1YoutubeIE._extract_storyboard.<locals>.<listcomp>)r  r2  r%  r>  r&  r(  r   r  r  r9  ro  columnsr  )r   rV   r1   r2   r  rO  rM  r{  r  r   r  r   rf   r   re   r  r  mathceil)r   rR  r  r  base_urlLr  rP  countsr  r  Zframe_countcolsro  NZsighr  rZ   r  r[   _extract_storyboard  sP      
"&zYoutubeIE._extract_storyboardc                 C   s   d }d|  dkrPddd}| j dd gddd	 }|r>||d
< | j||d|d}| ||pb|  }| | ||||||\}	}
|||	|
fS )NrH  r  Z
99999999991)ZbpctrZhas_verifiedr  Tr  r   ppF)r7  r<  )r   r^  rX  r  r  r  )r   r   r  r6  r  rH  r<  r  r  rR  r  rZ   rZ   r[   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  FrJ  ).r  c                 s   s   | ]}| d V  qdS )r  Nr  r  rZ   rZ   r[   rd   !  s     z*YoutubeIE._list_formats.<locals>.<genexpr>Tr  )r)   r   r  r  )r   r6  r  r  rR  r  r  live_broadcast_detailsr  Zlive_contentr  r  r  r  rx  r  r  rZ   rZ   r[   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}Qt|Qdddd ddddfjKdrd|9d< z(|Qd d d d d d d d  W n tLtMtNfk

r   Y n4X d ddÈdk
rdnddǜg|9Odi d< |QrVP|Q|pBQ|Q|pBR||pBd |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pVi dݡ}Z|Zr>t"W|Y|Z}&|&r>tX|&Cdޡ|9|&Cdߡd <  qq>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sx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< nP|`s|cdkr.|d|9d< n6|cdkrP|drD|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p(te|
d}g|grB|fs`d
kr`tfg
|Sdp^|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p6t|dtjd}k[|jt\jkrNdnjl|k|Qrx|kd k	rx[|jt\jmpzdrn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  r  )errorScreenZ%playerLegacyDesktopYpcTrailerRendererZtrailerVideoIdc                    s    j | d dS )Nr   )Z_html_search_metar  )r   rH  rZ   r[   r  <  r  z)YoutubeIE._real_extract.<locals>.<lambda>c                 S   s   d S r  rZ   r  rZ   rZ   r[   r  =  r  r  r  ).r  r  zog:titleztwitter:title).r  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   rZ   r  r   rZ   r[   r  d  r  z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>)r+   r  r$  )	feed_datar$  r[   
feed_entryb  s
     
 z+YoutubeIE._real_extract.<locals>.feed_entryr    (r   url_transparentr   z{}watch?v={}r   T)r  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)r!  ZplayerErrorMessageRendererr  	subreasonr_   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 )rc  )r,   r  )rb   rX  rZ   rZ   r[   r    s   z+YoutubeIE._real_extract.<locals>.<listcomp>zog:video:tagzyt:stretch=z(\d+)\s*:\s*(\d+)c                 s   s   | ]}t |V  qd S r  )rO  )rb   r  rZ   rZ   r[   rd     s     z*YoutubeIE._real_extract.<locals>.<genexpr>r(  r  rv  )..r  zog:imageztwitter:imager   r  Zhq720Z	sddefaultZ	hqdefault0Z	mqdefaultr   Zsd1Zsd2Zsd3Zhq1Zhq2Zhq3Zmq1Zmq2Zmq3r  rI  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}r-  Z_webpr_   r  Z_live)r6  r   r%  r-  r  N)r  )rb   r   r%  )r  r6  rZ   r[   rd     s         c                 3   s.   | ]&\}}d  d |  d kr|V  qdS )r  r   NrZ   )rb   r  t)thumbr6  rZ   r[   rd     s      z.webprm   r   r3  categoryZgenrert  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>  r  r  )r	  )r  r  rZ   r[   is_bad_format  s    z.YoutubeIE._real_extract.<locals>.is_bad_formatrq   r2  z(Last 2 hours)r$  r  r  )rm   r   "https://www.youtube.com/channel/%sr   ).	viewCountZinteractionCountZaverageRatingZisFamilySafeFZisFamilyFriendlyr4  zog:restrictions:agez18+r\  ZplayableInEmbed)
r  r  r9  zhdr:12sourcezvcodec:vp9.2Zchannelsr&  r   r  )r   r  rx  r  r  r  r  r  r  r  Zaverage_ratingrT  r  rP  rQ  rS  r  r  Z_format_sort_fields).captionsZplayerCaptionsTracklistRendererc                 S   s&   t | dpddddp$| dS )NZvssIdr_   rS   r  languageCode)r$   r   re   )rb  rZ   rZ   r[   get_lang_code  s    z.YoutubeIE._real_extract.<locals>.get_lang_codec                    s   i | ]} ||qS rZ   rZ   )rb   r  )r7  rZ   r[   
<dictcomp>  s    z+YoutubeIE._real_extract.<locals>.<dictcomp>).ZcaptionTracks.c                    s(   i | ] }| d  j| dddqS )r6  ZlanguageNamer   r  )r   r}  )rb   r   r  rZ   r[   r8    s    ).ZtranslationLanguages.c              	      sH   |  |g } jD ]0}|d|i ||tdt|||d qd S )Nr	  r!  )r%  r   r   )rw   _SUBTITLE_FORMATSr   r  r2   r0   )r:  r  	lang_codeZsub_namer<  Z	lang_subsr	  r  rZ   r[   process_language  s    
 z1YoutubeIE._real_extract.<locals>.process_languageZtranslated_subsr]  ZwriteautomaticsubZlistsubtitlesrC  r   r   r   r  kindr  ZisTranslatableZundr  z from %sza-r&  r  z-origz (Original)Ztlangautomatic_captionsr  ))r  )r  r.  )r  )r  _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_yearrt  r^   rq  Zclean_artistc                 S   s   g | ]}|  qS rZ   )r_  )rb   arZ   rZ   r[   r  m  s     rn     ·rb  )rq  r  rb  rt  r?  rD  rn  zIIncomplete data received in embedded initial data; re-fetching using API.r  r  )rz   z!Downloading initial data API JSON)rG  r@  r7  rz   r<  r  r;  r8  )rn  twoColumnWatchNextResultsresultsrC  rn  .r  rn  .Z commentsEntryPointHeaderRendererZcommentCountra  c                 S   s   |d d dkS )Nrb  ZpanelIdentifierr  rZ   r  rZ   rZ   r[   r    r  rb  headerZ"engagementPanelTitleHeaderRendererZcontextualInfor  rW  rB  ZconversationBarZliveChatRendererre  rf  ra  r  z &bpctr=9999999999&has_verified=1r>  r  Zyoutube_live_chatZyoutube_live_chat_replay)r   r6  r%  r>  Z	live_chatr  rY  )rn  rB  rC  rC  rn  r  ZvideoPrimaryInfoRendererZsuperTitleLinkc                 S   s   | d d S )NZsuperTitleIconr  rZ   r  rZ   rZ   r[   r    r  ZLOCATION_PINlocationu   (.+?)\s*S(\d+)\s*•?\s*E(\d+)rA   )r  r  r  c                 S   s   | d d d S )NvideoActionsmenuRenderertopLevelButtonsrZ   r  rZ   rZ   r[   r    r  )toggleButtonRenderer.)Z"segmentedLikeDislikeButtonRenderer.rI  c                 S   s   | d d d S )NZdefaultTextr  r  rZ   r  rZ   rZ   r[   r    r  z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                 S   s   | d S )Nr  rZ   r  rZ   rZ   r[   r    r  c                 S   s   | d d S )Nr  rZ   r  rZ   rZ   r[   r    r  zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peopler  r  ry  _countrF  rG  rH  .Z#segmentedLikeDislikeButtonViewModelZlikeButtonViewModelZtoggleButtonViewModelZdefaultButtonViewModelZbuttonViewModelZaccessibilityTextr  rR  )r3  ZvideoViewCountRendererr3  r  r  r  ZvideoSecondaryInfoRenderer)ownervideoOwnerRenderersubscriberCountText)r   rX  )r  )r  r  .r  r  c                 S   s   | d d d S )NZmetadataRowContainerZmetadataRowContainerRendererro  rZ   r  rZ   rZ   r[   r    r  c                 S   s   | d d S )NmetadataRowRendererZhasDividerLinerZ   r  rZ   rZ   r[   r    r  rN  )rn  r   ZLicenser  ZAlbumZArtistr  ZSong)rK  rL  r  r  r   r  )r  r  r  Z
uploadDate)timezonez%Y%m%d)rJ  NZdateTextrO  r  )r  r  r  )tzinfoztoday-2daysrx  r>  Zm3u8_nativeZ__needs_testing))r  r  )rb  rc  r  Z	isPrivater
  rT  Z
isUnlisted)r  r  r  rg  r  r	  Z__post_extractor)rr/   	_match_idZhttp_schemer  r)   r   r   r  rU  r   r}  r   r   r  r   rV   r   r   r"   unquote_plusr  r%   r  rf   playlist_resultr   r    r  r(  Z
report_drmr   Zraise_geo_restrictedZraise_no_formatsr{  r  finditerZ_meta_regexr   r  groupsr  rx   rO  r  r  rM  Z_remove_duplicate_formatsr  Z_sort_thumbnailsr   r&   r!   r  re  r   r  r  r   r   r   r   rv   rN  fragmentr<  r_  endswithr  re   r   rI  r   r  r  r=  r  KeyError
IndexError	TypeErrorrw   r`  rf  Z"_extract_chapters_from_descriptionro  r+   r  r3   r  r'   r   r  r  r}   r   r
   r  r  fromtimestamprO  utcstrftimer-   r(   r  r   r   rT  r   r  r   r   r   Zextract_commentsZmark_watched)lr   r   r  r  r  r  rR  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feedr&  Zfeed_idZ
feed_titler  r  r   r  rx  r=  Zpemrr  r)  Z	countriesZregions_allowedr*  keywordr  whZratior  r  r  Zoriginal_thumbnailsZthumbnail_namesZn_thumbnail_namesr  r0  r  Zowner_profile_urlr  Zlive_end_timer1  r	  r  r  r  Zpctrr5  Ztranslation_languagesr;  Zget_translated_subsr:  Zcaption_trackZ	orig_langZ	lang_nameZ
trans_codeZ
trans_nameZorig_trans_coderS  	componentr<  kr  Zd_kZs_ksr?  rt  r@  Zinitial_datarn  ZvpirstlZtlbZtbrsr  r  regexr  ZvcrZvcZvsirZvorro  Zmultiple_songsrowZmrrZ	mrr_titleZmrr_contents_textr  r  rO  Zupload_datetimeZs_kr  r  rZ   )r%  r7  r  r  r   r/  r6  rH  r[   _real_extract(  sX   
     


    


 


                  &

      





        
	

	
    
     
(
	

  



          
















	 


zYoutubeIE._real_extract)F)T)NF)N)N)NN)N)N)Cr~   r   r   IE_DESCr  rf   r   r  
_VALID_URLZ_EMBED_REGEXZ_RETURN_TYPEr  _formatsr9  Z_GEO_BYPASSIE_NAMEr  r{  _TESTSZ_WEBPAGE_TESTSr  r  r  r  r  r  r  r  r  r  r  r"  r  r1  r2  r:  r=  r5  r6  rB  rT  rV  rY  r`  rf  ro  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ri  __classcell__rZ   rZ   r  r[   r  d  s  !
$

m! #$!!%* $  	Uc	 &  # %	 ! -	 
 %  % ) %!  ' 	# $!  $                      *" &0o
	)")
1 LT  &r  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 )Nr  )r   r(  r  r   )rn   r;   r;   netloc)	r   r   r   rN  rr  r  rP  rQ  r%   )r  r  rS  rZ   rZ   r[   _smuggleP  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  )rx   r  )rs  r  rZ   r[   rd   e  s     zYYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper.<locals>.<genexpr>)r/   r  r   )r   r   r[  rs  r!  )r  r[   wrapper\  s    


zFYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper)r  wraps)r!  ru  rZ   rt  r[   passthrough_smuggled_dataN  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)rv   rl  r   r   rW  )r  Zknown_basic_renderersr5  rh  rZ   rZ   r[   _extract_basic_item_rendereri  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 )Nrt  r  r2  r   r  r  Fr  rM  r   r  ZvideoCountTextr  r  r  r  T)r  r   r   r   r   r  r  r  r  r  r  rX  r  r}  r  r  )r   r}  r   r   r)   r  r   r  r   r  r  r  r  r}   r   )r   rh  r  r  r  r  rZ   rZ   r[   _extract_channel_rendererw  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 )Nrv   r  
playlistId&https://www.youtube.com/playlist?list=ier6  r^  r  rt  rk   c                 S   s   | d d d d S )Nr  r  r  r   rZ   r  rZ   rZ   r[   r    r  z;YoutubeTabBaseInfoExtractor._grid_entries.<locals>.<lambda>)rl  r   r|  r}  r   rU  r  r   r  r}  r2   r+   r  YoutubePlaylistIEr  r  rQ  )
r   Zgrid_rendererr  rh  r  playlist_idr6  r  ep_urlr  rZ   rZ   r[   _grid_entries  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)musicResponsiveListItemFlexColumnRendererrz  r  r   rz  z"https://music.youtube.com/watch?v=)r  r6  r  )r  watchEndpointr~  r  r  r  z&list=r  r6  (https://music.youtube.com/playlist?list=)r  r  r  z!https://music.youtube.com/browse/)r)   rU  r  r   r  )r   rh  r6  r  r  Z	browse_idrZ   rZ   r[   _music_reponsive_list_entry  s4    

  

  
 z7YoutubeTabBaseInfoExtractor._music_reponsive_list_entryc                 c   sR   | d}t|tsd S | dp*| d}|r@| |E d H  | d}|rNd S )Nrc  gridRendererZexpandedShelfContentsRendererZhorizontalListRenderer)r   rl  r   r  )r   shelf_rendererrc  rh  rZ   rZ   r[   _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endpointr  r  r   rZ   r  rZ   rZ   r[   r    r  z<YoutubeTabBaseInfoExtractor._shelf_entries.<locals>.<lambda>r!  z
/channels?r  )r^  )r+   r  r2   r}  rU  r  )r   r  Zskip_channelsr@  Z	shelf_urlr  rZ   rZ   r[   _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 )Nrn  playlistVideoRendererplaylistPanelVideoRendererr  )rl  r   r   r  )r   Zvideo_list_rendererrc  rh  r6  rZ   rZ   r[   _playlist_entries  s    


z-YoutubeTabBaseInfoExtractor._playlist_entriesc                 c   sl   t |dddpi }|d}|r0| |V  d S |d}|rh| jd| t || |ddV  d S d S )	N)rc  )ry  r{  rx  Fr  r  r~  r  r  r  )r)   r   r  rU  r  r   r}  )r   Zrich_grid_rendererrh  r6  r  rZ   rZ   r[   _rich_entries  s(     

 
z)YoutubeTabBaseInfoExtractor._rich_entriesc                 C   s   | d}|r| |S d S )Nr  )r   r  )r   video_rendererr6  rZ   rZ   r[   _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onTapCommandr  r  r   hashtag)r  r  )r2   r)   rU  r  r   r}  )r   Zhashtag_tile_rendererr   rZ   rZ   r[   _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backstagePostRendererrZ   r  rZ   rZ   r[   r  !  r  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>c                 S   s   | d d S )NbackstageAttachmentry  rZ   r  rZ   rZ   r[   r  &  r  r  c                 S   s   | d d d S )Nr  rx  r~  rZ   r  rZ   rZ   r[   r  .  r  r  r  c                 S   s   | d d S )Nr  r  rZ   r  rZ   rZ   r[   r  4  r  c                 S   s   | d d d S )Nr  ZurlEndpointr   rZ   r  rZ   rZ   r[   r  9  r  )r+   r   r   r  r  rU  r  r   r{  rl  r  r  rQ  )r   Zpost_thread_rendererZpost_rendererr  r6  r  r  r  runr  Zep_video_idrZ   rZ   r[   _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 )Nrn  backstagePostThreadRendererry  )r   rl  r{  r   r  r  )r   Zpost_thread_continuationrn  rc  rh  rZ   rZ   r[   !_post_thread_continuation_entriesC  s    





z=YoutubeTabBaseInfoExtractor._post_thread_continuation_entriesc                 c   s(   t |dD ]}| td|tV  q
d S )N)ro  .reportHistoryTableRowRenderercells.ZreportHistoryTableCellRenderercellZ"reportHistoryTableTextCellRendererrz  r  .r  r  r  r   r!  )r)   rU  r2   r  )r   rh  r   rZ   rZ   r[   _report_history_entriesZ  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 Nrn  rZ   r  rZ   rZ   r[   r  d  r  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>r  ZmusicShelfRendererZmusicShelfContinuationr  richItemRendererr   reportHistorySectionRenderer)r  tableZtableRendererc                 S   s   | d S r  rZ   r  rZ   rZ   r[   r  v  r  c                    s     | gS r  )r  r  r  rZ   r[   r    r  c                    s     | gS r  )r  r  r  rZ   r[   r    r  c                    s     dd| igiS )Nrv   rx  r  r  r  rZ   r[   r    r  c                    s     dd| igiS )Nrv   rz  r  r  r  rZ   r[   r    r  c                    s     | gS r  )r  r  r  rZ   r[   r    r  c                    s    |  S r  _extract_entriesr  continuation_listr   rZ   r[   r    r  )ZplaylistVideoListRendererr  ZreelShelfRendererZshelfRendererZmusicResponsiveListItemRendererr  ry  rx  rz  ZhashtagTileRendererrichGridRenderer)r+   r{  rl  r   r)   r   r  rw  r  r  r  r  r  rv   )r   parent_rendererr  rn  rc  Zis_rendererr  r  Zisr_contentsZisr_contentknown_renderersr5  rh  rZ   r  r[   r  a  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  r  r  rZ   r[   r    r  z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>c                 S   s   | d S )Nrc  rZ   r  rZ   rZ   r[   r    r  c                 S   s   | d S )NsectionListRendererrZ   r  rZ   rZ   r[   r    r  c                 S   s   | d S )Nr  rZ   r  rZ   rZ   r[   r    r  r   r   ra  z5Detected YouTube feed looping - assuming end of feed.rz   rY  rZ   page )continuationContentsonResponseReceivedActionsr  )rG  r<  r;  rz   r  rv   rn  ro  )ry  ZgridPlaylistRendererZgridVideoRendererZgridChannelRendererr  r  r  r  r  ZplaylistVideoListContinuationZgridContinuationZitemSectionContinuationZsectionListContinuation))r  r  .r  r  r  Fr  r  )r+   r   r  r  r  r   r(  r  r=  r  rS  r  r  r  r  r)   rw  )r   tabrG  rz   rY  rZ  Zextract_entriesZtab_contentr  ra  Zseen_continuationsr  Zcontinuation_tokenr;  r  r  r  Zcontinuation_itemZvideo_items_rendererr5  r!  Z
parent_keyrZ   r  r[   _entries  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   )tabsr7  Ztab_rendererrZ   rZ   r[   _extract_selected_tab  s
    

z1YoutubeTabBaseInfoExtractor._extract_selected_tabc                 C   s   t | dtdS )N)rn  twoColumnBrowseResultsRendererr  .)tabRendererZexpandableTabRendererr  )r)   r   )r  rZ   rZ   r[   _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   rS  r  rQ  rS  )r   rG  rz   r:  r  metadataselected_tabrZ   rZ   r[   _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channelMetadataRendererr  Z
externalIdZ
channelUrlr  )r   r  r  r  ZplaylistMetadataRendererrD  ZpageHeaderRendererrc  ZpageHeaderViewModelc                 S   s   t | pddd d S )Nr_   =r   z=s0)r1   rV   r  rZ   rZ   r[   _get_uncropped  s    zOYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>._get_uncroppedZavatarr   r   Zavatar_uncroppedr   )r   r   r3  )rD  .)bannerZmobileBannerZtvBanner)r  ZimageBannerViewModelimagesourcesr  r5  r3  Zbanner_uncroppedr  "playlistSidebarPrimaryInfoRendererrD  ZplaylistHeaderRenderer)ZthumbnailRenderer)ZplaylistVideoThumbnailRendererZplaylistCustomThumbnailRendererr  )ZplaylistHeaderBannerZheroPlaylistThumbnailRendererr  )rD  ZhashtagHeaderRendererr  )rD  .rM  r  ZcontentMetadataViewModelZmetadataRows.ZmetadataPartsc                 S   s   d|d d kS )NZsubscribersrz  rc  rZ   r  rZ   rZ   r[   r  ;  r  zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>rz  c                 S   s   |  ddS )Nr  r_   r  r  rZ   rZ   r[   r  <  r  r  microformatDataRendererrQ  r*  c                 S   s   | ot | S r  )shlexrV   r  rZ   rZ   r[   r  >  r  )r  r	  rX  r  rQ  r  )ZvanityChannelUrl)Z	ownerUrls.Fr  ZchannelHandleTextr  r   )r  r  )rD  .r  Tr  ))statsZ
briefStatsZnumVideosTextr   )byliner   playlistBylineRendererrz  modified_dater  r  )rn  r  r  .r  rc  r  rn  .r  rn  .Z channelAboutFullMetadataRendererr  r}  )r  r   r  rz  r  Z$playlistSidebarSecondaryInfoRenderer)Z
videoOwnerrL  r  )r  r   r  r  z^by (.+) and \d+ others?$r  r  r!  r  )r   r  r  r   r2  r  )r  r  r  )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   r2   )r   rG  r:  r  Zmetadata_rendererr  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_unixrK  Z
owner_text	browse_eprZ   rZ   r[   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   NrZ   )rb   r  r  Zlast_idrZ   r[   rd     s      zGYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>rm   r   r   c                 S   s   | d d d d d S )Nrn  rm   r  r  r  rZ   r  rZ   rZ   r[   r    r  zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>r  r  indexr_  zOAE%3D)r~  r  r  r_  r  r  rn  )rG  r<  r@  r;  rz   r  c                 S   s   | d d d d S )Nrn  rB  rz  rZ   r  rZ   rZ   r[   r    r  )r  r  r{  r  r  rM  rO  r+   r=  rQ  rS  r   r  r   )r   rz  r  r:  rz   Zfirst_idr  r  videosr  Zwatch_endpointr;  r<  rZ   r  r[   _extract_inline_playlist{  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  rZ   r  rZ   rZ   r[   r    r  zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>r~  c                 S   s   | d d d d S r  rZ   r  rZ   rZ   r[   r    r  zMLCT|RLTD[\w-]{22}r  )r  Zplaylist_title)r   r+   r  r2   r  	fullmatchrU  r  r   rS  r  )
r   rG  r   r:  rz  rz   r  r  Zplaylist_urlZis_known_unviewablerZ   rZ   r[   _extract_from_playlist  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
isSelectedrZ   r  rZ   rZ   r[   r    r  zCYoutubeTabBaseInfoExtractor._extract_availability.<locals>.<lambda>r  r  r  r  )r  r  r  ZPUBLICr  r
  NZPRIVATEr  ZUNLISTEDr  F)r  r  r  r  rg  )r  r)   r   r  r   r  rT  r  r}   r   r  r   r   r   r   )r   r:  sidebar_rendererr  Zplayer_header_privacyr  Zprivacy_setting_iconZmicroformats_is_unlistedrZ   rZ   r[   r    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playlistSidebarRendererrv   rZ   r  rZ   rZ   r[   r    r  zLYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>c                    s   |   S r  rZ   r  info_rendererrZ   r[   r    r  )r+   r{  )r:  r  r  r  r  rh  rZ   r  r[   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_  r  rn  Fz7Redownloading playlist API JSON with unavailable videos)rG  r;  r<  r  r7  rz   r8  )rT  r)   r=  rQ  rS  r  )r   rG  r:  rz   Zis_playlistr;  r<  rZ   rZ   r[   _reload_with_unavailable_videos  s0       

    z;YoutubeTabBaseInfoExtractor._reload_with_unavailable_videosc                 C   s   d| j dt dkS )NrH  r]  r  )r   r  r   r  rZ   rZ   r[   skip_webpage  s    z(YoutubeTabBaseInfoExtractor.skip_webpagec                 C   s,  d\}}| j |dD ]}z,| j||dd}| j||p8d|dpBi }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  rD  zDownloading webpage)r8  r_   r  rn  currentVideoEndpointr  z#Incomplete yt initial data received)r  r^  rI  r   rl  r  r	   r   r  r  r  r  r)   )r   r   rG  r7  rH  r:  r  r  rZ   rZ   r[   _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]  r  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)rU  r   r  r   r   r   )r   rz   r7  r  rZ   rZ   r[   _report_playlist_authcheck  s    
z6YoutubeTabBaseInfoExtractor._report_playlist_authcheckNrL   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 )NrD  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  )r7  r  )r  r  rX  r  r  r   r  r   r   r  _extract_tab_endpoint)r   r   rG  rz   r7  webpage_fatalr  r:  rH  r  r  rZ   rZ   r[   _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)rz   r  r   r  znavigation/resolve_urlz#Downloading API parameters API JSON)	rG  r<  r  r;  rz   r7  r@  r8  r  r  r  )r  r  c                    s   | d   S )Nr  rZ   r  Zep_keyrZ   r[   r  >  r  zCYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>)rn  r  r  )rG  r<  r@  r;  rz   r7  r  r  z0Failed to resolve url (does the playlist exist?)Tr   )r=  r  rv   r+   r   r   r   )r   r   rG  rz   r7  r  r;  Zresolve_responseZ	endpointsr@  r_  Zerr_noterZ   r  r[   r  7  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_  ))rn  ZtwoColumnSearchResultsRendererZprimaryContentsr  rn  )ZonResponseReceivedCommandsr   r  r  )rn  ZtabbedSearchResultsRendererr  r   r  rc  r  rn  )r  zquery "r  c                 S   s   h | ]}|d  qS )r   rZ   )rb   keysrZ   rZ   r[   	<setcomp>Z  s     z>YoutubeTabBaseInfoExtractor._search_results.<locals>.<setcomp>FrD  r   r   )rz   rZ  r  r  r  )rG  r@  r<  r  r  rz   r;  rn  )r
   _SEARCH_PARAMSrt   r  r`  r  r  r  r   r=  rS  r  r)   r  r{  r3   )r   r<  r_  r  r:  Zcontent_keys
display_idr  rz   r  r  r  r;  Zslr_contentsrZ   rZ   r[   _search_resultsK  s@           z+YoutubeTabBaseInfoExtractor._search_results)F)T)T)T)NTFrL   )NTrL   )(r~   r   r   r  rw  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  rZ   rZ   rZ   r[   rp  M  sN   

&&
$6D
 )




rp  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>[^/?\#&]+)
    )r   )reserved_namesr!  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  r  r  r  r  r   r  rQ  r  rX  )r8  r   playlist_mincountr[  z%playlists, multipage, different orderz>https://www.youtube.com/user/igorkle1/playlists?view=1&sort=dd)r   r  r  r  r  r  rQ  r  r   r  rX  zplaylists, serieszJhttps://www.youtube.com/c/3blue1brown/playlists?view=50&sort=dd&shelf_id=3rF   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  r  r  r   r  r  r  r  rQ  rX  r  zplaylists, singlepagez7https://www.youtube.com/user/ThirstForScience/playlistsr^   ZUCAEtajcuhQ6an9WEzY9LEMQzThirstForScience - Playlistsz$md5:609399d937ea957b0f53cbffb747a14cZThirstForSciencez)https://www.youtube.com/@ThirstForSciencez@ThirstForSciencez8https://www.youtube.com/channel/UCAEtajcuhQ6an9WEzY9LEMQr  )r   r  r  r  r  r  r  r  rQ  r   rX  z3https://www.youtube.com/c/ChristophLaimer/playlistsr~  zbasic, single video playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcZ"PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczyoutube-dl public playlistr_   Z20201130z	Sergey M.ZUCmlqkdCBesrv2Lak1mF_MxAz8https://www.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxAr
  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   r  r  rQ  r  r  r   r  r  r	  r  r  r  r   )r8  r   r[  r}  zempty playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlistZ20230921r  )r   r  rQ  r   r  r  r  r  r	  r  r  r  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  r  r  r  r   rQ  r  r  r  rX  r   r8  r   r[  r  z
Videos tabz?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videos)r   r  r  r  r  rQ  r  r  r  r   rX  i  zVideos tab, sorted by popularzWhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videos?view=0&sort=p&flow=grid)r   r  r  r  r  r  r  r   rQ  r  rX     zPlaylists tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists)r   r  r  r  r  r  r   r  r  rQ  rX     zCommunity tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Community)r   r  r  r   r  r  rQ  rX  r  r  r  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  r  r  rQ  r   r  rX  r  r  r  r  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   r  rQ  r  r  r  r  r   r	  r  r  r  r-  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   r  rQ  r  r   r  r  r  r	  r  r  r  ic  *[Uu]navailable videos (are|will be) hidden)r8  r   r[  r  rr  z!even larger playlist, 8832 videosz/http://www.youtube.com/user/NASAgovVideo/videosro  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   rQ  r  r  r  r   r  r  r	  r  r  r  rD   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   r  r   rQ  r  r  r  r  r	  r  r  r     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   r   r  r  r  rQ  r  r  r	  r  r  r  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   r  rQ  r  r  r  r   r	  r  r  r  r     zChttps://invidio.us/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzcz4Playlist URL that does not actually serve a playlistzThttps://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4ZFqZTN594JQwr0  z6Smiley's People 01 detective, Adventure Series, ActionZ20150526r  z$md5:507cdcb5a49ac0da37a920ece610be80ru  )
r   r%  r  rO  r  r  rP  rQ  r  rR  r^  r  )r8  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hGkQjiJLjWQr,  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   r%  r  rO  r  rP  rQ  rR  r  r   r  rT  r  r  rS  rt  r	  r  r  rX  r  r  r  r  r  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   r%  r  rO  r  r  rP  rQ  rR  )r   r[  r_  rp  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.r  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  rQ  i,  )r   r[  r  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   r  r  r  r  r  r  rQ  r   r	  r  r  r     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  rQ  r  r   r  r  r  r  r	  r  e   z8https://www.youtube.com/channel/UCtFRv9O2AHqOZjjynzrv-xgzUCtFRv9O2AHqOZjjynzrv-xgrK  zYoutube music Albumz2https://music.youtube.com/browse/MPREb_gTAcphH99wEZ)OLAK5uy_l1m0thk3g31NmIIz_vMIbWtyv7eZixlH0z0Album - Royalty Free Music Library V2 (50 Songs))r   r  rQ  r  r  r	  r  r;  )r8  r   r[  r}  rr  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  r	  rQ  r  r   r  r  r  r  r  r  r  r[  rG  rF  r   r   rq   rI  z8https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Qz+https://www.youtube.com/watch?v=BaW_jenozKcrH  rM  rL  )r  r   r  r   r  r  r  r  r   r   r  r  r  extract_flat)r8  r   r[  rz  r}  r_  zHAPI Fallback: Recommended - redirects to home page. Requires visitorDatarecommendedZ
youtubetabr]  rH  r  )r8  r   r[  r  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  r  r   r  rQ  r  rX  i  z!Query for sorting no longer works)r8  r   r[  r  r_  r]  z;API Fallback: Topic, should redirect to playlist?list=UU...)r   r  r  r  r  r  rQ  r   r  r	  r  )r8  r   r[  r  r_  rr  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  r  rQ  r	  r  r   r  r  r  r  r  r  ztranslated tab namezBhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/playlistsr  r  ztest descriptionu#   cole-dlp-test-acc - 再生リストr  r  r  )
r   rQ  r  r  r  r  r   r  r  r  r  rE  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   rQ  r  r  r   r  r  r  r	  r  r  r  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 - Live   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  rX  r  r  r  r   rQ  r  r  r  r  rA   )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  rQ  r  r  rX  r  r   r  r  r  r  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  rQ  r  r  r   rX  r  r  r  r  r8  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  rQ  r  r   r  rX  r  r  r  r  r?   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  r   r  r  r  rQ  r  r  r  z*https://www.youtube.com/shorts/sSM9J5YH_60ZsSM9J5YH_60zSHORT short)r  r   r   r   r  r  r  )r   r[  rz  r_  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/livezUCQvWX73GQygcwXOTSf_VDVg - Livez+startswith:https://www.youtube.com/watch?v=)r  r   r   r   r  r  r  r  r  r   r  r  r  r  r  r   playlist_itemsr   r[  rz  r_  r  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)r  r   r   r   r  r  r   r  r  rX  r}  r  r  r  r  z*https://www.youtube.com/@3blue1brown/about)r   rQ  r  rX  r  r   r  r  r  r  r  r  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   r  r  r  r  r  rX  r  rQ  r   r  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   r   r  r  r  r  r  rQ  r  r  rX  r  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   r  r  r  r  r  r  r   r  rQ  r	  r  r  r  )r   r[  r  rr  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   r   r  r  rX  r  r  r  r  r  r  rQ  r8  r   r}  r[  c                    s   t |rdS t |S )NF)r  r  r  )rg  r   r  rZ   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 )Nr_   rZ   rb   re  r  rZ   rZ   r[   rd     s      z-YoutubeTabIE._get_url_mobj.<locals>.<genexpr>)_URL_REr  	groupdictr   rv   )r   r   r  rZ   rZ   r[   _get_url_mobj  s    zYoutubeTabIE._get_url_mobjr!  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  r_   )r  r  r  r   r  r   r  r  ZTAB_ID_SPONSORSHIPSZ
membershipz#Falling back to selected tab name: Zfeaturedstreams)homer  )r   r  r2   r)   r  r  r(  )r   r  r  Ztab_nameZtab_urltab_idrZ   rZ   r[   _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 r`   )r  )rb   r  r   r  rZ   r[   rd     s     z(YoutubeTabIE._has_tab.<locals>.<genexpr>)r  )r   r  r  rZ   r  r[   _has_tab  s    zYoutubeTabIE._has_tabc                 C   s   | j g |f| ||S r  )rS  r  )r   rG  r:  rZ   rZ   r[   _empty_playlist  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 )ONrn   rq  r  prer  r  Znot_channelr  r   r  r  ZMPz"https://music.youtube.com/channel/rN   r1  )r  r  ZurlCanonicalFru  z#Failed to resolve album to playlistZchannel_typer  r   r  z/videosz8YouTube Music is not directly supported. Redirecting to c                 3   s   | ]}t  |d fV  qdS r`   r  r  )r  rZ   r[   rd     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  r  )r  .ZnavigateActionr  r  r  r   r  r_   r!  zXThis playlist is likely not available in your region. Following conditional redirect to zSelected tab: r'  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)rz   r7  r  zQThe channel does not have a videos, shorts, or live tab. Redirecting to playlist z insteadr  )r6  zThis channel does not have a z tabzno-youtube-unavailable-videosr  r   )Zextractor_keyZ	extractorr  r  r+  c                 3   s   | ]}  |tV  qd S r  )rU  r  )rb   ur  rZ   r[   rd   =  s     zthe Uploads (UU) playlist URLc                 S   s   | d  dS )Nr  r  )r   r  rZ   rZ   r[   r  F  r  z,YoutubeTabIE._real_extract.<locals>.<lambda>z(https://www.youtube.com/playlist?list=UUr  zeDownloading as multiple playlists, separated by tabs. To download as a single playlist instead, pass )rn  rB  rz  rz  r  r  r  r  /livez5Unable to recognize playlist. Downloading just video zUnable to recognize tab page)/rQ  r   r   rP  rN  rQ  r  r  r   rU  r  r  r)   r  r   r   r"   r   Z_yes_playlistr  r  rf   r2   r   r  r  r  r(  r  r  r  r   r  r  r  r   r   rm  r  r  ri  rO  r  r+   rS  r   r  )r   r   r  rG  r  r  r  r  r  Z
is_channelZmdataZmurlZoriginal_tab_idr  r6  r  r:  rz   redirect_urlr  Z
extra_tabsr  Zselected_tab_idZselected_tab_nameZpl_idZpl_urlr_  r  Zuploads_urlrz  rZ   )r  r   r[   ri    s   

&  
           







    
zYoutubeTabIE._real_extract)r!  )r~   r   r   rj  r  r   r  rf   r  rk  rm  r  r{  r  r   r  rT  rn  r  r  r  compiler
  r  r  r  r  rp  rw  ri  ro  rZ   rZ   r  r[   r  m  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})
                     )r   )r  r!  zyoutube:playlistz
issue #673ZPLBB231211A4F62143z%[OLD]Team Fortress 2 (Class-based LP)ZWickmanz
@WickmanVTz$md5:8fa6f52abb47a9552002fa3ddfc57fc2z"https://www.youtube.com/@WickmanVTr  zUCKSpbfbl5kRQpTdL7kMc-1Qz8https://www.youtube.com/channel/UCKSpbfbl5kRQpTdL7kMc-1Qr
  )r  r   r  r  r  r  r  r  r  r   rQ  r  r	     r  Z"PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlZYDL_safe_search)r  r   r   zThis playlist is privater|  rs   zQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur^   ZJODA15Z"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEuZmilanz
@milan5503r_   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73HfelbmawZ20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)r  r   r  r  r  r  rQ  r  r  r   r  r  r	  z.[Uu]navailable videos? (is|are|will be) hiddenRetryingz	Giving up)r8  r   r}  r[  rr  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   r  r  r  r   r  r  rQ  r  r  r  r	  r  )r   r  r[  rr  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  rZ   r[   r    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  )	rQ  r   r  r0   r"   r%   rU  r  r   )r   r   r  r  rZ   rZ   r[   ri    s    

zYoutubePlaylistIE._real_extract)r~   r   r   rj  r  r   r  rf   r  rk  rm  r  rn  r  r  ri  ro  rZ   rZ   r  r[   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yeWKywCrFtkr,  z#Small Scale Baler and Braiding RugszBackus-Page House Museumz@backuspagemuseumz4re:https?://(?:www\.)?youtube\.com/@backuspagemuseumZ20161008z$md5:800c0c78d5eb128500bffd4f0b4f2e8azNonprofits & Activismr   Tr  ZUCEfMCQ9bs3tjvjy1s451zawrJ  z8https://www.youtube.com/channel/UCEfMCQ9bs3tjvjy1s451zawr
  ;   )r   r%  r  r  r  r  rO  r  rP  rQ  rR  rT  rS  r  r   r  r  r  r  r	  r  rW  rX  )r"  r^  rd  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/watchr  )r  r{  Zfeaturer  )Z_match_valid_urlr  rU  r0   r  r   )r   r   r  r6  r  rZ   rZ   r[   ri    s    


 zYoutubeYtBeIE._real_extractN)r~   r   r   rj  r   r  rk  r{  r  rn  ri  rZ   rZ   rZ   r[   r    sH    $r  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 )Nr  r  r  )rQ  rU  r  r   )r   r   r  rZ   rZ   r[   ri  
  s    

 z&YoutubeLivestreamEmbedIE._real_extractN)r~   r   r   rj  rk  rn  ri  rZ   rZ   rZ   r[   r     s   r   c                   @   s,   e Zd ZdZdZdZdddgZdd Zd	S )
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/)rQ  rU  r  )r   r   Zuser_idrZ   rZ   r[   ri    s    
zYoutubeYtUserIE._real_extractN)r~   r   r   rj  rm  rk  rn  ri  rZ   rZ   rZ   r[   r!    s   r!  c                   @   s8   e Zd ZdZdZdZdZddddddgZdd	 Zd
S )YoutubeFavouritesIEzyoutube: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  rU  r  r   r   rZ   rZ   r[   ri  ,  s    z!YoutubeFavouritesIE._real_extractN)	r~   r   r   rm  rj  rk  r  rn  ri  rZ   rZ   rZ   r[   r"    s   r"  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(multiPageMenuNotificationSectionRendererrv   )r&  r   r  r  r  r   ZnotificationRendererrp  )r)   r{  _extract_notification_rendererr   )r   r  r  Znotification_listr  r  ra  rZ   rZ   r[   _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  r  r  )r  r  r  z
/post/(.+)r  zpost idr   r  z/community?lb=)	ZcontextualMenurG  rv   r   ZmenuServiceItemRendererrz  r  r   rz  ZshortMessage   ­r_   z[^:]+: (.+)zvideo titler  r  ZsentTimeTextr   ZvideoThumbnail)
r  r   r   r6  r  r  r   r  r  r  )r)   r  r   r   r   r}  re   r  r<  r   r  r  r  r   r  )r   Znotificationr6  r   r  r  Zpost_idr   Znotification_titler  r  rZ   rZ   r[   r*  N  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   rq  ZgetNotificationMenuEndpointctokenr  zpage r-  z"notification/get_notification_menur&  r  )rG  r<  rz   r@  r  r;  r   )r  r  r)   r  r  r=  rS  r+  )r   rz   r  r  pager-  rZ   rZ   r[   _notification_menu_entriesy  s&         z1YoutubeNotificationsIE._notification_menu_entriesc                 C   s8   d}| j s| d|ni }| | | | |||S )NZnotificationsrL   )r  r`  r  rS  r/  )r   r   r  rz   rZ   rZ   r[   ri    s    
z$YoutubeNotificationsIE._real_extractN)r~   r   r   rm  rj  rk  r  rn  r+  r*  r/  ri  rZ   rZ   rZ   r[   r%  2  s   +r%  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 videorF   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 dier  N)r~   r   r   rj  rm  _SEARCH_KEYr  rn  rZ   rZ   rZ   r[   r0    s$   r0  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 videorF   r1  r{  r2  N)	r~   r   r   r0  rm  r3  rj  r  rn  rZ   rZ   rZ   r[   r4    s   
r4  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=videorF   r1  r{  )r   r  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/UCsXVk37bltHxD1rDPwtNM8Qr  u   Kurzgesagt – In a Nutshellz$md5:4ae48dfa9505ffc307dad26342d06bfcz@kurzgesagtz#https://www.youtube.com/@kurzgesagtT)r  r   r   r   r   r  r  r  r  r  r  r  r  r  rX  r  r  r  z2https://www.youtube.com/results?q=test&sp=EgQIBBgBr~  c              	   C   sB   t |}|dp|dd }| | ||ddd ||S )Nsearch_queryr  r   r  r  )r"   r   rS  r  )r   r   r  r<  rZ   rZ   r[   ri    s    z YoutubeSearchURLIE._real_extractN)r~   r   r   rj  r0  rm  rk  r{  r  rn  ri  rZ   rZ   rZ   r[   r5    sf   
=r5  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+musicrH  zroyalty free musicr{  r2  zYhttps://music.youtube.com/search?q=royalty+free+music&sp=EgWKAQIIAWoKEAoQAxAEEAkQBQ%3D%3Dr?   zroyalty free music - songsr   Zin_playlist)r   r  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 )Nr8  r  r   r  r  c                 3   s   | ]\}}| kr|V  qd S r  rZ   r	  r_  rZ   r[   rd   &  s      z8YoutubeMusicSearchURLIE._real_extract.<locals>.<genexpr>r  r_   r   r  r  rN   r1  )r_   )r"   r   r  	_SECTIONSrv   r   r   rR  rV   r  r   rS  r  )r   r   r  r<  sectionr  rZ   r:  r[   ri  !  s     z%YoutubeMusicSearchURLIE._real_extractN)	r~   r   r   rj  rm  rk  rn  r;  ri  rZ   rZ   rZ   r[   r9    s@   		r9  c                   @   s4   e Zd ZdZdZdZd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   t |  d S r  )r   r  r  rZ   rZ   r[   r  8  s    z*YoutubeFeedsInfoExtractor._real_initializec                 C   s   d| j  S )Nzyoutube:)
_FEED_NAME)rg  rZ   rZ   r[   rm  ;  s    z!YoutubeFeedsInfoExtractor.IE_NAMEc                 C   s   | j d| j t dS )Nzhttps://www.youtube.com/feed/r#  )rU  r>  r  r   r   rZ   rZ   r[   ri  ?  s    
 z'YoutubeFeedsInfoExtractor._real_extractN)
r~   r   r   r  r  r>  r  r   rm  ri  rZ   rZ   rZ   r[   r=  0  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=WLr#  r$  r   rZ   rZ   r[   ri  M  s     z!YoutubeWatchLaterIE._real_extractNr~   r   r   rm  rj  rk  rn  ri  rZ   rZ   rZ   r[   r?  D  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)?r  Fz:ytrecTr~  z:ytrecommendedr  N)r~   r   r   rj  rk  r>  r  rn  rZ   rZ   rZ   r[   rA  R  s   rA  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   rj  rk  r>  rn  rZ   rZ   rZ   r[   rB  c  s   rB  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)?r  z
:ythistoryTr~  NrC  rZ   rZ   rZ   r[   rD  p  s   rD  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%brA   )r+  r   r   quoter  r  r  )r6  Z	pb_paramsrZ   rZ   r[   _generate_audio_pivot_params  s    z6YoutubeShortsAudioPivotIE._generate_audio_pivot_paramsc                 C   s$   |  |}| jd| | tdS )Nz0https://www.youtube.com/feed/sfv_audio_pivot?bp=r#  )rQ  rU  rG  r  r   r   r6  rZ   rZ   r[   ri    s
    
z'YoutubeShortsAudioPivotIE._real_extractN)
r~   r   r   rj  rm  rk  rn  r  rG  ri  rZ   rZ   rZ   r[   rE  z  s   
rE  c                   @   sT   e Zd ZdZdZdZdddddddddd	ddd
dddddgZdd ZdS )YoutubeTruncatedURLIEzyoutube:truncated_urlFaX  (?x)
        (?:https?://)?
        (?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/
        (?:watch\?(?:
            feature=[a-z_]+|
            annotation_id=annotation_[^&]+|
            x-yt-cl=[0-9]+|
            hl=[^&]*|
            t=[0-9]+
        )?
        |
            attribution_link\?a=[^&]+
        )
        $
    zAhttps://www.youtube.com/watch?annotation_id=annotation_3951667041Tr~  zhttps://www.youtube.com/watch?z.https://www.youtube.com/watch?x-yt-cl=84503534z)https://www.youtube.com/watch?feature=fooz&https://www.youtube.com/watch?hl=en-GBz$https://www.youtube.com/watch?t=2372c                 C   s   t dddd S )NzDid you forget to quote the URL? Remember that & is a meta character in most shells, so you want to put the URL in quotes, like  youtube-dl "https://www.youtube.com/watch?feature=foo&v=BaW_jenozKc"  or simply  youtube-dl BaW_jenozKc  .Tr   )r   r   rZ   rZ   r[   ri    s    z#YoutubeTruncatedURLIE._real_extractNr@  rZ   rZ   rZ   r[   rI    s.   rI  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-hEMBSn3F4AaABCQr,  g      =@gC@gffffff%@r   r
  rf  zScott The WozZUC4rqhyiTs7XyuODcECvuiiQz8https://www.youtube.com/channel/UC4rqhyiTs7XyuODcECvuiiQz$md5:7a4517a17ea9b4bd98996399d8bb36e7Trh  z:https://i.ytimg.com/vi_webp/ScPX26pdQik/maxresdefault.webpz'Mobile Games on Console - Scott The WozZ20210920z@ScottTheWozz$https://www.youtube.com/@ScottTheWozrJ  zcount:20rN  )r   r%  section_startsection_endr  rT  r	  rP  r   r  r  r  rR  rS  rQ  r  r  rO  r  r  r  r  r  rX  r  rW  rY  rZ  c                 C   sr   |  |}| ||\}}t|d}|s0tdt|ddd}dd| t |t|d d	 t|d
 d	 dS )Nr  zUnable to find video ID)ra  .rb  rc  ZclipSectionRendererrn  .ZclipAttributionRendererZonScrubExitcommandExecutorCommandcommands.r'  r(  ZnotificationActionRendererZactionButtonrs  rt  rM  rN  .ZloopCommandFr  r(  r  ZstartTimeMsr\  Z	endTimeMs)r  r   r   r   rK  rL  )rQ  r  r)   r   r  r   r  )r   r   Zclip_idrT   r:  r6  Z	clip_datarZ   rZ   r[   ri    s    

zYoutubeClipIE._real_extractN)r~   r   r   rm  rk  r  rn  ri  rZ   rZ   rZ   r[   rJ    sB   "rJ  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  r,  r   r  r  r  r  r  r  r  r  r  r  r  r  r  Tr  r
  r  ri  r  r  r  r  rN  )r   r%  rT  r  rW  r  rO  r  r  r  rR  rt  rQ  r  r  rS  r  r	  rX  r  rP  r  r  r   r  r  r  rY  r   r^  )r   r[  r  r_  c                 C   s4   t t|dd gd }|s*tddd| |S )Ncontinuerm   z#Invalid cookie consent redirect URLTr   )r1   r"   r   r   rU  )r   r   r  rZ   rZ   r[   ri  (  s    z&YoutubeConsentRedirectIE._real_extractN)	r~   r   r   rm  rj  rk  r  rn  ri  rZ   rZ   rZ   r[   rO     sJ   $rO  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   )rQ  r   rH  rZ   rZ   r[   ri  9  s
    
z"YoutubeTruncatedIDIE._real_extractNr@  rZ   rZ   rZ   r[   rQ  /  s   rQ  )kr  r  r  rx   r  r  r   r  r)  r  r>  r  os.pathr	  rE  r  r  r  r  r&  r+  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   r  ru   r\   rj   r|   Enumr}   r   r  rp  r  r  r  r   r!  r"  r%  r0  r4  r5  r9  r=  r?  rA  rB  rD  rE  rI  rJ  rO  rQ  rZ   rZ   rZ   r[   <module>   s  -  8
      4                                  &         yr3\G5
1=/