
    yfsQ                    >   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 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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZL d
ZMd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d0d1d!d2d#id3d%d&d4dd5d6d7d8d9id:d%d&dd;d6d7d8d9id<d%d=d>dd?d@d7dAd9idBd%d&ddCdDd7dEd9idFd%d=dddGddidddddHdIdidJddKZNdL ZOdM ZPdN ZQ eQ         G dO dPej                        ZS G dQ dRe      ZT G dS dTeT      ZU G dU dVeT      ZV G dW dXeV      ZW G dY dZe      ZX G d[ d\e      ZY G d] d^e      ZZ G d_ d`e      Z[ G da dbeT      Z\ G dc ddeV      Z] G de dfeVe      Z^ G dg dheVe      Z_ G di djeV      Z` G dk dleV      Za G dm dne      Zb G do dpe      Zc G dq dreb      Zd G ds dteb      Ze G du dveb      Zf G dw dxe      Zg G dy dze      Zh G d{ d|eV      Zi G d} d~eT      Zj G d de      Zky)    N   )InfoExtractorSearchInfoExtractor)PhantomJSwrapper   )	functools)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variadic__yt_dlp_client'AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8clientWEBz2.20220801.00.00)
clientNameclientVersion)INNERTUBE_API_KEYINNERTUBE_CONTEXTINNERTUBE_CONTEXT_CLIENT_NAMEWEB_EMBEDDED_PLAYERz1.20220731.00.008   z'AIzaSyC9XL3ZjWddXya6X74dJoCTL-WEYFDNX30music.youtube.com	WEB_REMIXz1.20220727.01.00C   )r<   INNERTUBE_HOSTr=   r>   z'AIzaSyBUPetSUmoZL-OhlxA7wSac5XinrygCqMoWEB_CREATORz1.20220726.00.00>   z'AIzaSyA8eiZmM1FaDVjRy-df2KTyQ_vz_yYM39wANDROIDz19.09.37   z?com.google.android.youtube/19.09.37 (Linux; U; Android 11) gzip)r:   r;   androidSdkVersion	userAgent   F)r<   r=   r>   REQUIRE_JS_PLAYER'AIzaSyCjc_pVEDi4qsv5MtC2dMXzpIaDoRFLsxwANDROID_EMBEDDED_PLAYER7   z'AIzaSyAOghZGza2MQSZkY_zfZ370N-PUdXEo8AIANDROID_MUSICz6.42.52zIcom.google.android.apps.youtube.music/6.42.52 (Linux; U; Android 11) gzip   'AIzaSyD_qjV8zaaUMehtLkrKFgVeSX_Iqbtyws8ANDROID_CREATORz	22.30.100zMcom.google.android.apps.youtube.creator/22.30.100 (Linux; U; Android 11) gzip   z'AIzaSyB-63vPrdThhKuerbB2N_l7Kwwcxj6yUAcIOSz19.09.3z
iPhone14,3zJcom.google.ios.youtube/19.09.3 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X))r:   r;   deviceModelrJ      IOS_MESSAGES_EXTENSIONB   )r=   r>   rL   'AIzaSyBAETezhkwP0ZWA02RsqT1zu78Fpt0bC_s	IOS_MUSICz6.33.3zNcom.google.ios.youtubemusic/6.33.3 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)   IOS_CREATORz	22.33.101zNcom.google.ios.ytcreator/22.33.101 (iPhone14,3; U; CPU iOS 15_6 like Mac OS X)   MWEBTVHTML5_SIMPLY_EMBEDDED_PLAYERz2.0U   )webweb_embedded	web_musicweb_creatorandroidandroid_embeddedandroid_musicandroid_creatoriosios_embedded	ios_musicios_creatormwebtv_embeddedc                     | j                  dd      ^}}|r||d   |fS | j                  dd      ^}}| ||r|d   fS d fS )N.r   r   _)rsplitsplit)client_namevariantbases      :/usr/lib/python3/dist-packages/yt_dlp/extractor/youtube.py_split_innertube_clientry      s]     ''Q/NGdQ(( &&sA.ND7Ggaj====    c                     t        |       d   j                  dd      j                  d      ^}}t        |d d dj	                  d |D                    j                         S )Nr   embedscreene_srr       c              3   &   K   | ]	  }|d      ywr   N ).0xs     rx   	<genexpr>z$short_client_name.<locals>.<genexpr>   s     *?A1Q4*?s   )ry   replacert   r   joinupper)ru   mainpartss      rx   short_client_namer      sZ    *;7:BB=RWX^^_bcLD5bq277*?*?#?@FFHHrz   c                  *   ddi} d}t        |d d d         }t        t        j                               D ]  \  }}|j	                  dd       |j	                  dd       |j	                  d	d
       |d   d   j	                  dd       t        |      \  }}}d ||      z  |d<   |sBt        j                  |      xt        | d<   }d|d   d   d<   | |d   d<   |dxx   dz  cc<   |dk(  r| |d   d<   |dxx   dz  cc<   |dxx   dz  cc<    y )NembedUrlhttps://www.youtube.com/)rj   rf   rb   tvrn   r<   z'AIzaSyDCU8hByM-4DrUqRUYnGn-3llEO78bcxq8rD   www.youtube.comrL   Tr=   r8   hlen
   priority_embedscreenEMBEDclientScreen
thirdPartyrK   embeddedr   )r%   tupleINNERTUBE_CLIENTSitems
setdefaultry   copydeepcopy)	THIRD_PARTYBASE_CLIENTSr   r8   ytcfgrr   base_clientrv   r|   s	            rx   build_innertube_clientsr     sQ   .K ;Ldd+,H06689 #,.WX)+<=,d3!"8,77dC"9&"A;+!66jGK}}UZG[[56IPK+,X6~F=HK+,\:
#q(#
"7BE%&|4*"*"%#rz   c                       e Zd Z ej                         Z ej                         Z ej                         Z ej                         Z ej                         Z	 ej                         Z
 ej                         Zy)	BadgeTypeN)__name__
__module____qualname__enumautoAVAILABILITY_UNLISTEDAVAILABILITY_PRIVATEAVAILABILITY_PUBLICAVAILABILITY_PREMIUMAVAILABILITY_SUBSCRIPTIONLIVE_NOWVERIFIEDr   rz   rx   r   r   "  sb    %DIIK$499;#$))+$499; )		tyy{Htyy{Hrz   r   c                   \   e Zd ZdZdZdZdZdZg dZdhZ	dZ
d	Zd
 Zd Zd Zd Zej"                  d        Zd Zd Zd Zd ZdZdZd?dZd?dZd@dZd?dZd?dZdAdZd@dZd@dZ dZ!dBdZ"	 	 	 dCd Z#dDd!Z$e%d"        Z&dEd#Z'e%d$        Z(e%d%        Z)ej"                  d&        Z*d' Z+dddddddd(d)Z,d* Z-e%dAd+       Z.e/d,        Z0e/d-e1fd.       Z2e/d/        Z3e/d0        Z4dFd1Z5d2 Z6d3e7fd4Z8e%d5        Z9e%dd6d7       Z:d8 Z;e%d9        Z<e%d:        Z=d; Z>	 	 	 dGd<Z?e%d=        Z@d> ZAy)H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)Safazidmsbscacsdadeetzen-INzen-GBr   eszes-419zes-USeu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elhyiwurarfanemrhiasbnpaguortateknmlsithlomykaamkmzzh-CNzzh-TWzzh-HKjakoz1Unavailable videos will be hidden during playbackz@[\w.-]{3,30}zUC[\w-]{22}c                 H    | j                  d| j                   d|dd       S )N^()$zUC-iddefault_search_regex_YT_CHANNEL_UCID_RE)selfucids     rx   ucid_or_nonez%YoutubeBaseInfoExtractor.ucid_or_none  s-    !!R(@(@'A"DdG]a!bbrz   c                 H    | j                  d| j                   d|dd       S )Nr   r   z@-handler  r  _YT_HANDLE_RE)r  handles     rx   handle_or_nonez'YoutubeBaseInfoExtractor.handle_or_none  s-    !!R(:(:';2">
\`!aarz   c                 H    | j                  d| j                   d|dd       S )N'^(?:https?://(?:www\.)?youtube\.com)?/()zchannel handler  r
  r  urls     rx   handle_from_urlz(YoutubeBaseInfoExtractor.handle_from_url  s8    !!%LTM_M_L``a"b"%'7 " G 	Grz   c                 H    | j                  d| j                   d|dd       S )Nr  r  z
channel idr  r  r  s     rx   ucid_from_urlz&YoutubeBaseInfoExtractor.ucid_from_url  s7    !!%LTMeMeLffg"h"%|T " C 	Crz   c           
          | j                  ddddg      d   }|sy|| j                  vr't        d| d	t        | j                  d
di dd      |dk7  r| j	                  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, rq   expectedr   zPreferring "zQ" translated fields. Note that some metadata extraction may fail or be incorrect.)_configuration_arg_SUPPORTED_LANG_CODESr   r   report_warning)r  preferred_langs     rx   _preferred_langz(YoutubeBaseInfoExtractor._preferred_lang  s     00	UYdfcg0hijk!;!;; -n-==jkxz~  {U  {U  lb  ]a  lb  kc  cd  e  t#~..  ABrz   c                     | j                  d      }|j                  d      ry |j                  d      }|r|j                  j                  d      sy | j	                  dddd       y )	Nr   z__Secure-3PSIDSOCSCAA.youtube.comCAIT)secure)_get_cookiesgetvalue
startswith_set_cookie)r  cookiessocss      rx   _initialize_consentz,YoutubeBaseInfoExtractor._initialize_consent  s_    ##$>?;;'({{6"

--e4tDrz   c                    | j                  d      }|j                  d      }i }|r3	 t        t        j                  j                  |j                              }|j                  | j                  xs ddd       | j                  ddt        j                  j                  |             y # t        $ r | j                  dt               z          Y {w xY w)	Nr   PREFz Failed to parse user PREF cookier   UTC)r   tzr'  )namer,  )r*  r+  dicturllibparse	parse_qslr,  
ValueErrorr!  r   updater#  r.  	urlencode)r  r/  pref_cookieprefs       rx   _initialize_prefz)YoutubeBaseInfoExtractor._initialize_pref  s    ##$>?kk&)`FLL22;3D3DEF 	4//74uEFfFLL<R<RSW<XY  `##$FI\I^$^_`s   2B. .%CCc                 d    | j                          | j                          | j                          y N)r@  r1  _check_login_requiredr  s    rx   _real_initializez)YoutubeBaseInfoExtractor._real_initialize  s&      """$rz   c                 ^    | j                   r!| j                  s| j                  dd       y y y )Nz1Login details are needed to download this contentr/  )method)_LOGIN_REQUIRED_cookies_passedraise_login_requiredrD  s    rx   rC  z.YoutubeBaseInfoExtractor._check_login_required  s0    (<(<%%&Ybk%l )=rz   z@(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=zytInitialPlayerResponse\s*=rb   c                 :    t        j                  t        |         S rB  )r   r   r   r  r8   s     rx   _get_default_ytcfgz+YoutubeBaseInfoExtractor._get_default_ytcfg  s    }}.v677rz   c                     t         |   d   S )NrD   r   rL  s     rx   _get_innertube_hostz,YoutubeBaseInfoExtractor._get_innertube_host  s     ()9::rz   Nc                 T    fd} ||      xs  || j                  |            S )Nc                     t        |       S rB  )r-   )yexpected_typegetters    rx   <lambda>z:YoutubeBaseInfoExtractor._ytcfg_get_safe.<locals>.<lambda>  s    '!V]; rz   )rM  )r  r   rU  rT  default_client_funcs     ``  rx   _ytcfg_get_safez(YoutubeBaseInfoExtractor._ytcfg_get_safe  s'    ;U|MuT%<%<^%LMMrz   c                 :    | j                  |d d ft        |      S )Nc                     | d   S )NINNERTUBE_CLIENT_NAMEr   r   s    rx   rV  z?YoutubeBaseInfoExtractor._extract_client_name.<locals>.<lambda>   s    a 78 rz   c                     | d   d   d   S )Nr=   r8   r:   r   r]  s    rx   rV  z?YoutubeBaseInfoExtractor._extract_client_name.<locals>.<lambda>!  s    a 34X>|L rz   rY  strr  r   rW  s      rx   _extract_client_namez-YoutubeBaseInfoExtractor._extract_client_name  s,    ##8LNORTbd 	drz   c                 :    | j                  |d d ft        |      S )Nc                     | d   S )NINNERTUBE_CLIENT_VERSIONr   r]  s    rx   rV  zBYoutubeBaseInfoExtractor._extract_client_version.<locals>.<lambda>%  s    a :; rz   c                     | d   d   d   S )Nr=   r8   r;   r   r]  s    rx   rV  zBYoutubeBaseInfoExtractor._extract_client_version.<locals>.<lambda>&  s    a 34X>O rz   r_  ra  s      rx   _extract_client_versionz0YoutubeBaseInfoExtractor._extract_client_version#  s,    ##;OQRUWeg 	grz   c                     | j                  ddgt        j                               d   xs |xs | j                  |xs d      S )Ninnertube_hostr   r  r   rb   )r  	YoutubeIEr  rP  )r  req_api_hostnamerW  s      rx   _select_api_hostnamez-YoutubeBaseInfoExtractor._select_api_hostname(  sR    ''(82$yGWGWGY'Z[\] Y#Y'+'?'?@WRW'X	Zrz   c                 4    | j                  |d t        |      S )Nc                     | d   S )Nr<   r   r]  s    rx   rV  z;YoutubeBaseInfoExtractor._extract_api_key.<locals>.<lambda>-  s    Q7J5K rz   r_  ra  s      rx   _extract_api_keyz)YoutubeBaseInfoExtractor._extract_api_key,  s    ##E+KSR`aarz   c                     t        || j                  |      fdt              }t        |dt        i       }|j	                  | j
                  xs dddd       |S )	Nr=   rT  r8   rT  r  r   r4  r   )r   timeZoneutcOffsetMinutes)r   rM  r7  r+   r<  r#  )r  r   rW  contextclient_contexts        rx   _extract_contextz)YoutubeBaseInfoExtractor._extract_context/  s_    D++N;<>Qaeg &gxtUWXT%9%9%ATujklmrz   c                 8   t        t        j                               }| j                  | j                  d      }t	        |d      }|rt|j
                  rh|j
                  | _        | j                  d       |j                  d      s<| j                  d       | j                  dd| j                  d|dz   	       nd
| _        | j                  sy t        j                  | d| j                   d| j                               j                         }d| d| S )Nhttps://www.youtube.com)z__Secure-3PAPISIDSAPISIDzExtracted SAPISID cookier{  z2Copying __Secure-3PAPISID cookie to SAPISID cookier'  Ti  )r)  expire_timeF zSAPISIDHASH rr   )roundtime_SAPISIDr*  r   r,  write_debugr+  r.  hashlibsha1encode	hexdigest)r  origintime_now
yt_cookiessapisid_cookiesapisidhashs         rx   _generate_sapisidhash_headerz5YoutubeBaseInfoExtractor._generate_sapisidhash_header9  s
   %== **+DEJ &<>N."6"6 . 4 4  !;<!~~i0$$%YZ$$&	4==[cfj[j % l !&}}llj$--&299;==FY[ 	hZq66rz   c                    |rd|ind| j                  |      i}|j                  |       | j                  |      }|j                  ddi       |r|j                  |       | j                  ddgt        j                         d      d	   xs |	xs | j                  |      }	| j                  d
| j                  |
|       d| ||||t        j                  |      j                  d      ||	dd      S )Nrv  rW  zcontent-typezapplication/jsoninnertube_keyr   T)r  r  r   https://z/youtubei/v1/utf8false)keyprettyPrint)video_idfatalnoteerrnotedataheadersquery)rx  r<  generate_api_headersr  rk  r  rp  _download_jsonrm  jsondumpsr  )r  epr  r  r  r  r  r  rv  api_keyapi_hostnamerW  r  real_headerss                 rx   	_call_apiz"YoutubeBaseInfoExtractor._call_apiR  s    (/	7#Y@U@Ues@U@t4uE000O^-?@A(**?RDIYIYI[gk*lmno VV!%!6!6n!6!U 	""t00~NO}]_\`aUwD!((0,!':	 # < 	<rz   c                 B    | j                  | j                  |d||      S )Nzyt initial datar  )_search_json_YT_INITIAL_DATA_RE)r  item_idwebpager  s       rx   extract_yt_initial_dataz0YoutubeBaseInfoExtractor.extract_yt_initial_datad  s'      !9!97DUW^fk llrz   c                  J    | D ]  }t        t        |d             }||c S  y)zr
        Index of current account in account list.
        See: https://github.com/yt-dlp/yt-dlp/pull/519
        c                     | d   S )NSESSION_INDEXr   r]  s    rx   rV  zAYoutubeBaseInfoExtractor._extract_session_index.<locals>.<lambda>n  s    ?AS rz   N)r   r-   )r  r   session_indexs      rx   _extract_session_indexz/YoutubeBaseInfoExtractor._extract_session_indexg  s1      	%E'7S(TUM($$	%rz   c                 d    |rt        |d t              }|r|S |r| j                  d|dd d      S y )Nc                     | d   S )NID_TOKENr   r]  s    rx   rV  zBYoutubeBaseInfoExtractor._extract_identity_token.<locals>.<lambda>u  s
    Qz] rz   z%\bID_TOKEN["\']\s*:\s*["\'](.+?)["\']zidentity tokenF)r  r  )r-   r`  r  )r  r   r  tokens       rx   _extract_identity_tokenz0YoutubeBaseInfoExtractor._extract_identity_tokens  sH    E#:C@E%%8' $e & = = rz   c                      | D ]]  }t        |d t              }|r|c S t        |d d ft              xs dj                  d      }t        |      dk\  sR|d   sX|d   c S  y	)
z
        Extract syncId required to download private playlists of secondary channels
        @params response and/or ytcfg
        c                     | d   S )NDELEGATED_SESSION_IDr   r]  s    rx   rV  zBYoutubeBaseInfoExtractor._extract_account_syncid.<locals>.<lambda>  s    A6L4M rz   c                     | d   d   d   S )NresponseContextmainAppWebResponseContext
datasyncIdr   r]  s    rx   rV  zBYoutubeBaseInfoExtractor._extract_account_syncid.<locals>.<lambda>  s    #4!56Q!RS_!` rz   c                     | d   S )NDATASYNC_IDr   r]  s    rx   rV  zBYoutubeBaseInfoExtractor._extract_account_syncid.<locals>.<lambda>  s    =!1 rz   r   z||r   r   r   N)r-   r`  rt   len)argsr  delegated_sidsync_idss       rx   _extract_account_syncidz0YoutubeBaseInfoExtractor._extract_account_syncid}  sy      	#D#D*MsSM$$`13479 ?<>d  8}!hqk  {"	#rz   c                  (    t        | dgt              S )zv
        Extracts visitorData from an API response or ytcfg
        Appears to be used to track session state
        )VISITOR_DATA)r=   r8   visitorData)r  r  rr  )r   r`  )r  s    rx   _extract_visitor_dataz.YoutubeBaseInfoExtractor._extract_visitor_data  s     wx 	rz   c                 4    t        | j                               S rB  )boolr  rD  s    rx   is_authenticatedz)YoutubeBaseInfoExtractor.is_authenticated  s    D55788rz   c                 `    |si S | j                  | j                  d|dd      |d      xs i S )Nz"ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;r   {}r  Fr  )_parse_jsonr  )r  r  r  s      rx   extract_ytcfgz&YoutubeBaseInfoExtractor.extract_ytcfg  sN    I5w  'u   6 < :<	<rz   )r   account_syncidr  visitor_dataidentity_tokenr  rW  c                   d| j                  ||      z   }t        | j                  |d |            | j                  ||      ||xs | j	                  |      |xs | j                  |      |xs | j                  |      | j                  |d |      d}	|| j                  |      }|s|	||nd|	d<   | j                  |      }
|

|
|	d<   ||	d	<   t        |	      S )
Nr  c                     | d   S )Nr>   r   r]  s    rx   rV  z?YoutubeBaseInfoExtractor.generate_api_headers.<locals>.<lambda>  s    a8W6X rz   r  c                     | d   d   d   S )Nr=   r8   rJ   r   r]  s    rx   rV  z?YoutubeBaseInfoExtractor.generate_api_headers.<locals>.<lambda>  s    BU@VW_@`al@m rz   )zX-YouTube-Client-NamezX-YouTube-Client-VersionOriginzX-Youtube-Identity-TokenzX-Goog-PageIdzX-Goog-Visitor-Idz
User-Agentr   zX-Goog-AuthUserAuthorizationzX-Origin)
rm  r`  rY  rg  r  r  r  r  r  r   )r  r   r  r  r  r  r  rW  r  r  auths              rx   r  z-YoutubeBaseInfoExtractor.generate_api_headers  s    t88~VW%($$U,Xiw$x&z(,(D(DUN([(6(]$:V:VW\:]+Rt/K/KE/R!-!R1K1KE1R..u6m  M.  N	
   77>M]6:G:SYZG%&008'+GO$"(GJ7##rz   c           
          ddd| ddj                  |      }|si S | j                  ||dd|j                  dd	      j                          d
      }| j	                  ||      xs i S )Nrz  zhttps://music.youtube.comzhttps://www.youtube.com/embed/z?html5=1)rb   rd   rc   FzDownloading rr   r}  z client config)r  r  )r+  _download_webpager   stripr  )r  r8   r  r  r  s        rx   _download_ytcfgz(YoutubeBaseInfoExtractor._download_ytcfg  s    ,4<XJhO
 #f+	 	
 I((|FNN3PS<T<Z<Z<\;]]k-l ) n!!(G4::rz   c                      d| i}|rd|i|d<   |S )NcontinuationclickTrackingParamsclickTrackingr   )r  ctpr  s      rx   _build_api_continuation_queryz6YoutubeBaseInfoExtractor._build_api_continuation_query  s)     L
 &;S%AE/"rz   c                     t        |d d ft              }|sy |j                  d      }|sy |j                  d      }| j                  ||      S )Nc                     | d   d   d   S )Ncontinuationsr   nextContinuationDatar   r]  s    rx   rV  zJYoutubeBaseInfoExtractor._extract_next_continuation_data.<locals>.<lambda>  s    ?!3A!67M!N rz   c                     | d   d   S )Nr  reloadContinuationDatar   r]  s    rx   rV  zJYoutubeBaseInfoExtractor._extract_next_continuation_data.<locals>.<lambda>  s    >!23K!L rz   r  r  )r-   r7  r+  r  )clsrenderernext_continuationr  r  s        rx   _extract_next_continuation_dataz8YoutubeBaseInfoExtractor._extract_next_continuation_data  sb    #NLNOSU !(,,^<##$9:00sCCrz   continuation_epc                     t        |t              r8t        |d t              }|sy |j	                  d      }| j                  ||      S y )Nc                     | d   d   S )NcontinuationCommandr  r   r]  s    rx   rV  zHYoutubeBaseInfoExtractor._extract_continuation_ep_data.<locals>.<lambda>  s    1-B+CG+L rz   r  )
isinstancer7  r-   r`  r+  r  )r  r  r  r  s       rx   _extract_continuation_ep_dataz6YoutubeBaseInfoExtractor._extract_continuation_ep_data  sN    ot,"!LcSL!%%&;<C44\3GG -rz   c                 ^    | j                  |      }|r|S t        |dd| j                        S )N))contentsr   rows.continuationItemRenderer)continuationEndpoint)buttonbuttonRenderercommandFget_allrT  )r  r+   r  )r  r  r  s      rx   _extract_continuationz.YoutubeBaseInfoExtractor._extract_continuation  s?    ??I$$H '
 (I(IK 	Krz   c              #      K   t        |d t              xs g D ]W  }t        |t              s|j	                         D ]1  }|j                  d      }|s| j                  |d      }|s,||f 3 Y y w)Nc                     | d   S )Nalertsr   r]  s    rx   rV  z:YoutubeBaseInfoExtractor._extract_alerts.<locals>.<lambda>  s
    !H+ rz   typetext)r-   listr  r7  valuesr+  	_get_text)r  r  
alert_dictalert
alert_typemessages         rx   _extract_alertsz(YoutubeBaseInfoExtractor._extract_alerts  s{     !$(=tDJ 		.Jj$/#**, ."YYv.
!--v6$g--.		.s   A&A4)A4c                 8   g g }}|D ]P  \  }}|j                         dk(  r|r|j                  ||g       /|| j                  vs>|j                  ||g       R ||d d z   D ]  \  }}| j                  d| d| |         |rt	        d|d   d   z  |      y )	Nerrorr   zYouTube said:  - 	only_oncezYouTube said: %sr   r  )lowerappend_IGNORED_WARNINGSr!  r   )	r  r  r  r  r  errorswarningsr  alert_messages	            rx   _report_alertsz'YoutubeBaseInfoExtractor._report_alerts  s    r)/ 	=%J!W,z=9:d&<&<<] ;<		= +3VCR[*@ 	f%J.C O[de	f !3fRjm!ChWW rz   c                 L     | j                   | j                  |      g|i |S rB  )r  r  )r  r  r  kwargss       rx   _extract_and_report_alertsz3YoutubeBaseInfoExtractor._extract_and_report_alerts  s*    "t""4#7#7#=OOOOrz   
badge_listc                    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 f      D ]  }|j                  t        |dt                    xs |j                  t        |d            }|r|j                  d	|i       Wt        |d
ddddt        d      }|j                         D ],  \  }	}
|	|j                         v s|j                  d	|
i          |S )zr
        Extract known BadgeType's from a list of badge renderers.
        @returns [{'type': BadgeType}]
        )PRIVACY_UNLISTEDPRIVACY_PRIVATEPRIVACY_PUBLICCHECK_CIRCLE_THICKOFFICIAL_ARTIST_BADGECHECK)BADGE_STYLE_TYPE_MEMBERS_ONLYBADGE_STYLE_TYPE_PREMIUMBADGE_STYLE_TYPE_LIVE_NOWBADGE_STYLE_TYPE_VERIFIED BADGE_STYLE_TYPE_VERIFIED_ARTIST)unlistedprivatezmembers onlylivepremiumverifiedzofficial artist channel.c                 .    t        j                  d|       S )Nz[bB]adgeRenderer$)research)r  rr   s     rx   rV  z:YoutubeBaseInfoExtractor._extract_badges.<locals>.<lambda>8  s    299MacfCg rz   )iconiconTyperr  styler  label)accessibilityDatar0  tooltipiconTooltipFr   )r  rT  r  )r   r   r   r   r   r   r   r   r+   r+  r`  r  r   r  )r  r  icon_type_mapbadge_style_map	label_mapbadgesbadge
badge_typer0  matchlabel_badge_types              rx   _extract_badgesz(YoutubeBaseInfoExtractor._extract_badges  s    !* ? ?(==';;"+"4"4%.%7%7''
 .7-P-P(1(F(F)2););)2););090B0B
 "77 55%??&& 55!**'0'9'9
	 !*s4g.hi 	E!!,u6JZ]"^_ E"&&|E7'CD  vz23 !w >	=bgwz  EGHE+4??+< ''EKKM)MM6+;"<=	" rz   c                 4    t        t        | fd            S )Nc                     |d   k(  S )Nr  r   )rr   vr9  s     rx   rV  z5YoutubeBaseInfoExtractor._has_badge.<locals>.<lambda>M  s    ai:6M rz   )r  r+   )r7  r9  s    `rx   
_has_badgez#YoutubeBaseInfoExtractor._has_badgeK  s    L)MNOOrz   max_runsc          
         |xs d gD ]  }|| g}n,t        | |g       }t        d t        |      D              s|g}|D ]  }t        |d t              }|r|c c S t        |d t
              xs g }|st        |t
              r|}|d t        t        |      |xs t        |             }dj                  t        |dt                    }|s|c c S   y )Nr  c              3   T   K   | ]   }|d u xs t        |t        t        f       " yw).N)r  r  r   )r   r  s     rx   r   z5YoutubeBaseInfoExtractor._get_text.<locals>.<genexpr>V  s'     bC3#:GC$)GGbs   &(c                     | d   S )N
simpleTextr   r]  s    rx   rV  z4YoutubeBaseInfoExtractor._get_text.<locals>.<lambda>Y  s
    q rz   c                     | d   S )Nrunsr   r]  s    rx   rV  z4YoutubeBaseInfoExtractor._get_text.<locals>.<lambda>\  s
    qy rz   r   ).r   rr  )
r+   anyr5   r-   r`  r  r  minr  r   )r  rB  	path_listpathobjitemr   rH  s           rx   r  z"YoutubeBaseInfoExtractor._get_textO  s    '$ 	 D|f"4r:bS[\`Sabb%C  t%>DKt%8$?E2
4 6DBSTH,AD	BCww|D-sSTK 	 rz   c           
           | j                   |g| xs d}t        |      }|3t        | j                  dt	        j
                  dd|      dd             }|S )Nr   z	^([\d,]+)z\scountr  )r  r!   r)   r  r+  sub)r  r  rK  
count_textrP  s        rx   
_get_countz#YoutubeBaseInfoExtractor._get_counte  sa    #T^^D595;
J'=""<r:1NPWae"fhErz   c                 X   g }|xs dgD ]  }t        | g t        |      dd      D ]|  }t        |j                  d            }|s d|v r|j	                  d      d   }|j                  |t        |j                  d            t        |j                  d	            d
       ~  |S )z
        Extract thumbnails from thumbnails dict
        @param path_list: path list to level that contains 'thumbnails' key
        r   
thumbnails.r  maxresdefault?r   heightwidth)r  rX  rY  )r+   r5   r3   r+  rt   r  r   )r  rK  rU  rL  	thumbnailthumbnail_urls         rx   _extract_thumbnailsz,YoutubeBaseInfoExtractor._extract_thumbnailsm  s     
%" 	D)$0T(4.0T,0TPS0TU 	 +IMM%,@ A$ #m3$1$7$7$<Q$?M!!())--*AB(w)?@# 	 rz   c                     t        j                  d|       }|rM|j                  d      }|rt        |      S 	 t        d|j                  d      |j                  d            S y# t        $ r Y yw xY w)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   r;  )relative_time_textmobjr^  s      rx   extract_relative_timez.YoutubeBaseInfoExtractor.extract_relative_time  s}     yy b  JJw'E(//(tzz&7I4::V\K])^__   s   -A' '	A32A3c                 t   |sy | j                  |      }d }t        |t        j                        r#t	        j
                  |j                               }|9t        |      xs, t        | j                  d|j                         dd             }|r'|%| j                  dv r| j                  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  )Nr   z"Cannot parse localized time text ""Tr  )rc  r  dtdatetimecalendartimegm	timetupler0   r  r  r#  r!  )r  r   dt_	timestamps       rx   _parse_time_textz)YoutubeBaseInfoExtractor._parse_time_text  s    ((.	c2;;' 8I!$' B+<&&|

k4 ' A,B  I%$*>*>,*N4TF!<   Nrz   c                 L   t        | j                  dt                    }t        | j	                  |            }t        |      }t        | j	                               }t        |      }	 	 | j                  |d||||| j                  ||
      | j                  ||
      |	|

      }	 | j3                  |d       t9        |gt;        |       s"t        dd      |_        t        |d       }|sy |S # t        $ rG}t        |j                  t              s| j                  ||      cY d }~S t        |j                  t              s||_        t        |       Y d }~|j                  j                   j#                  d      }t%        |      sgt'        | j)                  | j+                  |j                  j                   d ||      xs d|d	      d
 t,              }|r| j/                  d|fgd	       |j                  j0                  dvr||_        t        |       Y d }~| j                  ||      cY d }~S d }~ww xY w# t        $ rQ}d|j4                  j7                         v r||_        t        |       Y d }~| j                  ||      cY d }~S d }~ww xY w)Nraise_incomplete_datarj  r  T)
r  r  r  r  r  r  rv  r  r  rW  i   )prefixr  Fc                     | d   d   S )Nr
  r  r   r]  s    rx   rV  z<YoutubeBaseInfoExtractor._extract_response.<locals>.<lambda>  s    !G*Y"7 rz   ERROR  i  r  zunknown errorzIncomplete data receivedr  )r  r  rk  iterRetryManagernextr  rx  rp  r   r  causer   _error_or_warningr
   r
  responsereadr   r-   r  _webpage_read_contentr`  r  statusr  msgr  r+   r5   )r  r  r  r  r  r   check_get_keysr  r  r  rW  raise_for_incompleteicd_retriesicd_rmmain_retriesmain_rmrz  efirst_bytesyt_errorshould_retrys                        rx   _extract_responsez*YoutubeBaseInfoExtractor._extract_response  s     $D$;$;<S\e$;$fg4,,3G,HIk"D--/0|$ >>>w$E 11%H 11%H!-n * N@	>//D/I  D8N+CD-.HSWX#K6#O[ " >!!''+=>11!51AA#AGGY7$%GM&gg..33C8{+&(( 66qww7G7Gw_j6ksosu|  EJ ) K7 >H  ++gx-@,A+O
 77>>3$%GM&--au-==1>8 " > #aeekkm3$%GM&--au-==>s[   -;C5 )I	 5
