
    =Ґi                     "   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 ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#  G d dejH                        Z% G d	 d
ejH                        Z&ejN                   G d d             Z(ejN                   G d de(             Z)ejN                   G d de(             Z*ejN                   G d de(             Z+e&jX                   e)dddd      e&jZ                   e)dddd      e&j\                   e)dd      i e*d       e+d      dZ/ddddidddde/ddddd idddde/dd!d"did#dd$d%dd&d'did(e&jX                   e)dddd      e&jZ                   e)dddd      e&j\                   e)dd      iddd)dd*d+did,e&jX                   e)dddd      e&jZ                   e)dddd      e&j\                   e)dd      iddd-dd.d/d0d1d2d3d4idde&jX                   e)ddd5      e&jZ                   e)ddd5      e&j\                   e)ddd5      i e*dd      d6dd7d8d9d:d;d<d2d=d>id?dd@ddAdBdCdDdEdFdGdHidIe&jX                   e)ddd5      e&j\                   e)ddd5      i e*dd      ddJddKdLdMd ide&jX                   e)dddd      e&jZ                   e)dddd      e&j\                   e)dd      idddNddOdPdQd idRdd$ddOdSdTd idRdddUddVdWdie&jX                   e)dd      e&jZ                   e)dd      e&j\                   e)dd      idXdYdZZ0d[ Z1d\ Z2d] Z3d^ Z4 e4         G d_ d`ejH                        Z5daZ6 G db dce      Z7y)d    N   )InfoExtractor   )	HTTPErrornetwork_exceptions)ExtractorErrorbug_reports_messagedatetime_from_strfilter_dict	get_firstint_or_noneis_htmljoin_nonemptyparse_count	qualities
str_to_inttraverse_objtry_calltry_getunified_timestampurl_or_nonevariadicc                       e Zd ZdZdZdZy)_PoTokenContextplayergvssubsN)__name__
__module____qualname__PLAYERGVSSUBS     W/var/www/descvideos/venv/lib/python3.12/site-packages/yt_dlp/extractor/youtube/_base.pyr   r   $   s    F
CDr%   r   c                       e Zd ZdZdZdZy)StreamingProtocolhttpsdashhlsN)r   r   r    HTTPSDASHHLSr$   r%   r&   r(   r(   *   s    ED
Cr%   r(   c                   8    e Zd ZU dZeed<   dZeed<   dZeed<   y)BasePoTokenPolicyFrequiredrecommendednot_required_for_premiumN)r   r   r    r1   bool__annotations__r2   r3   r$   r%   r&   r0   r0   0   s!    HdK%*d*r%   r0   c                       e Zd ZU dZeed<   y)GvsPoTokenPolicyFnot_required_with_player_tokenN)r   r   r    r8   r4   r5   r$   r%   r&   r7   r7   8   s    +0"D0r%   r7   c                       e Zd Zy)PlayerPoTokenPolicyNr   r   r    r$   r%   r&   r:   r:   =       r%   r:   c                       e Zd Zy)SubsPoTokenPolicyNr;   r$   r%   r&   r>   r>   B   r<   r%   r>   TF)r1   r2   r3   r8   )r1   r2   )r1   )GVS_PO_TOKEN_POLICYPLAYER_PO_TOKEN_POLICYSUBS_PO_TOKEN_POLICYclientWEBz2.20260114.08.00)
clientNameclientVersion   )INNERTUBE_CONTEXTINNERTUBE_CONTEXT_CLIENT_NAMESUPPORTS_COOKIESSUPPORTS_AD_PLAYBACK_CONTEXTzMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15,gzip(gfe))rD   rE   	userAgentWEB_EMBEDDED_PLAYERz1.20260115.01.008   )rG   rH   rI   zmusic.youtube.com	WEB_REMIXz1.20260114.03.00C   )INNERTUBE_HOSTrG   rH   r?   rI   rJ   WEB_CREATORz1.20260114.05.00>   )rG   rH   r?   REQUIRE_AUTHrI   ANDROIDz21.02.35   z?com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzipAndroid11)rD   rE   androidSdkVersionrK   osName	osVersion)r1   r2   r8   )rG   rH   REQUIRE_JS_PLAYERr?   r@   
ANDROID_VRz1.71.26OculuszQuest 3    ztcom.google.android.apps.youtube.vr.oculus/1.71.26 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip12L)rD   rE   
deviceMakedeviceModelrX   rK   rY   rZ      )rG   rH   r[   IOSz21.02.3Applez
iPhone16,2zMcom.google.ios.youtube/21.02.3 (iPhone16,2; U; CPU iOS 18_3_2 like Mac OS X;)iPhonez18.3.2.22D82)rD   rE   r`   ra   rK   rY   rZ      )rG   rH   r?   r@   r[   MWEBz2.20260115.01.00zMozilla/5.0 (iPad; CPU OS 16_7_10 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1,gzip(gfe))rG   rH   r?   rI   rJ   TVHTML5z7.20260114.12.00zMozilla/5.0 (ChromiumStylePlatform) Cobalt/25.lts.30.1034943-gold (unlike Gecko), Unknown_TV_Unknown_0/Unknown (Unknown, Unknown)   z
5.20260114z2Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version)rG   rH   rS   rI   TVHTML5_SIMPLYz1.0K   )rG   r?   rH   )web
web_safariweb_embedded	web_musicweb_creatorandroid
android_vriosmwebtvtv_downgraded	tv_simplyc                     | j                  dd      ^}}|r||d   |fS | j                  dd      ^}}| ||r|d   fS d fS )N.rF   r   _)rsplitsplit)client_namevariantbases      r&   _split_innertube_clientr   e  s]     ''Q/NGdQ(( &&sA.ND7Ggaj====r%   c                     t        |       d   j                  d      ^}}t        |d d dj                  d |D                    j	                         S )Nr   rz       c              3   &   K   | ]	  }|d      yw)r   Nr$   ).0xs     r&   	<genexpr>z$short_client_name.<locals>.<genexpr>o  s     *?A1Q4*?s   )r   r|   r   joinupper)r}   mainpartss      r&   short_client_namer   m  sK    *;7:@@ELD5bq277*?*?#?@FFHHr%   c                 P    | d   j                  di       j                  ddi       y )NrG   
thirdPartyembedUrlzhttps://www.youtube.com/)
setdefaultupdate)ytcfgs    r&   _fix_embedded_ytcfgr   r  s/    	
)),;BB.D r%   c                     d} t        | d d d         }t        t        j                               D ]'  \  }}|j	                  dd       |j	                  dd       |j	                  di        t
        D ]  }|d   j	                  |t                      ! |j	                  dt                      |j	                  d	t                      |j	                  d
d       |j	                  dd       |j	                  dd       |j	                  dd        |d   d   j	                  dd       t        |      \  }}}d ||      z  |d<   |dk(  st        |       * y )N)ru   rl   rt   rq   rs   rP   zwww.youtube.comr[   Tr?   r@   rA   rS   FrI   rJ   PLAYER_PARAMSrG   rB   hlen
   priorityembedded)r   tupleINNERTUBE_CLIENTSitemsr   r(   r7   r:   r>   r   r   )BASE_CLIENTSr   rB   r   protocolrz   base_clientr~   s           r&   build_innertube_clientsr   x  sW   :Ldd+,H06689 ')+<=,d3.3) 	RH'(33H>N>PQ	R13F3HI/1B1DE/+U37?$/!"8,77dC"9&"A;+!66jj &%'r%   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)r   r   r    enumautoAVAILABILITY_UNLISTEDAVAILABILITY_PRIVATEAVAILABILITY_PUBLICAVAILABILITY_PREMIUMAVAILABILITY_SUBSCRIPTIONLIVE_NOWVERIFIEDr$   r%   r&   r   r     sb    %DIIK$499;#$))+$499; )		tyy{Htyy{Hr%   r   youtubec                       e Zd ZdZdZdZdZdZg dZddhZ	d	Z
d
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ed        Zd ZdZdZdPdZdPdZ dQdZ!dPd Z"dPd!Z#dRd"Z$dQd#Z%e&d$        Z'ed%        Z(d& Z)dSd'Z*ed(        Z+ed)        Z, fd*Z-	 	 	 dTd+Z.dUd,Z/e&d-        Z0e&d.        Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6dddddd4d5Z7dddddddd6d7Z8ddd8d9Z9d: Z:e&dRd;       Z;e<d<        Z=e<d=e>fd>       Z?e<d?        Z@e<d@        ZAdVdAZBdB ZCdCeDfdDZEe&dE        ZFe&ddFdG       ZGdH ZHe&dIdJdK       ZIe&dL        ZJdUdMZK	 	 	 dWdNZLe&dO        ZM xZNS )X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Unavailable videos are hiddenz@[\w.-]{3,30}zUC[\w-]{22}r   zJhttps://github.com/yt-dlp/yt-dlp/wiki/Extractors#exporting-youtube-cookiesc                 H    | j                  d| j                   d|dd       S )N^()$zUC-iddefault_search_regex_YT_CHANNEL_UCID_RE)selfucids     r&   ucid_or_nonez%YoutubeBaseInfoExtractor.ucid_or_noneO  s-    !!R(@(@'A"DdG]a!bbr%   c                     | j                  d| j                   dt        j                  j	                  |xs d      dd       S )Nr   r   r   z@-handler   r   _YT_HANDLE_REurllibparseunquote)r  handles     r&   handle_or_nonez'YoutubeBaseInfoExtractor.handle_or_noneR  sI    !!R(:(:';2">@T@TU[Ua_a@b",d " < 	<r%   c                     | j                  d| j                   dt        j                  j	                  |xs d      dd       S )N'^(?:https?://(?:www\.)?youtube\.com)?/()r   zchannel handler   r  r  urls     r&   handle_from_urlz(YoutubeBaseInfoExtractor.handle_from_urlV  sL    !!%LTM_M_L``a"b"(,,"6"6syb"ACS]a " c 	cr%   c                 H    | j                  d| j                   d|dd       S )Nr  r  z
channel idr   r   r  s     r&   ucid_from_urlz&YoutubeBaseInfoExtractor.ucid_from_urlZ  s7    !!%LTMeMeLffg"h"%|T " C 	Cr%   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): delimz, ry   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     r&   _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r%   c                     | j                   ry | j                  j                  d      }|r|j                  j	                  d      sy | j                  dddd       y )NSOCSCAA.youtube.comCAIT)secure)_has_auth_cookies_youtube_cookiesgetvalue
startswith_set_cookie)r  socss     r&   _initialize_consentz,YoutubeBaseInfoExtractor._initialize_consentp  sR    !!$$((0

--e4tDr%   c                    | j                   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)NPREFz Failed to parse user PREF cookier   UTC)r   tzr$  )namer*  )r(  r)  dictr  r  	parse_qslr*  
ValueErrorr  r	   r   r   r,  	urlencode)r  pref_cookieprefs      r&   _initialize_prefz)YoutubeBaseInfoExtractor._initialize_prefx  s    ++//7`FLL22;3D3DEF 	4//74uEFfFLL<R<RSW<XY  `##$FI\I^$^_`s   2B' '%CCc                 \    d| _         | j                  rd| _         | j                  d       y y )NFTzFound YouTube account cookies)_passed_auth_cookiesr'  write_debugr  s    r&   _initialize_cookie_authz0YoutubeBaseInfoExtractor._initialize_cookie_auth  s/    $)!!!(,D%<= "r%   c                     | j                          | j                          | j                          | j                          y N)r:  r.  r?  _check_login_requiredr>  s    r&   _real_initializez)YoutubeBaseInfoExtractor._real_initialize  s2      "$$&""$r%   c                     |j                  d      rt        d| j                   d      | j                  d| j                          y )Noauthz)Login with OAuth is no longer supported. Tr  z2Login with password is not supported for YouTube. )r+  r   _youtube_login_hintr  )r  usernamepasswords      r&   _perform_loginz'YoutubeBaseInfoExtractor._perform_login  sU    w' ;D<T<T;UVaeg g 	@AYAY@Z[	]r%   c                 F    | j                  d       d| j                   dS )Ncookiesmethodz. Also see  z3  for tips on effectively exporting YouTube cookies)_login_hint_COOKIE_HOWTO_WIKI_URLr>  s    r&   rF  z,YoutubeBaseInfoExtractor._youtube_login_hint  s6    ##9#56l4C^C^B_ `D D 	Er%   c                 x    | j                   r.| j                  s!| j                  d| j                   d        y y y )Nz3Login details are needed to download this content. rL  )_LOGIN_REQUIREDis_authenticatedraise_login_requiredrF  r>  s    r&   rB  z.YoutubeBaseInfoExtractor._check_login_required  sC    (=(=%%EdF^F^E_`im & o )>r%   z@(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=zytInitialPlayerResponse\s*=rl   c                 :    t        j                  t        |         S rA  )copydeepcopyr   r  rB   s     r&   _get_default_ytcfgz+YoutubeBaseInfoExtractor._get_default_ytcfg  s    }}.v677r%   c                     t         |   d   S )NrP   )r   rW  s     r&   _get_innertube_hostz,YoutubeBaseInfoExtractor._get_innertube_host  s     ()9::r%   Nc                 T    fd} ||      xs  || j                  |            S )Nc                     t        |       S rA  )r   )yexpected_typegetters    r&   <lambda>z:YoutubeBaseInfoExtractor._ytcfg_get_safe.<locals>.<lambda>  s    '!V]; r%   )rX  )r  r   r_  r^  default_client_funcs     ``  r&   _ytcfg_get_safez(YoutubeBaseInfoExtractor._ytcfg_get_safe  s'    ;U|MuT%<%<^%LMMr%   c                 :    | j                  |d d ft        |      S )Nc                     | d   S )NINNERTUBE_CLIENT_NAMEr$   r   s    r&   r`  z?YoutubeBaseInfoExtractor._extract_client_name.<locals>.<lambda>  s    a 78 r%   c                     | d   d   d   S )NrG   rB   rD   r$   rg  s    r&   r`  z?YoutubeBaseInfoExtractor._extract_client_name.<locals>.<lambda>  s    a 34X>|L r%   rc  strr  r   ra  s      r&   _extract_client_namez-YoutubeBaseInfoExtractor._extract_client_name  s,    ##8LNORTbd 	dr%   c                 :    | j                  |d d ft        |      S )Nc                     | d   S )NINNERTUBE_CLIENT_VERSIONr$   rg  s    r&   r`  zBYoutubeBaseInfoExtractor._extract_client_version.<locals>.<lambda>  s    a :; r%   c                     | d   d   d   S )NrG   rB   rE   r$   rg  s    r&   r`  zBYoutubeBaseInfoExtractor._extract_client_version.<locals>.<lambda>  s    a 34X>O r%   ri  rk  s      r&   _extract_client_versionz0YoutubeBaseInfoExtractor._extract_client_version  s,    ##;OQRUWeg 	gr%   c                 p    | j                  ddgt              d   xs |xs | j                  |xs d      S )Ninnertube_hostr   r  r   rl   )r  CONFIGURATION_ARG_KEYrZ  )r  req_api_hostnamera  s      r&   _select_api_hostnamez-YoutubeBaseInfoExtractor._select_api_hostname  sJ    ''(82$G\']^_` Y#Y'+'?'?@WRW'X	Zr%   c                     t        || j                  |      fdt              }t        |dt        i       }|j	                  | j
                  xs dddd       |S )	NrG   r^  rB   )r^  r   r   r1  r   )r   timeZoneutcOffsetMinutes)r   rX  r4  r   r   r   )r  r   ra  contextclient_contexts        r&   _extract_contextz)YoutubeBaseInfoExtractor._extract_context  s_    D++N;<>Qaeg &gxtUWXT%9%9%ATujklmr%   c                    t        t        t        j                                     }g }|r.|j                  dj	                  |j                                      |j                  |||g       t        j                  dj	                  |      j                               j                         }||g}|r |j                  dj	                  |             |  ddj	                  |       S )N: r   rz   )rj  roundtimeappendr   valuesextendhashlibsha1encode	hexdigest)schemesidoriginadditional_parts	timestamp