I?,I+I1,I"CI)I;II		J#.JJJ#J#c                 2    t        j                  d|       d uS )Nz (https?://)?music\.youtube\.com/)r+  r:  r  s    rx   is_music_urlz%YoutubeBaseInfoExtractor.is_music_url  s    xx;SAMMrz   c                    |j                  d      }t        |d      }| j                  |dd      xs | j                  |d      }| j                  |d      }t        |j                  d            }|t	        | j                  |dd	            }|0t	        | j                  d
t        |ddt              |d d            }t        |dt        d      }|st        |d      }| j                  |      }t        |ddt              }| j                  t        |d            }	| j                  t        |d            }
t        dt        |dt                    xs d}d| }|dk(  sd|v rd| }| j                  |dd       xs | j                  |d!      xs d}t        t        |d"d#            }|d$n<d%|j                         v rd&n(|d'k(  s | j                  |	t        j                        rd(nd }| j                  |d)d*d       xs d}d+|j                         v rd,n| j                  d-|i      }|d.v rd/nd0}| j                  |d1d2      xs | j                  |d3      }t        |d4| j                   d      }i d5d6d7t"        j%                         d8|d6|d|d9|d|d:|d;|d<|rd=| nd d>|d?|d@t'        |d dAd B      dC| j)                  |dD      dE| j+                  dFt,        G      r| j/                  |      nd dH|dI| j                  |	t        j0                        rdJn| j3                  | j                  |	t        j4                        xs d | j                  |	t        j6                        xs d | j                  |	t        j8                        xs d | j                  |	t        j:                        xs d K      ||dL|dM| j                  |
t        j<                        rdNiS d iS )ONvideoId)navigationEndpointreelWatchEndpointoverlayreelPlayerOverlayRenderer"reelPlayerHeaderSupportedRenderersreelPlayerHeaderRenderertitleheadlinereelTitleTextdescriptionSnippetlengthSeconds
lengthText)thumbnailOverlays."thumbnailOverlayTimeStatusRendererr   z](?i)(ago)(?!.*\1)\s+(?P<duration>[a-z0-9 ,]+?)(?:\s+[\d,]+\s+views)?(?:\s+-\s+play\s+short)?$)r  accessibilityr1  r0  r   )r  rT  duration)r  r`  )shortBylineTextrH  .r  browseEndpointbrowseIdFrT  r  )channelNavigationEndpointr  r  )r  .r  r/  r  r7  ownerBadgesr   )r  commandMetadatawebCommandMetadatar  rr   https://www.youtube.com/watch?v=SHORTSz/shorts/zhttps://www.youtube.com/shorts/publishedTimeText	videoInfotimestampText)upcomingEventData	startTimer  is_upcomingstreamedwas_liveLIVEis_liveviewCountTextshortViewCountTextzno viewsr   rF  r  r  concurrent_view_count
view_count	ownerTextr  channelTitleText)r  rH  .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  rU  rZ  rl  approximate_daterj  release_timestampavailabilitypublic)
is_privateneeds_premiumneeds_subscriptionis_unlistedlive_statuschannel_is_verifiedT)r+  r+   r  r   r"   r  r`  r  r<  r4   r)   r  r@  r   r   rS  r  rk  r  r   r\  r  YoutubeTabIErm  r   _availabilityr   r   r   r   r   )r  r  r  reel_header_rendererr  r  r  r  overlay_styler7  owner_badgesnavigation_urlr  	time_textscheduled_timestampr  view_count_textr  view_count_fieldr  channel_handles                        rx   _extract_videoz'YoutubeBaseInfoExtractor._extract_video  s   <<	*+H 7N  O x*=vPdfuAvnnX/CDx||O<=%dnn,(p'r sH%d&8&8pX'_ik{~$j '9 ': ;H
 "ju.
 %&:<wxJ&&z2
$_. %%l8X&FG++L=,QR !;\\>   &#% 	 1
;H$
n(D3H:>C^^H.A;O T';_MTQS 	(h@blq)rs 1<M)Y__->>+v5QZQcQc9d	 	 ..?DXZefljl%)>)>)@@a??L/+JK 	6AE_6_2eq>>(K9JK Onn%9;MN 	 &h 1h ..?
U
i&&(
 (
 3	

 U
 ;
 
 *
 w
 j=j\J^b
 
 >
 L?[eij
 $228[I
 !445GP\4] //	:##
$  !4%
&  OOFI4Q4QR''#vy7U7UV^Z^"&//&):X:X"Y"a]a'+vy?b?b'c'kgk $	8W8W X `\`	 ( b+
4 j;!4??<I[I[+\49
 	
8 cg9
 	
rz   )rb   )Nrb   rB  rz  )TNDownloading API JSONzUnable to download API pageNNNrb   TNN)TTF)r  NNNbrowseTNrb   )Br   r   r   __doc___RESERVED_NAMES_PLAYLIST_ID_RErH  _INVIDIOUS_SITESr   r  r  r  r  r  r  r  r   cached_propertyr#  r1  r@  rE  rC  r  _YT_INITIAL_PLAYER_RESPONSE_RErM  rP  rY  rb  rg  rm  rp  rx  r  r  r  r  staticmethodr  r  r  r  r  r  r  r  r  classmethodr  r7  r  r  r  r  r  r  r<  r@  r  rS  r\  rc  rm  r  r  r  r   rz   rx   r   r   ,  s   7	L  eO
 OCP MM$M(cbGC  "E
Z%
m ^%C"8;N
d
g
Zb H72 BF7TPU<$m % %= # #$   9 9<  DdV[$4
; 	 	 
D 
D HD H H K K 
. 
.XP2$ 2h P P -1    *  .  ,( VZae).AF N N]
rz   r   c                   X&    e Zd ZdZdddj	                  ej                        iz  ZddgZdZ	dZ
i d	d
dddddddd
ddddddddddddddddddddddd dd!d"dd#dd$d%dd&d"dd'd
dd dd(d"dd)d
d*d+dd(d"dd,dd-ddd.d/dd0d1dd&d"dd2dd3d4dd&d"dd5d6dd d7d(d8dd9d6d*d+d7d(d8dd:d6d$d%d7d&d8dd;d6d0d1d7d&d8dd<dd*d+dd(d"dd=dd*d+dd(d"di d>dd d?dd(d"d@dAdBdd+d?dd(d"d@dAdCdd%d?dd&d"d@dAdDdd1d?dd&d"d@dAdEd6d d?d7d(d8d@dAdFd6d+d?d7d&d8d@dAdGd6d%d?d7d&d8d@dAdHdddIddJd"dKdAdLdddIddJd"dKdAdMdd dIdd(d"dKdAdNdd+dIdd(d"dKdAdOdd%dIddPd"dKdAdQdd1dIddPd"dKdAdRdddIddJd"dKdAdSddTdIddd"dKdAdUdddVd"dWdXdd dVd"dWi dYdd+dVd"dWdZdd%dVd"dWd[dd1dVd"dWd\ddVd"d]d^dddVd"dWd_dd+dVd"dWd`ddadVd"dWdbdd%dVd"dcdddedd1dVd"dcdddfddgdVd"dWdhdidjddJdkdldmdidjdd(dkdldndidjddPdkdldodidjddkdpdqdidjddkdpdrdidjdsdkdpdtdidjdudkdpi dvd6d ddVd6d8dwdxd6d+d*dVd6d8dwdyd6d%d$dVd6d8dwdzd6d1d0dVd6d8dwd{d6d+d*dVd6d8dwd|d6d+d*dVd6d8dwd}d6ddVd6d~ddd6ddVd~dWdd6d dVd~dWdd6d+dVd~dWdd6d+dVd~dWdd6d+dVd~dWdd6d%dVd~dWdd6d1dVd~dWdd6dadVd~dWdd6dgdVd~dWdd6d%dVd~dcddi dd6d1dVd~dcdddd6dadVd~dcdddd6dgdVd~dWdd6dgdVd~dcdddd6d7djd(ddd6d7djdPddd6djddddd6djddddd6djddddddiddddVddWddddVddWddd dVddWddd+dVddWddd%dVddWddd1dVddWdddadVddWdddgdVddWiZdZdZdZg di ddddddddddddddddddgddgdddededdƓddȓddʓdd̓dddeedddddӜ	dԜdddddddddܜddޜddi ddddddddddddddddddgddgdddededdƓddȓddʓdd̓deedddddddidddddiddddddnddddi ddddidddddddddddeddddȓdddedddd̓ddddddddgddedddddȐd ddddi ddddddddddddd	dۓdd
gdɐddŐddddedddd̓ddddddȓeedddeddҐddddi ddddddddddd	dۓdŐddddddddeddgdd̓ddd gdɐd!dedd"dedd#d$edȐd%dd&d'i dd(dd)dddd*dd+d	dۓdedŐddd,dedɐd-dd.dd̓dg d/ddȓddgdd0d1eed.d2d3d4dd5d6i dd7dddd8dd9dd:dd;d	d͓dg d<deddd=d>dɐd?ded@d;ddAddBddCdgdƐdDd̐d>edBdEdFdG	ddHdIdȐdJdKi ddKddddLddMd=dNddOddPd@dQddƓddRddSdedd̓ddNdɐdTdeddQdNdd͐dUdgdQedNdVdWdX
dYgdZd[i dd[dddd\dd]dd^dd_ded`daddȓddbgdcddddedg dfddgdɐdhd	d͓ddƓdiedjededkdldȐdmddniddoi ddpdddqdrddsddtdduddvddȓddwd	d͓ddxddyddzdɐd{dedd|gded̐d}eedwd~dddԜddd6ddddddniddddd6ddddddddddddddddddYdddddddddi dddddddddddeddddƓddȓdddd
gdːdiddd`ddɐdded	d͓eddedddddidi ddddddddƓdddddeddddd	d͓deddddd`ddedddɐdddȐdid
geddddidi dddddddɐddddeddƓddȓdddddedddcddedddddd
gddid͐deddddigddiddddddddddȐdddȐddi ddœddddƓd@dǓddȓddɓddʓd=d˓ddǓd̐d˓d͐dΓdɐdϓddgdedd̓ddѓddғddƐddeded՜ddidddȐddאdddِdڐdېdddidܐdddȐddi ddߓddddddddddddddddded	d͓dg dddddƓdeddgdɐdddeeddddddiddi ddddddddddddddddȓdddeddd	d͓ddƓddgdddɐdded̐deeedddddҐd
ddidddȐdddȐdd dddddddddidddi dd	dddd
ddddddddddΓddΓdɐddddeddƓd	d͓ddddddgdddeddedddedȐdddidgddddd d!d"d#d$ddid%dd&dȐdd'dȐdd(dȐdd)dȐdd*dȐdd+dȐdd,d-dd.d/d0d1d2dddd3ddd4i dd5dddd6dd7dd8d9d:gd;d:gdd6d͐d<dcd=d@d6deddȓdeddgdd>dd:d:dƐd?d@d͐dAdxdedB	ddiddCdȐddDdEddFdGdHdIdJdKdLddidMddNi ddOddddPddddQdedɐdRdeddSdg ddTddƓd	d͓ddUgddVddȓdd̓dWedWdXdYdZddidd[i dd\dddd]dd^dd_dd`deddadd̓ddgddƓdɐdbddddȓd	d͓deddcddeeedddedfddҐdg	ddiddhdȐddidȐddji ddjddddkddlddmd̐dnddkd͐dodedd̓d@dkddpd	d͓deddqd=dnddng drdsdƐdtdgdednedu	ddiddvdȐddwi ddxddddyddzdd{dd|dd}ddgdedd~dg ddɐdd	dۓdŐddddedd̓ded~ddedȐd%dԜdi ddddddddddddddgdddedddg ddɐdd	d͓ddƓdddd̓ddȓeddddddidddȐdddȐdddȐddi ddddddddddddddddddgdedddg ddɐdd	d͓ddƓdedd̓deedddeddҐd	ddddgiiddd4dȐddddgiiidddȐdddi dddddddddddddedddddedɐdddȓddddƓdddd̓dddgdeedddeddҐd
ddȐdddi ddddddddddddÓddēded	d͓dd
gddœddȓdd̓ddƓdeddƓddǓdeedǐdɐddҐd˜dԜdi ddddddddddddÓddēded	d͓dd
gddœddȓdd̓dd̓deddƓddǓdeedǐdɐddҐd˜d͐dgiddi ddГddddѓddғddӓddԓddՓded	d͓ddgdd֓ddȓdd̓d`dדdcdƓddƓdedƐdؐdedؐdڐdeddҐdܜ
dԜdi ddޓddߓddddddƓd	d͓d`ddddddːddɐddddedcddddd|gdeedȐdeddddddiddi dddddddddedŐd}dddɐdd	d͓ddgdedddddddd̓ddȓdedg dddddԜdi dddddddddddg dedddeddȓdŐd}dɐdd	d͓dddd̓dddd|gd ddddddiddi dddddddg dddd̓dd dddedd|gdɐdddddƓd	d͓ddddȓdddddd	ddd
dgiiddgddddȐdJddi ddddddgdddd̓dddedɐdddddddȓdeddddd	d͓ddƓddeg dddeddҐddddgiidd dd!d"i dd(dd6dd)dd1dd,dedd+dd*dg d/ddȓdeddgdɐd#d	dۓdd.dedŐded̐d0d.d3d2d$ddd%giid&d dd'i dd(ddd	d͓ded)dӓdd*dɐd+dd,dedcd*dg d-dd.deddȓdd/ddƓded0dgdid1d2d3d2d4d5ddҐd6dԜd7i dd8ddded)d9dd:ded	d͓dedd̓dd;dd<dd=d>d?dd@dAd:dBdCddDdEdFdGdeddҐdHdddgdIgdJiidZdKdLi ddMddddNddOddPd	d͓dg dQddRddȓdɐdSdededdTdd̓ddUddƓddVedgedTdWdXdҐdYddidZgZe fd[       Z fd\Zd] Zd^ Zd_d`daZddbZdc Zedd        ZddeZdf Zdg Zdh Zdi Z dj Z!dk Z"dl Z#dm Z$dn Z%ddoZ&dp Z'e fdq       Z(edr        Z)ds Z*dt Z+du Z,ddvZ-ddwZ.e/dx        Z0dy Z1e/dz        Z2edd{       Z3e/d|        Z4e/d}        Z5d~ Z6d Z7d Z8d Z9d Z:d Z;d Z<d Z=ddZ>d Z? xZ@S (  rk  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)s|
                            youtube\.googleapis\.com)/                        # the various hostnames, with wildcard subdomains
                         (?:.*?\#/)?                                          # handle anchor (#/) redirect urls
                         (?:                                                  # the various things that can precede the ID:
                             (?:(?:v|embed|e|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)s
                         )/
                         |(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=
                         )
                     )?                                                       # all until now is optional -> you can pass the naked ID
                     (?P<id>[0-9A-Za-z_-]{11})                                # here is it! the YouTube video ID
                     (?(1).+)?                                                # if we found the ID, everything can follow
                     (?:\#|$)	invidious|a  (?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$5flvi     mp3@   h263)extrY  rX  acodecabrvcodec6i  i  133gpaacmp4v)r  r  r  17         18mp4i  ih  `   h26422i   i     34   35iV  i  36i@  )r  rY  r  r  37i  i8  38i   i   43webmvorbisvp84445465978823Di)r  rX  format_noter  r  r  
preference83848510010110291HLS0   92939495   96132151H   133z
DASH video)r  rX  r  r  134135136137138)r  r  r  160212264i  298<   )r  rX  r  r  fps299266ip  139m4az
DASH audiom4a_dash)r  r  r  r  	container140141256)r  r  r  rA  258325dtse328zec-3167)r  rX  rY  r  rA  r  168169170218219278vp9)r  rX  r  rA  r  242243244245246247248271272302303308313315171)r  r  r  r  172249opus2   )r  r  r  r  250F   251   _rtmpprotocolrtmp394zav01.0.00M.08395396zav01.0.01M.08397zav01.0.04M.08398zav01.0.05M.08399zav01.0.08M.08400zav01.0.12M.08401)json3srv1srv2srv3ttmlvttFyoutubez6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9r   BaW_jenozKcr  r  #   youtube-dl test video "'/\ä↭𝕐r  Philipp Hagemeisterr  UCLqxVugv74EIW3VWh2NOa3Qr  zCre:https?://(?:www\.)?youtube\.com/channel/UCLqxVugv74EIW3VWh2NOa3Qupload_date20121002r  z$md5:8fb536f4877b8a7455c2ec23794dbc22
categorieszScience & Technologytagsz
youtube-dlr  r   r  
like_countr  r  playable_in_embedTrZ  z4https://i.ytimg.com/vi/BaW_jenozKc/maxresdefault.jpgr  not_liver   r   	   +https://www.youtube.com/@PhilippHagemeister@PhilippHagemeister	count:100)		age_limit
start_timeend_timecomment_countchannel_follower_countr  r  r  heatmapr  	info_dictz%//www.YouTube.com/watch?v=yZIXLfi8CZQzEmbed-only video (#1746)yZIXLfi8CZQ20120608zCPrincipal Sexually Assaults A Teacher - Episode 117 - 8th June 2012z$md5:09b78bd971f1e3e289601dfba15ca4f7   )r   r  r~  r  r  r  zPrivate video)r  r  r  skipz9https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQz!Use the first video ID in the URL)r  r  r  r  r  r  r  skip_download)r  r  r  paramsz+https://www.youtube.com/watch?v=a9LDPn-MO4Iz.256k DASH audio (format 141) via DASH manifestza9LDPn-MO4Ir   zUHDTV TEST 8K VIDEO.mp4)r   r  r~  r  r  )youtube_include_dash_manifestformatzformat 141 not served anymore)r  r  r  r  r  z+https://www.youtube.com/watch?v=IB3lcPjvWLAIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree Wilsonz$md5:8f5e2b82460520b619ccac1f509d43bf   20131011r  gp=
/`@UChuZAo1RKL85gev3Eal9_zgz8https://www.youtube.com/channel/UChuZAo1RKL85gev3Eal9_zgtrackz	The Sparkz:https://i.ytimg.com/vi_webp/IB3lcPjvWLA/maxresdefault.webpAfrojackzcount:19Musicz!https://www.youtube.com/@Afrojackz	@Afrojack)r  r  r  	alt_titler  r  r  r  z141/bestaudio[ext=m4a]r  r  r  zEmbed allowed age-gate videoz'https://youtube.com/watch?v=HtVdAasjOgUHtVdAasjOgUz7The Witcher 3: Wild Hunt - The Sword Of Destiny Trailerz@re:(?s).{100,}About the Game\n.*?The Witcher 3: Wild Hunt.{100,}   20140605r  Gamingz:https://i.ytimg.com/vi_webp/HtVdAasjOgU/maxresdefault.webp
needs_authz8https://www.youtube.com/channel/UCzybXLxv08IApdjdN0mJhEgzThe Witchercount:17UCzybXLxv08IApdjdN0mJhEgz#https://www.youtube.com/@thewitcherz@thewitcher)r  r  r  r  r  r  r  r  )r  r  r  z0Age-gate video with embed allowed in public sitez'https://youtube.com/watch?v=HsUATh_Nc2UHsUATh_Nc2UzGodzilla 2 (Official Video)z$md5:bf77e03fcae5529475e500129b05668a20200408UCYQT13AtrJC0gsM1far_zJgFlyingKittyz8https://www.youtube.com/channel/UCYQT13AtrJC0gsM1far_zJgEntertainmentFlyingkittyz
godzilla 2z4https://i.ytimg.com/vi/HsUATh_Nc2U/maxresdefault.jpg   z'https://www.youtube.com/@FlyingKitty900z@FlyingKitty900)r  r  r  r  r  r  r  z5Age-gate video embedable only with clientScreen=EMBEDz'https://youtube.com/watch?v=Tq92D6wQ1mgTq92D6wQ1mgz#[MMD] Adios - EVERGLOW [+Motion DL]20191228z$md5:17eccca93a786d51bc67646756894066zUC1yoRdFoFJaCY-AGfD9W0wQz6https://i.ytimg.com/vi_webp/Tq92D6wQ1mg/sddefault.webpzProjekt Melody)mmddancemikumikudancekpopvtuberj   z8https://www.youtube.com/channel/UC1yoRdFoFJaCY-AGfD9W0wQz&https://www.youtube.com/@ProjektMelodyz@ProjektMelody)r  r  r  r  r  r  z!Non-Agegated non-embeddable videoz'https://youtube.com/watch?v=MeJVWBSsPAYMeJVWBSsPAYz%OOMPH! - Such Mich Find Mich (Lyrics)z$Fan Video. Music & Lyrics by OOMPH!.20130730zSuch mich find mich)oomphzsuch mich find michlyricszgerman industrialzmusica industrialcreatorzOOMPH!z0https://i.ytimg.com/vi/MeJVWBSsPAY/sddefault.jpgr     z
Herr LurikzUCdR3RSDPqub28LjZx0v9-aAz8https://www.youtube.com/channel/UCdR3RSDPqub28LjZx0v9-aAz"https://www.youtube.com/@HerrLurikz
@HerrLurik)	r  r  r  r  artistr  r  r  r  zNon-bypassable age-gated videoz'https://youtube.com/watch?v=Cr381pDsSsAr  r  only_matching__2ABJjxzNoi
  20100430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  r  r  albumr  r  r  r  zDASH manifest missing)r  r  expected_warningslqQg6PlCWgIi  20150827z$md5:04bbbf3ccceb6795947572ca36f45904z5Hockey - Women -  GER-AUS - London 2012 Olympic Gamesr  iDPSportsrelease_date20120731Olympics)
Hockeyz
2012-07-31z31 July 2012zRiverbank ArenaSessionr  zOlympic GameszLondon 2012z2012 Summer OlympicszSummer GamesUCTl3QQTvqHFjurroKxexy2Qz4https://i.ytimg.com/vi/lqQg6PlCWgI/maxresdefault.jpgr  z8https://www.youtube.com/channel/UCTl3QQTvqHFjurroKxexy2Qz!https://www.youtube.com/@Olympicsz	@Olympics)r  r  r  r  r  r  r  r  zrequires avconvz+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0stretched_ratiogqq?ra   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
@AllenMeow)r  r  r  r  r  r  r  qEJwOuvDf7Iu   Обсуждение судебной практики по выборам 14 сентября 2014 года в Санкт-Петербурге20150404)r   r  r  r  r~  zThis live event has ended.)r  r  r  r  z+https://www.youtube.com/watch?v=FIl7x6_3R5YFIl7x6_3R5Yz$md5:7b81415841e02ecd4313668cde88737az$md5:116377fd2963b81ec4ce64b542173306   20150625zmincount:31)r   r  r  r  r  r~  formatsznot actual anymore)r  r  r  z)https://www.youtube.com/embed/CsmdDsKjzN8 8ce563a1d667b599d21064e982ab9e31CsmdDsKjzN820150501uA   Retransmisión en directo de la XVIII media maratón de Zaragoza.u1   Retransmisión XVIII Media maratón Zaragoza 2015)r  md5r  r  r  z+https://www.youtube.com/watch?v=zaPI8MvL8pgzaPI8MvL8pgz/Terraria 1.2 Live Stream | Let's Play - Part 04z$md5:563ccbc698b39298481ca3c571169519)r   r  r  r  j5yGuxZ8lLUz7Terraria 1.2 Live Stream | Let's Play - Part 04 (Chris)i'  r  z8https://www.youtube.com/channel/UCN2XePorRokPB9TEgRZpddg20131105zcount:24iyRz4https://i.ytimg.com/vi/j5yGuxZ8lLU/maxresdefault.jpgr  UCN2XePorRokPB9TEgRZpddgWiiLikeToPlay20131106z@WLTPzhttps://www.youtube.com/@WLTP)r  r  r  r  r  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  r  r  R7r3vfO7Haoz9Terraria 1.2 Live Stream | Let's Play - Part 04 (Spencer)z4https://i.ytimg.com/vi/R7r3vfO7Hao/maxresdefault.jpgiyRi'  )r  r  r  r  r  r  r  r  r  r  playlistr  z+https://www.youtube.com/watch?v=gVfLd0zydlogVfLd0zydloz/DevConf.cz 2016 Day 2 Workshops 1 14:00 - 15:30r   r  r   zNot multifeed anymorer  r  playlist_countr  zhttps://vid.plus/FlRa-iH7PGwr  r  z_https://zwearz.com/watch/9lWxNJF-ufM/electra-woman-dyna-girl-official-trailer-grace-helbig.htmlz+https://www.youtube.com/watch?v=lsguqyKfVQglsguqyKfVQgz4{dark walk}; Loki/AC/Dishonored; collab w/Elflover21z	Dark Walkz$md5:8085699c11dc3f597ce0410b0dcbb34a   20151119z0Todd Haberman;
Daniel Law Heath and Aaron Kaplanr  r  z6Position Music - Production Music Vol. 143 - Dark Walkz:https://i.ytimg.com/vi_webp/lsguqyKfVQg/maxresdefault.webpzFilm & Animationz8https://www.youtube.com/channel/UCTSRgz5jylBvFt_S7wnsqLQUCTSRgz5jylBvFt_S7wnsqLQcount:13IronSoulElf)r  r  r  r  r  r  r  z+https://www.youtube.com/watch?v=Ms7iBXnlUO8z+https://www.youtube.com/watch?v=Q39EVAstoRMQ39EVAstoRMz+Clash Of Clans#14 Dicas De Ataque Para CV 4z$md5:ee18a25c350637c8faff806845bddee920151107zThis video does not exist.z+https://www.youtube.com/watch?v=FRhJzUSJbGIz+https://www.youtube.com/watch?v=M4gD1WSo5mAM4gD1WSo5mAz$md5:e41008789470fc2533a3252216f1c1d1z$md5:a677553cf0840649b731a3024aeff4cci  20150128licensez4Creative Commons Attribution license (reuse allowed)UCuLGmD72gJDBwmLw06X58SAz8https://www.youtube.com/channel/UCuLGmD72gJDBwmLw06X58SA)zCopyright (Legal Subject)zLaw (Industry)zWilliam W. Fisher (Author)z/The Berkman Klein Center for Internet & Society	Educationz:https://i.ytimg.com/vi_webp/M4gD1WSo5mA/maxresdefault.webpz@BKCHarvardz#https://www.youtube.com/@BKCHarvard)r  r  r  chaptersr  r  r  z+https://www.youtube.com/watch?v=eQcmzGIKrzgeQcmzGIKrzgz8Democratic Socialism and Foreign Policy | Bernie Sandersz$md5:13a2503d7b5904ef4b223aa101628f39i  20151120count:12UCH1dpzjCEiGAt8CXkryhkZgNews & PoliticszBernie Sandersz:https://i.ytimg.com/vi_webp/eQcmzGIKrzg/maxresdefault.webpz8https://www.youtube.com/channel/UCH1dpzjCEiGAt8CXkryhkZgz&https://www.youtube.com/@BernieSandersz@BernieSanders)
r  r  r  r  r  r  r  r  r  r  zKhttps://www.youtube.com/watch?feature=player_embedded&amp;amp;v=V36LpHqtcDYz+https://www.youtube.com/watch?v=i1Ko8UG-Tdoz+https://www.youtube.com/watch?v=yYr8q0y5JfguGpuVWrhIzEzPiku - Trailerz$md5:c36bd60c3fd6f1954086c083c72092eb20150811Standard YouTube License)r   r  r  r  r~  r  This video is not available.z+https://www.youtube.com/watch?v=iqKdEhx-dD4ziqKdEhx-dD4zIsolation - Mind Field (Ep 1)z$md5:f540112edec5d09fc8cc752d3d4ba3cdi%  20170118seriesz
Mind Fieldseason_numberepisode_numberz:https://i.ytimg.com/vi_webp/iqKdEhx-dD4/maxresdefault.webpVsauceepisodez	Episode 1zSeason 1zUC6nSFpj9HTCZ5t-N3Rm3-HAz8https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HAzhttps://www.youtube.com/@Vsaucez@Vsauce)seasonr  r  r  r  r  r  r  r  r  r  r  zSkipping DASH manifestr  r  r  r  z+https://www.youtube.com/watch?v=6SJNVb0GnPI6SJNVb0GnPIz Race Differences in Intelligencez$md5:5d161533167390427a1f8ee89a1fc6f1i  20140124)r   r  r  r  r  r~  zJThis video has been removed for violating YouTube's policy on hate speech.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=Z4Vy8R84T1UZ4Vy8R84T1UzCsaman SMAN 53 Jakarta(Sancety) opening COFFEE4th at SMAN 53 Jakartaz$md5:d41d8cd98f00b204e9800998ecf8427ei  20130923zmaxcount:10)r  r  z-https://music.youtube.com/watch?v=MgNrAu2pzNsMgNrAu2pzNszVoyeur Girlz$md5:7ae382a65843d6df2685993e90a8628f20190312artistsStephencreatorsz"it's too much love to know my dear20190313z8https://www.youtube.com/channel/UC-pWHpBjdGG69N9mM2auIAA   z:https://i.ytimg.com/vi_webp/MgNrAu2pzNs/maxresdefault.webpzUC-pWHpBjdGG69N9mM2auIAA)	r  r  r  rZ  r  r  r  r  r  z/https://www.youtubekids.com/watch?v=3b8nCWDgZ6QDJztXj2GPflDJztXj2GPfkz9Panjabi MC - Mundian To Bach Ke (The Dictator Soundtrack)z$md5:bf577a41da97918e94fa9798d9228825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  r~  r  r  r  zVideo unavailablez+https://www.youtube.com/watch?v=x41yOUIvK2kx41yOUIvK2kzIMG 345620170613z:https://i.ytimg.com/vi_webp/x41yOUIvK2k/maxresdefault.webpUCo03ZQPBW5U4UC3regpt1nwz8https://www.youtube.com/channel/UCo03ZQPBW5U4UC3regpt1nwzPets & Animals   zl'Or Vert asblz&https://www.youtube.com/@ElevageOrVertz@ElevageOrVert)r  r  r  r  r  z+https://www.youtube.com/watch?v=CHqg6qOn4noCHqg6qOn4noz+Part 77   Sort a list of simple types in c#z$md5:b8746fa52e10cdbf47997903f13b20dc20130831UCCTVrRB5KpIiK6V2GGVsR1Qz8https://www.youtube.com/channel/UCCTVrRB5KpIiK6V2GGVsR1Qz0https://i.ytimg.com/vi/CHqg6qOn4no/sddefault.jpgi
  	kudvenkatz7https://www.youtube.com/@Csharp-video-tutorialsBlogspotz@Csharp-video-tutorialsBlogspot)	r  r  r  r  r  r  r  r  r  z+https://www.youtube.com/watch?v=gVfgbahppCYz1https://www.youtube.com/watch_popup?v=63RmMXCd_bQOtqTfy26tG0Burn Outz$md5:8d07b84dcbcbfb34bc12a56d968b613120141120The Cinematic Orchestra	Every Dayif  z8https://www.youtube.com/channel/UCIzsJBIyo8hhpFm1NK0uLgw)r#  r$  r!  UCIzsJBIyo8hhpFm1NK0uLgwz4https://i.ytimg.com/vi/OtqTfy26tG0/maxresdefault.jpg)	r  r  r  rZ  r  r  r  r  r  z+https://www.youtube.com/watch?v=nGC3D_FkCmgz+https://www.youtube.com/watch?v=SZJvDhaSDncSZJvDhaSDnczESan Diego teen commits suicide after bullying over embarrassing videozUC-SJ6nODDmufqBzPBwCvYvQ20140716z$md5:acde3a73d3f133fc97e837a9f76b53b7   zCBS Mornings)suicidebullyingr  cbsnewsz0https://i.ytimg.com/vi/SZJvDhaSDnc/hqdefault.jpgz8https://www.youtube.com/channel/UC-SJ6nODDmufqBzPBwCvYvQz$https://www.youtube.com/@CBSMorningsz@CBSMorningscBvYw8_A0vQu:   4K Ueno Okachimachi  Street  Scenes  上野御徒町歩きz$md5:ea770e474b7cd6722b4c95b833c0363020201120i  zTravel & EventsUC3o_t8PzBmXf5S9b7GLx1MwzWalk around Japan)z
Ueno TokyozOkachimachi TokyozAmeyoko StreetzTokyo attractionzTravel in Tokyoz6https://i.ytimg.com/vi_webp/cBvYw8_A0vQ/hqdefault.webpz8https://www.youtube.com/channel/UC3o_t8PzBmXf5S9b7GLx1Mwz,https://www.youtube.com/@walkaroundjapan7124z@walkaroundjapan7124)r  r  r  r  WaOKSUlf4TMz-https://music.youtube.com/watch?v=XclachpHxisz+https://www.youtube.com/watch?v=wsQiKKfKxugz+https://www.youtube.com/watch?v=YOelRv7fMxYYOelRv7fMxYzDIGGING A SECRET TUNNEL Part 120210624zUCp68_FLety0O-n9QU6phsgwzCre:https?://(?:www\.)?youtube\.com/channel/UCp68_FLety0O-n9QU6phsgwz$md5:5d5991195d599b56cd0c4148907eec50iT  
colinfurze)ColinfurzeTerrytunnelundergroundbunkerz4https://i.ytimg.com/vi/YOelRv7fMxY/maxresdefault.jpgz#https://www.youtube.com/@colinfurzez@colinfurze)	r  r  r  r  r  r  r  r  r  player_clientrf   )r  extractor_argsr;  player_skipconfigs)r  r  r  z*https://www.youtube.com/shorts/BGQWPY4IigYStoryboardsz+https://www.youtube.com/watch?v=5KLPxDtMqe85KLPxDtMqe8mhtml	format_idsb0zYour Brain is Plasticz$md5:89cd86034bdb5466cd87c6ba206cd2bc20140324zUCZYTClx2T1of7BRZ86-8fowz8https://www.youtube.com/channel/UCZYTClx2T1of7BRZ86-8fowz4https://i.ytimg.com/vi/5KLPxDtMqe8/maxresdefault.jpgSciShow   z https://www.youtube.com/@SciShowz@SciShow)
r  r  r  r  r  r  r  r  r  r  )r  r  )r  r  r  r  z+https://www.youtube.com/watch?v=2NUZ8W2llS42NUZ8W2llS4u,   The NP that test your phone performance 🙂z$md5:144494b24d4f9dfacb97c1bbef5de84dUCRqNBSOHgilHfAczlUmlWHAz8https://www.youtube.com/channel/UCRqNBSOHgilHfAczlUmlWHArQ   zcount:2320220103zLeon Nguyenz:https://i.ytimg.com/vi_webp/2NUZ8W2llS4/maxresdefault.webpz#https://www.youtube.com/@LeonNguyenz@LeonNguyen)rZ  r  r  r  r  r  r  20220102compat_opts!no-youtube-prefer-utc-upload-datez+https://www.youtube.com/watch?v=mzZzzBU6lrMmzZzzBU6lrMz$I Met GeorgeNotFound In Real Life...z$md5:978296ec9783a031738b684d4ebf302dUC_8NknAFiyhOUaZqHR3lq3Qz8https://www.youtube.com/channel/UC_8NknAFiyhOUaZqHR3lq3Qi  zcount:26iNaQuackityz4https://i.ytimg.com/vi/mzZzzBU6lrM/maxresdefault.jpgz	@Quackityz!https://www.youtube.com/@Quackity)
r  r  rZ  r  r  r  r  r  r  r  z+https://www.youtube.com/watch?v=kgx4WGK0oNUkgx4WGK0oNUuj   re:jazz\/lofi hip hop radio🌱chill beats to relax\/study to \[LIVE 24\/7\] \d{4}-\d{2}-\d{2} \d{2}:\d{2}UC84whx2xxsiA1gXHXXqKGOAia20210619z8https://www.youtube.com/channel/UC84whx2xxsiA1gXHXXqKGOAr  z4https://i.ytimg.com/vi/kgx4WGK0oNU/maxresdefault.jpgzAbao in Tokyo20211127zcount:39z$md5:2ef1d002cad520f65825346e2084e49dz$https://www.youtube.com/@abaointokyoz@abaointokyo)r  r  r  r  r  r  r  z+https://www.youtube.com/watch?v=tjjjtzRLHvAtjjjtzRLHvAu*   ハッシュタグ無し };if window.ytcsi20220323
Lesmiscorezre:^https?://.*\.jpgz8https://www.youtube.com/channel/UCdqltm_7iv1Vs6kp6Syke5AUCdqltm_7iv1Vs6kp6Syke5A   z@lesmiscorez#https://www.youtube.com/@lesmiscore)r  r  r  r  r  z+https://www.youtube.com/watch?v=el3E4MbxRqQel3E4MbxRqQz%dlp test video 2 - primary sv no desccole-dlp-test-acc8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrArW   20220908UCiu-3thuViMebBjw_5nWYrA"https://www.youtube.com/@coletdjnz
@coletdjnz)r  r  r  r  z+https://www.youtube.com/watch?v=gHKT4uU8ZnggHKT4uU8Zng20220728z$dlp test video title translated (fr)z*dlp test video description translated (fr))r  r  r  r  r   r  r;  z!Preferring "fr" translated fieldsz6 channel audioz+https://www.youtube.com/watch?v=zgdo7-RRjgoz#Multiple HLS formats with same itagz+https://www.youtube.com/watch?v=kX3nB4PpJkokX3nB4PpJkoz$md5:e8031ff6e426cdb6a77670c9b81f6fa6i  z:https://i.ytimg.com/vi_webp/kX3nB4PpJko/maxresdefault.webpz$Last To Take Hand Off Jet, Keeps It!MrBeast20221112z8https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVAUCX6OQ3DkcsbYNE6H8uQQuVAz https://www.youtube.com/@MrBeastz@MrBeast)r  r  r  r  r  r  r  r  rj   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  r  ro   z251-drcz(https://www.youtube.com/live/qVv6vCqciTMqVv6vCqciTMr  202212234https://i.ytimg.com/vi/qVv6vCqciTM/maxresdefault.jpg8https://www.youtube.com/channel/UCIdEIHpS0TdkqRkHL5OkLtAVtuberu   月ノ美兎u   名取さなu   にじさんじu   クリスマスu   3D配信   【 #インターネット女クリスマス 】3Dで歌ってはしゃぐインターネットの女たち【月ノ美兎/名取さな】V  UCIdEIHpS0TdkqRkHL5OkLtAc   さなちゃんねる$md5:6aebf95cc4a1d731aebc01ad6cc9806d$https://www.youtube.com/@sana_natori@sana_natori)r  r  r  r  r  r  r  r  r  r  r  z+https://www.youtube.com/watch?v=wSSmNUl9SnwwSSmNUl9Snwzcount:2zScott Manley20170831i  zcount:8r  z$https://www.youtube.com/@scottmanleyz$md5:f4bed7b200404b72a394c2f97b782c02r  r  z@scottmanleyz&The Computer Hack That Saved Apollo 14zUCxzC4EngIsMrPmbm6Nxvb-Are:^https?://.*\.webpz8https://www.youtube.com/channel/UCxzC4EngIsMrPmbm6Nxvb-A)r  rZ  r  r  r  r  r  r  )r:  r<  zehttp://www.improbable.com/2017/04/03/untrained-modern-youths-and-ancient-masters-in-selfie-portraits/ 873c81d308b979f0e23ee7e620b312a3zmsN87y-iEx0z!Feynman: Mirrors FUN TO IMAGINE 620080526z$md5:873c81d308b979f0e23ee7e620b312a3)feynmanmirrorsciencephysicsimaginationfuncoolpuzzlezUCCeo--lls1vna5YJABWAcVAz0https://i.ytimg.com/vi/msN87y-iEx0/hqdefault.jpgzChristopher Sykesz8https://www.youtube.com/channel/UCCeo--lls1vna5YJABWAcVA   z6https://www.youtube.com/@ChristopherSykesDocumentariesz@ChristopherSykesDocumentaries)r  r  r  r  r  r  r  )r  r  r  r  c                 l    ddl m}  ||      }|j                  dd g      d   ryt        |   |      S )Nr   r$   r  r   F)utilsr$   r+  supersuitabler  r  r$   qs	__class__s       rx   r  zYoutubeIE.suitable
  s7    $c]66&4&!!$w$$rz   c                 @    t        |   |i | i | _        i | _        y rB  )r  __init___code_cache_player_cache)r  r  r  r  s      rx   r  zYoutubeIE.__init__
  s%    $)&)rz   c           
          t        j                         t        j                         D cg c]  }|j                  d      s| c} fd fd}	D ]e  }|d<   t	        j
                   j                  |d   ||	 xr |j                               }
r|
|d<   d|d<   Ot         |
i             |d<   |d= g y c c}w )	Nis_from_startc                    t        j                          |z   k  ry 
j                        \  }}}}t        |dt              }t        |dt              }
j	                  ||||      \  }}}}|dk(  	t        j                          y )N.videoDetailsrr  .microformatplayerMicroformatRendererr  )r  _download_player_responsesr+   r7  _list_formats)rA  delayrr   prs
player_urlvideo_detailsmicroformatsr  r  r  r  smuggled_datar  r  r  webpage_urls           rx   refetch_manifestzDYoutubeIE._prepare_live_from_start_formats.<locals>.refetch_manifest
  s    yy{j500$($C$CCX`bm$n!Aq#z(.CSWXM'F"$L -1,>,>xWdfiku,v)A{Aw!Y.GJrz   c                      j                  d      D ][  }5    |       ddd       t         fdD        d      }|s"s	 d|_        nd  t                |_        P|d   |d   fc S  y# 1 sw Y   QxY w)	zZ
            @returns (manifest_url, manifest_stream_number, is_live) or None
            Fr  Nc              3   4   K   | ]  }|d    k(  s|  yw)rA  Nr   )r   frA  s     rx   r   zOYoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feed.<locals>.<genexpr>
  s     L+)0K!L   z: Video is no longer livez*Cannot find refreshed manifest for format manifest_urlmanifest_stream_number)rv  rw  r
  r   )
rA  r  retryr  r  r  lockr  r  r  s
   `   rx   mpd_feedz<YoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feed
  s     ***7 O 7$Y67 LWLdS")1
2K&L(RS\R]^q^s]t&u(!,D*EwNNO 7 7s   
A44A=	r  rA  	fragmentshttp_dash_segments_generatorri  )		threadingLockr  r+  r   partial_live_dash_fragmentsr   r   )r  r  r  live_start_timer  r  r  r  r  r  genr  r  r  s   ``` ````   @@@rx    _prepare_live_from_start_formatsz*YoutubeIE._prepare_live_from_start_formats
  s    ~~YY[
%@)?1@	% 	%	 	$  		'A"AiL##D$=$=x;$3X7{?WqvvxYC!$+ >*!)#b'!2+o&		'E As   CCc              #      K   d\  }}d\  d}	j                  d      xs t        j                         }
|
|xs |
z
  |kD  }|r j                  t        d      d       d}|	dd c}}d\   fd	} j	                  d
| d        r4t        j                         }dkD  ry |r.	  j                  |d ddd      }t        |d       dz  d }M |ddkD        \  }dz  |sd|kD  rd }ldz  |	dk  r
|dk  r|	z   }|r!t        |t        |d   d   z        z
        }	 t        |      D ]6  } |dd      \  }}|s|dz
  }t        d      t        d|z        }|d 8 |k(  rdz  nd}ry t        j                  t        d||z   t        j                         z
               r3y y # t        $ r d }Y w xY w# t        $ r Y Vw xY ww)N)rW   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  r  c                    }	j                  dd       }|xs% |xr! t        |t              xr |j                  dk(  } 
|rdnd      xs df\  | s|rsdfS |k(  rdfS r}n9	 j	                  d ddd      \  }}|s	dz  dfS t        fd	|D              }|d
   |d   sJ t        t        j                  dd   d         j                  d            }d|fS # t
        $ r d }Y rw xY w)N
last_errorrt  rW   iPF  FTr  r  r  r   c              3   4   K   | ]  }|d    k(  s|  yw)r  Nr   )r   r   stream_numbers     rx   r   zUYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd.<locals>.<genexpr>5  s     `a15M3NR_3_`r  r  fragment_base_urlz(?:/|^)sq/(\d+)r   rL  r   )popr  r
   r}  "_extract_mpd_formats_and_subtitlesr   rw  intr+  r,  r`  )refresh_sequence	immediateold_mpd_urlr  expire_fastfmt_infofmtsrr   	_last_seqctxrA  r  r  r  last_seqmanifestless_orig_fmtr  mpd_urlno_fragment_scorer  r  s            rx   _extract_sequence_from_mpdzBYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd  sW    "Kt4J#tz'tjY6W't\f\m\mqt\tK/7	1Y^/_ 0R3:M52Q ,G]G#w (?* G+>)$0 "EEE5 F OGD! %*% (?*`4`` -I ()< =$$$BII&8)B-:OPVVWXYZI?" &  D s   0C. .C<;C<[z"] Generating fragments for format rH   Fr  c                 2    t        | j                  d         S )NzX-Head-Seqnum)r   r  r]  s    rx   rV  z0YoutubeIE._live_dash_fragments.<locals>.<lambda>I  s    ;qyy?Y3Z rz   r   r^   r   r   r  zbreaking out of outer loopzsq/%d)r  fragment_countrW   )r+  r  r!  r   r  _request_webpager   r-   maxr  ranger4   sleep)r  r  rA  r  r  r  r  
FETCH_SPANMAX_DURATIONbegin_indexdownload_start_timelack_early_segments	known_idxlast_segment_urlr  
fetch_timeurlhshould_continueidxrr   r  r  r  r  r  r  r  s   ` ` ```             @@@@@@@rx   r  zYoutubeIE._live_dash_fragments  s    #, 
L*:'!ggg.=$))+1_5[H[\_kk 3V!Wbf   h #'9Da6	$&6'1$	$	# 	#@ 	1XJ&HTUJ 2% 00($UEQV 1 XD #4)Z[#%*%'+$,FtM^acMc,d)!Q&!&8##' MHQ9q=${2	"	8c,)TV-XbJc:c6d+de	 H5 
C)CE5)Q&OQ*$'!G	,-IJJ'./@'C-'P$/*2 
 (%*%()%$	 % JJs1j:5		CDEu  &  D R " sV   B3G<G A-G<AG, <G<G<G)%G<(G))G<,	G95G<8G99G<Nr  c                H    t        |dddt              }|sy t        d|      S )N).PLAYER_JS_URL).WEB_PLAYER_CONTEXT_CONFIGS.jsUrlFr  rz  )r+   r`  r4   )r  r  ytcfgsr  s       rx   _extract_player_urlzYoutubeIE._extract_player_urlz  s0    !*,].
 0*==rz   c                 n    | j                  dd||      }|r| j                  d|d|      }|rd| dS y y )	Nz"https://www.youtube.com/iframe_apizDownloading iframe API JS)r  r  r  zplayer\\?/([0-9a-fA-F]{8})\\?/zplayer versionr  z!https://www.youtube.com/s/player/z /player_ias.vflset/en_US/base.js)r  r  )r  r  r  resplayer_versions        rx   _download_player_urlzYoutubeIE._download_player_url  sf    $$0,xu % N !//138HPU 0 WN:>:JJjkk  rz   c                 P    dj                  d |j                  d      D              S )z/ Return a string representation of a signature rq   c              3   D   K   | ]  }t        t        |              y wrB  r`  r  )r   parts     rx   r   z0YoutubeIE._signature_cache_id.<locals>.<genexpr>  s     J4CIJ    )r   rt   )r  example_sigs     rx   _signature_cache_idzYoutubeIE._signature_cache_id  s"    xxJ;3D3DS3IJJJrz   c                     | j                   D ]  }t        j                  ||      }|s n t        d|z        |j	                  d      S )NzCannot identify player %rr   )_PLAYER_INFO_REr+  r,  r   r`  )r  r  	player_reid_ms       rx   _extract_player_infozYoutubeIE._extract_player_info  sQ    ,, 	KI99Y
3D	K
 !!<z!IJJzz$rz   c                     | j                  |      }|| j                  vr-| j                  |||d|z   d|z        }|r|| j                  |<   | j                  j                  |      S )NzDownloading player zDownload of %s failed)r  r  r  )r  r  r  r+  )r  r  r  r  	player_idcodes         rx   _load_playerzYoutubeIE._load_player  sx    --j9	D,,,))HE*Y6/*< * >D .2  +##I..rz   c           
      >  
 | j                  |      }d| d| j                  |       }t        j                  j	                  |      |k(  sJ | j                  d|        | j                  j                  d|      d c
}
s| j                  ||      }|r~| j                  |      }dj                  t        t        t        t        |                        } ||      D 	cg c]  }	t        |	       c}	
| j                  j!                  d|
       
fdS c c}	w )Njs_rr   zExtracting signature function zyoutube-sigfuncsr   c                 :     dj                   fdD              S )Nr   c              3   (   K   | ]	  }|     y wrB  r   )r   iss     rx   r   zJYoutubeIE._extract_signature_function.<locals>.<lambda>.<locals>.<genexpr>  s      :!1 :s   )r   )r  
cache_specs   `rx   rV  z7YoutubeIE._extract_signature_function.<locals>.<lambda>  s     :z :: rz   )r  r  osrL  basenamer  cacheloadr  _parse_sig_jsr   mapchrr  r  ordstore)r  r  r  r  r  func_idr  r  test_stringcr  s             @rx   _extract_signature_functionz%YoutubeIE._extract_signature_function  s   --j9	 	{!D$<$<[$I#JKww(G3339'CD::??+=wG
D$$Xz:D$$T*C''#c5[1A+B"CDK*-k*:;Q#a&;JJJ/*E:: <s   #Dc           
         | j                  d      sy d }dj                  t        t        t	        t        |                        } ||      }|D cg c]  }t        |       }}dj                   ||            }ddj                  d |j                  d      D              z  }	d	|	d
|d}
| j                  d|
z          y c c}w )Nyoutube_print_sig_codec              3      K   d }d }d}t        | dd  | d d       D ]5  \  }}|||z
  |k(  r ||||       d } ||z
  dv r||z
  }|}/d|z   7 |dz   y  |||       y w)Nc                 v    | dk(  rdn
t        |       }||z   dk\  rd||z   z  nd}|dk(  rdnd|z  }d| | | dS )Nr   r   z:%d:r   zs[])r`  )r^  endstepstartsendsstepss         rx   	_genslicezBYoutubeIE._print_sig_code.<locals>.gen_sig_code.<locals>._genslice  sU    $zs5z14tqt,c"aiedlF8D6%22rz   z(Never used)r   r   )r   r   zs[%d])zip)idxsr  r  r^  r  prevs         rx   gen_sig_codez/YoutubeIE._print_sig_code.<locals>.gen_sig_code  s     3 D"EtABxcr3 )4#4x4' #E466Dt8w&t8D E!D.() |k!q$//s   A)A+r   z + z(%s)r  c              3   D   K   | ]  }t        t        |              y wrB  r  )r   ps     rx   r   z,YoutubeIE._print_sig_code.<locals>.<genexpr>  s     Bac#a&kBr  rq   z*if tuple(len(p) for p in s.split('.')) == z:
    return 
zExtracted signature function:
)		get_paramr   r  r  r  r  r  rt   	to_screen)r  funcr  r  r  	cache_resr  r  	expr_codesignature_id_tupler  s              rx   _print_sig_codezYoutubeIE._print_sig_code  s    ~~67	08 ggc#uS-='>?@%	&/0c!f0
0JJ|J78	#IIB;+<+<S+ABBD '9)E84?@ 1s   Cc                 p    | j                  d|dd      }t        |      }|j                  |      f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                      | g      S rB  r   )r  initial_functions    rx   rV  z)YoutubeIE._parse_sig_js.<locals>.<lambda>  s    )1#. rz   )r  r	   extract_function)r  jscodefuncnamejsir(  s       @rx   r  zYoutubeIE._parse_sig_js  sL    %%e ?u & N  F#//9..rz   c                       fd}|S )Nc                  V   j                   vr	  | i |j                   <   j                      }t        |t              r||S # t        $ r}|j                   <   Y d }~@d }~wt        $ r6}t        t        j                         |      j                   <   Y d }~}d }~ww xY w)Nrx  )r  r   	Exception	traceback
format_excr  )r  r  r  retcache_idr  r  s       rx   innerz YoutubeIE._cached.<locals>.inner  s    t111c373H3HD&&x0 $$X.C#y)	J & 534D&&x0  c3A)BVBVBX`a3bD&&x0cs#   A	 		B(A&&B(2,B##B(r   )r  r  r4  r5  s   ``` rx   _cachedzYoutubeIE._cached  s    	 rz   c                     | j                  | j                  d|| j                  |            } ||||      }| j                  ||        ||      S )z3Turn the encrypted s field into a working signaturer%  )r6  r	  r  r#  )r  r  r  r  extract_sigr  s         rx   _decrypt_signaturezYoutubeIE._decrypt_signature  sS    ll,,eZAYAYZ[A\^8Z3T1%Awrz   c           
         |t        d      t        d|      }	 | j                  ||      \  }}}| j                  d      r| j	                  d| d|d	    d
       	 | j                  | j                  d|      }  |||      |      }	| j                  d| d|	        |	S # t         $ r}t        d|      d}~ww xY w# t        j                  $ r}	 t        | d      }n# t         $ r |w xY w| j                  d| d| |       | j                  |d       |\  }
}|j                  ddj                  |
       d| d|d|d      j                         }	Y d}~d}~ww xY w)z3Turn the encrypted n field into a working signatureNz&Cannot decrypt nsig without player_urlrz  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)r  r  zDecrypted nsig z => )r   r4   _extract_n_function_coder  r  r6  _extract_n_function_from_coder	   r0  r   r!  r  executer   r  )r  r  r  r  r,  r  	func_coder  extract_nsigr3  r  	func_bodys               rx   _decrypt_nsigzYoutubeIE._decrypt_nsig  s    !IJJ6
C
	R(,(E(EhPZ([%CI >>23NN:9+SSTVXYZ	L<<(J(JKYcdL.,sI.q1C  	?1#T#78
1  	R !GqQQ	R && 	L&tT:!   !s,zl<=EG Q$/'OD)++'		$'8i[QEQTU!(B  DDIEG 	LsB   B# ,C #	B>,B99B>E'C#"E"#C//A.E""E'c                     | j                  d|dd      \  }}|s|S t        j                  t        | j                  dt	        j
                  |       d|d| d| d	                  t        |         S )
NzP\.get\("n"\)\)&&\(b=(?P<nfunc>[a-zA-Z0-9$]+)(?:\[(?P<idx>\d+)\])?\([a-zA-Z0-9]\)z!Initial JS player n function name)nfuncr  r&  zvar z\s*=\s*(\[.+?\])\s*[,;]z#Initial JS player n function list (rq   r  )r  r  loadsr   r+  escaper  )r  r*  r+  r  s       rx   _extract_n_function_namez"YoutubeIE._extract_n_function_name2  s    **_7?O + Q# Ozz*T%7%7BIIh'((?@&1(1SEC&E F GGJ3xQ 	Qrz   c                    | j                  |      }| j                  j                  d|d      }|xs | j                  ||      }t	        |      }|r|||fS | j                  |      }| j                  d|z  |ddd       }|r|d   g|d	   f}n"| j                  d
       |j                  |      }| j                  j                  d||       |||fS )Nzyoutube-nsigz	2022.09.1)min_verz(?xs)%s\s*=\s*function\s*\((?P<var>[\w$]+)\)\s*
                     # NB: The end of the regex is intentionally kept strict
                     {(?P<code>.+?}\s*return\ [\w$]+.join\(""\))};znsig function)varr  )r`  r  r   r   z&Extracting nsig function with jsinterp)
r  r  r   r  r	   rH  r  r  extract_function_coder  )r  r  r  r  r@  r*  r,  	func_names           rx   r=  z"YoutubeIE._extract_n_function_code=  s    --j9	JJOONI{OS	Ed//*EF#	9,,11&9	 &&FHQR O?D	 ' J	
 #A,16IEF11)<I

I>Iy((rz   c                 0     |j                   | fd}|S )Nc                    	  | g      }|j	                  d      rt        j                  d      |S # t         j                  $ r  t        $ r.}t        j                  t        j                         |      d }~ww xY w)Nr/  enhanced_except_z(Signature function returned an exception)r	   r0  r1  r2  r-  )r  r3  r  r  s      rx   rA  z=YoutubeIE._extract_n_function_from_code.<locals>.extract_nsigZ  s{    OA3i ~~01#--.XYYJ !**  O#--i.B.B.DANNOs   	4 A>)A99A>)extract_function_from_code)r  r,  r@  rA  r  s       @rx   r>  z'YoutubeIE._extract_n_function_from_codeW  s"    -s--y9
	 rz   c           	         d}t        |t              rt        |j                  d            }|sX|!d}|rt	        |      | j                  |       y| j                  |||      }|rt        | j                  d|dd|            }|S )	zr
        Extract signatureTimestamp (sts)
        Required to tell API what sig/player version is in use.
        NSTSz6Cannot extract signature timestamp without player_url.r  z2(?:signatureTimestamp|sts)\s*:\s*(?P<sts>[0-9]{5})zJS player signature timestampsts)r`  r  )r  r7  r   r+  r   r!  r  r  )r  r  r  r   r  rT  	error_msgr  s           rx   _extract_signature_timestampz&YoutubeIE._extract_signature_timestamph  s    
 eT"eii./C!T	(33##I.$$Xz$GD!$"4"4I435 #5 #O P 
rz   c           	         t        d      D ]l  \  }}|rdnd}t        |d|dft              }|s| j                  d| d        y t        j
                  j                  |      }t        j
                  j                  |j                        }d	dj                  fd
t        dd      D              }	t        t        |j                  d      xs dgd         dz
        g}
|j                  dg|	g|
dd       |r|j                  d|
d       t        j
                  j                  |j!                  t        j
                  j#                  |d                  }| j%                  ||d| ddd       o y )N)videostatsPlaybackUrlvideostatsWatchtimeUrlzfully r   playbackTrackingbaseUrlrr  zUnable to mark watchedz@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_c              3   V   K   | ]   }t        j                  d d      dz      " yw)r   r+  ?   N)randomrandint)r   rr   CPN_ALPHABETs     rx   r   z*YoutubeIE._mark_watched.<locals>.<genexpr>  s&     Z,v~~a'='BCZs   &)r      r  z1.5r   2
detailpage)vercpncmtr   )str   T)r  zMarking zUnable to mark watchedFr  )	enumerater   r3   r!  r8  r9  urlparser$   r  r   r  r`  floatr+  r<  
urlunparse_replacer=  r  )r  r  player_responsesis_fullr  r0  r  
parsed_urlr  rf  video_lengthra  s              @rx   _mark_watchedzYoutubeIE._mark_watched  s~   %&YZ &	7LGS 'HRE,/A3	.R*57C##oeWG$DE..s3J&&z'7'78B ^L''ZUSTVX\ZZC  rvve}'?&C Dq HIJLIIuu#"	   		& 
 ,,))##&,,*@*@T*J#KMC ""X%8( # 7I&	7rz   c              #     K   t        j                  d|      }|r3| j                  |j                  d      |        | j	                         t
        |   ||      E d {    t        j                  d|      D ]   }| j                  t        |      | |       " t        j                  d|      D ]  }| j                  |d   | |d           y 7 tw)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)r   )	r+  r,  
url_resultr`  StopExtractionr  _extract_from_webpagefindallr.   )r  r  r  rb  id_mr  s         rx   rv  zYoutubeIE._extract_from_webpage  s     
 yyi ..E!2C88$$&&70g>>> ::I7S 	>C..c!2C==	>  ?@GI 	4A ..2QrU33	4 	?s   AC"C#A5Cc                 H    | j                  |      }|st        d|       |S )NzInvalid URL: )get_temp_idr   )r  r  r  s      rx   