hash_partssidhashr   s           r&   _make_sid_authorizationz0YoutubeBaseInfoExtractor._make_sid_authorization  s    diik*+	
chh'7'>'>'@AB9c623,,sxx
3::<=GGIG$LL!123388E?+,,r%   c                 $    | j                  d      S )Nhttps://www.youtube.com)_get_cookiesr>  s    r&   r(  z)YoutubeBaseInfoExtractor._youtube_cookies  s      !:;;r%   c                     | j                   t        fd      }t        fd      }t        fd      }|xs |||fS )zp
        Get SAPISID, 1PSAPISID, 3PSAPISID cookie values
        @returns sapisid, 1psapisid, 3psapisid
        c                  "     d   j                   S )NSAPISIDr*  
yt_cookiess   r&   r`  z;YoutubeBaseInfoExtractor._get_sid_cookies.<locals>.<lambda>  s    j&;&A&A r%   c                  "     d   j                   S )Nz__Secure-3PAPISIDr  r  s   r&   r`  z;YoutubeBaseInfoExtractor._get_sid_cookies.<locals>.<lambda>      z2E'F'L'L r%   c                  "     d   j                   S )Nz__Secure-1PAPISIDr  r  s   r&   r`  z;YoutubeBaseInfoExtractor._get_sid_cookies.<locals>.<lambda>  r  r%   )r(  r   )r  
yt_sapisidyt_3papisidyt_1papisidr  s       @r&   _get_sid_cookiesz)YoutubeBaseInfoExtractor._get_sid_cookies  sE    
 **
AB
LMLM ([+{BBr%   c           	          g }i }|r||d<   | j                         \  }}}d|fd|fd|ffD ]+  \  }}	|	s	|j                  | j                  ||	||             - |sydj                  |      S )z
        Generate API Session ID Authorization for Innertube requests. Assumes all requests are secure (https).
        @param origin: Origin URL
        @param user_session_id: Optional User Session ID
        @return: Authorization header value
        uSAPISIDHASHSAPISID1PHASHSAPISID3PHASHNr  )r  r  r  r   )
r  r  user_session_idauthorizationsr  r  yt_1psapisidyt_3psapisidr  r  s
             r&   _get_sid_authorization_headerz6YoutubeBaseInfoExtractor._get_sid_authorization_header  s     $3S!151F1F1H.
L,*J7,l;,l;= 	kKFC %%d&B&B63PVXh&ij		k xx''r%   c                     | j                   S rA  )r'  r>  s    r&   rR  z)YoutubeBaseInfoExtractor.is_authenticated  s    %%%r%   c                 t    | j                         \  }}}d| j                  v }t        |xr
 |xs |xs |      S )N
LOGIN_INFO)r  r(  r4   )r  r  r  r  has_login_infos        r&   r'  z*YoutubeBaseInfoExtractor._has_auth_cookies  sC    151F1F1H.
L, &)>)>>NS
(Rl(RlTTr%   c                     t        |   |i |}t        | dd       r-| j                  s!| j	                  d| j
                   dd       |S )Nr<  zThe provided YouTube account cookies are no longer valid. They have likely been rotated in the browser as a security measure. For tips on how to effectively export YouTube cookies, refer to  z .F	only_once)super_request_webpagegetattrr'  r  rO  )r  argskwargsresponse	__class__s       r&   r  z)YoutubeBaseInfoExtractor._request_webpage  sh    7+T<V< 4/6t?U?UTTXToToSpprt  	   ! r%   c                    |rd|ind| j                  |      i}|j                  |       | j                  |      }|j                  ddi       |r|j                  |       | j                  d| j	                  |