extract_idzYoutubeIE.extract_id  s*    ??3' =!677rz   c                 T    t        |dt              }| j                  |d d |      S )N)playerOverlaysplayerOverlayRendererdecoratedPlayerBarRendererr  	playerBarchapteredPlayerBarRendererr  rr  c                 0    t        t        | d      d      S )N)chapterRenderertimeRangeStartMillis  scale)r   r+   chapters    rx   rV  z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>  s    =W&QRZ^,` rz   c                 &    t        | dt              S )N)r  r  rF  rr  )r+   r`  r  s    rx   rV  z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>  s    <CSV,X rz   )start_functiontitle_functionr  )r+   r  _extract_chapters_helper)r  r  r  chapter_lists       rx   _extract_chapters_from_jsonz%YoutubeIE._extract_chapters_from_json  sE    #  "	# ,,`X -  	rz   c           	           t        |dt              } fd fdt        t        d  fd|D              g       S )N)engagementPanels."engagementPanelSectionListRenderercontentmacroMarkersListRendererr  rr  c                 :    t        j                  | d            S )NtimeDescription)r"   r  r  r  s    rx   rV  zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>  s    ~dnnWN_6`'a rz   c                 (    j                  | d      S )Nr  )r  r  s    rx   rV  zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>  s    w(H rz   c              3   Z   K   | ]"  }j                  t        |d              $ yw)).macroMarkersListItemRendererN)r  r+   )r   r  chapter_timechapter_titler  r  s     rx   r   zDYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<genexpr>  s8      "*  )),xAf*g*6xQ"*s   (+)r+   r  rw  filter)r  r  r  content_listr  r  s   ` ` @@rx   '_extract_chapters_from_engagement_panelz1YoutubeIE._extract_chapters_from_engagement_panel  sM    #~  bHF4 "* )"* + -/0 	0rz   c                     t        |dddd ddddd	d
t        j                  t        d      hfd hdt        hfdf
      xs d S )NframeworkUpdatesentityBatchUpdate	mutationsc                 $    |d   d   d   d   dk(  S )NpayloadmacroMarkersListEntitymarkersList
markerTypeMARKER_TYPE_HEATMAPr   rr   r?  s     rx   rV  z,YoutubeIE._extract_heatmap.<locals>.<lambda>  s     9&>?N|\`uu rz   r  r  r  markers.startMillisr  r  c                 B    t        | d         t        | d         z   dz  S )Nr  durationMillisr  )r  r]  s    rx   rV  z,YoutubeIE._extract_heatmap.<locals>.<lambda>  s&    Am,<(=AFVDW@X(X\`'` rz   intensityScoreNormalized)r  r  r,  )r+   r   r  r   )r  r  s     rx   _extract_heatmapzYoutubeIE._extract_heatmap  sf    D 3[u/	3,y/@/@VZ/[.\]`a4}oFQ#   	rz   c                    |j                  d      }|sy || j                  |d      | j                  |d      t        |ddd| j                  hf      | j                  |d      t        |dd	d
dt
        hf      |xs dd}| j                  |d      xs d}| j                  |      }|j                  ||d       t        dt        |dt        d            |d<   t        |d      }|||d<   t        |dt              }|d|v |d<   | j                  t        |d      g      }	| j                  |	t        j                        rd|d<   t        |d      }
|
rd|d <   |S )!N	commentIdcontentText	voteCountauthorEndpointr  r  
authorTextauthorThumbnailrU  r   r  root)r   r   r  	author_idauthorauthor_thumbnailparentr  r   )
_time_textrl  rz  )r  )r  r  Fr  
author_urlauthorIsChannelOwnerauthor_is_uploader)actionButtonscommentActionButtonsRendererrr  creatorHeartis_favoritedauthorCommentBadgeTauthor_is_verifiedpinnedCommentBadge	is_pinned)r+  r  rS  r+   r  r3   rm  r<  r4   r`  r7  r<  r@  r   r   )r  comment_rendererr  
comment_idinfor  rl  r  comment_abrr7  r  s              rx   _extract_commentzYoutubeIE._extract_comment  s   %))+6
 NN#3]C//*:KH%&69IK[]gjnj{j{i|8}~nn%5|D ,-=@QS_acejmxly?z {&
 NN#35HIOR	)))4	#"
 	 %%|4D Gk!5(23\
 **:<RS));D%&"O_ce"#1[#@D %%|4DFZ'[&\]??69#5#56)-D%& !13GH	 $Drz   c           
   #   >   K    fd fd} fd}s"t        dd dddt               t                     t         d            }|r j                  j	                  d       |dk(  rry t        d	  j                  d
      dgdz  z         ^}	}
 j                  |      }d }d}d u }|r$|s" j                   j                              }d}d}t        j                  d      D ]  }|s n j                   j                  |            }dd    dd    d}|dk(  r|rd}ndd   |fz  }ndrdndrdnd||fz  }d }|sd   dk(  rd   dk(  sg |d|rdndg}	  j                  d |d|||       }d}d }t)        ||t*        g '      D ]A  }|r ||      }d}|r  ||      D ]  }|s   y |   j                  d(|i      }|sA    j-                  |d)d*      }|r/s,d   dk(  r# j'                  d+| d,        j.                  y y y # t        $ rZ}d!t!        |      j#                         v r9r7 j%                  d"      d#v r j'                  d$       Y d }~ y t        d%d&       d }~ww xY ww)-Nc                 0    j                  | dg      d   S )Nr   r   )r  )r  r  s    rx   rV  z,YoutubeIE._comment_entries.<locals>.<lambda>!  s    $*A*A!bT*J1*M rz   c                    d }| D ]  }t        |d      }
j                  |dd      }||d<   
j                  d| d       t         	d      dk7        t	        |fd	t
              xs i }|j                  d
      xs i }
j                  |      xs 
j                  |      }|st        |j                  d            }|s	dk(  rdnd}
j                  d|j                         z          |S  |S )NcommentsHeaderRenderer	countTextcommentsCount	est_totalzDownloading ~z	 commentscomment_sorttopc                      | d   d   d      S )NsortMenusortFilterSubMenuRenderersubMenuItemsr   )r   comment_sort_indexs    rx   rV  zDYoutubeIE._comment_entries.<locals>.extract_header.<locals>.<lambda>1  s    a
m,GHXYkl rz   serviceEndpointr  r   ztop commentsznewest firstzSorting comments by %s)r+   rS  r  r  r-   r7  r+  r  r  r(   r  )r  _continuationr  comments_header_rendererexpected_comment_countsort_menu_itemsort_continuation_ep	sort_textr  get_single_config_argr  trackers           @rx   extract_headerz2YoutubeIE._comment_entries.<locals>.extract_header#  s:    M# +7AY+Z()-,k?*L& *5+AGK(NN]3I2J)#TU%()>~)NRW)W%X"!(,lnr"t "zwy  (6'9'9:K'L'RPR$ $ B BCW X  !G\`\v\v  xF  ]G$'(:(:7(CD	 2D2I~I7)//:KKL  10 ! rz   c              3     K   sdd<   | D ]l  }sd   k\  rd  t        |d       }t        ||fddggt        i       }j                  |      }|sL|d   }|j	                  d	      rd
   j                  |       |d   v r7|d
   v r|j	                  d	      sj                  drdnd d       d  nd   j                  |d          dxx   dz  cc<   rdndxx   dz  cc<   | t        |d t              }|sdxx   dz  cc<   j                  ||j	                  d            }t        j                  |t        
t        d	d   z
                    E d {    o y 7 w)Nr   current_page_threadtotal_parent_commentsc                     | d   S )NcommentThreadRendererr   r]  s    rx   rV  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>E  s    QG^E_ rz   commentRenderer)commentr  rs  r   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                     | d   d   S )NrepliescommentRepliesRendererr   r]  s    rx   rV  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>d  s    q|D\7] rz   )r  r  )r-   r   r7  r  r+  addr!  _comment_entries	itertoolsislicerJ  r  )r  r  comment_thread_rendererr  r  r  comment_replies_renderercomment_entries_itermax_parentsmax_repliesmax_replies_per_threadr  r  r  r  r   s           rx   extract_threadz2YoutubeIE._comment_entries.<locals>.extract_thread?  s    12-.# *h'*A"Bk"Q*1';_*`'#,,g6:KMk9l8m"&$4  //0@&I$T]
;;{+0155jA );!<<!W-A%BB7;;WbKc !''Y06,B??cef ./33GDMB(A-(&.>UVZ[[V ,3+-]_c,e( ,12a72+/+@+@0%&{{40' ,A ,C(  )//0Dc.A{WMcEd7d0eGg  h h hS*hRhs   DF A%F 5E>6	F r   )r  r  r  r  r  r  r  max_comment_depthz|[youtube] max_comment_depth extractor argument is deprecated. Set max replies in the max-comments extractor argument insteadr   c                 8    t        | t        j                        S Nr  )r   sysmaxsize)r  s    rx   rV  z,YoutubeIE._comment_entries.<locals>.<lambda>  s    k!S[[9 rz   max_commentsr   r~   FT)onResponseReceivedEndpoints.)reloadContinuationItemsCommandappendContinuationItemsActioncontinuationItemsr   r  (r  z/~r  r  z$Downloading comment section API JSONz3    Downloading comment API JSON reply thread %d %sr  z+%sDownloading comment%s API JSON page %d %sz       z replies.r  )r  r  rw  )r  r  r  r   r  r  r  zincomplete dataignoreerrors)T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  rs  r  )r  .messageRendererr   rA  zYoutube said: r  r  )r7  setr   _downloaderdeprecated_featurer  r  r  r  _generate_comment_continuationr  rP  r  r  r  r   r`  r  r  r!  r+   r  r  CommentsDisabled)r  root_continuation_datar   r  r  r  r  r  	max_depthr  rr   r  rz  is_forced_continuationis_first_continuationcontinuation_items_pathpage_numr  comment_prog_strnote_prefixr  r  continuation_itemsentryr  r  r  r  r  s   ` ````                   @@@@rx   r  zYoutubeIE._comment_entries  s     M	!8-	h -	h` $%&'%&!$#&5G   56I JK	// 1q r>fMP94;R;RSa;dhjgknogo;oNqJk;0F 112HI!& &$ 
  ==d>a>abj>klL%)"#J!* ;	H//e$JdJdemJn/oG!"7?#;"<Bw{?S>TTUV1}("HK"W 568H[J #JK L!'IRv2.O0 0 "N)7;3G13LQXYhQimnQn#z$; #zS #z0E,Kw#z "{11 UG+#1 2 3( &+"L&28=Tdhrt&u "(#12D#EL,1)#+,>?  E K   $99:GY:Z[[;	z ..!79epq.r6go&>!&C.	 :XY]^''' 'D67G "  %A66~~n59PP++st ,e%)+ + s?   E0J<H7AJ,AJ7	J AJJJJJc                 v    d|  d|  d}t        j                  |j                               j                         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)r  r  s     rx   r  z(YoutubeIE._generate_comment_continuation  s:    
 !
*?zImn/6688rz   c                       fd}t         j                  ddg      d         }t        j                   ||      d|      S )zEntry for comment extractionc              3      K   t        d t        | di       D        d       }j                  |      E d {    y 7 w)Nc              3   H   K   | ]  }|j                  d       dk(  r|  yw)sectionIdentifiercomment-item-sectionNr+  )r   rN  s     rx   r   zIYoutubeIE._get_comments.<locals>._real_comment_extract.<locals>.<genexpr>  s-      L88/04JJ Ls    ").itemSectionRendererr  )rw  r+   r  )r  r  r  r  r   s     rx   _real_comment_extractz6YoutubeIE._get_comments.<locals>._real_comment_extract  sI      L!-h8T^`!aLMQSH ,,XuhGGGs   6A?Ar  r   r   )r   r  r  r  )r  r   r  r  r  r*  r  s   ```    rx   _get_commentszYoutubeIE._get_comments  sE    	H #4#:#:>B4#PQR#ST 5h ?LQQrz   c                      dddS )NT)contentCheckOkracyCheckOkr   r   rz   rx   _get_checkok_paramszYoutubeIE._get_checkok_params  s    "&t<<rz   c                 D    ddi}|||d<   dd|ii| j                         S )Nhtml5PreferenceHTML5_PREF_WANTSsignatureTimestampplaybackContextcontentPlaybackContext)r/  )r  rT  rv  s      rx   _generate_player_contextz"YoutubeIE._generate_player_context  sM     1
 ?,/G()(' 
 %%'	
 	
rz   c                 b    t        | d      ryt        | d      d}t        fd|D              S )N)playabilityStatusdesktopLegacyAgeGateReasonT)r8  )r}  reason)zconfirm your agezage-restrictedinappropriateage_verification_requiredage_check_requiredc              3   4   K   | ]  }D ]  }||v  
  y wrB  r   )r   r  r:  reasonss      rx   r   z)YoutubeIE._is_agegated.<locals>.<genexpr>  s$     ](U\]68v%]%]s   )r+   rI  )player_responseAGE_GATE_REASONSr?  s     @rx   _is_agegatedzYoutubeIE._is_agegated  s:    )\]0[\
 ]6F]]]rz   c                      t        | d      dk(  S )N)r8  r}  
UNPLAYABLEr+   )r@  s    rx   _is_unplayablezYoutubeIE._is_unplayable  s    O-LMQ]]]rz   c                    | j                  ||      }| j                  |||      }	|r| j                  |||d      nd }
| j                  ||	||      }d|i}t	        |      d   dv rd|d<   | j                  d	d gd
      d   }|r||d<   |j                  | j                  |
             | j                  |d|||d
|d|j                  dd      j                         z        xs d S )NFr  )r   r  r  rW  r  r   )rf   android_embedscreenzCgIIAQ==r  player_paramsTr  playerzDownloading %s player API JSONrr   r}  )r  r  r  r   r  r  rW  r  )r  r  rV  r  ry   r  r<  r6  r  r   r  )r  r8   r  master_ytcfgplayer_ytcfgr  
initial_prr  r  syncidrT  r  yt_querypp_args                 rx   _extract_player_responsez"YoutubeIE._extract_player_response  s&   33L,O--lL*Udnd//*lZ_/`tx++v]ci , k x
 #6*1-1SS!+HX((4&D(QRST!'HX55c:;%%t!1FNN34L4R4R4TT	 & 
 
 	rz   c                    g }g d}t        d t        j                         D        d d      }| j                  d      D ]Z  }||v r|j	                  |       |dk(  r|j                  |       0|dk(  r|j                  |       G| j                  d	|        \ |s|}|j                  d
      s| j                  |      r|j                  d |D               t        |      S )N)rj   rf   rb   c              3   2   K   | ]  }|d d dk7  s|  y w)Nr   rr   r   r   r8   s     rx   r   z3YoutubeIE._get_requested_clients.<locals>.<genexpr>*  s     PfRajC>OVPs   c                     t         |    d   S )Nr   rO  )r8   s    rx   rV  z2YoutubeIE._get_requested_clients.<locals>.<lambda>+  s    08D rz   T)r  reverser:  r  allzSkipping unsupported client r  c              3   >   K   | ]  }| d t         v s| d   yw)_musicNrO  rU  s     rx   r   z3YoutubeIE._get_requested_clients.<locals>.<genexpr>9  s-      %m&,xvEVZkEk6(&!%ms   
)
sortedr   keysr  r  extendr!  r+  r  r   )r  r  r  requested_clientsr  allowed_clientsr8   s          rx   _get_requested_clientsz YoutubeIE._get_requested_clients&  s    + P"3"8"8":PDdT --o> 	MF(!((09$!((15!((9##&B6($KL	M ! '^,0A0A#0F$$ %m0A%m m +,,rz   c                 *    t        |d      x}|k7  r|S y )N)r  r  rE  )r  prr  pr_ids       rx   _invalid_player_responsez"YoutubeIE._invalid_player_response>  s$     ""&ABBExOL Prz   c                    d }|r | j                  | j                  |d|d      }g }|r)| j                  ||      s|j                  i |dd i       t	              d d d   fd}d}	d }
i }rt        j                               \  }}}|dk(  r|ni }d| j                  d	      vr|dk7  r| j                  ||      xs |}|
xs | j                  |||
      }
| j                  |      j                  d      }d| j                  d	      v rd}d }
|
s|	s|r| j                  |      }
d}		 |dk(  r|r|n| j                  |||xs |||r|
nd ||      }| j                  ||      x}r|||<   n`|r^t!        |      }t#        |dt$        hf      xs i }||t&        <   t#        |ddt$        hf      D ]  }||t&        <    |j                  |       |dk(  r)| j)                  |      r| j*                  r || d       n3| j-                  |      r"|dk(  r || d       n|s |d| | d       r|rc| j                  ddj/                  |       ddj/                  t	        |j1                                      d| d       |st        dd      ||
fS |st        d      ||
fS # t        $ r}| j                  |       Y d }~]d }~ww xY w)Nzinitial player responseFr  streamingDatar   c                      | D ]A  }t        |      d   }|t        v s|vsj                  |       j                  |        y y)z? Append the first client name that exists but not already used r   N)ry   r   r  r  )client_namesru   actual_clientall_clientsclientss      rx   append_clientz:YoutubeIE._extract_player_responses.<locals>.append_clientU  sM    +  7 DQ G $55$K7{3#6rz   rb   r=  r<  r  rL   jsTr  adaptiveFormats.r   _creatorro   	_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)r  r  rd  r  r  ry   r  r  r  r  rM  r+  r  rR  r   r!  r   r+   r7  STREAMING_DATA_CLIENT_NAMErF  r  rB  r   r  )r  rk  r  r  rL  r  rN  r  rl  tried_iframe_fallbackr  skipped_clientsr8   r   rv   rM  require_js_playerrb  r  rc  r6  sdr  rj  s    `                     @rx   _extract_player_responsesz#YoutubeIE._extract_player_responsesD  sk   
**33W>WYain + pJ d;;JQ
 JJ<*<ot<='l$B$-	 !&
+B7;;=+Q(FK+1U?<L 7 7 FF6UZ?#33FHEU#lt'?'?ldk'?'lJ $ 7 7 ? C CDW Xt..}==$)!!
&;@Q!66x@
(,%#)U?zZtGdGdHl&BlL`qR\w{  ~H  JWHX 55b(CCuC*/'(0!"&?@FB15-.%b+I3QUPV*WX 9A48A019

2 *$)<)<R)@TEZEZX67""2&m+![M";< !L">;-y@YZS V 1#((?2K1L M447HHSAWAWAY=Z4[3\\jksjttvxy $bmqs s J  !HIIJC " ##A&s   3(J0 0	K9KKc                 R    |dk(  r| j                  d      s|dk(  r|xs ddkD  r|S y y )Nr  live_from_start	post_liver   i   )r  )r  r  r  s      rx   _needs_live_processingz YoutubeIE._needs_live_processing  s8    9$8I)J+-8=qH2L 3M-rz   c              #   f   -./0123K   d-t        j                  t              g c1}i dd ic03t        g d      2t	        |d      } j                  d      }d|v . j                  d      rd. j                  j                  d	       -fd
}	|D ]  }
|
j                  d      rt        |
j                  d            }|
j                  d      xs i }||j                  d      |
j                  d      f}.s||v ro|
j                  d      }t        |
j                  d            }|dk(  s|s$|
j                  dd      j                         xs |}|dk(  rd}|r|r|0|<   |r|3|<   |
j                  d      dk(  r|
j                  d      }|st        j                  j                  |
j                  d            }t        t!        |d             }t!        |d       }t#        ||||f      sf	 |dt	        |d      xs dd j%                  |||      z  }t        |      }d#}|j                  d$      r@	  j-                   j.                  d%|d$   d         }t1        |d$ ||d$   d   ||      i      }tC        |
j                  d.      xs |
j                  d/      d0      }|j                  d1      rd2n(d3|j                  d4      xs dj                         v rd5nd6}t	        |
d7d8 hf      /tE        /fd9      }|r j)                  | d:d"       |
j                  tF              }|
j                  d;      xs |jI                  d<d      xs d}t        |
j                  d=            xs d}i d>t        |
j                  d?            d@t        |
j                  dA            dB| |
j                  d      rdCnd dDtK        tK        |j                  d4      |dkD  xr dEdF      ||
j                  d      xr dGt!        |
dH       t!        |
dI       |xr dJ|xr dK jM                  dL      xs .xr |dMF	      dN|rd5n|dOk(  rdPnd6dQ|v rdRndz   d=|dSkD  r|nd dT|
j                  dU      d|d 2|      tO        |
j                  d            dVz  z
  dWtO        |
j                  dX            dY|dZtQ        |/      d|d[t        |
j                  d[            d\tK        |j                  dd      jS                  d]      d   |d6k  rd^nd      xs d d_|d`|rd5n|dk(  rdand }tU        jV                  db|
j                  dc      xs d      }|rFtY        |j[                  dS            |dd<   |j]                  t_        |j[                  dV                   |r61|   ja                  de|j                  d\      f       |jc                  |       df|j                  dg      |j                  dh      fv } | r|j                  dd      r|dd   diz   |dj<   .sdk|v r$|d@   ri |.r|dB    dln|dB   dm |	|      dn .sdk|vsdo-i|dp<   |   je                  |      }!dq|v}" j                  dr      rd#}" j                  j                  ds       t         j                  dt            }# jM                  dud      r	|!dvk(  s|!r|"r|#ja                  dw        jM                  dxd      s|#ja                  dy        j                  dz      r j                  j                  d{       n|"r|dvk(  r|!dvk7  r|#ja                  dy       .0123 fd|}$i }%|D ]'  }&|&j                  tF              }dw|#vxr |&j                  d}      }'|'r[ jg                  |'|d~d#|dvk(        \  }(}) ji                  |)|%      }%|(D ](  }* |$|*dw| jk                  d|*d   dd             s%|* * dy|#vxr |&j                  d      }+|+s jm                  |+|d#      \  },}) ji                  |)|%      }%|,D ]S  }* |$|*dy||*dB         st         jk                  d|*j                  d      xs |*d   dd             |*d@<   |!rd|*d<   |* U * |% y # t&        $ r2} j)                  d |d!        j+                  |d"       Y d }~Dd }~ww xY w# t&        $ r}d}t3        |t4        j6                        rOd& j                  j9                  d' j                  j:                  j<                         d(t>        j@                   d)}|r7 j)                  d*| d+|d$   d    d,| |d!        j+                  |d"       n j)                  d-|d!       d}Y d }~&d }~ww xY ww)Ni   r   )tinyaudio_quality_ultralowaudio_quality_lowaudio_quality_mediumaudio_quality_highsmallmediumlargehd720hd1080hd1440hd2160hd2880highres).rn  .r  	duplicateinclude_duplicate_formatsTzv[youtube] include_duplicate_formats extractor argument is deprecated. Use formats=duplicate extractor argument insteadc                 L     t         fdt        d d         D              S )Nc              3   t   K   | ]/  }d t        d    d| dt        |z   dz
  d          i      i 1 yw)r  r  -r   filesizeN)r2   rJ  )r   range_start
CHUNK_SIZEr  s     rx   r   zTYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments.<locals>.<genexpr>  s^      F  '%}Ac+
2JQ2NPQR\P].^-_`3  Fs   58r   r  )r   r  )r  r  s   `rx   build_fragmentszAYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments  s0     F "'q!J-!D	F F Frz   targetDurationSecitag
audioTrackr   isDrcqualityrX  r~  audioQualityr   r   r  FORMAT_STREAM_TYPE_OTFr  signatureCipherc                     | d   d   S )Nr  r   r   r]  s    rx   rV  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>  s    AeHQK rz   c                     | d   d   S )Nr  r   r   r]  s    rx   rV  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>  s    afQi rz   &)spr   	signature=z8Signature extraction failed: Some formats may be missingr  r  Fnnsigz         Install 	PhantomJSz to workaround the issue. r  zGnsig extraction failed: You may experience throttling for some formats
z         n = r<  zVCannot decrypt nsig without player_url: You may experience throttling for some formatsaverageBitratebitrater  audioIsDefaultr   descriptivedisplayNamer&  r   approxDurationMsc                     t        | d      S )Nr  )r   r]  s    rx   rV  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>  s    P]^_aePf rz   c                       dz  k  S )Nr   r   )r  format_durations   rx   rV  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>	  s    /HM*I rz   z?: Some formats are possibly damaged. They will be deprioritizedqualityLabelaudio_quality_r;  asraudioSampleRater  contentLengthrA  z-drcr  z
 (default)r  DRCc                 H    | d   j                  dd      j                         S )NprojectionTypeRECTANGULARr   r   r  r]  s    rx   rV  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>  s#    1-=+>+F+F}VX+Y+_+_+a rz   c                 H    | d   j                  dd      j                         S )NspatialAudioTypeSPATIAL_AUDIO_TYPE_r   r  r]  s    rx   rV  z:YoutubeIE._extract_formats_and_subtitles.<locals>.<lambda>  s$    1-?+@+H+HI^`b+c+i+i+k rz   	THROTTLEDDAMAGEDverboser  source_preferencer  Premiumd   r   audio_channelsaudioChannelsr   has_drmdrmFamiliestbrfilesize_approxrY  languagerq   desclanguage_preferencer  z.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?mimeTyper  httpsnoner  r  _dashrA  dashyz-dashyhttp_dash_segments)rA  ri  r  http_chunk_sizedownloader_options
incompleteinclude_incomplete_formatszx[youtube] include_incomplete_formats extractor argument is deprecated. Use formats=incomplete extractor argument insteadr  youtube_include_hls_manifestr  hlsr  dashinclude_live_dashzo[youtube] include_live_dash extractor argument is deprecated. Use formats=incomplete extractor argument insteadc                      j                  d      f}s||   v ry|   j                  |       |rr| d  d<   n)t        fd|   D              r| d  d<   n|r| d<    j                  d      d d<   |dv r-t         j                  d	      d
d       d	<    dxx   dz  cc<    j                  t	         d       d             d<    d   dk(  r- j                  d      r 	t        	 fd                d<   
j                  d      sr t         j                  d	      |d       d	<    j                  d      r d   dk  r d= dk(  r# j                  d      rd d<    dxx   dz  cc<   y)Nr  Fr  rA  c              3   .   K   | ]  \  }}|k7    y wrB  r   )r   r  rr   protos      rx   r   z\YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<genexpr>d  s     8DAqQ%Z8s   r  r   )616235r  r  r}  r  r  c                 0    | d   j                  d      d   S )NrA  r  r   )rt   )r  s    rx   rV  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>p  s    Q{^EYEYZ]E^_`Ea rz   r  rX  c                 &    t        | d   z
        S )NrX  )abs)r   r  s    rx   rV  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>r  s    PSTUXYZbXcTcPd rz   )r  r  r  r;  r   r  r  mayberW   T)r+  r  rI  r   r-   rJ  r  )r  r  ru   r  r  all_formatsitag_qualitiesitagsqres_qualitiesr  s   ``   rx   process_manifest_formatzIYoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format\  s   !%%
+,C3%+#5$KOOC $(65'!2+8E$K88$(65'!2+!%+uu()1)+%&~%#0}1EyX[#\- %&#-&^//;a0bdfghAiL|r!aeeHo s=Fd/e!fg)~~i(K#0}1E{Z^#_- uuU|%AeH~!%%	"2&)%&!+&rz   hlsManifestUrlr  )r  r'  z/itag/(\d+)r  dashManifestUrlr  z/clen/(\d+)r  z	file sizer  )7collectionsdefaultdictr  r%   r+   r  r  r  r+  r(   r   r  r8  r9  r$   r3   r-   rX  r9  r   r!  r  r6  rC  r2   r  r	   r0  _format_errStylesEMPHASISr   INSTALL_HINTr   r,   rs  r   r   r  r  r   rt   r+  r:  r   r`  r<  r    r  r  r|  #_extract_m3u8_formats_and_subtitles_merge_subtitlesr  r  )4r  streaming_datar  r  r  r  
stream_idsstreaming_formatsformat_typesr  fmtr  audio_track	stream_idr  rX  fmt_urlscencrypted_sigr  r  	throttleddecrypt_nsigphantomjs_hintr  r  
is_damagedru   r6  r;  dct	mime_mobjsingle_streamneeds_live_processingskip_bad_formatsskip_manifestsr  	subtitlesrw  hls_manifest_urlr  subsr  dash_manifest_urlr  r  r  r  r  r  r  r  s4   `    `                                       @@@@@@@rx   _extract_formats_and_subtitlesz(YoutubeIE._extract_formats_and_subtitles  s
    
'33C8"z(*QI% 
  )9cd..y9!\1""#>?K// 1c d	F % N	Cww*+swwv/D'',/52K{t4cggg6FGI
*ggi(G !23F& ''."5;;=H t| +2N4(,3M&) wwv"::ggenG\\**3773D+EF%gb2G&HI ',? @B]CD	$R4CC//xT  G W%EIyy~%#'<<0B0BFERUJWXM#ZL.w\%*Q-:N9 G&  (8 9 OSWWY=OQUVC!oo&67)koom.L.RPR-Y-Y-[[S   +31CFfEg0hiO
 ""IJJ##j _`lp $ r ''"<=K77>*Ygoo>NPR.SYWYDcggen-2C{377+<#=>K(@A v0@fb%IJ }!+//-"@"5"9"JlRTV#'''*4uC!abC!kl-+z/Gi^^I.=+N;  	 $is44<RUW09T0Aq'J  cAgs4!" !#''/":#$ &%& 1W:SWWW-=(>(BB'( 4 67)* s+, "#4S/#J-. w/0 SWWW%5612 M+//$*C*I*I#*Nq*Q4G"4L&RTV ^Y]56 &':7: Zc44<RT;C> A377:CVC\Z\^I))//!*<=E


<	(:;<d#''**= >?!!),"swwx'8#''(:K&LLM#&u:#7K w,6C
O@KC$4#5V!<QTU`Qa 4!0!5	  g\9->
,K()	]N	` !% ; ;K R'|;""#?@$// 1d e T44V<==tD(I5(-=u%~~=tDv&""#67// 1d e+":?TXa?av&	 	B 	  	 B&&!;<K$N:WrvvFV?W!EE$hUXaIa F c
d 11$	B	  A.q%dFXFX*AeHfd GY GL M 
 !'n < ZHYAZ  $ G GHY[ckp G q 11$	B	   A.q&+q~V(3D4F4F*AEE2E,F,R!E(T_im 5G 5o )p*015Ao. #	 2 m & ''(b19T ( K$$Q$$7	 & %%'N!!]%<%<=,=d>N>N>Z>Z[fhlhxhxhh  iI  iI  ?J  >K KFFVFcFcEddf+h!++fgufv+E#JqM?,zlT^frv , x ((d(;++t%- , ? !%I%sv   G/f1;*b"%f1?c Of1Ff19f1<f1Af1"	c+'cf1cf1 	f.)B:f)#f1)f..f1c              #   b  K   t        |dd      j                  d      d d d   }t        t        d|j	                         xs d             }|sy t        |      dz
  }t        |      D ]<  \  }}|j                  d      }t        t        t        |d d	             }t        |      d
k7  st        |      s1| j                  d| ddj                  |       t                       ~|\  }	}
}}}|dd  \  }}|j                  dt        ||z
              j                  d|      d| z   }|||z  z  }||z  }d| ddddd||	|
||z  ||t!        t#        j$                  |            D cg c]0  }|j                  dt        |            t'        ||||z  z
        d2 c}d ? y c c}w w)N)storyboardsplayerStoryboardSpecRendererspecr   r  r  r   zhttps://i.ytimg.com/r   #rW      zMalformed storyboard z: rW  z$Lz$Nz&sigh=sb
storyboardr@  r  z$M)r  r  )rA  r  r  ri  r  r  r  rY  rX  r;  r  columnsr  )r   rt   r3   r4   r  r  ri  r  r  r   rX  r!  r   r   r   r`  r  mathceilrJ  )r  rn  r  r  base_urlLr  r  countsrY  rX  frame_countcolsr  Nsighr  r  fragment_durationjs                       rx   _extract_storyboardzYoutubeIE._extract_storyboard  s    U_acchchilcmnrprnrtw'=txxz?QTRSIM  	GAt::c?D#k4845F4yA~S[##&;A3b$@PQdQfPg$hi5;2E6;d12hGAt""4QU4<<T1E&QUPVWC(D4K8N (> 9!!X+#   "X- !>!:;=  ;;tSV4 #$5x1GXCX7Y Z = 	2=s   E(F/*5F*F/c                 B   d }d| j                  d      vr9ddd}| j                  dd gd      d	   }|r||d
<   | j                  ||d|      }| j                  ||      xs | j                         }| j	                  | j                  ||      ||||      \  }	}
|||	|
fS )Nr  r<  
99999999991)bpctrhas_verifiedrI  TrJ  r   ppF)r  r  )r  r  r  rM  rx  r`  )r  r  r  r  r  r  r  r(  rL  rn  r  s              rx   r  z$YoutubeIE._download_player_responses  s    D33MBB*C@E((4&D(QRSTB d,,XU% - AG ))(G<Y@W@W@Y'+'E'E''];g|](<$* &6
BBrz   c                 \   t        |d      }t        |d      }|t        |d      }t        |d      }	t        |d      }
t        |d      }|rdn|rdn|
rd	n|	rd
n	d||	fv rdnd }t        |d      }| j                  |||||      ^ }}t        d |D              r|D ]  }d|d<   	 |||||fS )N).liveBroadcastDetailsisLive	isLiveNowisLiveContent
isUpcomingisPostLiveDvrr{  r  r  r  Fr  ).rf  c              3   >   K   | ]  }|j                  d         yw)r  Nr(  )r   r  s     rx   r   z*YoutubeIE._list_formats.<locals>.<genexpr>  s     1AquuY1s   Tr  )r+   r   r  rX  )r  r  r  r  rn  r  r  live_broadcast_detailsr  live_contentr  r{  r  r  r  r	  r  s                    rx   r  zYoutubeIE._list_formats  s    !-l<Y!ZM84? 6DG @|<m_=	&/{)0I-8M*6J*/G\3J*JJ  	 &&68NO"AA.RZ\fhsu}~)111 $#)$ &{NGYVVrz   c                 %   opqrst t        |i       \  }} j                  |      s j                         dz   }|dz   sz   } j                  ||s|      \  t}}}t	        |dt
              }t        |dt              }	|	r! j                  |	 j                         |	      S tr tfdnd }
t	        |dt
              }t	        |d	t
              } j                  |d
      } j                  xr |xs t        |d      xs |xs
  |
g d      } j                  |d      }t        |d      }| j                  xr |xs |n|}t        |dt              }|r*|j                  d      s j                  d      r j                  dsz         ng }g }|j                  d      D ]  }t         j"                  j%                  t         j"                  j'                  |            oofd} |d      }|sO |d      }|}|r|d|z  z  }|j)                  ddt+        |dod   d   ddi      |d       |j)                  |         j                  ddj-                  |      ds        j/                  |s||      S t1        t        |d            xs, t1        t        |d            xs t3         |
d             xs d } j5                  s|||||      \  }p}}}pd!k(  r j7                  s d"       |s j                  d#      st	        |d$      r j9                  s       t        |d%t
              xs i } j                  |d&      xs t        |d&      } t;         j                  |d'      xs d(      }!|!rL|!d)k(  r?t        |d*      }"|"s |
d+      }#|#r|#j                  d      nd }" j=                  |!|"d,       | d-|! z  } | r j?                  | d.       t        |d/t@              xs g }$|$sLtrJtC        jD                   jG                  d0      t      D %cg c]  }%tI        |%jK                  d1             }$}%|$D ]z  }&|&jM                  d2      stC        jN                  d3|&      }'|'s.d4 |'jQ                         D        \  }(})|(dkD  sN|)dkD  sT|(|)z  }*|D ]  }+|+j                  d5      d6k7  s|*|+d7<     n  jS                  ||fd8      }, |
d9d:g      }-|-r|,j)                  d;|-i       |,jU                         }.g d<}/tW        |/      }0|,jY                  psfd=|/D               |,D ]5  rt[        rsfd>t]        |/      D        |0      }1d?rd;   v rdnd@dA|1z  z
  rdB<   7  j_                  |,        j`                  jc                  |.       t        |dC      xs  |
dD      }2 je                  tg        t        |dE      xs t        |dF      xs  |
dE                  }3t        |dG      }4ti        t        |dH            }5ti        t        |dI            }6|s	|6r|5r|6|5z
  } jk                  p|      qpqfdJ}7tm        |7|      D ]=  }8|8j                  dB      xs d@dKz
  |8dB<   to        |8j                  dL      dMdNO      |8dL<   ? qr jq                  |s|5|||pdPk(         |jY                   js                  ||              ju                  |4      }9i dsd|dQ|dR|,dSt	        |.dT      dU|dV|3dWtw        |3d dXd Y      d |dZt1        t        ||fd[      xs  |
d\            d]ty        t        |d^            d_t        |d`      dau s |
db      dck(  s |
dd      dek(  rdfnddg|dh|2r|2gnd di|$djt        |dk      dlp|5dmdn}:i };t	        |dot
              }<|<rdp }=t	        |<dq      D >ci c]  }> |=|>      |> }?}>t	        |<dr      D @ci c]4  }@|@j                  ds       j                  |@j                  dt      duv      6 }A}@ fdw}Bdx j{                  dy      vxr%  j                  dzda      xs  j                  d{      }C|?j}                         D ]5  \  }D}E|Ej                  d|      }t%        |      j                  d}d g      d@   }F|s: j                  Ed~duv      }G|Ej                  d      dk7  r!Dse B|;|DGi        Ej                  d      sAj}                         D ]  \  }H}I|Hs	H}JEj                  d      dk7  r Hdk7  rCs'HdD z  }HItw        Gd d      z  }IDdJ k(  rE|D ].  }+|+j                  d      d6k7  s|+j                  d      r*J|+d<   0  B||H dI di         B||HIFJk(  ri ndHi        8 ||:d<   |;|:d<   t         j"                  j                  |      }K|Kj                  |Kj                  fD ]f  }Lt         j"                  j%                  |L      }M|Mj}                         D ]2  \  }N}OdD ](  \  }P}Q|Pdz  }P|P|:vsNQv st3        MN   d         |:P<   * 4 h |xs d(j                         j                  d      rtC        jN                  d|      }'|'r|'jK                  d      }R|'jK                  d      }S|SrSj                  dd(      }SRsSd d }R|:j                  |'jK                  dj                               |'jK                  d      x}TrTgn;|'jK                  d      j                  d      D Tcg c]  }T|Tj                          c}T|'jK                  d      j                         St1        R      d       d }Utr3 j                  stda      }Ut	        |Ud      s j                  d       d }UUsLdsi}M|Mj                   j                                 j                  sdda||Md j                  |      d      }Ut	        Uddd ddddf j                  da      |:d<   	 Ud   d   d   d   d   d   d   d    ds dsdpdv rdnddg|:j                  di       d<   UrU j                  U|      xs*  j                  U|      xs  j                  ||      xs d |:d<    j                  U      |:d<   t	        Udt@        g       }Vt        |Vd      }W|WrWj                  d      }X|Xr j                  X      }Xt        Wd       dk(  rX|:d<   nltC        jN                  dX      }'|'rT|:j                  |'jK                  du      t        |'jK                  dA            t        |'jK                  dë            dĜ       t        Wdń t@              xs g D ]  }Yt        t	        |Yddǫ            }Z|ZD ]  }[dȄ dfdʄ d˄ gdffD ]u  \  }\}]t        [|\t
              xs i j                  dͫ      }^|^s-tC        j                  ]^      }'|'sFt        |'jK                  dΫ            |:|'jK                  dϫ      dz   <       t	        Wddddddddddddt        hfda۫      |:d<   t	        |Wdݫ      }_|_r? j                  _dޫ      }`|_j                  d߫      r`|:d<   n|:j                  dZ      `|:dZ<   t        Vd      }a|arat	        ad      }b|:j                   j                  |bd       j                  |bd      d       |9s% ju                  t	        bddt        hfda۫            }9t        ad t@              xs g }cda}d|cD ]  }et        |ed       du sd}d n cD ]  }e|ej                  d      xs i }f|fj                  d      }g|gs, j                  fd      }g j                  |fd      }h|gdk(  rh|:d<   [dr^gdk(  rh|:d<   igdk(  rhrhgnd |:d<   ygdk(  sh|:d<     j                  t	        ad            }i j                  |it        j                        rd|:d<   |:j                  |:j                  d      |9tw        |9d dd Y      d       t        t        |d            xs t         |
d            }j|jrpdv rBd j                  dg       vr.t         j                   j                  Wd                  xs j}jj|:d<   |jrkpdvrgt        j      j                  t        j                  j                        }k|kt        d      k\  r&|:dQ   D ]  }8|8j                  d      d k(  sd|8d<     dD ]  \  }l}P|:j                  |l      }O|OsO|:P<      j                  t	        Wd            }m j                  |mt        j                        xs t        |dt              }n j                  mt        j                        rdn j                  nUr&n$ j                  mt        j                        xs dand Ur&n$ j                  mt        j                        xs dand |:d_   dfk\  nd n4 j                  mt        j                        xs t        |dt                    |:d<    j                  |sVt      |:d	<    j                  s|       |:S c c}%w c c}>w c c}@w c c}Tw # t        t        t        f$ r Y fw xY w(
  Nz//www.youtube.com/zwatch?v=).r8  rr  )errorScreen%playerLegacyDesktopYpcTrailerRenderertrailerVideoIdc                 ,    j                  | d       S r  )_html_search_meta)r   r  r  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>  s    $"8"8GT"8"R rz   c                      y rB  r   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>  s    rz   r  r  ).r  r  )zog:titleztwitter:titler  ).r  shortDescription)multicameraplayerLegacyMulticameraRenderermetadataListforce_singlefeed
noplaylistz2Downloading just video %s because of --no-playlist,c                 .     t         fdt              S )Nc                     |    d   S )Nr   r   )r   r6  s    rx   rV  z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>$  s    4 rz   )r-   r`  )r6  	feed_datas   `rx   
feed_entryz+YoutubeIE._real_extract.<locals>.feed_entry"  s    &%';S B Brz   r   z (%s)url_transparentr  r   T)r  r  r  r  zDownloading multifeed video (r  z-) - add --no-playlist to just download video r  r  r{  z): Video is in Post-Live Manifestless modeallow_unplayable_formats).licenseInfos)r4  playerErrorMessageRendererr:  	subreasonr   z?The uploader has not made this video available in your country.availableCountriesregionsAllowed)metadata_availablez. r  keywordszog:video:tagr  zyt:stretch=z(\d+)\s*:\s*(\d+)c              3   2   K   | ]  }t        |        y wrB  )rk  )r   r?  s     rx   r   z*YoutubeIE._real_extract.<locals>.<genexpr>b  s     <E!H<s   r  r  r  )..rZ  zog:imageztwitter:imager  )rV  hq720	sddefault	hqdefault0	mqdefaultr  sd1sd2sd3hq1hq2hq3mq1mq2mq3r%  rc  3c              3   x   K   | ]1  }d D ]*  }ddj                  |||dk(  rdnddk(  rdnd      i , 3 y	w)
)webpjpgr  z:https://i.ytimg.com/vi{webp}/{video_id}/{name}{live}.{ext}r_  _webpr   r  _live)r  r6  r  r_  r'  N)r  )r   r6  r  r  r  s      rx   r   z*YoutubeIE._real_extract.<locals>.<genexpr>{  sn      B 	B +. OVV!# #vW2{V_G_Geg W i
 B 
 Bs   7:c              3   D   K   | ]  \  }}d  d | d   v s|  yw)rr  r  Nr   )r   r  tthumbr  s      rx   r   z*YoutubeIE._real_extract.<locals>.<genexpr>  s2     eDAqAhZqQRPSBTX]^cXdBdaes     z.webpr   r   r  categorygenre	channelIdexternalChannelIdownerProfileUrlstartTimestampendTimestampc                 p    r| j                  d      sydk(  rdk7  r| j                  d      dk(  ryy y y )Nr  Tr  ri  r  r(  )r  r  r  s    rx   is_bad_formatz.YoutubeIE._real_extract.<locals>.is_bad_format  sH    $SWW_-E*/D	/Q
+/CC D 0R*rz   r   r  z(Last 2 hours)r}  r  r  r  rU  rZ  )r   r  r  r  r  "https://www.youtube.com/channel/%sr  r  ).	viewCountinteractionCountaverage_ratingaverageRatingr  isFamilySafeFisFamilyFriendlyr  zog:restrictions:agez18+r  r  r  r  r  playableInEmbedr  )
r  r  r;  zhdr:12sourcezvcodec:vp9.2channelsr  r  r  )r  _format_sort_fields).captionsplayerCaptionsTracklistRendererc                     t        | j                  d      xs dd      j                  dd      xs | j                  d      S )NvssIdr   rq   r  languageCode)r&   r+  r   )r  s    rx   get_lang_codez.YoutubeIE._real_extract.<locals>.get_lang_code  s>    $UYYw%7%=2sCKKCQTU 5 99^46rz   ).captionTracks.).translationLanguages.r~  languageNamer   rA  c                     | j                  |g       }j                  D ]>  }|j                  d|i       |j                  |t	        dt        ||            |d       @ y )Nr  rz  )r  r  r6  )r   _SUBTITLE_FORMATSr<  r  r4   r2   )rA  r  	lang_codesub_namer  	lang_subsr  r  s          rx   process_languagez1YoutubeIE._real_extract.<locals>.process_language  sp    %00B?	11 CLLs"  $$"&'@BRS[]bBcd (& 	rz   translated_subsr  writeautomaticsublistsubtitlesr[  r  r6  kindr  isTranslatableundr  z from %sza-r  r  z-origz (Original)tlangautomatic_captionsr	  ))r^  )r^  rd  )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_yearr  r~   r  clean_artistr     ·r  )r  r  r  r  r  r  r  zIIncomplete data received in embedded initial data; re-fetching using API.r  rw  )r   z!Downloading initial data API JSON)r  r  r  r   r  r  r  r  )r  twoColumnWatchNextResultsresultsr  r  .r)  r  . commentsEntryPointHeaderRenderercommentCountr  c                     |d   d   dk(  S )Nr  panelIdentifierr'  r   r  s     rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>F  s    Q/S-TUf-g  lB  .B rz   r  header"engagementPanelTitleHeaderRenderercontextualInfor  r  r  conversationBarliveChatRendererr  r  r  r  z &bpctr=9999999999&has_verified=1r  r  youtube_live_chatyoutube_live_chat_replay)r  r  r  ri  	live_chatr  r  )r  r  r  r  r  rs  videoPrimaryInfoRenderersuperTitleLinkc                     | d   d   S )NsuperTitleIconr.  r   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>l  s    !$4"5j"A rz   LOCATION_PINlocationu   (.+?)\s*S(\d+)\s*•?\s*E(\d+)rK   )r  r  r  c                     | d   d   d   S )NvideoActionsmenuRenderertopLevelButtonsr   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>x  s    a/?@QR rz   )toggleButtonRenderer.)"segmentedLikeDislikeButtonRenderer.r  c                     | d   d   d   S )NdefaultTextr  r1  r   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>  s    a&6&GH[&\ rz   z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                     | d   S )Nr  r   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>  s    !O*< rz   c                     | d   d   S )Nr1  r   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>  s    !,?*@AT*U rz   zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peopler0  rP  r  _countr  r  r  .#segmentedLikeDislikeButtonViewModellikeButtonViewModeltoggleButtonViewModeldefaultButtonViewModelbuttonViewModelaccessibilityTextr  r  )rp  videoViewCountRendererrp  r+  r  videoSecondaryInfoRenderer)ownervideoOwnerRenderersubscriberCountText)r  r  )r  )r  rH  .r  r  c                     | d   d   d   S )NmetadataRowContainermetadataRowContainerRendererr  r   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>  s    !234RSTZ[ rz   c                     | d   d   S )NmetadataRowRendererhasDividerLiner   r]  s    rx   rV  z)YoutubeIE._real_extract.<locals>.<lambda>  s    !,A*BCS*T rz   r  )r  r   Licenser  AlbumArtistr  Song)r  r  r7  r  r  r  )r  r  r  
uploadDate)r  NrK  rJ  dateTextr~  )r  r{  r  )tzinfoztoday-2daysri  m3u8_native__needs_testing))r  r  )r  r  r7  	isPrivater  
isUnlisted)r  r  r  r  r  r  __post_extractor)nr1   	_match_idhttp_schemer  r+   r7  r   r`  rt  r  r  r#  r+  r  r  rt   r8  r9  r$   unquote_plusr  r'   r   playlist_resultr   r"   r  r  
report_drmr   raise_geo_restrictedraise_no_formatsr  r+  finditer_meta_regexr.   r`  r-  r,  groupsr\  r   r  r]  rw  ri  _remove_duplicate_formatsr  _sort_thumbnailsr  r(   r#   r|  r  r   r  r"  r  r   r   r  r   rj  fragmentr  r  endswithr   r<  r  r!  r/  r  r  rS  r   KeyError
IndexError	TypeErrorr  r  "_extract_chapters_from_descriptionr  r-   r  r5   r:  r)   r!   r<  r@  r   r   r/   r*   rm  r   rf  timezoneutcr   r  r   r  r   r   r   extract_commentsmark_watched)ur  r  r  r  r  rL  rn  r  playability_statusestrailer_video_idsearch_metar  r  translated_titlevideo_titletranslated_descriptionoriginal_descriptionvideo_descriptionmultifeed_metadata_listentriesfeed_idsfeedrD  feed_id
feed_titler  r  r1  r  r  r  pemrr:  rI  	countriesregions_allowedrM  ry  keywordrb  whratior  rU  r[  original_thumbnailsthumbnail_namesn_thumbnail_namesr  rf  r  owner_profile_urlr  live_end_timern  r  r  r  r	  pctrr  rQ  rz  r  translation_languagesr  get_translated_subsr  caption_track	orig_lang	lang_name
trans_code
trans_nameorig_trans_coderp  	componentr  kr?  d_ks_ksr  r  ainitial_datar  vpirstltlbtbrsr  rU  regexr0  vcrvcvsirvorr  multiple_songsrowmrr	mrr_titlemrr_contents_textr  r~  upload_datetimes_kr7  r  rC  r  r  re  r  r  su   `                                                                                                              @@@@@@rx   _real_extractzYoutubeIE._real_extract  s   *33]>>#&##%(<<+h6>B>]>]^acprz  }H  ?I;/+8 N % V ?? $++-1AC C " S(6 	 %%57L\`a#O   >>,G++@0@ N#M7;N*N &&LM 	 "&>R!S(8JK
 (<'G   ;%; $ $Mc	 	 #,N# #=+<+<=O+P~~l+SV^^_399#> -D !' 5 511$7!9IB ).G" !+G!4J'E!:!55NN!2"+*.6	$8JK/6 8 "'$  OOG,5-6 yy*H67 ++X{4EG G  	- IJ G"9\?#KLG%k*&=>GBF 	
 x}FVXbdlm 	Y^WFX+%z)RST>>"<=,~_tBu)$=TS YVX  ^^D(3`yAUW_7`F"4>>$#D#JKI aa ),8L MI$*56F*GBQO$9$9#$>W[	--iW[-\Byk**%%ft%<]JdKQrG T%5%5n%EwOQ QWWY/0QH Q   	G!!-0yy!5w?<dkkm<DAq1uQ !A!( =A uuX&87<"3 4= 	 --}l.KMde
#Z$AB}  )oo/

  0 B &	B 	B
   	SEeIo$>egxyA(/5<(?1RAPQE"RE,	S 	&&z2))*=>\:6N+g:N&&{m[1 (':;(;'() *
 &l4EF'	2HJZ([\%i0F&WXMo$6H $ ; ;K R	 -1 	dC!$!6!<" BC!.sww}/EGW_b!cC	d !11?CmU`dmUmo 	t//0@(KL--.?@
(
[
 w
 *	
 &9;G
 ,
 *
 <
D:^hlm
 
 +=,79KL 3124
 mIm_,UV
  ,75@12g=45>  FG'
( ;)
* 8*d+
, H-
.  +?AR!S/
0 ;1
2 "1$t5
< 	,.brvw6 (.IJL c"C'LH L
 )/QR%T ($...9Q\].*^^%T! %T
 #44;R;RSY;Z"Z #_2E:]dnn_>]  ,4NN,< !d(	=(,,Y7$X.226D6B2F	 NN=&1NM	 $$V,5$ $!8Y	2G(,,-=> .C.I.I.K d*J
% &0O$((0E9jE>Q2$")o5
"l9dJ&OO
 b(9$::!( @A uuX&8zAR0?*@
 ).ZL:NS]R^^iPjlnp %%7:z+4+GRgWaMbd'd!dF &8!"%[\\**3/
$--z/?/?@ 	@ILL)))4E @1!O @IC7NC$19$258A;$?S	@@	@ #**,556TU
 99	 '
(D #zz.9#zz.9#/#7#7R#@L''3BQ'7!ZZ8-1ZZ-G(G(G9=H9M9S9STX9Y%ZAaggi%Z!ZZ0668$0$/$=  77'QV7WLj9##$op#)ELL113411 V5"%
111E8	 2 :L !-\ <
   !B0(<`br
 %!9_	$%@ABSTUghixyz{|  ~V  W  Xf  g :(Ccd$4?C]4]0"<> =DOOK,[9 00xH ??hW::;LhW 	  #33LADOe, #=>((+,CnnS)ACFTU (+D$99%FLD&*jjm-0A-?.1$**Q-.@% 
  R    &   :[]^   &C\I+K != UN  nMo*p & ")fd!;!Ar F Fw O #%88E5#9D#FPQUQ[Q[\cQdFeTZZ%7(%B C %&&&, ".d0A357LNc')@BZ!#6	5G QV	"WD t%LMC__S+6778$46D01XXl+3)+D&#?@t%DECKK>>#w7*.//#?T*UW X "!%!5!5 \r' )./"0 [    #N 3 TUY]]%)N  :gg34:GGG,	  NN38	$(NN3$H!	)&7DO' G+(9W"h.AR+<*=X\Y"f,(9W:   //TCl0mnL|Y-?-?@.2*++)(?[eij
 	 IlLAB :{<89 	 --34>>-Y[;\\*%%dnnT:&FGI XLW )];.UU/<DDBKKOOD\O"3M"BB	? 6Cwwz*m;15-.6 J 	HCAS		
 %%l4&BCoofi.L.LM S"=+TR 	 	0M0MNH##% !-1G OOFI,J,JK T !-1G OOFI,O,OP T,2$.$6DOOFI,K,KL Q |4P $ S 	^ $(#8#8xQY[b#c ($45IQfL%Tz &[> *i0 		s3   (!AJAJ"9AJ(AJ$
AJ) J)AKK AKFr  NFrB  r  )Ar   r   r   IE_DESCr   r   r  
_VALID_URL_EMBED_REGEX_RETURN_TYPEr  _formatsr  _GEO_BYPASSIE_NAMEr  r  _TESTS_WEBPAGE_TESTSr  r  r  r  r  r  r  r  r  r  r	  r#  r  r6  r9  rC  rH  r=  r>  rV  rr  rv  r|  r  r  r  r  r  r  r  r+  r/  r6  rB  rF  rR  r`  rd  rx  r|  r  r"  r  r  r   __classcell__r  s   @rx   rk  rk  W  s|7   G !B 	SXX6GGH$A"JH		8L& LO
lUSC5QS_eflUSC5QS_efl 	eu?l 	ecSERT`fg	l
 	ecSERT`fgl 	edcUSVbhil 	ecSERUaghl 	ecSERUaghl 	ecUfMl 	eddeTWcijl 	eddeTWcijl 	fscXVYejkl 	fscXVYejkl 	ftshWZfkll  	fttxX[glm!l" 	ecSERUagh#l$ 	ecSERUagh%l, 	es45Y\hn  B  C-l. 	es45Y\hn  B  C/l0 	es45Y\hn  B  C1l2 	etDEZ]io  @C  D3l4 	vTX^amr  CF  G5l6 	vTX^amr  CF  G7l8 	vTX^amr  CF  G9l> 	es5EZ\hn  B  C?l@ 	es5EZ\hn  B  CAlB 	es5EZ]io  @C  DClD 	es5EZ]io  @C  DElF 	es5EZ]io  @C  DGlH 	etEU[^jp  AD  EIlJ 	uEU[]io  @C  DKlL 	u5EZ\hn  B  CMlR 	uLTZ[SlT 	uLTZ[UlV 	uLTZ[WlX 	uLTZ[YlZ 	u\U[\[l\ 	u\VL]l^ 	uLTZ[_l` 	uLTZ[alb 	u\U[\cld 	uLTZcefelf 	u\U[dfgglh 	u\U[\iln 	u\USUdnoolp 	u\USVeopqlr 	u\USVeopslt 	u\UYcdulv 	u\UYcdwlx 	u\VZdeylz 	u\VZde{l@ 	vs<flx}~AlB 	vs<flx}~ClD 	vtLgmy~ElF 	v\hnz  AGlH 	vs<flx}~IlJ 	vs<flx}~KlL 	v\X^jopMlN 	v\UZ[OlP 	v\UZ[QlR 	v\UZ[SlT 	v\UZ[UlV 	v\UZ[WlX 	v\UZ[YlZ 	vlV[\[l\ 	vlV[\]l` 	vlV[\alb 	v\UZcefcld 	vlV[dfgelf 	vlV[dfgglh 	vlV[\ilj 	vlV[dfgklp 	v,WZ[qlr 	v,WZ[slx 	vlfUWXylz 	vlfUWX{l| 	vlfUXY}lB 	*f%ClH 	uLTcdIlJ 	uLTcdKlL 	uLTcdMlN 	uLTcdOlP 	uLTcdQlR 	u\UdeSlT 	u\UdeUlV 	u\UdeWlHZ IKG^Kmu @ 0	
 8 e z E 56  B c c  $T  S!" z#$ !$*-1 M4&5	
^B ;.#)^E $	
A^\ O7mu @ 0	
 8 e z E 56  B c c  $T  S!" z#$ !$*-1 M4&16  ; 	
[^^ AD#)!2 26 4	
]^@ Amu e E	
 C z w c 8 $T Y c  z Y  :!" 
#$ !)&i(*-& C*38 262;!	
^F 3<mu R b	
 C z R xj Y  Y c = z 
  8!" $T#$ "*-) E,!$'+&3	
E^D G<mu 6 E	
 z R  8 = Y c / z 5 S  c!" C#$ &**-) I0!$'+1	
C^@ L<m> u z	
 E R c  8 c U + z K $T  /!" C#$  Z!$*-, H//	
^z 8<mu @ E	
 z . Q l c $U 8 O c 2 C  <!" 8#$  'i (Y)"*-( D+5	
y^z 5<!	
y^H !mu C z	
 : E 6 ]  
 8 c z : Y  c!" #$ %%)Y&i&*-& C*7< ("?"	
G^P	 !mu D z	
 E P c $Z $T xj 
 :   s 8 S  Q!" #$  *!Y*-& C*'+38  !2; 	
O	^T
 Amu "7 B	
 z    X S $T ; Q 
 Y 8 S c  /0!" c#$  * *!$*-' D+1	
S
^P !# k!)  !2 1	
O^n A#?E)( )	
m^J ?5#)bL 26 1	
I^n A#KE  -5 W "#I	
  -c "#] #H ( ": !8* ": J (  !W  $S!"  #$ #&"<."%$. /#*$C3:  -5 W #H	
 "#]  -c "#I    !# J !"< ( $S  ":!"  !W#$ %/)-#-#+*"% /#*$C3:  -5 Y  !W	
 !"< !# #H ( ": "#I -c J #J $S "#]  !" !8*#$ *4#-!" %"% /#*$C3qTj '-}_	
i^l A#J  +		
i^~ 2!	
}^F u!	
E^V Amu O [	
 E C z N  M Q Y 12 c z  Y!" 8#$ # ((%)!*-16  A#	
M^X A!	
U^b A#FE)   1	
_^@ A!	
}^J Amu ? E	
 C z Q 8 Y c Q e L  c  {m!" Y#$  *%)*- M, E16  ; 	
G^J Amu S E	
 D z Q $T 
 c 8 Q  01 +  Y!" c#$  *Y!$*- , H/'+&7<  ?"	
I^P a!	
O^Z A!	
W^d A#)E)5   3	
a^D Amu 8 E	
 D z ,   !! Y 
 c  Q 8  ;!" /#$ %8Y!%))*-$ A(!$'+;@   )"K(	
A^X A#;E)   b	
S^x !!	
u^B !!	
^J <!	
I^R G!	
Q^\ ?!	
Y^f A!	
c^p A#^E)( "&16 )!	
m^V Cmu  E	
 z I; YK  > 
 ] c $T c wi  Y!" 9#$ & (Y8")*-5:  A#	
Q^Z E!	
Y^d !#TE)&[B	   (!	
a^H Amu  r	
 z c Y c 8  Y  Q /0 A  $T!" z#$ -*-- H/-2  7	
E^L Amu F E	
 z 8 c Y z {m  O 
 $T Q  c!" C#$ '!$*- ' Y@'+&5:  E%	
C^R A!	
O^Z G!	
Y^d !mu  E	
 z 3   c z Z C Q c Y  4!" 4#$ M8 (S&i%)*-5!$5:  ?"	
a^j A!	
g^t Amu ` 8	
 z E C 01 c > G O R  Y  c!" z#$ &**-* F-!$'+1	
q^p !mu U E	
 z D 01 8 c . t U Q  Y  z!" $T#$ +./ N5+0  5	
m^j !!
g^r C!
o^z A!
w^B  Am9 u z	
 8 e E C / c < V S Q   c!" z#$ &**- ( E,!$'+&5: #,.L"M?#
^J! C! 9}yk.J"K		
G!^X! @!
U!^^! "@mw U 0	
 E z c 8 Y c S $T 
  9  z!" C#$  +m*- % B)!$'+&78 %,dC? 
]!^`" Amu G E	
 8 Y B c Q xj 
 $T z z c  !" =#$ Z!$*-) E,&1
]"^Z# Amu G E	
 8 Y B c Q xj 
 $T z z c  !" =#$ Z!$*-) E,&14 %'J&KL;
W#^V$ Amu ? E	
 8 Y C c Q / 
 $T z $Z 
  z!" c#$ !)%S*-&* C!$'+&7 
S$^X% Am  G u 8	
  Q $Z z Y y S ? )# 
 
  /0!" c#$ "%)E),+ F-14 '-;	
U%^R& Amu E z	
 c 
 < 4 Q wi c r Y 8 z  $T!" )##$ ,( E-
Q&^J' Amu @ r	
 .  c Y c $T 
 4 Q A z  z!" /0#$ 9 D+/+. '-7
E'^@( Amu . 	
 A z 8 z c /0 4 ?  Q K  $T!" Y#$ !E+/), )-VVZU[L\@]^"F!G5
}'^t( &@!
s(^|( :@mu / E	
 z C )# Y ? 9 $T c z Y Q  !" 8#$ "% B)!$'+&36 +4ow5O)P\cd=
{(^z) C@mv > Y	
 8 )# E z K $T c / O R +  c!" #$ "%),/ H/2 +4o5W)Xdmn9
y)^v* >mu Q  	
 J z S Y c 
 t   f c $T D  !" )##$ 9./)%/2E3 F-'+&9 	