|       d| ||||t        j                  |      j                  d      |t        | j                  d|	gt        d	
      d   ddd             S )Nr|  ra  zcontent-typezapplication/jsonhttps://z/youtubei/v1/utf8innertube_keyTr  r  r   false)keyprettyPrintc                     |S rA  r$   )rz   vs     r&   r`  z4YoutubeBaseInfoExtractor._call_api.<locals>.<lambda>.  s     r%   )cndn)video_idfatalnoteerrnotedataheadersquery)r~  r   generate_api_headers_download_jsonrw  jsondumpsr  r   r  ru  )r  epr  r  r  r  r  r  r|  api_keyapi_hostnamera  r  real_headerss                 r&   	_call_apiz"YoutubeBaseInfoExtractor._call_api  s    (/	7#Y@U@Ues@U@t4uE000O^-?@A(""t00~NO}]_\`aUwD!((0,..#gY7LX\ / ^^_a& #	$	 # % 	%r%   c                 B    | j                  | j                  |d||      S )Nzyt initial datar  )_search_json_YT_INITIAL_DATA_RE)r  item_idwebpager  s       r&   extract_yt_initial_dataz0YoutubeBaseInfoExtractor.extract_yt_initial_data0  s'      !9!97DUW^fk llr%   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$   rg  s    r&   r`  zAYoutubeBaseInfoExtractor._extract_session_index.<locals>.<lambda>:  s    ?AS r%   N)r   r   )r  r   session_indexs      r&   _extract_session_indexz/YoutubeBaseInfoExtractor._extract_session_index3  s1      	%E'7S(TUM($$	%r%   c                 F    | sy| j                  d      \  }}}|r||fS d|fS )ad  
        Parse data_sync_id into delegated_session_id and user_session_id.

        data_sync_id is of the form "delegated_session_id||user_session_id" for secondary channel
        and just "user_session_id||" for primary channel.

        @param data_sync_id: data_sync_id string
        @return: Tuple of (delegated_session_id, user_session_id)
        )NNz||N)	partition)data_sync_idfirstrz   seconds       r&   _parse_data_sync_idz,YoutubeBaseInfoExtractor._parse_data_sync_id>  s8     '11$7q&&= U{r%   c                     t        |ddt        ht        f      x}r|S  | j                  | }| j	                  |      d   S )z
        Extract current delegated session ID required to download private playlists of secondary channels
        @params response and/or ytcfg
        @return: delegated session ID
        .DELEGATED_SESSION_IDr   r   rj  any_extract_data_sync_idr  )r  r  delegated_sidr  s       r&   _extract_delegated_session_idz6YoutubeBaseInfoExtractor._extract_delegated_session_idP  sQ     )5KcUTW/XYY=Y  1t1148''5a88r%   c                     t        |ddt        ht        f      x}r|S  | j                  | }| j	                  |      d   S )zx
        Extract current user session ID
        @params response and/or ytcfg
        @return: user session ID
        .USER_SESSION_IDrF   r  )r  r  user_sidr  s       r&   _extract_user_session_idz1YoutubeBaseInfoExtractor._extract_user_session_id]  sO     $D30AC5#*NOO8OO1t1148''5a88r%   c                 v    | j                  ddgt        d      d   x}r|S t        |ddt        ht        f      S )z
        Extract current account dataSyncId.
        In the format DELEGATED_SESSION_ID||USER_SESSION_ID or USER_SESSION_ID||
        @params response and/or ytcfg
        r  NTr  r   .)DATASYNC_ID)responseContextmainAppWebResponseContext
datasyncId)r  ru  r   rj  r  )r  r  r  s      r&   r  z.YoutubeBaseInfoExtractor._extract_data_sync_idi  sV      22>D6Rgsw2xyz{{<{3gjminpstv 	vr%   c                 j    | j                  ddgt        d      d   x}r|S t        |dgt              S )zv
        Extracts visitorData from an API response or ytcfg
        Appears to be used to track session state
        visitor_dataNTr  r   )VISITOR_DATA)rG   rB   visitorData)r  r  ry  )r  ru  r   rj  )r  r  r  s      r&   _extract_visitor_dataz.YoutubeBaseInfoExtractor._extract_visitor_datau  sL    
  22>D6Rgsw2xyz{{<{wx 	r%   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      r&   extract_ytcfgz&YoutubeBaseInfoExtractor.extract_ytcfg  sN    I5w  'u   6 < :<	<r%   r   delegated_session_idr  r  r  c                   i }|xs | j                  |      }|r||d<   || j                  |      }|s|	||nd|d<   | j                  ||xs | j                  |            }|
||d<   ||d<   t	        |dt
              rd	|d
<   |S )NzX-Goog-PageIdr   zX-Goog-AuthUser)r  AuthorizationzX-Origin	LOGGED_INry  truezX-Youtube-Bootstrap-Logged-In)r  r  r  r  r   r4   )	r  r   r  r  r  r  r  r  auths	            r&   _generate_cookie_auth_headersz6YoutubeBaseInfoExtractor._generate_cookie_auth_headers  s    3`t7Y7YZ_7`';GO$  77>M=#<:G:SYZG%&11&/  KB]a]z]z  |A  ^B1  C'+GO$"(GJ{$?7=G34r%   )r   r  r  r  r  r  ra  c          	      "   d| j                  ||      z   }	t        | j                  |d |            | j                  ||      |	|xs | j	                  |      | j                  |d |      d| j                  |||||	      }
t        |
      S )Nr  c                     | d   S )NrH   r$   rg  s    r&   r`  z?YoutubeBaseInfoExtractor.generate_api_headers.<locals>.<lambda>  s    a8W6X r%   r  c                     | d   d   d   S )NrG   rB   rK   r$   rg  s    r&   r`  z?YoutubeBaseInfoExtractor.generate_api_headers.<locals>.<lambda>  s    BU@VW_@`al@m r%   )zX-YouTube-Client-NamezX-YouTube-Client-VersionOriginzX-Goog-Visitor-Id
User-Agentr  )rw  rj  rc  rq  r  r	  r   )r  r   r  r  r  r  r  ra  r  r  r  s              r&   r  z-YoutubeBaseInfoExtractor.generate_api_headers  s     t88~VW%($$U,Xiw$x&z(,(D(DUN([!-!R1K1KE1R..u6m  M.  N
 00%9 /+ 1 
 7##r%   )retry_fatalretry_on_statusc                f   | j                  |      D ]  }	  | j                  |i |c S  y # t        $ rz}t        |j                  t
              rBt        |j                  t              r|j                  j                  |xs dvr||_        Y d }~| j                  ||       Y d }~ y d }~ww xY w)Nr  i  i  )
RetryManager_download_webpager   
isinstancecauser   r   statuserror_error_or_warning)r  r  r  r  r  retryes          r&   _download_webpage_with_retriesz7YoutubeBaseInfoExtractor._download_webpage_with_retries  s    &&[&9 		E-t--t>v>>		 " agg'9:%aggy9QWW^^TcTqgq=r&' &&q&<s   -	B0AB+B++B0c                    dddd| dddj                  |      }|si S | j                  ||d|j                  d	d
      j                          dt	        | j                  |      ddddt        hfi            }| j                  ||      xs i }t        |      d   dk(  rt        |       |dk(  r7| j                  s+t	        |dddt        hf      xs i }|j                  dd        |S )Nzhttps://m.youtube.comr  zhttps://music.youtube.comzhttps://www.youtube.com/embed/z?html5=1zhttps://www.youtube.com/tv)rt   rl   ro   rn   ru   zDownloading rz   r  z client configr  rG   rB   rK   )r  r  r   r   ru   
configInfoappInstallData)r)  r  replacestripr   rX  rj  r  r   r   rR  r4  pop)r  rB   r  r  r  r   config_infos          r&   _download_ytcfgz(YoutubeBaseInfoExtractor._download_ytcfg  s$   +,4<XJhO.
 #f+ 	 I55,v~~c3/G/M/M/O.PP^ _ !8!8!@2HkC5QC  6  ""8W5; #6*1-;& T>$"7"7&u#X|dV/E F LIK OO,d3r%   c                      d| i}|rd|i|d<   |S )NcontinuationclickTrackingParamsclickTrackingr$   )r&  ctpr  s      r&   _build_api_continuation_queryz6YoutubeBaseInfoExtractor._build_api_continuation_query  s)     L
 &;S%AE/"r%   c                     t        |d d ft              }|sy |j                  d      }|sy |j                  d      }| j                  ||      S )Nc                     | d   d   d   S )Ncontinuationsr   nextContinuationDatar$   rg  s    r&   r`  zJYoutubeBaseInfoExtractor._extract_next_continuation_data.<locals>.<lambda>  s    ?!3A!67M!N r%   c                     | d   d   S )Nr&  reloadContinuationDatar$   rg  s    r&   r`  zJYoutubeBaseInfoExtractor._extract_next_continuation_data.<locals>.<lambda>  s    >!23K!L r%   r&  r'  )r   r4  r)  r*  )clsrenderernext_continuationr&  r)  s        r&   _extract_next_continuation_dataz8YoutubeBaseInfoExtractor._extract_next_continuation_data  sb    #NLNOSU !(,,^<##$9:00sCCr%   continuation_epc                     t        |dddt        hf      }|j                  |       |D ]=  }t        |ddt        hf      }|s|j	                  d      }| j                  ||      c S  y )NcommandExecutorCommandcommands.continuationCommandtokenr'  )r   r4  r  rj  r)  r*  )r1  r5  continuation_commandscommandr&  r)  s         r&   _extract_continuation_ep_dataz6YoutubeBaseInfoExtractor._extract_continuation_ep_data  s~     ,6
C$P!R$$_5, 	HG'2GSVRW1XYL++34C44\3GG	Hr%   c                 ^    | j                  |      }|r|S t        |dd| j                        S )N))contentsr   rows
subThreads.continuationItemRenderer)continuationEndpoint)buttonbuttonRendererr<  F)get_allr^  )r4  r   r=  )r1  r2  r3  s      r&   _extract_continuationz.YoutubeBaseInfoExtractor._extract_continuation  s?    ??I$$H '
 (I(IK 	Kr%   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$   rg  s    r&   r`  z:YoutubeBaseInfoExtractor._extract_alerts.<locals>.<lambda>  s
    !H+ r%   typetext)r   listr  r4  r  r)  	_get_text)r1  r  