u*^z+ Amu c	
 I > c Q )# z z C 	  F  E!" N#$ ~%& A'( 95Y%)!$'+&5: !9]f\g.h"i?"	
w+^FF- {5mu < z	
 E Q k 8 $T O c   . z Y  !" C#$ "56*-/ X?&16  ; 	
#NJ % % 
.'`mF^ 48 >lK    	/;((AT/*  D	Q)4"0'7R 4 4.  0/bv(p 9 9	R = = 
 
 	^ 	^ ^ ^4-0Rh
zx$LC$W.Vrz   rk  c                   2   e Zd Zed        Zed        Zd Zd Zd Zd Z	d"dZ
d Zd	 Zd
 Zd Zd Zd Z	 d Zd Zd Zed#d       Zed        Zd Zd Zd Zd Zd Zeefd       Zd Zej>                  d        Z d#dZ!d#dZ"d$dZ#d%d Z$dZ%e&dfd!Z'y)&YoutubeTabBaseInfoExtractorc                 L     d t        j                          fd       }|S )Nc                 `   | j                  d      dvr| S |j                  d      rst        j                  j                  | d         }|j                  dv rC|j                  d       t        j                  j                  |j                  d            | d<   |rt        | d   |      | d<   | S )Nr  )r  rE  r  r  )r   rA   rA   netloc)	r+  r8  r9  rj  r3  r  rl  rm  r'   )r  r  rp  s      rx   _smugglezGYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>._smuggle  s    xx (BB  0#\\224;?
$$(PP!%%n5"(,,"9"9*:M:MUh:M:i"jDK)$u+}EUKrz   c                     t        |i       \  }| j                  |      rdd<    | |      }r, |       |j                  d      rfd|d   D        |d<   |S )NTr  r  c              3   L   K   | ]  } |j                                 y wrB  )r   )r   r  r4  r  s     rx   r   zYYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper.<locals>.<genexpr>  s"     +lRSHQ8J8J8L,M+l   !$)r1   r  r+  )r  r  r  r  r4  r  s      @rx   wrapperzFYoutubeTabBaseInfoExtractor.passthrough_smuggled_data.<locals>.wrapper  so    !.sB!7C  %04n-T36IM2==++lW`ajWk+lIi(rz   )r   wraps)r  r8  r4  s   ` @rx   passthrough_smuggled_dataz5YoutubeTabBaseInfoExtractor.passthrough_smuggled_data  s,    
	 
			 
		 rz   c                     d}| j                         D ]E  \  }}t        |t              s||v r|c S |j                  d      s1|j	                  d      sC|c S  y )N)playlistRenderervideoRendererchannelRenderershowRendererreelItemRenderergridRenderer)r   r  r7  r-  r  )rN  known_basic_renderersr  r  s       rx   _extract_basic_item_rendererz8YoutubeTabBaseInfoExtractor._extract_basic_item_renderer  s\    !
 "ZZ\ 	 MCh---'CLL,D	 rz   c           
         | j                  |d         }| j                  |d      }t        |d dd       }| j                  t	        |ddt
        hfd            }|s!| j                  | j                  |d	            }i d
dd|d|dt        j                         d|d|d|d|d|d|dt        |d dd       dt	        |d	d| j                        d| j                  |d      d| j                  |d	      | j                  |d      nd d| j                  |d      d| j                  | j                  t	        |d            t        j                        rdS d S ) Nrh  r  ro  r  r  r  Fr  r  r  r  r   r  r  r  r  r  r  r  r  r  videoCountTextrr  rU  rZ  r  r  r  r  r  T)r  r  r   r  r+   r`  r  r  r  rS  r\  r@  r<  r   r   )r  r  r  r  r  r  s         rx   _extract_channel_rendererz5YoutubeTabBaseInfoExtractor._extract_channel_renderer+  s   &&x'<=
x1":t5Ycgh--$ 'O$ !&'(
 !00J_1`aN
U
;
 *
 l))+	

 u
 
 *
 ;
 U
 >
 L?[eij
 %l/1AQUQ`Q`'b
  $228[I!
"  ??8-BCO *:;UY)
* 4>>(4HI+
, "4??$$\(M%JKYM_M_,a4-
 	
. gk/
 	
rz   c           	   #     K   |d   D ]S  }t        |t              s| j                  |      }t        |t              s7| j                  |d      }|j	                  d      }|r-| j                  d|z  t        j                         ||       |j	                  d      }|r| j                  |       |j	                  d      }|r| j                  |       t        dt        |d	 t                    }|st        t        t        fD ]J  }	|	j                  |      s| j                  ||	j                         |	j!                  |      |        S V y w)
Nr   r  
playlistId(https://www.youtube.com/playlist?list=%sier  r  r  rh  r   c                     | d   d   d   d   S )Nr  r  r  r  r   r]  s    rx   rV  z;YoutubeTabBaseInfoExtractor._grid_entries.<locals>.<lambda>n  s    A&:$;<M$NOc$dej$k rz   )r  r7  rD  r  r+  rt  r  r  r  rG  r4   r-   r`  YoutubePlaylistIErk  r  r  )
r  grid_rendererrN  r  r  playlist_idr  r  ep_urlrL  s
             rx   _grid_entriesz)YoutubeTabBaseInfoExtractor._grid_entriesQ  s^    !'* #	DdD)88>Hh-NN8W5E #,,|4Koo>L#**,{ % & ' ' ||I.H))(33!k2J44X>>7k: F '):IF B{{6*"oo"ryy{R\\&=Q_d . f f	?#	s   C;E >%E $<E c                    t        |d      }|r6t        |d      }| j                  d| t        j                         ||      S t        |d      }|rct        |d      }|r,| j                  d| d| t        j                         |      S | j                  d	| t        j                         |      S t        |d
      }|r)| j                  d| t        j                         |      S y )N)playlistItemDatar  )flexColumnsr   )musicResponsiveListItemFlexColumnRendererr   rH  r   r   z"https://music.youtube.com/watch?v=)rL  r  r  )r  watchEndpointrI  r  rW  r  z&list=rL  r  (https://music.youtube.com/playlist?list=)r  r  r  z!https://music.youtube.com/browse/)r+   rt  rk  r  r  )r  r  r  r  rP  	browse_ids         rx   _music_reponsive_list_entryz7YoutubeTabBaseInfoExtractor._music_reponsive_list_entryw  s&   *IJ  ,+ ,E ??%Gz#R&/&6&6&88SX # Z Z"8-bc#H.`aH)KH:U[\g[h'i*6*=*=*?+ ' W W??%Mk]#[&2&9&9&;k # S S +_`	??%Fyk#R&2&9&9&;i # Q Q rz   c              #      K   |j                  d      }t        |t              sy |j                  d      xs |j                  d      }|r| j                  |      E d {    |j                  d      }|ry y 7 w)Nr  gridRendererexpandedShelfContentsRendererhorizontalListRenderer)r+  r  r7  rR  )r  shelf_rendererr  r  s       rx   _shelf_entries_from_contentz7YoutubeTabBaseInfoExtractor._shelf_entries_from_content  sx      $$Y/'4(;;~.^'++>]2^ ))(333;;78  4s   AA;A9 A;c              #      K   t        |d t              }t        d|      }|r.|rd|v ry | j                  |d      }| j	                  ||       | j                  |      E d {    y 7 w)Nc                     | d   d   d   d   S Nendpointr  r  r  r   r]  s    rx   rV  z<YoutubeTabBaseInfoExtractor._shelf_entries.<locals>.<lambda>  s    a
m4E&FG[&\]b&c rz   rz  z
/channels?r  )r  )r-   r`  r4   r  rt  rb  )r  ra  skip_channelsr  	shelf_urlr  s         rx   _shelf_entriesz*YoutubeTabBaseInfoExtractor._shelf_entries  sq     c 5r:	 !:NN>7;E//)/??33NCCCs   A#A-%A+&A-c              #      K   |d   D ]o  }t        |t              s|j                  d      xs |j                  d      }t        |t              sI|j                  d      }|s]| j                  |       q y w)Nr  playlistVideoRendererplaylistPanelVideoRendererr  )r  r7  r+  r  )r  video_list_rendererr  r  r  s        rx   _playlist_entriesz-YoutubeTabBaseInfoExtractor._playlist_entries  sw     *:6 		0Ggt,{{#:;hw{{Kg?hHh-||I.H%%h//		0s   A9A;c           	   #     K   t        |dd      xs i }|j                  d      }|r| j                  |       y |j                  d      }|r=| j                  d| t        j                         || j                  |d             y y w)	N)r  )r=  r@  r<  Fr  r  rI  &https://www.youtube.com/playlist?list=r  rK  )r+   r+  r  rt  r  r  r  )r  rich_grid_rendererr  r  rP  s        rx   _rich_entriesz)YoutubeTabBaseInfoExtractor._rich_entries  s     R\ac ifh 	 <<	*%%h//ll<0//8F&&(; NN8W= " ? ?  s   BBc                 L    |j                  d      }|r| j                  |      S y )Nr  )r+  r  )r  video_rendererr  s      rx   _video_entryz(YoutubeTabBaseInfoExtractor._video_entry  s+    !%%i0&&~66 rz   c                     t        dt        |d            }|r6| j                  |t        j	                         | j                  |d            S y )Nhttps://youtube.com)onTapCommandr  r  r  hashtag)rL  r  )r4   r+   rt  r  r  r  )r  hashtag_tile_rendererr  s      rx   _hashtag_tile_entryz/YoutubeTabBaseInfoExtractor._hashtag_tile_entry  s[    +\!#c.e f??++-T^^DY[d5e # g g rz   c              #   l  K   t        |d t              }|sy t        |d t              xs i }|j                  d      }|r| j                  |      }|r| t        |d t              }|r+| j                  d|z  t        j                         |       t        |d t              xs g }|D ]  }t        |t              st        |d t              }	|	s)t        j                  |	      s?t        j                  |	      }
||
k(  rZ| j                  |	t        j                         |
        y w)	Nc                     | d   d   S )NpostbackstagePostRendererr   r]  s    rx   rV  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    AfI6M,N rz   c                     | d   d   S )NbackstageAttachmentr=  r   r]  s    rx   rV  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    Q'<%=o%N rz   r  c                     | d   d   d   S )Nr  r<  rI  r   r]  s    rx   rV  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    Q'<%=>P%QR^%_ rz   rJ  rY  c                     | d   d   S )Nr  rH  r   r]  s    rx   rV  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    -0@0H rz   c                     | d   d   d   S )Nr  urlEndpointr  r   r]  s    rx   rV  zBYoutubeTabBaseInfoExtractor._post_thread_entries.<locals>.<lambda>  s    q!56}EeL rz   )r-   r7  r+  r  r`  rt  r  r  r  r  rk  r  r  )r  post_thread_rendererpost_rendererrt  r  r  rP  rH  runrQ  ep_video_ids              rx   _post_thread_entriesz0YoutubeTabBaseInfoExtractor._post_thread_entries  sH     "NPTV NPTV \Y[ 	!%%i0''7E_adf//:[H&&(; " @ @ }&H$OUSU 	WCc4(LcSF%%f-#--f5K;&//&Y-=-=-?+/VV	Ws   D2D4c              #   B  K   |j                  d      }t        |t              sy |D ]r  }|j                  d      }t        |t              r| j	                  |      E d {    >|j                  d      }t        |t              s`| j                  |       t y 7 =w)Nr  backstagePostThreadRendererr=  )r+  r  r  r7  r  ru  )r  post_thread_continuationr  r  r  s        rx   !_post_thread_continuation_entriesz=YoutubeTabBaseInfoExtractor._post_thread_continuation_entries  s     +//
;(D) 	2G{{#@AH(D)44X>>>{{?3H(D)''11	2 ?s   ABB &BBc              #   r   K   t        |d      D ]$  }| j                  t        d|      t               & y w)N)r  .reportHistoryTableRowRenderercells.reportHistoryTableCellRenderercell"reportHistoryTableTextCellRendererr   rH  .r  r  r  r  rz  )r+   rt  r4   rk  )r  r  r  s      rx   _report_history_entriesz3YoutubeTabBaseInfoExtractor._report_history_entries  s@      +V W 	VC //'*CS"I9UU		Vs   57c              #      K   d gd d  t        |d t              xs g }|D ]  }t        |t              st	        |dddt              }|s|j                  d      r2 j                  |d         D ]  }|   j                  |      d<   nJ|j                  d      r9t	        |d	      } j                  |      E d {     j                  |      d<   t        |d
 t              xs g }|D ]  }	t        |	t              s j                   j                   j                   j                   fd j                   fd fd fd fd fdd}
|	j                         D ]6  \  }}||
vr |
|   |      D ]	  }|s|   j                  |      d<      d   r j                  |      d<    d   s j                  |      d<   y y 7 w)Nc                     | d   S Nr  r   r]  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>  s
    a
m rz   r)  musicShelfRenderermusicShelfContinuationrr  richItemRendererr   reportHistorySectionRenderer)r  tabletableRendererc                     | d   S r  r   r]  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>*  s
    !J- rz   c                 (    j                  |       gS rB  )r\  r   r  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>4  s    $BbBbcdBeAf rz   c                 (    j                  |       gS rB  )ru  r  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>6  s    0A0A!0D/E rz   c                 0    j                  dd| igi      S )Nr   r<  rR  r  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>7  s!    $2D2DgQcefPgOhEi2j rz   c                 0    j                  dd| igi      S )Nr   r>  r  r  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>8  s!    1C1CWPacdOeNfDg1h rz   c                 (    j                  |       gS rB  )r{  r  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>9  s    d6N6Nq6Q5R rz   c                 (    j                  |       S rB  _extract_entriesr   continuation_listr  s    rx   rV  z>YoutubeTabBaseInfoExtractor._extract_entries.<locals>.<lambda>:  s    $2G2GK\2] rz   )playlistVideoListRendererr^  reelShelfRenderershelfRenderermusicResponsiveListItemRendererr  r=  r<  r>  hashtagTileRendererrichGridRenderer)r-   r  r  r7  r+   r+  rr  r  r  rn  rR  ri  r  r   )r  parent_rendererr  r  r  is_rendererr  r  isr_contentsisr_contentknown_renderersr  r  s   ` `          rx   r  z,YoutubeTabBaseInfoExtractor._extract_entries  s!     $v!?,CTJPb -	OGgt,&.0DF^"$K ;;12!%!3!3G<N4O!P $#$+/+E+Eo+V%a([[!?@(2lmE#;;EBBB+/+E+Ee+L%a(";0GNTRTL+ !+t4 261G1G$($6$6)-););%)%8%87f373L3L%E(j'h+R(]# &1%6%6%8 MC/1 !5!5h!? ( "'K( ,0+E+Eh+O%a(#4 %Q''+'A'A+'N!!$[-	O^ !##'#=#=o#Na  $E Cs   B>G"GCG"$G"-3G"c              #   F   K   d g fd}t        |d t              }|sy t        |d t              xs t        |d t              xs i } ||      E d {    d   }	t               }
t        j                  d      D ]  }|	s y |	j                  d      }|||
v r j                  d        y |
j                  |        j                  |||	      } j                  | d
| |	||d      }|s y  j                  |      xs |} 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      }t        |dd t        i       }d }|j!                         D ]B  }||vr||   \  }}|r||in|}d g ||      E d {    d   xs  j#                  |      }	D |r y  y 7 7 )w)Nc                 (    j                  |       S rB  r  r  s    rx   rV  z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>M  s    D$9$9!=N$O rz   c                     | d   S )Nr  r   r]  s    rx   rV  z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>N  s
    Qy\ rz   c                     | d   S )NsectionListRendererr   r]  s    rx   rV  z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>R  s    1-B+C rz   c                     | d   S )Nr  r   r]  s    rx   rV  z6YoutubeTabBaseInfoExtractor._entries.<locals>.<lambda>S  s    a0B.C rz   r   r   r  z5Detected YouTube feed looping - assuming end of feed.r   r  r   page )continuationContentsonResponseReceivedActionsr  )r  r  r  r   r  r   r  r  )r=  gridPlaylistRenderergridVideoRenderergridChannelRendererrk  r)  r  r  r  playlistVideoListContinuationgridContinuationitemSectionContinuationsectionListContinuation))r  r  .r  r	  r  Fr  rs  )r-   r7  r  r  rP  r+  r  r  r  r  r  rR  rn  r  r  r+   r\  r  )r  tabr  r   r  r  extract_entriestab_contentr  r  seen_continuationsr  continuation_tokenr  rz  r  r  continuation_itemvideo_items_rendererr  r  
parent_keyr  s   `                     @rx   _entriesz$YoutubeTabBaseInfoExtractor._entriesK  s    !FOc#94@K!CTJ Q{$CTJQNP 	 #?333(+ U!* 6	H!-!1!1.!A!-2DHZ2Z  !XY""#56//N 0 WG--")6(4"G5s . uH
   55h?O<L #'"4"4g!>)-););W(E&*&8&8'%B(,(:(:G'D*.*@*@*)M(7'D%4j$A040V0VXb/c262N2NPV1W262H2H$1O%)%7%7$>,0,R,RTX+Y,;T+BO  ".h 9 &u"6 !--?DX\fh i#' (--/ ho-#23#7 jKU
4F'G[m$%)F! 455503gt7Q7QRf7gh (m6	 	4j 6s+   AH!HFH!5H6 H!H!H!c                 V    | D ]  }|j                  d      s|c S  |rt        d      y )NselectedzUnable to find selected tab)r+  r   )tabsr  tab_renderers      rx   _extract_selected_tabz1YoutubeTabBaseInfoExtractor._extract_selected_tab  s;      	$L
+##	$  !>?? rz   c                 &    t        | dt              S )N)r  twoColumnBrowseResultsRendererr  .)tabRendererexpandableTabRendererrr  )r+   r7  )rz  s    rx   _extract_tab_renderersz2YoutubeTabBaseInfoExtractor._extract_tab_renderers  s    {  LPQ 	Qrz   c                 :   | j                  ||      }| j                  |      }|dxx   t        |dd      z  cc<   |dxx   t        |dd      z  cc<    | j                  | j	                  ||d   || j                  ||      | j                  ||            fi |S )Nr  z - %sexpandedTextr   )_extract_metadata_from_tabsr  r   r  r  r  r  )r  r  r   r  r  metadataselected_tabs          rx   _extract_from_tabsz.YoutubeTabBaseInfoExtractor._extract_from_tabs  s    33GTB11$7\,II\,PP#t##MMhtne,,UD9**479
  	rz   c                    d|i}t        |dt              }|rXt        |d| j                  hfd| j                  hf      }|j	                  |j                  d      |d       |d   r|d   |d<   nt        |d	t              }d
 }| j                  |d      }|r% ||d   d         }|r|j                  |ddd       | j                  |d      }	|	D ]  }
d|
d<   	 |	r% ||	d   d         }|r|	j                  |ddd       | j                  |d      }t        |dt              }| j                  |d      }| j                  |d      }|j	                  t        |d      xs | j                  |d      xs |d   | j                  |      | j                  |d      t        |d       t        |dddd t        hf      xs t        |d!d" hd f      |xs ||z   |	z   d#       t        |d$| j                  hfd%&      xs t        |d'd d(| j                  hfd%&      }|r!|j	                  |t!        |d d)d *      d+       | j#                  t        |d,d%&            }| j%                  |t&        j(                        rd-|d.<   t+        ||fd/      }| j-                  | j                  |d0      xs | j                  |d1            }t/        |      |d2<   | j                  |d      |d3<   |d3   | j                  |d4      |d3<   |d3   | j                  |d5      |d3<   | j                  |d      |d6<   |d6   | j                  |d7      |d6<   |j                  d      st        |d8      }|st        | j                  |d9      d:      }| j                  |      }t        |d;      xs i }|j	                  | j1                  d<|d=|*      | j                  |j                  d>            | j                  t3        d?|j                  d@                  dA       |j	                  |dB   t!        |j                  d      d dCd *      t!        |j                  dD      d d)d *      dE       |S )FNr   )r  channelMetadataRendererrr  
externalId
channelUrlr  )r  r  r  r  playlistMetadataRendererc                 J    t        | xs dj                  d      d   dz         S )Nr   r  r   z=s0)r3   rt   r  s    rx   _get_uncroppedzOYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>._get_uncropped  s&    	r005a85@AArz   avatarr   r  avatar_uncroppedr   )r  r   r  )r  .)bannermobileBannertvBannerr&  r  banner_uncroppedr  "playlistSidebarPrimaryInfoRendererr  playlistHeaderRenderer)thumbnailRenderer)playlistVideoThumbnailRendererplaylistCustomThumbnailRendererrZ  )playlistHeaderBannerheroPlaylistThumbnailRendererrZ  )r  hashtagHeaderRendererry  )r  .r  c                 &    | j                  dd      S )Nr  r   r(  r]  s    rx   rV  zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    mUW@X rz   r  microformatDataRendererr  .rM  c                 4    | xr t        j                  |       S rB  )shlexrt   r]  s    rx   rV  zIYoutubeTabBaseInfoExtractor._extract_metadata_from_tabs.<locals>.<lambda>  s    PQPdV[VaVabcVd rz   )r  r  r  r  r  rU  )vanityChannelUrl)	ownerUrls.Fr  r  channelHandleTextr  r  )r  r  )r  .r7  Tr  ))stats
briefStatsnumVideosTextr   )byliner   playlistBylineRendererr   modified_dater  r  )r  r  r  .r  r  r  r  .r)  r  . channelAboutFullMetadataRendererr  r  )r	  r   r	  r   r  $playlistSidebarSecondaryInfoRenderer)
videoOwnerr  r  )rH  r   r  r  z^by (.+) and \d+ others?$r  r  rz  r  )r  r  r  r  ro  r  )r  r  r  )r+   r7  r  r  r<  r+  r\  r  _extract_sidebar_info_rendererr  _extract_availabilityrS  r-   r`  r  r  r   r<  r@  r   r   r   rm  r*   r  r4   )r  r  r  r  metadata_rendererr  r  avatar_thumbnailsuncropped_avatarchannel_bannersr  uncropped_bannerprimary_sidebar_rendererplaylist_header_rendererprimary_thumbnailsplaylist_thumbnailsr  channel_badgesplaylist_statslast_updated_unixr  
owner_text	browse_eps                          rx   r  z7YoutubeTabBaseInfoExtractor._extract_metadata_from_tabs  s)   g(/Vfjk%&7,IZIZH[9\'3d6H6H5I&JLJKK,009(  L!!,/T
 ,T3[ko p	B !445FQ-.?.B5.IJ!((+,"#*  22IK% 	'F#&F< 	' -oa.@.GH&&+,"$(  $(#F#FtMq#r #/6Zjn#o !55$  'PQ"66$&ln 	"#4g> $.\]$d 66t<&*ood<b&c"#46XY!$8QSY[^ad`e(fg m$%6FdEegj8kl-D1DHYY\kk

 
	 *-UX\XlXlWm,nx}~ nD8S2EH[H[G\"]glm 	 KK- ,^TC_im n 
 --l4AZdi.jk??>9+=+=>*.D&' #%'?@Bnp !11NN>1- i~~68ghj !11B C_!__^Q?\%!%1I?![D%!% 8~ "D "&!C !)%)__5MO~%D!"xx% !9;GE$77>deAC .J$U,_`fdfIKK--.JJXblv-w"//	j0IJ#33G<UW`WdWdewWx4yz  	Y'(>Fjtxy(-)@$Hdnrs
 	 rz   c           
   #     K   d x}x}t        j                  d      D ],  }t        | j                  |            }|s y t	        fdt        |      D        d      dz   }	|	t        |      k\  r y ||	d  E d {    |xs |d   d   }|d   d   t        |d       }
| j                  || j                  ||      | j                  |||            }||
j                  d      xs |
j                  d	      xs t        |      |
j                  d
      xs dd}| j                  d||fz  |d||d      }t        |d t              }/ y 7 խw)Nr   c              3   :   K   | ]  \  }}|d    k(  s|  yw)r   Nr   )r   r  r?  last_ids      rx   r   zGYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<genexpr>+  s      P1QtW=O!Ps   r   r   r   c                 $    | d   d   d   d   d   S )Nr  r   rl  r  rW  r   r]  s    rx   rV  zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>2  s!    AjM"$56R$STh$ijy$z rz   r  r  indexr  zOAE%3D)rI  r  r	  r  z
%s page %drw  r  )r  r  r  r  r   r  c                     | d   d   d   d   S )Nr  r  r  r   r]  s    rx   rV  zFYoutubeTabBaseInfoExtractor._extract_inline_playlist.<locals>.<lambda>B  s    AjM2M$Nz$Z[e$f rz   )r  rP  r  rn  rw  ri  r  r-   r  r  r  r+  r  r7  )r  r  rP  r  r   first_idrz  r  videosr^  watch_endpointr  r  r	  s                @rx   _extract_inline_playlistz4YoutubeTabBaseInfoExtractor._extract_inline_playlist%  s    (,,,7X!* 	nH$00:;FP	&(9PRTUXYYEF#ef~%%26!9T?HRj&G$z|N//D,H,HPT,U!77$N 0 PG *)--i8CG'++G4CF(,,X6B(	E --$X'>>u) . H
 fhlnH5	n &s   A7E:E;CEc                    |j                  d      xs t        |d t              }|j                  d      xs |}t        |t        |d t                    }t	        j
                  d|      }	|r.||k7  r)|	s'| j                  |t        j                         ||      S | j                  | j                  ||||      ||      S )Nr  c                     | d   d   S )N	titleTextrF  r   r]  s    rx   rV  zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>F  s    AkN<8 rz   rI  c                     | d   d   d   d   S re  r   r]  s    rx   rV  zDYoutubeTabBaseInfoExtractor._extract_from_playlist.<locals>.<lambda>K  s    *.? @AU VW\ ] rz   zMLCT|RLTD[\w-]{22}rK  )rP  playlist_title)r+  r-   r`  r4   r+  	fullmatchrt  r  r  r  r!	  )
r  r  r  r  r  r   r  rP  playlist_urlis_known_unviewables
             rx   _extract_from_playlistz2YoutubeTabBaseInfoExtractor._extract_from_playlistD  s    W% ?8#*?ll<0;G sG]%  !ll+@+NLC/8K??!4!4!6! # # # ##))(KuM#E $ ; 	;rz   c                    | j                  |d      xs i }t        |d      xs i }|j                  d      }| j                  t        |d            }t	        ||fddddd	d
 dddf	t
              }t        |dt              }| j                  |t        j                        s
|dk(  s|dk(  rdS | j                  |'| j                  |t        j                        xs |dk(  n||dk(  nd|'| j                  |t        j                        xs |dk(  n||dk(  n||nd| j                  |t        j                        xs d| j                  |t        j                        xs 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  privacyr7  privacyFormdropdownFormFieldRendererdropdowndropdownRendererr  c                     |d   d   S )NprivacyDropdownItemRenderer
isSelectedr   r  s     rx   rV  zCYoutubeTabBaseInfoExtractor._extract_availability.<locals>.<lambda>k  s    !9:<H rz   r2	  r-  r.  rr  )r  r  r%  PUBLICr  r  NPRIVATEr  UNLISTEDr  F)r  r  r  r  r  )r	  r+   r+  r<  r   r`  r  r@  r   r   r  r   r   r   r   )r  r  sidebar_rendererr	  player_header_privacyr7  privacy_setting_iconmicroformats_is_unlisteds           rx   r		  z1YoutubeTabBaseInfoExtractor._extract_availability[  s     >>tEijpnp#/6Z#[#a_a  8 < <Y G%%l3CX&NO  )%'787EWYbHJgioq{}	  $0HX\$^ 
 	(E(EF(H4'+;; 	#
 ## >S=^ OOFI,J,JK :,	9FZFf-1BBlp ?T>_ OOFI,K,KL ;,
:G[Gg-1CC5M5Y1_c#'??69;^;^#_#gcg"oofi6T6TU]Y]  $ "	#rz   c                 l    t        | d t              xs g }|D ]  }t        |fd|      }|s|c S  y )Nc                     | d   d   d   S )NsidebarplaylistSidebarRendererr   r   r]  s    rx   rV  zLYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>  s    AiL)BCGL rz   c                     |    S rB  r   )r   info_renderers    rx   rV  zLYoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer.<locals>.<lambda>  s    q/? rz   )r-   r  )r  r@	  rT  r7	  rN  r  s    `    rx   r	  z:YoutubeTabBaseInfoExtractor._extract_sidebar_info_renderer  sH    "LdT ZWY 	$ 	 Dt%?OH	 rz   c           	          t        t        |dd            }|sy| j                  || j                  ||      | j	                  ||            }dd| d}| j                  |||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  r  Fz7Redownloading playlist API JSON with unavailable videos)r  r  r  r  r  r   r  )r  r+   r  r  r  r  )r  r  r  r   is_playlistr  r  s          rx   _reload_with_unavailable_videosz;YoutubeTabBaseInfoExtractor._reload_with_unavailable_videos  s     <:<`b c++(D(DUD(Q33D%@ , B !WI
 %%WE%U%J & L 	Lrz   c                 P    d| j                  dt        j                               v S )Nr  r  rj  )r  r  r  rD  s    rx   skip_webpagez(YoutubeTabBaseInfoExtractor.skip_webpage  s&    D33F<CVCVCX3YYYrz   c                 n   d\  }}| j                  |      D ]f  }	 | j                  ||d      }| j                  ||xs d|      xs i }	 | j                  |       t        |ddd	      rUt        d
      |_	        d }h ||fS # t        $ ry}t	        |j
                  t              r>t	        |j
                  t              r|j
                  j                  dvr||_	        Y d }~| j                  ||       Y d }~ ||fS d }~ww xY w# t        $ r!}| j                  ||       Y d }~ ||fS d }~ww xY w)Nr  r  zDownloading webpage)r  r   rs  r  currentVideoEndpointr  z#Incomplete yt initial data received)rv  r  r  r   r  rx  r   r
   r}  r
  ry  r  r+   )r  r  r  r  r  r  r  r  s           rx   _extract_webpagez,YoutubeTabBaseInfoExtractor._extract_webpage  sK   "&&U&3 	E	00gDY0Z33GW]RW3X^\^//5  j2HJef,-RS/	2 }+ " agg'9:%aggy9QWW^^S]=]&' &&q&6 }+ " &&q&6 }s6   0BD
	DAD&DD
	D4D//D4c                     |s\| j                   rOd}d| j                  dt        j                               vr|rt	        | dd      | j                  |d       y	y	y	)
z>Use if failed to extract ytcfg (and data) from initial webpagezePlaylists that require authentication may not extract correctly without a successful webpage download	authcheckr  rj  z. If you are not downloading private content, or your cookies are only for the first account and channel, pass "--extractor-args youtubetab:skip=authcheck" to skip this checkTr  r  N)r  r  r  r  r   r!  )r  r   r  r~  s       rx   _report_playlist_authcheckz6YoutubeTabBaseInfoExtractor._report_playlist_authcheck  su    ..yC$"9"9&I\I\I^"9"__di$e \ \ "	# #
 t4 /urz   Nrb   c                    d }| j                   s| j                  |||      \  }}|xs | j                  ||      }| j                  | j	                  |      d      xs i }	|dk7  rL|	j                  d      dk(  r8d| j                  dg       vr$d}
|rt        |
d	
      | j                  |