alert_dictalert
alert_typemessages         r&   _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    |      y )Nr  r   zYouTube said: z - r  rF   r  )lowerr  _IGNORED_WARNINGSr  r   )	r  rJ  r  r  r  errorswarningsrQ  alert_messages	            r&   _report_alertsz'YoutubeBaseInfoExtractor._report_alerts  s    r)/ 	=%J!W,z=9:d&<&<<] ;<		= +3VCR[*@ 	f%J.C O[de	f >&*Q-!AHUU r%   c                 L     | j                   | j                  |      g|i |S rA  )rZ  rS  )r  r  r  r  s       r&   _extract_and_report_alertsz3YoutubeBaseInfoExtractor._extract_and_report_alerts&  s*    "t""4#7#7#=OOOOr%   
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  rz   s     r&   r`  z:YoutubeBaseInfoExtractor._extract_badges.<locals>.<lambda>J  s    299MacfCg r%   )iconiconTypery  stylerK  label)accessibilityDataru  tooltipiconTooltipFr   )rF  r^  r   )r   r   r   r   r   r   r   r   r   r)  rj  r  r   rU  )r  r]  icon_type_mapbadge_style_map	label_mapbadgesbadge
badge_typeru  matchlabel_badge_types              r&   _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+;"<=	" r%   c                 4    t        t        | fd            S )Nc                     |d   k(  S )NrK  r$   )rz   r  r~  s     r&   r`  z5YoutubeBaseInfoExtractor._has_badge.<locals>.<lambda>_  s    ai:6M r%   )r4   r   )r|  r~  s    `r&   
_has_badgez#YoutubeBaseInfoExtractor._has_badge]  s    L)MNOOr%   )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  rM  r   )r   r  s     r&   r   z5YoutubeBaseInfoExtractor._get_text.<locals>.<genexpr>h  s'     bC3#:GC$)GGbs   &(c                     | d   S )N
simpleTextr$   rg  s    r&   r`  z4YoutubeBaseInfoExtractor._get_text.<locals>.<lambda>k  s
    q r%   c                     | d   S )Nrunsr$   rg  s    r&   r`  z4YoutubeBaseInfoExtractor._get_text.<locals>.<lambda>n  s
    qy r%   r   ).rL  ry  )
r   r  r   r   rj  rM  r  minlenr   )r  r  	path_listpathobjitemrL  r  s           r&   rN  z"YoutubeBaseInfoExtractor._get_texta  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 	 r%   c           
           | j                   |g| xs d}t        |      }|3t        | j                  dt	        j
                  dd|      dd             }|S )Nr   z	^([\d,]+)z\scountr   )rN  r   r   r   rp  sub)r  r  r  
count_textr  s        r&   
_get_countz#YoutubeBaseInfoExtractor._get_countw  sa    #T^^D595;
J'=""<r:1NPWae"fhEr%   
thumbnails)	final_keyc                X   g }|xs dgD ]  }t        | g t        |      |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$   .r  maxresdefault?r   heightwidth)r  r  r  )r   r   r   r)  r|   r  r   )r  r  r  r  r  	thumbnailthumbnail_urls          r&   _extract_thumbnailsz,YoutubeBaseInfoExtractor._extract_thumbnails  s     
%" 	D)$0Q(4.0Q)0QS0QR 	 +IMM%,@ A$ #m3$1$7$7$<Q$?M!!())--*AB(w)?@# 	 r%   c                    t        j                  d|       }|rX|j                  d      }|rt        |      S 	 t        dj	                  |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)rp  rq  groupr
   formatr6  )relative_time_textmobjr  s      r&   extract_relative_timez.YoutubeBaseInfoExtractor.extract_relative_time  s     yy b  JJw'E(//():):4::f;MtzzZ`Oa)bcc   s   8A2 2	A>=A>c                 x   |sy | j                  |      }d }t        |t        j                        r#t	        j
                  |j                               }|9t        |      xs, t        | j                  d|j                         dd             }|r)|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  )r  r  dtdatetimecalendartimegm	timetupler   r   rU  r   r  )r  rL  report_failuredt_r  s        r&   _parse_time_textz)YoutubeBaseInfoExtractor._parse_time_text  s    ((.	c2;;' 8I!$' B+<&&|

k4 ' A,B  dy'8T=Q=QUa=a4TF!<   Nr%   c                 *   t        | j                  dt                    }t        | j	                  |            }t        |      }t        | j	                               }t        |      }	 	 | j                  |d||||| j                  ||
      |	|
	      }	 | j1                  |d       t7        |gt9        |       s"t        dd      |_        t        |d       }|sy w|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                  j.                  dvr||_        t        |       Y d }~| j                  ||      cY d }~S d }~ww xY w# t        $ rQ}d|j2                  j5                         v r||_        t        |       Y d }~