d	       |s)| j                  ||       | j                  |||||      }||fS )Nr  F(https://www.youtube.com/feed/recommendedtabIdentifierFEwhat_to_watchno-youtube-channel-redirectrJ  zSThe channel/playlist does not exist and the URL redirected to youtube.com home pageTr  r  )r  rW  )rF	  rI	  r  r  r  r+  r  r   r!  rL	  _extract_tab_endpoint)r  r  r  r   r  webpage_fatalrW  r  r  r  r~  s              rx   _extract_dataz)YoutubeTabBaseInfoExtractor._extract_data  s       11#wm1TMGTAT//AE55d6Q6QRV6W_d5ekikLAA$((9=NN5T^^M[]=^^k(t<<##C4#8++E+?--c7E_m-nDU{rz   c                 F   | j                  ||      }| j                  |d|id|||dd|	      }ddd	}|j                         D ]6  \  }	t        |fd
t              }
|
s| j                  ||
|	||||d      c S  d}|rt        |d      | j                  ||       y )N)r   rW  r  rf  znavigation/resolve_urlz#Downloading API parameters API JSON)	r  r  r  r  r   r  r  r  rW  r  rw  )r  rW  c                     | d      S )Nrf  r   )r   ep_keys    rx   rV  zCYoutubeTabBaseInfoExtractor._extract_tab_endpoint.<locals>.<lambda>  s    :v9N rz   )r  rH	  r  )r  r  r  r  r   r  rW  r  z0Failed to resolve url (does the playlist exist?)Tr  )r  r  r   r-   r7  r   r!  )r  r  r  r   r  rW  r  resolve_response	endpointsr  r  err_noterW	  s               @rx   rR	  z1YoutubeTabBaseInfoExtractor._extract_tab_endpoint  s    ++%+W11E3<
T[chpu'.Sdr 2 t (0&I	#//+ 	fJFB-/NPTUF--#6b'u^#d . f f	f F D99Hg.rz   c           
   #   v  K   d|i}|t         u r| j                  }|r||d<   d}d| d}t        |D ch c]  }|d   	 c}      }| j                  s| j	                  ||      ni }	| j                  |	d       d g}
d }t        j                  d	      D ]  }|j                  |
d   xs i        | j                  |	| j                  |      |
      }| j                  | d| d||||	|      }t        |g| }| j                  dt        t        |            i|
      E d {    |
d   r y  y c c}w 7 w)Nr  r  ))r  twoColumnSearchResultsRendererprimaryContentsr  r  )onResponseReceivedCommandsr   r  r	  )r  tabbedSearchResultsRendererr  r   r  r  r  r  )r  zquery "re  r   Fr  r   )r   r  rW  r  r,  )r  r  r  rW  r  r   r  r  )r   _SEARCH_PARAMSr   rF	  r  rL	  r  rP  r<  r  r  r  r+   r  r  r5   )r  r  r  rW  r  content_keys
display_idr\  r  r   r  r,  r  r  slr_contentss                  rx   _search_resultsz+YoutubeTabBaseInfoExtractor._search_results  su    Z((F#DN
 ugQ'
LADQABHLHYHY$$^Z@_a''U';!F!* 
	HKK)!,23//$*D*DV*L]k 0 mG++%,fXJ7HD-nTYcj , lF (>>L,,j$x?U:V-WYjkkk$Q'
	  B ls"   1D9D2C$D9#D7$	D9.
D9r!  r  )NTFrb   )NTrb   )(r   r   r   r  r:  rD  rG  rR  r\  rb  ri  rn  rr  ru  r{  r  r  r  r  r  r  r  r  r  r!	  r*	  r		  r7  r	  rD	  r   r  rF	  rI	  rL	  rT	  rR	  r`	  r   rd	  r   rz   rx   r/  r/    s&    4    $
L$LQ*D 
0 7
g"WH2V4OlBH @ @ Q Qyvn>;.'#R JN    L( Z Z:
5&/$ N,6u rz   r/  c                   6    e Zd ZdZdej
                  dj                  ej                        dz  ZdZ	g dddd	d
dddddd	g dde
dddddd	d
ddddg d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,d-d)e
d.dd/d!d0d1d2d3d4d5g e
d6d7d8d9d:d7d;d<d=d>d?d@dAdBdCg d7d5dDd8d9dEd;d<d7dFdGd?dHdIdJdKdLdMdNdMg dOdPdQdJe
dRdSdTdUdVdJdWdLdMdNg dOdQdJdPdMe
dXdYdTdZd[dJdWdLdMdNdJdPdMg dOdQe
d\d]dTd^d_dJd`dLdMdNdPdMdQdJg dOe
dadbdTdcdddJdedLdMdQdJg dOe
dPdNdMdfdgdTdhdidJdjdLdMdQdJg dOe
dPdNdMdfdkdTdldmdnddoddd gdde
dddd!dpddqd!d0drd!d0dsd!d0dtdudvdwdxg e
dydzd{d|d:d}d|d~ddd?dddddg dde
d5dd:ddddddgdddd!dddddg e
dddd5dd:ddddddTdddde
dg d5dddd:ddddddgdddddddde
g dd5d:ddddddgddddddg e
dddd:dddddddTdd!d0dddddddddgee
e
dʜ
dd!idej                         gd͜dd!d0dd!d0di ddғddԓdedddeddgdede
de
ddޓddddGde
dddd!dddd:dde
e
dddd!ddd!idgdddddddddgg de
d	dd!id!ddd!d0dd!d0ddd!ddd!d0dd!d0dd!d0dd!d0d d!d0ddd!dddd!ddd!d0dd!d0dd!d0dd!d0d	d
dg ddddd!d0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'dd5d:d&d(d)d dgdd*d+d+g dd,dd-d.d/d0g e
d5dEdd1d2d gd3d4d5d6d7dEg d8d9e
d5d:d;d<d=d9d>d?d@dAdBdCdDdEdFe
dGdHdIdJdHdKigd>dLd!idMdNddOdOg dd2d!dPdQdRgiidSdTdUdVdWdXdYdZdWg d[e
d\d]d!dPdQdRgiidSd^d_d`d"d#d$dd%d5d'g d&e
d:d&dad)d!dPdQdRgiidSd dgdbdcddd!ddedfdgdhdig dEdjdkdldme
dndodkdpdSdTdqdrdsg dtdudvdsdwdxdydwdz
d>d{d|d}d~giiidgdbdddg e
dtdwdsddd:dxdydwdd>d{d|d}d~giiidgdbdddg dd2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dDdddddddde
ddddddddd!d0dd!d0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dsdÐdwdudsdtg dxdydwdĜ
d?dBdCdŐdƐde
edȜigdLd!idɜdʐddg dd?dBdCdeedeee
eeeeed͜igd!dΐdϜd>dМdѐdsdҐdwdudsdtg dxdydwdĜ
d?dBdӐdԐdՐdՐd֐d֐dee
e
d֐dאdd!dٜigdLd!idɜddd gde
dddddddd!dۜdGddܐdݐdݐdސdߐdde
dg ddddGdddddddddd-dde
d!ddDdddde
dd5ddddg d:dddddgdddddddde
dddddd!g d ddZe fd       Z ej(                  de d      Zd ZddZd Zd	 Zej6                  d
        Z xZS (  r  zYouTube Tabsa  (?x:
        https?://
            (?!consent\.)(?:\w+\.)?
            (?:
                youtube(?:kids)?\.com|
                %(invidious)s
            )/
            (?:
                (?P<channel_type>channel|c|user|browse)/|
                (?P<not_channel>
                    feed/|hashtag/|
                    (?:playlist|watch)\?.*?\blist=
                )|
                (?!(?:%(reserved_names)s)\b)  # Direct URLs
            )
            (?P<id>[^/?\#&]+)
    )r  )reserved_namesr  zyoutube:tabzplaylists, multipageuM   https://www.youtube.com/c/ИгорьКлейнер/playlists?view=1&flow=grid^   UCqj7Cz7revf5maW9g5pgNcgzIgor Kleiner Ph.D. - Playlistsz$md5:15d7dd9e333cb987907fcb0d604b233azIgor Kleiner Ph.D.z@IgorDataSciencez(https://www.youtube.com/@IgorDataScience)u'   критическое мышлениеu   наука простоu   математикаu   анализ данныхz8https://www.youtube.com/channel/UCqj7Cz7revf5maW9g5pgNcg)r   r  r  r  r  r  r  r  r  r  r  )r  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  r  r  r  r  r  zplaylists, serieszJhttps://www.youtube.com/c/3blue1brown/playlists?view=50&sort=dd&shelf_id=3rW   UCYO_jab_esuFRV4b17AJtAwz3Blue1Brown - Playlistsz$md5:4d1da95432004b7ba840ebc895b6b4c9z8https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw3Blue1Brownz@3blue1brownz$https://www.youtube.com/@3blue1brownMathematicsT)r   r  r  r  r  r  r  r  r  r  r  r  zplaylists, singlepagez7https://www.youtube.com/user/ThirstForScience/playlistsr~   UCAEtajcuhQ6an9WEzY9LEMQzThirstForScience - Playlistsz$md5:609399d937ea957b0f53cbffb747a14cThirstForSciencez)https://www.youtube.com/@ThirstForSciencez@ThirstForSciencez8https://www.youtube.com/channel/UCAEtajcuhQ6an9WEzY9LEMQr  )r   r  r  r  r  r  r  r  r  r  r  z3https://www.youtube.com/c/ChristophLaimer/playlistsr  zbasic, single video playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFVb7Iudeipvc2BCavECqzc"PL4lCao7KL_QFVb7Iudeipvc2BCavECqzczyoutube-dl public playlistr   20201130z	Sergey M.UCmlqkdCBesrv2Lak1mF_MxAz8https://www.youtube.com/channel/UCmlqkdCBesrv2Lak1mF_MxAr  z%https://www.youtube.com/@sergeym.6173z@sergeym.6173)r   r  r  r  r  r	  r  r  r  r  r  r  r  r   )r  r  r  r  zempty playlistzHhttps://www.youtube.com/playlist?list=PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfz"PL4lCao7KL_QFodcLWhDpGCYnngnHtQ-Xfzyoutube-dl empty playlist20230921r%  )r   r  r  r  r  r	  r  r  r  r  r  r  r   zHome tabzAhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/featuredUCKfVa3S1e4PHvxWcwyMMg8wzlex will - Homez$md5:2163c5d0ff54ed5f598d6a7e6211e488zlex willz@lexwill718)biblehistoryprophesyz#https://www.youtube.com/@lexwill718z8https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w)r   r  r  r  r  r  r  r  r  r  r  r   r  r  r  ri	  z
Videos tabz?https://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/videoszlex will - Videos)r   r  r  r  r  r  r  r  r  r  r  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  r  r  r     zPlaylists tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/playlistszlex will - Playlists)r   r  r  r  r  r  r  r  r  r  r     zCommunity tabzBhttps://www.youtube.com/channel/UCKfVa3S1e4PHvxWcwyMMg8w/communityzlex will - Community)r   r  r  r  r  r  r  r  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  r  r  r  r  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 department"PLwP_SiAcdui0KVebT0mU9Apz359a4ubsCz$md5:a14dc1a8ef8307a9807fe136a066026820150605UCEPzS1rYsrkqzSLNp76nrcgz8https://www.youtube.com/channel/UCEPzS1rYsrkqzSLNp76nrcgChristiaan008z@ChRiStIaAn008z&https://www.youtube.com/@ChRiStIaAn008)r  r   r  r  r  r	  r  r  r  r  r  r  r  r  zLarge playlistz>https://www.youtube.com/playlist?list=UUBABnxM4Ar9ten8Mdjj1j0QzUploads from CauchemarUUBABnxM4Ar9ten8Mdjj1j0Qz8https://www.youtube.com/channel/UCBABnxM4Ar9ten8Mdjj1j0Qre:\d{8}	CauchemarUCBABnxM4Ar9ten8Mdjj1j0Qz@Cauchemar89z$https://www.youtube.com/@Cauchemar89)r  r   r  r  r	  r  r  r  r  r  r  r  r  ic  *[Uu]navailable videos (are|will be) hidden)r  r  r  ri	  r  z!even larger playlist, 8832 videosz/http://www.youtube.com/user/NASAgovVideo/videosr  zTBuggy playlist: the webpage has a "Load more" button but it doesn't have more videosz>https://www.youtube.com/playlist?list=UUXw-G3eDE9trcvY2sBMM_aAzUploads from Interstellar MoviezUUXw-G3eDE9trcvY2sBMM_aAzUCXw-G3eDE9trcvY2sBMM_aAz8https://www.youtube.com/channel/UCXw-G3eDE9trcvY2sBMM_aAzInterstellar Moviez@InterstellarMoviez*https://www.youtube.com/@InterstellarMovie)r  r   r  r  r  r  r  r  r	  r  r  r  r  rQ   z.Playlist with "show unavailable videos" buttonz>https://www.youtube.com/playlist?list=UUTYLiWFZy8xtPwxFwX9rV7Qu*   Uploads from Phim Siêu Nhân Nhật BảnUUTYLiWFZy8xtPwxFwX9rV7Qu   Phim Siêu Nhân Nhật Bảnz8https://www.youtube.com/channel/UCTYLiWFZy8xtPwxFwX9rV7QUCTYLiWFZy8xtPwxFwX9rV7Qz,https://www.youtube.com/@phimsieunhannhatbanz@phimsieunhannhatban)r  r   r  r  r  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 BlankTVUU8l9frL61Yl5KFOl87nIm2wBlankTVz8https://www.youtube.com/channel/UC8l9frL61Yl5KFOl87nIm2wUC8l9frL61Yl5KFOl87nIm2wz@blanktvz https://www.youtube.com/@blanktv)r  r   r  r  r  r  r  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 Pound"PLzH6n4zXuckpfMu_4Ff8E7Z1behQks5baz$md5:7f567c574d13d3f8c0954d9ffee4e487zUC9-y-6csu5WGm29I7JiwpnAz8https://www.youtube.com/channel/UC9-y-6csu5WGm29I7JiwpnAComputerphile20190712z@Computerphilez&https://www.youtube.com/@Computerphile)r  r   r  r  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=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4FqZTN594JQwr  z6Smiley's People 01 detective, Adventure Series, Action20150526r  z$md5:507cdcb5a49ac0da37a920ece610be80r  )
r   r  r  r~  r  r  r  r  r  r  r  r   )r  r  r  r  r  add_iezMhttps://www.youtubekids.com/watch?v=Agk7R8I8o5U&list=PUZ6jURNr1WQZCNHF0ao-c0gz5https://www.youtube.com/watch?v=MuAGGZNfUkU&list=RDMMz=https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQ/liver   hGkQjiJLjWQr  r  r  r~  r  r  r  r  r  r  r  zSky Newsr  zUCoMdktPbSTixAyNGwb-UYkQr  r  rZ  z?re:https?://i\.ytimg\.com/vi/[^/]+/maxresdefault(?:_live)?\.jpgr  r  zre:\d+r  r  z8https://www.youtube.com/channel/UCoMdktPbSTixAyNGwb-UYkQz https://www.youtube.com/@SkyNewsz@SkyNews)r  r  r  r  r  r  r  r  z"Ignoring subtitle tracks found in r  z/https://www.youtube.com/user/TheYoungTurks/livea48o2S1cPooz The Young Turks - Live Main Show20150715z$md5:438179573adcdff3c97ebb1ee632b891)zCenk Uygur (TV Program Creator)z$The Young Turks (Award-Winning Work)zTalk Show (TV Genre))	r   r  r  r~  r  r  r  r  r  )r  r  r  r  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.rN	  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/cctv9cctv9zcctv9 - All)r   r  r  i,  )r  r  ri	  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/VLPLRBp0Fe2GpgmgoscNFLxNyBVSFVdYmFkq"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-EOJ3D6gOs7HcyNgNoCopyrightSoundsz*https://www.youtube.com/@NoCopyrightSoundsz@NoCopyrightSounds)r   r  r  r  r	  r  r  r  r  r  r  r  r     z'YouTube Music is not directly supportedz-Topic, should redirect to playlist?list=UU...z9https://music.youtube.com/browse/UC9ALqqC4aIeG5iDs7i90BfwUU9ALqqC4aIeG5iDs7i90Bfwz'Uploads from Royalty Free Music - TopicUC9ALqqC4aIeG5iDs7i90BfwzRoyalty Free Music - Topicz8https://www.youtube.com/channel/UC9ALqqC4aIeG5iDs7i90Bfw)r   r  r  r  r  r  r  r	  r  r  r  e   z8https://www.youtube.com/channel/UCtFRv9O2AHqOZjjynzrv-xgzUCtFRv9O2AHqOZjjynzrv-xgr  zYoutube music Albumz2https://music.youtube.com/browse/MPREb_gTAcphH99wE)OLAK5uy_l1m0thk3g31NmIIz_vMIbWtyv7eZixlH0z0Album - Royalty Free Music Library V2 (50 Songs))r   r  r  r  r  r  r	  rc  )r  r  r  r  r  zunlisted single video playlistzHhttps://www.youtube.com/playlist?list=PLwL24UFy54GrB3s2KMMfjZscDi1x5Dajf"PLwL24UFy54GrB3s2KMMfjZscDi1x5Dajfzyt-dlp unlisted playlist test20220418	colethedjzUC9zHu_mHU96r19o-wV5Qs1Qz8https://www.youtube.com/channel/UC9zHu_mHU96r19o-wV5Qs1Qz&https://www.youtube.com/@colethedj1894z@colethedj1894)r   r  r  r  r	  r  r  r  r  r  r  r  r  r  r{  rz  r  r  r   r}  z8https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Qz+https://www.youtube.com/watch?v=BaW_jenozKcr|  r  r  )r  r   r  r  r  r  r  r  r  r  r  r  r  extract_flat)r  r  r  r  r  r  zHAPI Fallback: Recommended - redirects to home page. Requires visitorDatarecommended
youtubetabr  r  ra  )r  r  r  ri	  r  z1API Fallback: /videos tab, sorted by oldest firstzJhttps://www.youtube.com/user/theCodyReeder/videos?view=0&sort=da&flow=gridUCu6mSoMNzHQiBIOCkHUa2AwzCody'sLab - Videosz$md5:d083b7c2f0c67ee7a6c74c3e9b4243faz	Cody'sLabz8https://www.youtube.com/channel/UCu6mSoMNzHQiBIOCkHUa2Aw)r   r  r  r  r  r  r  r  i  z!Query for sorting no longer works)r  r  r  ri	  r  r  z;API Fallback: Topic, should redirect to playlist?list=UU...)r   r  r	  r  r  r  r  r  r  r  r  )r  r  r  ri	  r  r  z)non-standard redirect to regional channelz8https://www.youtube.com/channel/UCwVVpHQ2Cs9iGJfpdFngePQzQcollaborative playlist (uploader name in the form "by <uploader> and x other(s)")zHhttps://www.youtube.com/playlist?list=PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx6z"PLx-_-Kk4c89oOHEDQAojOXzEzemXxoqx620220407z8https://www.youtube.com/channel/UCKcqXmCcyqnhgpA5P0oHH_QUCKcqXmCcyqnhgpA5P0oHH_Q	pukkandanzTest for collaborative playlistz$yt-dlp test - collaborative playlistz"https://www.youtube.com/@pukkandanz
@pukkandan)r   r	  r  r  r  r  r  r  r  r  r  r  r  ztranslated tab namezBhttps://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA/playlistsr\  rZ  ztest descriptionu#   cole-dlp-test-acc - 再生リストrY  r]  r^  )
r   r  r  r  r  r  r  r  r  r  r;  ry  r  r   zPreferring "ja"z=preferred lang set with playlist with translated video titleszHhttps://www.youtube.com/playlist?list=PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0z"PLt5yu3-wZAlQAaPZ5Z-rJoTdbT-45Q7c0testzdlp test playlist)r   r  r  r  r  r  r  r  r  r  r  r  zphttps://www.youtube.com/feed/sfv_audio_pivot?bp=8gUrCikSJwoLMkd0VmtzQk1ZRk0SCzJHdFZrc0JNWUZNGgsyR3RWa3NCTVlGTQ==sfv_audio_pivotz=https://www.youtube.com/channel/UCEH7P7kyJIkS_gJf93VYbmg/liveUCEH7P7kyJIkS_gJf93VYbmgzUCEH7P7kyJIkS_gJf93VYbmg - Live   zAhttps://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/letsplayUCQvWX73GQygcwXOTSf_VDVgz%UCQvWX73GQygcwXOTSf_VDVg - Let's playr  z=https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/homezUCQvWX73GQygcwXOTSf_VDVg - Homez8https://www.youtube.com/channel/UCK9V2B22uJYu3N7eR_BT9QAUCK9V2B22uJYu3N7eR_BT9QAu   Polka Ch. 尾丸ポルカz$md5:49809d8bf9da539bc48ed5d1f83c33f2zcount:35z#https://www.youtube.com/@OmaruPolkaz@OmaruPolka)r   r  r  r  r  r  r  r  r  r  r  r  rK   )r  r  r  z,https://www.youtube.com/@NotJustBikes/shortszUC0intLFzLaudFG-xAvUEO-AzNot Just Bikes - Shortszcount:10z8https://www.youtube.com/channel/UC0intLFzLaudFG-xAvUEO-Az$md5:5e82545b3a041345927a92d0585df247zNot Just Bikesz%https://www.youtube.com/@NotJustBikesz@NotJustBikes)r   r  r  r  r  r  r  r  r  r  r  r  z@https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sig/streamsUC3eYAvjCVwNHgkaGbXX3sigu   中村悠一 - Livezcount:7z8https://www.youtube.com/channel/UC3eYAvjCVwNHgkaGbXX3sigu   中村悠一z$md5:e744f6c93dafa7a03c0c6deecb157300z(https://www.youtube.com/@Yuichi-Nakamuraz@Yuichi-Nakamura)r   r  r  r  r  r  r  r  r  r  r  r:  z8https://www.youtube.com/channel/UC2yXPzFejc422buOIzn_0CAzhttps://www.youtube.com/newsz#https://www.youtube.com/c/TKFShortsUCgJ5_1F6yJhYLnyMszUdmUgzShorts Break - Shortszcount:48zShorts Breakz$md5:6de33c5e7ba686e5f3efd4e19c7ef499z8https://www.youtube.com/channel/UCgJ5_1F6yJhYLnyMszUdmUgz-https://www.youtube.com/@ShortsBreak_Officialz@ShortsBreak_Official)r   r  r  r  r  r  r  r  r  r  r  rH   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  r  r  r  r  z*https://www.youtube.com/shorts/sSM9J5YH_60sSM9J5YH_60zSHORT short)r  r  r  r   r  r  rU  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  r  r  ri	  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_AJ5Yw	PewDiePiez"https://www.youtube.com/@PewDiePiez
@PewDiePie)r  r  r  r   r  r  r  r  rU  r  r  r  r  r  r  z*https://www.youtube.com/@3blue1brown/about)r   r  r  r  r  r  r  r  r  r  r  r  z;https://www.youtube.com/@99percentinvisiblepodcast/podcasts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  r  r  r  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  r  r  r  r  r  z>https://www.youtube.com/playlist?list=UUxqPAgubo4coVn9Lx1FuKcgUUxqPAgubo4coVn9Lx1FuKcgz8https://www.youtube.com/channel/UCxqPAgubo4coVn9Lx1FuKcgz@BangyShortsz$https://www.youtube.com/@BangyShortsUCxqPAgubo4coVn9Lx1FuKcgzBangy ShortszUploads from Bangy Shorts)r   r  r  r  r  r  r  r  r  r  r  r	  r  r  )r  r  ri	  r  zTags containing spacesz8https://www.youtube.com/channel/UC7_YxT-KID8kRbqZo7MyscQzUC7_YxT-KID8kRbqZo7MyscQ
Markiplierz$md5:0c010910558658824402809750dc5d97z@markiplierz#https://www.youtube.com/@markiplier)
markipliercomedygamingzfunny videoszfunny momentszsketch comedylaughingz	lets playzchallenge videos	hilarious
challengessketcheszscary gameszfunny gamesz
rage gameszmark fischbach)r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  c                 P    t         j                  |      rdS t        |   |      S r"  )rk  r  r  )r  r  r  s     rx   r  zYoutubeTabIE.suitableC  s%    !**3/uJUW5Ec5JJrz   z(?P<pre>z1)(?(not_channel)|(?P<tab>/[^?#/]+))?(?P<post>.*)$c                     | j                   j                  |      j                         }|j                  d |j	                         D               |S )Nc              3   0   K   | ]  \  }}|	|df  y w)Nr   r   )r   r  r?  s      rx   r   z-YoutubeTabIE._get_url_mobj.<locals>.<genexpr>K  s     B1	QGBs   
	)_URL_REr:  	groupdictr<  r   )r  r  rb  s      rx   _get_url_mobjzYoutubeTabIE._get_url_mobjI  s<    ||!!#&002B

BBrz   c                 \   |j                  d      xs dj                         }t        |t        |d            }|xr | j	                  |      d   dd  xs t        |dt
              }|rdd	ij                  ||      |fS |r| j                  d
|        dddj                  ||      |fS )Nr  r   )rf  r  r  r  r  r   rO	  rr  TAB_ID_SPONSORSHIPS
membershipz#Falling back to selected tab name: featuredstreams)homer'  )r+  r  r4   r+   r	  r`  r  )r  r  r  tab_nametab_urltab_ids         rx   _extract_tab_id_and_namez%YoutubeTabIE._extract_tab_id_and_nameN  s    GGG$*113(LM%O P Dd009%@D K!#cJ 	%|c&&!8, , B8*MN
 #h
!8, 	,rz   c                 0     t         fd|D              S )Nc              3   L   K   | ]  }j                  |      d    k(    ywr   )r	  )r   r  r  r	  s     rx   r   z(YoutubeTabIE._has_tab.<locals>.<genexpr>e  s&     Ss4005a8FBSr7  )rI  )r  r  r	  s   ` `rx   _has_tabzYoutubeTabIE._has_tabd  s    SdSSSrz   c                 J     | j                   g |fi | j                  ||      S rB  )r  r  )r  r  r  s      rx   _empty_playlistzYoutubeTabIE._empty_playlistg  s+    #t##Bc43S3ST[]a3bccrz   c                 h     j                  |      }t        j                  j                  t        j                  j	                  |      j                  d            } j                  dg       } j                  |      }|d   |d   |d   |d    f\  }}}}	|	r|j                  d      r|d d	 d
k(  r  j                  d|d	d   t        |d	d        S |d d	 dk(  rM j                  d| |d      }
t        |
ddt              }|st        d       j                  |t              S |d   dk(  r j                  d| | | t        |      S |dd  | | }}|	r|sd|vr| d| }|j                  d      r j                  d|        t!        |      }dD cg c]  }t        ||df       c}\  }}|sQ|d   j#                  d      r=|st        dd       j                  d |         j                  d!| t        |      S  j%                  ||      s j                  d"| t&        |      S  j)                  ||      \  }}t        |d#d$      }|rLd|vrHd%j+                  t-        d&|      ||f      } j/                  d'|         j                  |t              S  j1                  |      g }}|	r|rd|vr{ j3                  |      } j5                  ||      \  }} j7                  d(|d)| d*|       |d+k(  r j9                  ||      S |s|r j/                  d,        j;                  |d-      r#|j=                  d%j+                  |d.|f              j;                  |d/      r#|j=                  d%j+                  |d0|f             |s`|d1k7  r[|d d	 d2k7  r j9                  ||      S d3|d	d   }d!| }	  j)                  |||dd4      \  }}||}} j/                  d5| d6       nC|rA|d1k7  r<| | d }}n3|xs d1|k7  r*|d7k(  rt?        |8      |rt        d9| d:d      | | }d;|vr jA                  |||      xs |} jC                  |d<        j1                  |      g }}|rM jE                  ||||      g}|d   jG                  t        jI                         t        jJ                  |d=        j                  d>      d?k(  r|jM                   fd@|D               n%|jM                  tO         jP                  |             tS        |      dk(  r|d   S |rT jU                  ||      }dA}tW        |dB       rdC|dD   d	d   } j/                  dE|          jX                  ||fi |S t        |dFtZ        G      }|r j]                  |||||      S t        |dHt        G      xs |}|r3|dIk7  r j                  dJ|         j                  d"| t&        |      S t        dK      c c}w # t        $ r  j9                  ||      cY S w xY w)LNr   r2  rJ  prer  r~  not_channelr  r   rB	  rZ  MPz"https://music.youtube.com/channel/rd   r  )r  r  urlCanonicalFr  z#Failed to resolve album to playlistchannel_typer  r   rQ	  z/videosz8YouTube Music is not directly supported. Redirecting to )r?  r  r   watchz&A video URL was given without video IDTr  zDA video URL was given without video ID. Trying to download playlist rp  r  )r  .navigateActionrf  r  r  r  r  r   rz  zXThis playlist is likely not available in your region. Following conditional redirect to zSelected tab: z (z), Requested tab: aboutziDownloading all uploads of the channel. To download only the videos in a specific tab, pass the tab's URLr	  z/streamsshortsz/shortsr	  UCUU)r   r  rS	  zQThe channel does not have a videos, shorts, or live tab. Redirecting to playlist z insteadr'  )r  zThis channel does not have a z tabzno-youtube-unavailable-videosr  )extractor_key	extractorr  r	  rR  c              3   J   K   | ]  }j                  |t                y wrB  )rt  r  )r   ur  s     rx   r   z-YoutubeTabIE._real_extract.<locals>.<genexpr>  s     P4??1l;Ps    #zthe Uploads (UU) playlist URLc                 *    | d   j                  d      S )Nr  r	  )r-  r]  s    rx   rV  z,YoutubeTabIE._real_extract.<locals>.<lambda>  s    1\?+E+Ed+K rz   z(https://www.youtube.com/playlist?list=UUr  zeDownloading as multiple playlists, separated by tabs. To download as a single playlist instead, pass )r  r  r  r  rr  rH	  rW  r  /livez5Unable to recognize playlist. Downloading just video zUnable to recognize tab page)/r  r8  r9  rl  rj  rm  r  r	  r+  rt  r  rR	  r+   r`  r   r!  r$   r-  _yes_playlistrk  rT	  r   r4   r  r  r  r	  r  r	  r	  r  r   rD	  r  r  r<  r  r)  r]  r  r   r  r  r-   r  r7  r*	  ) r  r  r  r  rJ  rb  r	  r  r~  
is_channelmdatamurloriginal_tab_idrb	  r  r  r  rP  r  r   redirect_urlr  
extra_tabsr  selected_tab_idselected_tab_namepl_idpl_urlr  r  uploads_urlr  s    `                               rx   r   zYoutubeTabIE._real_extractj  sh   ..%ll%%LL!!#&//7H/IKnn]B7!!#&%)%[$u+tF|QUVcQdMd%d"S$
-++N;r{d">wqr{mLl\cdedf\gi i!$228	BG\g 3 i#E+e,1F()NOOt\::n%18	#tfM|]df f '*!"g'3%/@c&C;&VE'C^,"Z[^Z_ `a c]GT Ub3(!; U+D/::7C$%MX\]]"fgrfs tu??8FVac c !!+x8??28*=y(T T ((j9e
 $  C  MRS9L77G,E|$TVY[_#`aLNNu  wC  vD  E  F??<>>66t<bj$#@#S55d;L151N1N|]`1a.O.~o-@CTBUUghwgz{| ')++GT::"'8  d e==y1%%bggsJ.E&FG==x0%%bggsIt.D&EF "o&Ar{d*#33GTBB !.EEeWMFA&*&8&8e[_os&8&te (-fopuovv~A  Ox$?#&%vC!-X/A"f, &w77&(+HHYY])^imnn dVn ++=77
D%PXTXD'''=33D92g..wtTJKGAJ!-!4!4!6)11" 
 >>*+s2NNPZPPNN3t11:>?w<11:77FH9Kx!KL HR^I_`a`bIcHdeNNBBMPQ (4''EHEE  Scgi..wT8USSFVY[ g^f 	g~##&[\d[e$fg??%EhZ#PR[]eff;<<s !Vn * C#33GTBBCs   XX X10X1r  )r   r   r   r#  r   r  r   r  r$  r)  r  r  rk  r  r`  r  r*  r  r  r+  compiler	  r	  r	  r	  r	  r/  r:  r   r,  r-  s   @rx   r  r    s   G	" 3BBXX6GGH!J( GR&^,5A,-F+4 PU&)
	 R$ 8O,5A,-F P4+U&)
	#RF $[,.AU$4)B%"O&)#'
	ERj (H,3A*G.4U)&)
	iRL EKRR /Y61'"4U$#C*
 %QRx !Y60"'4U&C*#
 #wR\ R,&A"(!4AU4&)
 ![R~ P,(A"(4U4A!&)
 !!}R` 0h,(A"(4A!4U&)
 !!_RB  S,+A"(A!U44&)
  !ARd  S,+A!U44&)A("
  !cRF R,*A!U44&)A("
  !ERh T,<AU"O$4&)B)%#'
	gRL EKRR NQRX LWR^ mY.6A'4U&$+'D
 %]RD !O-,U("4$)#B
 "KL'CRl 4@kRt hO6,4U+($/,H
  %sRZ	 AOA,6U4($J17
 !KL'Y	RB
 =O+, U4($%!>
 "KL'A
Rj
 FY76A4U&$'+'D
  %i
RP UORV GeM%1A+,
 T
 /##%&'UR~ _}RD GCRJ O
-
5
 S
 ;	

 3
 ,-
 D
 #
  
 z
 4
 
 #
 [
  
  I!
" H#
$ %U&)%(>%"#'3
8 T
 CCA!IRL A7%1A,-w

 T
 !KRn OmRt AsRz A>yRB 7ARH 6GRN 6MRT <SRZ :YR` 89_Rh HTgRp 0oRv 3uR| <{RB <ARH 7"

 !GRX vWR^ |[]Rf 8JeRn ?V6z.U(4*$H+/
 !KMvw'mRX @J,>43U($4
 !GIvw%UR@ J,/

 
{RP &C=G&(
 GHORl 1Y64&'"4UD+#
  @##8Y!D04 M1
 " !4(I%kRv [9"

  !+fyk-BC
uRP D[,*A#4U&)	
 !!+fyk-BC
 4%ORv NJ,>(4U3$4
 !!+fyk-BC
 HIvw+uRb <IaRj dY6'U&4"<;@'#
 %iRP &S,U-:4*@'+
 #i&4&1A%BC/0#ORv PY6U*4!($@'+
 #i&4&1A%BC/0)sR` B#&

  
]Rv O,6

  
qRH S,=

 	ERZ O,6

 	WRl J,0&)4UA2A3(#'
 #iRR >,.UA&)4'C(*#'
  %MRv R,*4U%&)AF-&
  !sRZ J	URd .	_Rl 5,,4%A&)UK&2
  !iRN 7%

  	KR` k(

  	]Rt Q,1*-4U@'+
 #C#&!"	
  "4(9oRl O,6
 #D(!"), #"'+
 $ $(3?7iRd S,3*-4U@'+
 &Q08$&Y"*-"%' D+'+
 & "4(E#aRh < "O"&)4$UAB)%#'
 !gRL M,4PA6.&)U-7
 !IRn <,"?+&#4)U&)#'
  #kRV P,U)B4%&$(0
 !KL+OR| )I,#4!&)A(A$U#''
	{RFh  K K bjjHZL0abcG
,,Td !::Y= ;Y=rz   r  c                   2    e Zd ZdZdej
                  dj                  ej                        dz  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&g d'd(d)d*d+d,d-d.d/d-e
d0g d1d2ddd3d4gd5d6d7d8d9d7d8gZe fd:       Zd; Z xZS )<rN  zYouTube playlistsa  (?x)(?:
                        (?:https?://)?
                        (?:\w+\.)?
                        (?:
                            (?:
                                youtube(?:kids)?\.com|
                                %(invidious)s
                            )
                            /.*?\?.*?\blist=
                        )?
                        (?P<id>%(playlist_id)s)
                     )r  )rP  r  zyoutube:playlistz
issue #673PLBB231211A4F62143z%[OLD]Team Fortress 2 (Class-based LP)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  r  r  r     rw	  "PLtPgu7CB4gbY9oDN3drwC3cMbJggS7dKlYDL_safe_search)r  r   r   zThis playlist is privater  r   zQhttps://www.youtube.com/embed/videoseries?list=PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEur~   JODA15"PL6IaIsEjSbf96XFRuNccS_RuEXwNdsoEumilanz
@milan5503r   z8https://www.youtube.com/channel/UCEI1-PVPcYXjB73Hfelbmaw20140919zUCEI1-PVPcYXjB73Hfelbmawz"https://www.youtube.com/@milan5503)r  r   r  r  r  r  r  r	  r  r  r  r  r  )z.[Uu]navailable videos? (is|are|will be) hiddenRetryingz	Giving up)r  r  r  r  r  zPhttp://www.youtube.com/embed/_xDOZElKyNU?list=PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIli  z'2018 Chinese New Singles (11/6 updated)"PLsyOSbh5bs16vubvKePAQ1x3PhKavfBIlLBKz@music_kingz$md5:da521864744d60a198e3a88af4db0d9dz8https://www.youtube.com/channel/UC21nz3_MesPLqtDqwdvnoxAz#https://www.youtube.com/@music_kingUC21nz3_MesPLqtDqwdvnoxA)r  r   r  r  r  r  r  r  r  r  r  r	  r  r	  )r  ri	  r  r  TLGGrESM50VT6acwMjAyMjAxNwTr  )OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhMc                     t         j                  |      ryddlm}  ||      }|j	                  dd g      d   ryt
        |   |      S )NFr   r  r?  r   )r  r  r  r$   r+  r  r  s       rx   r  zYoutubePlaylistIE.suitabled  sH      %$c]66#vq!w$$rz   c                     | j                  |      }t        j                  |      }t        dt	        |      xs d|i      }|rt        |ddi      }| j                  |t        j                         |      S )Nz https://www.youtube.com/playlistr  r  TrY  )	r  r   r  r2   r$   r'   rt  r  r  )r  r  rP  r  s       rx   r   zYoutubePlaylistIE._real_extractn  sr    nnS)/<<SA.SM2fk24 cND#9:Cs|':':'<{SSrz   )r   r   r   r#  r   r  r   r  r$  r)  r  r*  r  r  r   r,  r-  s   @rx   rN  rN    sZ   !G 0??XX6GGHJ !G#<&!'A@(4 U$
  %( 4&6
 * b6'U'4@$
 j'* b >6(AUA4($
 LL%( ,
 ;KIFV % %Trz   rN  c            	           e Zd ZdZddej
                  iz  Zdi ddddd	d
ddddddddddddgdededdddddddd d!d"d#ed$d%d&eed'ddd(d)d*dd+gZ	d, Z
y-).YoutubeYtBeIEyoutu.bezYhttps?://youtu\.be/(?P<id>[0-9A-Za-z_-]{11})/*?.*?\blist=(?P<playlist_id>%(playlist_id)s)rP  zDhttps://youtu.be/yeWKywCrFtk?list=PL2qgrgXsNUG5ig9cat4ohreBjYLAPC0J5r   yeWKywCrFtkr  r  r  z#Small Scale Baler and Braiding Rugsr  zBackus-Page House Museumr  z@backuspagemuseumr  z4re:https?://(?:www\.)?youtube\.com/@backuspagemuseumr~  20161008r  z$md5:800c0c78d5eb128500bffd4f0b4f2e8ar  zNonprofits & Activismr  r  r  r   r  TrZ  rv  r  r  UCEfMCQ9bs3tjvjy1s451zawr  r  z8https://www.youtube.com/channel/UCEfMCQ9bs3tjvjy1s451zawr  ;   )r  r  r  r  r  r  )r?  r  r  z4https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21r  c           	          | j                  |      }|j                  d      }|j                  d      }| j                  t        d||dd      t        j                         |      S )Nr   rP  zhttps://www.youtube.com/watchr
  )r?  r  featurerY  )_match_valid_urlr`  rt  r2   r  r  )r  r  rb  r  rP  s        rx   r   zYoutubeYtBeIE._real_extract  so    $$S)::d#jj/<#%?   &&(;  @ 	@rz   N)r   r   r   r#  r   r  r$  r  r  r*  r   r   rz   rx   r

  r

  y  sU   Gmq~  AY  Ai  Ai  qj  jJU
-
5
 :
 2	

 .
 S
 :
 A
 23
 D
 #
 
  
 1
 1
  4!
" :#
$ U$ &)/
4 !
7@ F?"FH	@rz   r

  c                   &    e Zd ZdZdZdddgZd Zy)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                 x    | j                  |      }| j                  d| dt        j                         |      S )Nr  r	  rY  )r  rt  r  r  )r  r  r  s      rx   r   z&YoutubeLivestreamEmbedIE._real_extract  s@    ^^C(
.zl%@""$z  ; 	;rz   N)r   r   r   r#  r$  r*  r   r   rz   rx   r
  r
    s#    )GjJ[ F
;rz   r
  c                   *    e Zd ZdZdZdZdddgZd Zy)	YoutubeYtUserIEz%YouTube user videos; "ytuser:" prefixzyoutube:userzytuser:(?P<id>.+)zytuser:phihagTr  c                 X    | j                  |      }| j                  d| t        |      S )Nzhttps://www.youtube.com/user/)r  rt  r  )r  r  user_ids      rx   r   zYoutubeYtUserIE._real_extract  s,    ..%!>wiH,X_``rz   N)r   r   r   r#  r)  r$  r*  r   r   rz   rx   r
  r
    s)    5GG%J F
arz   r
  c                   6    e Zd ZdZdZdZdZddddddgZd Zy	)
YoutubeFavouritesIEzyoutube:favoritesz9YouTube liked videos; ":ytfav" keyword (requires cookies)z:ytfav(?:ou?rite)?s?Tz:ytfavr  z:ytfavoritesc                 L    | j                  dt        j                               S )Nz(https://www.youtube.com/playlist?list=LLrL  rt  r  r  r  s     rx   r   z!YoutubeFavouritesIE._real_extract  s'    6""$  & 	&rz   N)	r   r   r   r)  r#  r$  rH  r*  r   r   rz   rx   r
  r
    s:    !GIG(JO F&rz   r
  c                   H    e Zd ZdZdZdZdZddddddgZd Zd	 Z	d
 Z
d Zy)YoutubeNotificationsIEzyoutube:notifz<YouTube notifications; ":ytnotif" keyword (requires cookies)z:ytnotif(?:ication)?s?Tz:ytnotifr  z:ytnotificationsc              #      K   t        |ddt              xs g }d |d<   |D ]A  }| j                  |j                  d            }|r| |j                  d      }|s=||d<   C y w)N)	actionsr   openPopupActionpopupmultiPageMenuRenderersectionsr   (multiPageMenuNotificationSectionRendererr   )r"
  r   r  r	  rr  r   notificationRendererr  )r+   r  _extract_notification_rendererr+  )r  rz  r  notification_listrN  r  r  s          rx   _extract_notification_menuz1YoutubeNotificationsIE._extract_notification_menu  s     ( TP	  & $&	 	
  $!% 	4D77AW8XYE88$>?L'3!!$	4s   AA&A&c                    t        |dt              }d| }d }|set        |dt              }| j                  t        |dt                    }| j	                  dt        |dt              dd 	      }|r|sy d
| d| }t        |dt              }| j                  |d      }|r|j                  dd      }| j	                  t        j                  |xs d       d|dd 	      }	| j                  dt              r!| j                  | j                  |d            nd }
d||rt        nt        j                         ||	|||| j                  |d      |
d
S )NrX  rr  r  )r  r  r  z
/post/(.+)r  zpost idr  r  z/community?lb=)	contextualMenur  r   r   menuServiceItemRendererr   rH  r   r   shortMessage   ­r   z[^:]+: (.+)zvideo titler  rj  sentTimeTextr  videoThumbnail)
r  r  r  r  r  r  r  r  rU  rl  )r+   r`  r7  r  r  r  r   r+  rG  r  r  rm  rk  r  r\  )r  notificationr  r  r  r	  post_idr  notification_titler  rl  s              rx   r)
  z5YoutubeNotificationsIE._extract_notification_renderer  s   L\_a0
;
$FVZ\I**<	:]`+abJ((|I7IY\]4 ) )G W4ZLwiXC~ "^^L.I!3!;!;FB!G""		'-R()57I4 # ) //0B</X **4>>,+WX 	 $,y,FFH $22<AQR"
 	
rz   c              #   4  K   d g}d }t        j                  d      D ]u  }t        |dt              }| j	                  d| |rd|ini |dd| j                  || j                  |            	      }| j                  ||      E d {    |d
   ru y  y 7 w)Nr   )r   r  getNotificationMenuEndpointctokenrr  zpage r8
  z"notification/get_notification_menur"
  r
  )r  r  r   r  r  r  r   )r  rP  r+   r`  r  r  r  r+
  )r  r   r  rz  pager8
  s         rx   _notification_menu_entriesz1YoutubeNotificationsIE._notification_menu_entries#  s     !FOOA& 		D!!#gwz|F--vFx.@PRZ_7	11DLfLfgoLp1q . sH 66xARSSS$Q'		 Ts   BBB	BBc                     d}| j                   s| j                  d|      ni }| j                  |       | j                  | j	                  |      ||      S )Nnotificationsrb   )rF	  r  rL	  r  r:
  )r  r  rb	  r   s       rx   r   z$YoutubeNotificationsIE._real_extract1  sS    $
?C?P?P$$UJ7VX''.##D$C$CE$JJXbccrz   N)r   r   r   r)  r#  r$  rH  r*  r+
  r)
  r:
  r   r   rz   rx   r 
  r 
    sK    GLG*JO "F4)
Vdrz   r 
  c                   B    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y)YoutubeSearchIEzYouTube searchzyoutube:searchytsearchzEgIQAfABAQ==zytsearch5:youtube-dl test videorW   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   r#  r)  _SEARCH_KEYr`	  r*  r   rz   rx   r>
  r>
  8  sN    GGK#N0),
 3814
	Frz   r>
  c                   J    e Zd Zej                  dz   ZdZdZdZdddddd	gZy
)YoutubeSearchDateIEz:dateytsearchdatez#YouTube search, newest videos firstCAISAhAB8AEBz#ytsearchdate5:youtube-dl test videorW   r@
  r  rA
  N)	r   r   r   r>
  r)  rB
  r#  r`	  r*  r   rz   rx   rD
  rD
  O  s>    %%/G K3G#N4),
 Frz   rD
  c                       e Zd ZdZej
                  dz   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  Z
y!)"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=videorW   r@
  r  )r  ri	  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%253D
kurzgesagtr  r  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  rU  r  r  r  r  r  r%  r	  r	  z2https://www.youtube.com/results?q=test&sp=EgQIBBgBr  c           	          t        |      }|j                  d      xs |j                  d      d   }| j                  | j                  ||j                  dd      d         ||      S )Nsearch_queryr  r   r  rB  )r$   r+  r  rd	  )r  r  r  r  s       rx   r   z YoutubeSearchURLIE._real_extract  s`    c]'6266#;:##D$8$8tW@UVW@X$Y[`bghhrz   N)r   r   r   r#  r>
  r)  r$  r  r  r*  r   r   rz   rx   rH
  rH
  ^  s    CG%%.GwJt),
 Y
 F
 ]!

 0Q&9E78  Z", E:'+*-#
 * $(3?;> Dq;Fzirz   rH
  c                   p    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 Zy)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+musicrb  zroyalty free musicr  rA
  zYhttps://music.youtube.com/search?q=royalty+free+music&sp=EgWKAQIIAWoKEAoQAxAEEAkQBQ%3D%3DrH   zroyalty free music - songsr	  in_playlist)r  ri	  r  r  zIhttps://music.youtube.com/search?q=royalty+free+music#community+playlistsz(royalty free music - community playlistszEgWKAQIYAWoKEAoQAxAEEAkQBQ==zEgWKAQIgAWoKEAoQAxAEEAkQBQ==EgeKAQQoAEABagoQChADEAQQCRAFz!EgeKAQQoADgBagwQAxAJEAQQDhAKEAU==zEgWKAQIIAWoKEAoQAxAEEAkQBQ==zEgWKAQIQAWoKEAoQAxAEEAkQBQ==)albumsr  zcommunity playlistszfeatured playlistssongsr	  c                    t        |      }|j                  d      xs |j                  d      d   }|j                  dd      d   r.t        fd| j                  j	                         D              }nbt
        j                  j                  |j                  d      dgz   d	         j                         }| j                  j                  |      sd }t        ||d
      }| j                  | j                  |d      ||      S )NrN
  r  r   r  rB  c              3   4   K   | ]  \  }}|k(  s|  y wrB  r   )r   r  r?  r  s      rx   r   z8YoutubeMusicSearchURLIE._real_extract.<locals>.<genexpr>  s     P$!QAKAPr  r  r   r   r  r  rd   r  )r$   r+  rw  	_SECTIONSr   r8  r9  r  rt   r  r   r  rd	  )r  r  r  r  sectionr  r  s         @rx   r   z%YoutubeMusicSearchURLIE._real_extract  s    c]'6266#;:g&q)P$..*>*>*@PRXYGll//32$1F0JKQQSG^^''0FeWE:##D$8$8Wb$8$cejlqrrrz   N)	r   r   r   r#  r)  r$  r*  rW
  r   r   rz   rx   rP
  rP
    s    OG(GhJF&)
 k.1
 "=1 [<?
 "=1F4 11=A/0Isrz   rP
  c                   4    e Zd ZdZdZdZd Zed        Zd Z	y)YoutubeFeedsInfoExtractorz_
    Base class for feed extractors
    Subclasses must re-define the _FEED_NAME property.
    Tfeedsc                 .    t         j                  |        y rB  )r   rC  rD  s    rx   rE  z*YoutubeFeedsInfoExtractor._real_initialize  s     66t<rz   c                      d| j                    S )Nzyoutube:)
_FEED_NAMErD  s    rx   r)  z!YoutubeFeedsInfoExtractor.IE_NAME  s    $//*++rz   c                 f    | j                  d| j                   t        j                               S )Nzhttps://www.youtube.com/feed/r
  )rt  r^
  r  r  r  s     rx   r   z'YoutubeFeedsInfoExtractor._real_extract  s4    +DOO+<=,BUBUBW  Y 	Yrz   N)
r   r   r   r  rH  r^
  rE  r   r)  r   r   rz   rx   rZ
  rZ
    s2     OJ= , ,Yrz   rZ
  c                   *    e Zd ZdZdZdZdddgZd Zy)YoutubeWatchLaterIEzyoutube:watchlaterzDYoutube watch later list; ":ytwatchlater" keyword (requires cookies)z:ytwatchlaterTr  c                 L    | j                  dt        j                               S )Nz(https://www.youtube.com/playlist?list=WLr
  r
  r  s     rx   r   z!YoutubeWatchLaterIE._real_extract  s(    6<;N;N;P  R 	Rrz   Nr   r   r   r)  r#  r$  r*  r   r   rz   rx   ra
  ra
    s)    "GTG!J F
Rrz   ra
  c                   8    e Zd ZdZdZdZdZddddddd	ddgZy
)YoutubeRecommendedIEz,YouTube recommended videos; ":ytrec" keywordz?https?://(?:www\.)?youtube\.com/?(?:[?#]|$)|:ytrec(?:ommended)?r	  Fz:ytrecTr  z:ytrecommendedrw  N)r   r   r   r#  r$  r^
  rH  r*  r   rz   rx   re
  re
    sB    <GSJJO   %	Frz   re
  c                   ,    e Zd ZdZdZdZddddddgZy)	YoutubeSubscriptionsIEz@YouTube subscriptions feed; ":ytsubs" keyword (requires cookies)z:ytsub(?:scription)?s?subscriptionsz:ytsubsTr  z:ytsubscriptionsNr   r   r   r#  r$  r^
  r*  r   rz   rx   rg
  rg
    s0    PG*J J "Frz   rg
  c                   $    e Zd ZdZdZdZdddgZy)YoutubeHistoryIEz:Youtube watch history; ":ythis" keyword (requires cookies)z:ythis(?:tory)?ru	  z
:ythistoryTr  Nri
  r   rz   rx   rk
  rk
    s#    JG#JJ Frz   rk
  c                   :    e Zd ZdZdZdZdddgZed        Zd Z	y	)
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                     d| j                         fdz  z  }t        j                  j                  t	        j
                  |      j                               S )zK
        Generates sfv_audio_pivot browse params for this video id
        s   +
)'
%b%b%brK   )r  r8  r9  quoter   r!  r"  )r  	pb_paramss     rx   _generate_audio_pivot_paramsz6YoutubeShortsAudioPivotIE._generate_audio_pivot_params-  sH    
 F(//J[I]`aIab	||!!&"2"29"="D"D"FGGrz   c                 v    | j                  |      }| j                  d| j                  |       t              S )Nz0https://www.youtube.com/feed/sfv_audio_pivot?bp=r
  )r  rt  rq
  r  r  r  r  s      rx   r   z'YoutubeShortsAudioPivotIE._real_extract5  s@    >>#&>t?`?`ai?j>kl   	rz   N)
r   r   r   r#  r)  r$  r*  r  rq
  r   r   rz   rx   rm
  rm
  $  s>    PG*GSJB F
 H Hrz   rm
  c                   R    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 Zy)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                     t        dd      )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  s     rx   r   z#YoutubeTruncatedURLIE._real_extractc  s    4
  	rz   Nrc
  r   rz   rx   ru
  ru
  <  so    %GGJ" S 0 @ ; 8 6F(rz   ru
  c                       e Zd ZdZdZdi dddddd	d
dddddddddgdddddddddedddd d!d"d#d$d%dd&d'ed(ed)ed*d+
d,gZd- Zy.)/YoutubeClipIEzyoutube:clipz4https?://(?:www\.)?youtube\.com/clip/(?P<id>[^/?#]+)z7https://www.youtube.com/clip/UgytZKpehg-hEMBSn3F4AaABCQr   zUgytZKpehg-hEMBSn3F4AaABCQr  r  section_startg      =@section_endgC@r  gffffff%@r  r   r  r  r  r  r  zScott The Wozr  UC4rqhyiTs7XyuODcECvuiiQr  z8https://www.youtube.com/channel/UC4rqhyiTs7XyuODcECvuiiQr  z$md5:7a4517a17ea9b4bd98996399d8bb36e7r  r  Tr  r  rZ  z:https://i.ytimg.com/vi_webp/ScPX26pdQik/maxresdefault.webpr  z'Mobile Games on Console - Scott The Woz20210920z@ScottTheWozz$https://www.youtube.com/@ScottTheWozr  zcount:20r  )
r~  r  r  r  r  r  r  r  r  r  r  c           	         | j                  |      }| j                  ||      \  }}t        |d      }|st        d      t        |dd      }dd| t        j                         |t        |d         d	z  t        |d
         d	z  dS )Nr	  zUnable to find video ID)r  .r  r  clipSectionRendererr  .clipAttributionRendereronScrubExitcommandExecutorCommandcommands.r#
  r$
  notificationActionRendereractionButtonr  r  r
  r
  .loopCommandFr  rE  r  startTimeMsr  	endTimeMs)r  r  r  r   ry
  rz
  )r  rI	  r+   r   rk  r  r  )r  r  clip_idrr   r  r  	clip_datas          rx   r   zYoutubeClipIE._real_extract  s    ..%''W54&Z[ !:;;  (F PU	V	 '5hZ@&&( =!9:TAy56=
 	
rz   N)r   r   r   r)  r$  r  r*  r   r   rz   rx   rx
  rx
  m  s   GHJ I
.
5
 T
 4	

 
 
 H
 8*
 
 4
 U
 A
 #
  
 J
  U!
" >#
$ &')B%&)" "7
   FD
rz   rx
  c                       e Zd ZdZdZdZdi ddddd	d
dddedddddddddddedddg ddddedd d!d"d#ed$d%gd&d'd(d)d(d d*d+d,gd-d,id.gZd/ Zy0)1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   rf  r  r  r  r   r  rs  r  r  r  r~  rg  rZ  rh  r  ri  r  rr  r  r  r  rj  r  rl  r  r  Tr  rm  r  rn  r  r  ro  rp  rq  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  )r  r  r	  r  c                     t        t        |      j                  dd g      d         }|st        dd      | j	                  |      S )Ncontinuer   z#Invalid cookie consent redirect URLTr  )r3   r$   r+  r   rt  )r  r  r	  s      rx   r   z&YoutubeConsentRedirectIE._real_extract  sE    "8C=#4#4Z$#H#LM !FQUVV|,,rz   N)	r   r   r   r)  r#  r$  r  r*  r   r   rz   rx   r
  r
    s9   GG6J R
-
5
 
 >	

 S
 

 :
 O
 U
 B
 #
 J
 p
   b
 #
   !
" #
$ %&)4*+%!+.A/#'"9
< +"I.C" "FH-rz   r
  c                   *    e Zd ZdZdZdZdddgZd Zy)	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                 L    | j                  |      }t        d| d| dd      )NzIncomplete YouTube ID z. URL z looks truncated.Tr  )r  r   rs
  s      rx   r   z"YoutubeTruncatedIDIE._real_extract  s3    >>#&$XJfSE9JK 	rz   Nrc
  r   rz   rx   r
  r
    s*    $GGYJ < F
rz   r
  )lr   rh  r  r   rg  rf  r   r  r  r  r  os.pathr  r_  r+  r  r  r  r  r1  urllib.parser8  commonr   r   openloadr   compatr   jsinterpr	   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/   r0   r1   r2   r3   r4   r5   rs  r   ry   r   r   Enumr   r   rk  r/  r  rN  r

  r
  r
  r
  r 
  r>
  rD
  rH
  rP
  rZ
  ra
  re
  rg
  rk
  rm
  ru
  rx
  r
  r
  r   rz   rx   <module>r
     sL               	  
     6 &  $ A+ + + + + + + + + + +Z /  G#!3
 *+	 G3!3
 *,	 G-)!3
 *,
 G+!3
 *,	 G'!+%'^	
 *+" G7!+%'^	
 *," G-!*%'h	
 *," G/!,%'l	
 *,"  G#!*+i	
 *+" 6!*+i	
 *," G)!)+m	
 *," +!,+m	
 *," G$!3
 *+	 G>!&
 *,	Aj Z>I
#8  		 h
} h
Vg6( g6TmS": Slm=. m=`'oT oTd0@M 0@f;} ;am a&2 &&Yd8 Ydx13F .57J Di4 DiN2s9 2sjY Y(R- R4 "
6 
0  0.M .b:
/ :
z,-7 ,-^= rz   