| j                  ||      cY d }~S d }~ww xY w)Nraise_incomplete_datart  r  T)	r  r  r  r  r  r  r|  r  ra  i   )prefixr  Fc                     | d   d   S )Nr  rR  r$   rg  s    r&   r`  z<YoutubeBaseInfoExtractor._extract_response.<locals>.<lambda>  s    !G*Y"7 r%   ERRORr  r  zunknown errorzIncomplete data receivedr  )r4   r  ru  iterr  nextr  r~  r   r  r  r   r  r   r  r  readr   r   r   _webpage_read_contentrj  rZ  r  r\  msgrU  r   r   )r  r  r  r  r  r   check_get_keysr  r  r  ra  raise_for_incompleteicd_retriesicd_rmmain_retriesmain_rmr  r  first_bytesyt_errorshould_retrys                        r&   _extract_responsez*YoutubeBaseInfoExtractor._extract_response  sn     $D$;$;<S\q$;$rs4,,3G,HIk"D--/0|$ >>>w$E 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[   -*C$ H8 $
H5.,H0H5 ,H0CH0H0*H50H58	J.J5JJJc                 2    t        j                  d|       d uS )Nz (https?://)?music\.youtube\.com/)rp  r  )r  s    r&   is_music_urlz%YoutubeBaseInfoExtractor.is_music_url  s    xx;SAMMr%   )rl   )Nrl   rA  )r  N)TNDownloading API JSONzUnable to download API pageNNNrl   )T)TTF)r  NNNbrowseTNrl   )Or   r   r    __doc___RESERVED_NAMES_PLAYLIST_ID_RErQ  _INVIDIOUS_SITESr  rV  r  r   _NETRC_MACHINErO  r  r  r  r  	functoolscached_propertyr   r.  r:  r?  rC  rI  propertyrF  rB  r  _YT_INITIAL_PLAYER_RESPONSE_RErX  rZ  rc  rl  rq  rw  r~  staticmethodr  r(  r  r  rR  r'  r  r  r  r  r  r  r  r  r  r  r	  r  r  r$  r*  classmethodr4  r4  r=  rG  rS  rZ  r\  rM  r  r  rN  r  r  r  r  r  r  __classcell__)r  s   @r&   r   r     s   7	L  eO
 OCP 	<'
 %M(Nic<cC  "E	Z>%] E Eo
 ^%C"8;N
d
g
Z - - < <C (4 & & U U BF7TPU%(m % %  "9
9
v	< 6:PTfjz~  HL *  dD`dD$* AFW[ 
> 	 	 
D 
D 	HD 	H 	H K K 
. 
.VP2$ 2h P P -1    * 8D  .  ,( VZae).@D N Nr%   r   )8r  rU  dataclassesr  r  r   r  r  r  rp  r  urllib.parser  commonr   networking.exceptionsr   r   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Enumr   r(   	dataclassr0   r7   r:   r>   r,   r-   r.   WEB_PO_TOKEN_POLICIESr   r   r   r   r   r   ru  r   r$   r%   r&   <module>r     s           	   " B    *dii 		  + + + 1( 1 1 	+ 	 	 	) 	 	 	!1%)+0	"
 	 0%)+0	!
 	/ 
$ 25A .u=- : #!3
 *+ (,   #!3 _
 *+ (,   3!3
 *, 	 .)!3
 *,##%5 )-/4	& ""$4 )-/4	% !!#3 $ 
$ !(,9B +!3
 *,##%5 )-/4	& ""$4 )-/4	% !!#3 $ 
$  7> '!+%'^#!	
 *+"##%5 /3&
 ""$4 /3%
 !!#3 /3$ 
" #6uRV"W=F *!*&(%' T#"	
 *,"( #!*%+l"+

 *+##%5 /3& !!#3 /3$ 
 #6uRV"W"7B $!3 k	
 *+##%5 )-/4	& ""$4 )-/4	% !!#3 $ 
$ !(,;B '!3 a	
 *+  '!-Q
 *+  .!&
 ##%5 & ""$4 % !!#3 $ 
 *,+UA H>I
'4  		  " dN} dNr%   