
    V|h                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrSSKJr  SSKJrJr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#   " S S\RH                  5      r% " S	 S
\RH                  5      r&\RN                   " S S5      5       r(\RN                   " S S\(5      5       r)\RN                   " S S\(5      5       r*\RN                   " S S\(5      5       r+\&RX                  \)" SSSSS9\&RZ                  \)" SSSSS9\&R\                  \)" SSS90\*" SS9\+" SS9S.r/SSSS.0SSS.\/ESSSSS .0SSS.\/ESS!S"S.0S#SS.S$SS%S&S.0S'\&RX                  \)" SSSSS9\&RZ                  \)" SSSSS9\&R\                  \)" SSS90SS(.SS)S&S.0S*\&RX                  \)" SSSSS9\&RZ                  \)" SSSSS9\&R\                  \)" SSS90SSS+.SS,S-S.S/S0S1S2.0SS\&RX                  \)" SSSS39\&RZ                  \)" SSSS39\&R\                  \)" SSSS390\*" SSS9S4.SS5S6S7S8S9S:S0S;S<.0S=SS>.SS?S@SASBSCSDSESF.0SG\&RX                  \)" SSSS39\&R\                  \)" SSSS390\*" SSS9SSH.SSISSJS .0S\&RX                  \)" SSSSS9\&RZ                  \)" SSSSS9\&R\                  \)" SSS90SSK.SSLSMSNS .0SOSSPSQ.SSRSSS.0\&RX                  \)" SSS9\&RZ                  \)" SSS9\&R\                  \)" SSS90STSU.SSVSWS.0SXSSSY.SZ.r0S[ r1S\ r2S] r3\3" 5          " S^ S_\RH                  5      r4S`r5 " Sa Sb\5      r6g)c    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                        \ rS rSrSrSrSrSrg)_PoTokenContext$   playergvssubs N)__name__
__module____qualname____firstlineno__PLAYERGVSSUBS__static_attributes__r       X/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/youtube/_base.pyr   r   $   s    F
CDr(   r   c                        \ rS rSrSrSrSrSrg)StreamingProtocol*   httpsdashhlsr   N)r    r!   r"   r#   HTTPSDASHHLSr'   r   r(   r)   r+   r+   *   s    ED
Cr(   r+   c                   @    \ rS rSr% Sr\\S'   Sr\\S'   Sr\\S'   Sr	g)BasePoTokenPolicy0   Frequiredrecommendednot_required_for_premiumr   N)
r    r!   r"   r#   r6   bool__annotations__r7   r8   r'   r   r(   r)   r4   r4   0   s!    HdK%*d*r(   r4   c                   $    \ rS rSr% Sr\\S'   Srg)GvsPoTokenPolicy8   Fnot_required_with_player_tokenr   N)r    r!   r"   r#   r>   r9   r:   r'   r   r(   r)   r<   r<   8   s    +0"D0r(   r<   c                       \ rS rSrSrg)PlayerPoTokenPolicy=   r   Nr    r!   r"   r#   r'   r   r(   r)   r@   r@   =       r(   r@   c                       \ rS rSrSrg)SubsPoTokenPolicyB   r   NrB   r   r(   r)   rE   rE   B   rC   r(   rE   TF)r6   r7   r8   r>   )r6   r7   )r6   )GVS_PO_TOKEN_POLICYPLAYER_PO_TOKEN_POLICYSUBS_PO_TOKEN_POLICYclientWEBz2.20250925.01.00)
clientNameclientVersion   )INNERTUBE_CONTEXTINNERTUBE_CONTEXT_CLIENT_NAMESUPPORTS_COOKIESz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))rL   rM   	userAgentWEB_EMBEDDED_PLAYERz1.20250923.21.00r=   zmusic.youtube.com	WEB_REMIXz1.20250922.03.00C   )INNERTUBE_HOSTrO   rP   rG   rQ   WEB_CREATOR>   )rO   rP   rG   REQUIRE_AUTHrQ   ANDROIDz20.10.38   z?com.google.android.youtube/20.10.38 (Linux; U; Android 11) gzipAndroid11)rL   rM   androidSdkVersionrR   osName	osVersion)r6   r7   r>   )rO   rP   REQUIRE_JS_PLAYERrG   rH   
ANDROID_VRz1.65.10OculuszQuest 3    ztcom.google.android.apps.youtube.vr.oculus/1.65.10 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip12L)rL   rM   
deviceMakedeviceModelr^   rR   r_   r`      )rO   rP   ra   IOSz20.10.4Applez
iPhone16,2zMcom.google.ios.youtube/20.10.4 (iPhone16,2; U; CPU iOS 18_3_2 like Mac OS X;)iPhonez18.3.2.22D82)rL   rM   rf   rg   rR   r_   r`      )rO   rP   rG   rH   ra   MWEBzMozilla/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))rO   rP   rG   rQ   TVHTML5z7.20250923.13.00z2Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version   zMozilla/5.0 (ChromiumStylePlatform) Cobalt/25.lts.30.1034943-gold (unlike Gecko), Unknown_TV_Unknown_0/Unknown (Unknown, Unknown))rO   rP   rQ   AUTHENTICATED_USER_AGENTTVHTML5_SIMPLYz1.0K   )rO   rG   rP   TVHTML5_SIMPLY_EMBEDDED_PLAYERz2.0U   )rO   rP   rY   rQ   )web
web_safariweb_embedded	web_musicweb_creatorandroid
android_vriosmwebtv	tv_simplytv_embeddedc                     U R                  SS5      tpU(       a  XS   U4$ U R                  SS5      tp!XU(       a  US   4$ S 4$ )N.rN   r   _)rsplitsplit)client_namevariantbases      r)   _split_innertube_clientr   d  sU     ''Q/NGQ(( &&sA.NDGgaj====r(   c                     [        U 5      S   R                  S5      tp[        US S SR                  S U 5       5      5      R	                  5       $ )Nr   r       c              3   *   #    U  H	  oS    v   M     g7f)r   Nr   ).0xs     r)   	<genexpr>$short_client_name.<locals>.<genexpr>n  s     *?AQ4s   )r   r   r   joinupper)r   mainpartss      r)   short_client_namer   l  sI    *;7:@@ELDbq277*?*?#?@FFHHr(   c                  
   SS0n Sn[        US S S2   5      n[        [        R                  5       5       GHJ  u  p4UR	                  SS5        UR	                  SS5        UR	                  S	0 5        [
         H   nUS	   R	                  U[        5       5        M"     UR	                  S
[        5       5        UR	                  S[        5       5        UR	                  SS5        UR	                  SS5        UR	                  SS 5        UR	                  SS 5        US   S   R	                  SS5        [        U5      u  pgnSU" U5      -  US'   US:X  a  XS   S'   US==   S-  ss'   GM3  U(       d  GM=  US==   S-  ss'   GMM     g )NembedUrlzhttps://www.youtube.com/)r|   ru   r~   r}   rz   rV   zwww.youtube.comra   TrG   rH   rI   rY   FrQ   PLAYER_PARAMSrp   rO   rJ   hlen
   priorityembedded
thirdPartyr   r   )
r   tupleINNERTUBE_CLIENTSitems
setdefaultr+   r<   r@   rE   r   )	THIRD_PARTYBASE_CLIENTSr   rJ   ytcfgprotocolr   base_clientr   s	            r)   build_innertube_clientsr   q  s   .K ;Ldd+,H06689)+<=,d3.3)H'(33H>N>PQ *13F3HI/1B1DE/+U3$/3T:!"8,77dC"9&"A+!66jj 7B%&|4*"W*"+ :r(   c                      \ rS rSr\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r	\R
                  " 5       r
\R
                  " 5       r\R
                  " 5       rSrg)	BadgeType  r   N)r    r!   r"   r#   enumautoAVAILABILITY_UNLISTEDAVAILABILITY_PRIVATEAVAILABILITY_PUBLICAVAILABILITY_PREMIUMAVAILABILITY_SUBSCRIPTIONLIVE_NOWVERIFIEDr'   r   r(   r)   r   r     sT     IIK99;))+99; $		yy{Hyy{Hr(   r   youtubec                     ^  \ rS rSrSrSrSrSrSr/ SQr	SS	1r
S
rSrSrSrS rS rS rS r\R(                  S 5       rS rS rS rS rS r\S 5       rS rSrSrSRS jr SRS jr!SSS  jr"SRS! jr#SRS" jr$STS# jr%SSS$ jr&\'S% 5       r(\S& 5       r)S' r*SUS( jr+\S) 5       r,\S* 5       r-U 4S+ jr.   SVS, jr/SWS- jr0\'S. 5       r1\'S/ 5       r2S0 r3S1 r4S2 r5S3 r6S4 r7SSSSSS5.S6 jr8SSSSSSSS7.S8 jr9SSS9.S: jr:S; r;\'STS< j5       r<\=S= 5       r>\=S>\?4S? j5       r@\=S@ 5       rA\=SA 5       rBSXSB jrCSC rDSD\E4SE jrF\'SF 5       rG\'SSG.SH j5       rHSI rI\'SJSK.SL j5       rJ\'SM 5       rKSWSN jrL   SYSO jrM\'SP 5       rNSQrOU =rP$ )ZYoutubeBaseInfoExtractori  z-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                 B    U R                  SU R                   S3USS S9$ )N^()$zUC-iddefault_search_regex_YT_CHANNEL_UCID_RE)selfucids     r)   ucid_or_none%YoutubeBaseInfoExtractor.ucid_or_noneM  s-    !!R(@(@'A"DdG]a!bbr(   c                     U R                  SU R                   S3[        R                  R	                  U=(       d    S5      SS S9$ )Nr  r  r   z@-handler  r  _YT_HANDLE_REurllibparseunquote)r
  handles     r)   handle_or_none'YoutubeBaseInfoExtractor.handle_or_noneP  sI    !!R(:(:';2">@T@TU[Ua_a@b",d " < 	<r(   c                     U R                  SU R                   S3[        R                  R	                  U=(       d    S5      SS S9$ )N'^(?:https?://(?:www\.)?youtube\.com)?/()r   zchannel handler  r  r
  urls     r)   handle_from_url(YoutubeBaseInfoExtractor.handle_from_urlT  sL    !!%LTM_M_L``a"b"(,,"6"6syb"ACS]a " c 	cr(   c                 B    U R                  SU R                   S3USS S9$ )Nr  r  z
channel idr  r  r  s     r)   ucid_from_url&YoutubeBaseInfoExtractor.ucid_from_urlX  s7    !!%LTMeMeLffg"h"%|T " C 	Cr(   c           
          U R                  SSSS/S9S   nU(       d  gXR                  ;  a$  [        SU S	[        U R                  S
S06 S3SS9eUS:w  a  U R	                  SU S35        U$ )zz
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, r   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_lang(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                     U R                   (       a  g U R                  R                  S5      nU(       a!  UR                  R	                  S5      (       d  g U R                  SSSSS9  g )NSOCSCAA.youtube.comCAIT)secure)_has_auth_cookies_youtube_cookiesgetvalue
startswith_set_cookie)r
  socss     r)   _initialize_consent,YoutubeBaseInfoExtractor._initialize_consentn  sU    !!$$((0

--e44tDr(   c                    U R                   R                  S5      n0 nU(       a3   [        [        R                  R                  UR                  5      5      nUR                  U R                  =(       d    SSS.5        U R                  SS[        R                  R                  U5      S9  g ! [         a    U R                  S[        5       -   5         N~f = f)NPREFz Failed to parse user PREF cookier   UTC)r   tzr2  )namer8  )r6  r7  dictr  r  	parse_qslr8  
ValueErrorr+  r	   updater-  r:  	urlencode)r
  pref_cookieprefs      r)   _initialize_pref)YoutubeBaseInfoExtractor._initialize_prefv  s    ++//7`FLL22;3D3DEF 	4//74uEFfFLL<R<RSW<XY  `##$FI\I^$^_`s   2B. .&CCc                 f    SU l         U R                  (       a  SU l         U R                  S5        g g )NFTzFound YouTube account cookies)_passed_auth_cookiesr5  write_debugr
  s    r)   _initialize_cookie_auth0YoutubeBaseInfoExtractor._initialize_cookie_auth  s/    $)!!!(,D%<= "r(   c                     U R                  5         U R                  5         U R                  5         U R                  5         g N)rJ  r<  rP  _check_login_requiredrO  s    r)   _real_initialize)YoutubeBaseInfoExtractor._real_initialize  s2      "$$&""$r(   c                     UR                  S5      (       a  [        SU R                   3SS9eU R                  SU R                   35        g )Noauthz)Login with OAuth is no longer supported. Tr'  z2Login with password is not supported for YouTube. )r9  r   _youtube_login_hintr+  )r
  usernamepasswords      r)   _perform_login'YoutubeBaseInfoExtractor._perform_login  sX    w'' ;D<T<T;UVaeg g 	@AYAY@Z[	]r(   c                 @    U R                  SS9 SU R                   S3$ )Ncookiesmethodz. Also see  z3  for tips on effectively exporting YouTube cookies)_login_hint_COOKIE_HOWTO_WIKI_URLrO  s    r)   rY  ,YoutubeBaseInfoExtractor._youtube_login_hint  s6    ##9#56l4C^C^B_ `D D 	Er(   c                     U R                   (       a0  U R                  (       d  U R                  SU R                   3S S9  g g g )Nz3Login details are needed to download this content. r`  )_LOGIN_REQUIREDis_authenticatedraise_login_requiredrY  rO  s    r)   rT  .YoutubeBaseInfoExtractor._check_login_required  sC    (=(=%%EdF^F^E_`im & o )>r(   z@(?:window\s*\[\s*["\']ytInitialData["\']\s*\]|ytInitialData)\s*=zytInitialPlayerResponse\s*=ru   c                     [         R                  " [        U   5      nUR                  S5      (       a;  U R                  (       a*  UR                  S0 5      R                  S0 5      nUS   US'   U$ )Nrp   rO   rJ   rR   )copydeepcopyr   r7  rg  r   )r
  rJ   r   client_contexts       r)   _get_default_ytcfg+YoutubeBaseInfoExtractor._get_default_ytcfg  sg    /78 99/00T5J5J"--.A2FQQRZ\^_N*/0J*KN;'r(   c                     [         U   S   $ )NrV   )r   )r
  rJ   s     r)   _get_innertube_host,YoutubeBaseInfoExtractor._get_innertube_host  s     ()9::r(   Nc                 `   ^^ UU4S jnU" U5      =(       d    U" U R                  U5      5      $ )Nc                    > [        U TT5      $ rS  )r   )yexpected_typegetters    r)   <lambda>:YoutubeBaseInfoExtractor._ytcfg_get_safe.<locals>.<lambda>  s    '!V];r(   )rn  )r
  r   rw  rv  default_client_funcs     ``  r)   _ytcfg_get_safe(YoutubeBaseInfoExtractor._ytcfg_get_safe  s'    ;U|MuT%<%<^%LMMr(   c                 :    U R                  US S 4[        U5      $ )Nc                     U S   $ )NINNERTUBE_CLIENT_NAMEr   r   s    r)   rx  ?YoutubeBaseInfoExtractor._extract_client_name.<locals>.<lambda>  s
    a 78r(   c                     U S   S   S   $ )NrO   rJ   rL   r   r  s    r)   rx  r    s    a 34X>|Lr(   r|  strr
  r   rz  s      r)   _extract_client_name-YoutubeBaseInfoExtractor._extract_client_name  s,    ##8LNORTbd 	dr(   c                 :    U R                  US S 4[        U5      $ )Nc                     U S   $ )NINNERTUBE_CLIENT_VERSIONr   r  s    r)   rx  BYoutubeBaseInfoExtractor._extract_client_version.<locals>.<lambda>  s
    a :;r(   c                     U S   S   S   $ )NrO   rJ   rM   r   r  s    r)   rx  r    s    a 34X>Or(   r  r  s      r)   _extract_client_version0YoutubeBaseInfoExtractor._extract_client_version  s,    ##;OQRUWeg 	gr(   c                     U R                  SS/[        S9S   =(       d#    U=(       d    U R                  U=(       d    S5      $ )Ninnertube_hostr   r$  r   ru   )r)  CONFIGURATION_ARG_KEYrq  )r
  req_api_hostnamerz  s      r)   _select_api_hostname-YoutubeBaseInfoExtractor._select_api_hostname  sJ    ''(82$G\']^_` Y#Y'+'?'?@WRW'X	Zr(   c                     [        XR                  U5      4S[        S9n[        US[        0 S9nUR	                  U R
                  =(       d    SSSS.5        U$ )	NrO   rv  rJ   )rv  r  r   r@  r   )r   timeZoneutcOffsetMinutes)r   rn  rC  r   rF  r-  )r
  r   rz  contextrm  s        r)   _extract_context)YoutubeBaseInfoExtractor._extract_context  s]    ++N;<>Qaeg &gxtUWXT%9%9%ATujklmr(   c                    [        [        [        R                  " 5       5      5      n/ nU(       a.  UR                  SR	                  UR                  5       5      5        UR                  XAU/5        [        R                  " SR	                  U5      R                  5       5      R                  5       nXF/nU(       a   UR                  SR	                  U5      5        U  SSR	                  U5       3$ )N: r   r   )r  roundtimeappendr   valuesextendhashlibsha1encode	hexdigest)schemesidoriginadditional_parts	timestamp
hash_partssidhashr   s           r)   _make_sid_authorization0YoutubeBaseInfoExtractor._make_sid_authorization  s    diik*+	
chh'7'>'>'@AB9623,,sxx
3::<=GGI$LL!123388E?+,,r(   c                 $    U R                  S5      $ )Nhttps://www.youtube.com)_get_cookiesrO  s    r)   r6  )YoutubeBaseInfoExtractor._youtube_cookies  s      !:;;r(   c                    ^ U R                   m[        U4S j5      n[        U4S j5      n[        U4S j5      nU=(       d    UX24$ )zX
Get SAPISID, 1PSAPISID, 3PSAPISID cookie values
@returns sapisid, 1psapisid, 3psapisid
c                  "   > T S   R                   $ )NSAPISIDr8  
yt_cookiess   r)   rx  ;YoutubeBaseInfoExtractor._get_sid_cookies.<locals>.<lambda>  s    j&;&A&Ar(   c                  "   > T S   R                   $ )Nz__Secure-3PAPISIDr  r  s   r)   rx  r        z2E'F'L'Lr(   c                  "   > T S   R                   $ )Nz__Secure-1PAPISIDr  r  s   r)   rx  r    r  r(   )r6  r   )r
  
yt_sapisidyt_3papisidyt_1papisidr  s       @r)   _get_sid_cookies)YoutubeBaseInfoExtractor._get_sid_cookies  sC    
 **
AB
LMLM ([+BBr(   c           	          / n0 nU(       a  X$S'   U R                  5       u  pVnSU4SU4SU44 H/  u  pU	(       d  M  UR                  U R                  XX5      5        M1     U(       d  gSR                  U5      $ )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_header6YoutubeBaseInfoExtractor._get_sid_authorization_header  s     $3S!151F1F1H.
,*J7,l;,l;=KF s%%d&B&B6PV&ij	= xx''r(   c                     U R                   $ rS  )r5  rO  s    r)   rg  )YoutubeBaseInfoExtractor.is_authenticated  s    %%%r(   c                     U R                  5       u  pnSU R                  ;   n[        U=(       a    U=(       d    U=(       d    U5      $ )N
LOGIN_INFO)r  r6  r9   )r
  r  r  r  has_login_infos        r)   r5  *YoutubeBaseInfoExtractor._has_auth_cookies  sA    151F1F1H.
, &)>)>>NS
(Rl(RlTTr(   c                    > [         TU ]  " U0 UD6n[        U SS 5      (       a/  U R                  (       d  U R	                  SU R
                   S3SS9  U$ )NrM  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getattrr5  r+  rc  )r
  argskwargsresponse	__class__s       r)   r  )YoutubeBaseInfoExtractor._request_webpage  sk    7+T<V< 4/66t?U?UTTXToToSpprt  	   ! r(   c                    U(       a  SU0OSU R                  US90nUR                  U5        U R                  US9nUR                  SS05        U(       a  UR                  U5        U R                  SU R	                  X5       SU 3X4Xg[
        R                  " U5      R                  S5      U[        U R                  SU	/[        S	S
9S   SS.S S9S9$ )Nr  rz  zcontent-typezapplication/jsonhttps://z/youtubei/v1/utf8innertube_keyTr$  r%  r   false)keyprettyPrintc                     U$ rS  r   )r   vs     r)   rx  4YoutubeBaseInfoExtractor._call_api.<locals>.<lambda>3  s    r(   )cndn)video_idfatalnoteerrnotedataheadersquery)r  rF  generate_api_headers_download_jsonr  jsondumpsr  r   r)  r  )r
  epr  r  r  r  r  r  r  api_keyapi_hostnamerz  r  real_headerss                 r)   	_call_api"YoutubeBaseInfoExtractor._call_api!  s     (/	7#Y@U@Ues@U@t4uE000O^-?@A(""t00NO}]_\`aD!((0,..#gY7LX\ / ^^_a& #	$	 # % 	%r(   c                 :    U R                  U R                  USXS9$ )Nzyt initial datar  )_search_json_YT_INITIAL_DATA_RE)r
  item_idwebpager  s       r)   extract_yt_initial_data0YoutubeBaseInfoExtractor.extract_yt_initial_data5  s$      !9!97DUW^ llr(   c                  P    U  H   n[        [        US 5      5      nUc  M  Us  $    g)zZ
Index of current account in account list.
See: https://github.com/yt-dlp/yt-dlp/pull/519
c                     U S   $ )NSESSION_INDEXr   r  s    r)   rx  AYoutubeBaseInfoExtractor._extract_session_index.<locals>.<lambda>?  s	    ?ASr(   N)r   r   )r  r   session_indexs      r)   _extract_session_index/YoutubeBaseInfoExtractor._extract_session_index8  s,     E'7S(TUM($$ r(   c                 V    U (       d  gU R                  S5      u  pnU(       a  X4$ SU4$ )a4  
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firstr   seconds       r)   _parse_data_sync_id,YoutubeBaseInfoExtractor._parse_data_sync_idC  s4     '11$7&= U{r(   c                     [        USS[        1[        45      =n(       a  U$ U R                  " U6 nU R	                  U5      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   r  any_extract_data_sync_idr  )r
  r  delegated_sidr  s       r)   _extract_delegated_session_id6YoutubeBaseInfoExtractor._extract_delegated_session_idU  sO     )5KcUTW/XYY=Y  1148''5a88r(   c                     [        USS[        1[        45      =n(       a  U$ U R                  " U6 nU R	                  U5      S   $ )zX
Extract current user session ID
@params response and/or ytcfg
@return: user session ID
.USER_SESSION_IDrN   r  )r
  r  user_sidr  s       r)   _extract_user_session_id1YoutubeBaseInfoExtractor._extract_user_session_idb  sM     $D30AC5#*NOO8OO1148''5a88r(   c                 z    U R                  SS/[        SS9S   =n(       a  U$ [        USS[        1[        45      $ )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)  r  r   r  r  )r
  r  r  s      r)   r  .YoutubeBaseInfoExtractor._extract_data_sync_idn  sV      22>D6Rgsw2xyz{{<{3gjminpstv 	vr(   c                 h    U R                  SS/[        SS9S   =n(       a  U$ [        US/[        S9$ )z^
Extracts visitorData from an API response or ytcfg
Appears to be used to track session state
visitor_dataNTr  r   )VISITOR_DATA)rO   rJ   visitorData)r%  r,  r  )r)  r  r   r  )r
  r  r*  s      r)   _extract_visitor_data.YoutubeBaseInfoExtractor._extract_visitor_dataz  sL    
  22>D6Rgsw2xyz{{<{wx 	r(   c           	      h    U(       d  0 $ U R                  U R                  SUSSS9USS9=(       d    0 $ )Nz"ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;r   {}r  Fr  )_parse_jsonr  )r
  r  r  s      r)   extract_ytcfg&YoutubeBaseInfoExtractor.extract_ytcfg  sN    I5w  'u   6 < :<	<r(   r   delegated_session_idr  r  r  c                :   0 nU=(       d    U R                  U5      nU(       a  X'S'   Uc  U R                  U5      nU(       d  Ub
  Ub  UOSUS'   U R                  XS=(       d    U R                  U5      S9nUb  XS'   XWS'   [	        US[
        S9(       a  S	US
'   U$ )NzX-Goog-PageIdr   zX-Goog-AuthUser)r  AuthorizationzX-Origin	LOGGED_INr  truezX-Youtube-Bootstrap-Logged-In)r  r  r  r!  r   r9   )	r
  r   r5  r  r  r  r  r  auths	            r)   _generate_cookie_auth_headers6YoutubeBaseInfoExtractor._generate_cookie_auth_headers  s    3`t7Y7YZ_7`';O$  77>M=#<:G:SYZG%&11&  KB]a]z]z  |A  ^B1  C'+O$"(J{$?7=G34r(   )r   r5  r  r  r*  r  rz  c          
         SU R                  Xg5      -   n	[        U R                  US US95      U R                  X5      U	U=(       d    U R	                  U5      U R                  US US9S.U R                  UUUUU	S9En
[        U
5      $ )Nr  c                     U S   $ )NrP   r   r  s    r)   rx  ?YoutubeBaseInfoExtractor.generate_api_headers.<locals>.<lambda>  s
    a8W6Xr(   r  c                     U S   S   S   $ )NrO   rJ   rR   r   r  s    r)   rx  r?    s    BU@VW_@`al@mr(   )zX-YouTube-Client-NamezX-YouTube-Client-VersionOriginzX-Goog-Visitor-Id
User-Agentr4  )r  r  r|  r  r-  r;  r   )r
  r   r5  r  r  r*  r  rz  r  r  r  s              r)   r  -YoutubeBaseInfoExtractor.generate_api_headers  s     t88VW%($$U,Xiw$x&z(,(D(DU([!-!R1K1KE1R..u6m  M.  N
 00%9 /+ 1 
 7##r(   )retry_fatalretry_on_statusc                ~   U R                  US9 H  n U R                  " U0 UD6s  $    g ! [         a  n[        UR                  [
        5      (       aN  [        UR                  [        5      (       a#  UR                  R                  U=(       d    S;  a  Xel         S nAM  U R                  XaS9   S nA  g S nAff = f)Nr  r   i  )
RetryManager_download_webpager   
isinstancecauser   r   statuserror_error_or_warning)r
  rD  rE  r  r  retryes          r)   _download_webpage_with_retries7YoutubeBaseInfoExtractor._download_webpage_with_retries  s    &&[&9E--t>v>> : " agg'9::%aggy99QWW^^TcTqgq=r&' &&q&<s   +
B<A'B7"B77B<c                    SSSSU S3SS.R                  U5      nU(       d  0 $ U R                  X2SUR                  S	S
5      R                  5        S3[	        U R                  U5      SSSS[        1405      S9nU R                  X$5      =(       d    0 nUS:X  aA  U R                  (       d0  [	        USSS[        145      =(       d    0 nUR                  SS 5        U$ )Nzhttps://m.youtube.comr  zhttps://music.youtube.comzhttps://www.youtube.com/embed/z?html5=1zhttps://www.youtube.com/tv)r}   ru   rx   rw   r~   zDownloading r   r  z client configrB  rO   rJ   rR   )r  r  r~   
configInfoappInstallData)r7  rQ  replacestripr   rn  r  r2  rg  rC  pop)r
  rJ   r  r  r  r   config_infos          r)   _download_ytcfg(YoutubeBaseInfoExtractor._download_ytcfg  s   +,4<XJhO.
 #f+ 	 I55,v~~c3/G/M/M/O.PP^ _ !8!8!@2HkC5QC  6  ""85; T>$"7"7&u#X|dV/E F LIK OO,d3r(   c                 *    SU 0nU(       a  SU0US'   U$ )NcontinuationclickTrackingParamsclickTrackingr   )r]  ctpr  s      r)   _build_api_continuation_query6YoutubeBaseInfoExtractor._build_api_continuation_query  s)     L
 &;S%AE/"r(   c                     [        US S 4[        5      nU(       d  g UR                  S5      nU(       d  g UR                  S5      nU R                  X45      $ )Nc                     U S   S   S   $ )Ncontinuationsr   nextContinuationDatar   r  s    r)   rx  JYoutubeBaseInfoExtractor._extract_next_continuation_data.<locals>.<lambda>  s    ?!3A!67M!Nr(   c                     U S   S   $ )Nr]  reloadContinuationDatar   r  s    r)   rx  rg    s    >!23K!Lr(   r]  r^  )r   rC  r7  ra  )clsrenderernext_continuationr]  r`  s        r)   _extract_next_continuation_data8YoutubeBaseInfoExtractor._extract_next_continuation_data  s`    #NLNOSU !(,,^<##$9:00CCr(   continuation_epc                     [        USSS[        145      nUR                  U5        U HB  n[        USS[        145      nU(       d  M   UR	                  S5      nU R                  XE5      s  $    g )NcommandExecutorCommandcommands.continuationCommandtokenr^  )r   rC  r  r  r7  ra  )rj  ro  continuation_commandscommandr]  r`  s         r)   _extract_continuation_ep_data6YoutubeBaseInfoExtractor._extract_continuation_ep_data  su     ,6
C$P!R$$_5,G'2GSVRW1XYL++34C44\GG -r(   c                 b    U R                  U5      nU(       a  U$ [        USSU R                  S9$ )N))contentsr   rows.continuationItemRenderer)continuationEndpoint)buttonbuttonRendererrv  F)get_allrv  )rm  r   rw  )rj  rk  rl  s      r)   _extract_continuation.YoutubeBaseInfoExtractor._extract_continuation  s?    ??I$$H '
 (I(IK 	Kr(   c              #      #    [        US [        5      =(       d    /  Hk  n[        U[        5      (       d  M  UR	                  5        H=  nUR                  S5      nU(       d  M  U R                  US5      nU(       d  M8  XE4v   M?     Mm     g 7f)Nc                     U S   $ )Nalertsr   r  s    r)   rx  :YoutubeBaseInfoExtractor._extract_alerts.<locals>.<lambda>  s    !H+r(   typetext)r   listrJ  rC  r  r7  	_get_text)rj  r  
alert_dictalert
alert_typemessages         r)   _extract_alerts(YoutubeBaseInfoExtractor._extract_alerts  sw     !$(=tDJJJj$//#**,"YYv.
!--v67$-- - Ks   A:B Bc                 D   / / peU HW  u  pxUR                  5       S:X  a  U(       a  UR                  Xx/5        M4  XR                  ;  d  ME  UR                  Xx/5        MY     XeS S -    H  u  pxU R                  SU SU 3US9  M     U(       a  [	        SUS   S    3US9eg )NrM  r   zYouTube said: z - r  rN   r'  )lowerr  _IGNORED_WARNINGSr+  r   )	r
  r  r(  r  r  errorswarningsr  alert_messages	            r)   _report_alerts'YoutubeBaseInfoExtractor._report_alerts  s    r)/%J!W,z9:&<&<< ;<	 *0 +3CR[*@%J.C O[de +A >&*Q-!AHUU r(   c                 L    U R                   " U R                  U5      /UQ70 UD6$ rS  )r  r  )r
  r  r  r  s       r)   _extract_and_report_alerts3YoutubeBaseInfoExtractor._extract_and_report_alerts'  s(    ""4#7#7#=OOOOr(   
badge_listc                    [         R                  [         R                  [         R                  [         R                  [         R                  [         R                  S.n[         R
                  [         R                  [         R                  [         R                  [         R                  S.n[         R                  [         R                  [         R
                  [         R                  [         R                  [         R                  [         R                  S.n/ n[        USS 45       H  nUR                  [        US[        S95      =(       d    UR                  [        US5      5      nU(       a  UR                  S	U05        M_  [        US
SSSS[        SS9nUR                  5        H.  u  pXR                  5       ;   d  M  UR                  S	U
05          M     M     U$ )zZ
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                 0    [         R                  " SU 5      $ )Nz[bB]adgeRenderer$)research)r  r   s     r)   rx  :YoutubeBaseInfoExtractor._extract_badges.<locals>.<lambda>K  s    299MacfCgr(   )iconiconTyper  styler  label)accessibilityDatar  tooltipiconTooltipFr   )r  rv  r  )r   r   r   r   r   r   r   r   r   r7  r  r  r   r  )r
  r  icon_type_mapbadge_style_map	label_mapbadgesbadge
badge_typer  matchlabel_badge_types              r)   _extract_badges(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iE!!,u6JZ]"^_ E"&&|E7'CD  vz23 !w >	=bgwz  EGHE+4??+<'KKM)MM6+;"<= ,= j" r(   c                 6   ^ [        [        U U4S j5      5      $ )Nc                    > US   T:H  $ )Nr  r   )r   r  r  s     r)   rx  5YoutubeBaseInfoExtractor._has_badge.<locals>.<lambda>`  s    ai:6Mr(   )r9   r   )r  r  s    `r)   
_has_badge#YoutubeBaseInfoExtractor._has_badge^  s    L)MNOOr(   )max_runsc          
         U=(       d    S / H  nUc  U /nO-[        X/ S9n[        S [        U5       5       5      (       d  U/nU H  n[        US [        5      nU(       a  Us  s  $ [        US [
        5      =(       d    / nU(       d  [        U[
        5      (       a  UnUS [        [        U5      U=(       d    [        U5      5       nSR                  [        US[        S95      nU(       d  M  Us  s  $    M     g )Nr  c              3   b   #    U  H%  oS L =(       d    [        U[        [        45      v   M'     g7f).N)rJ  r  r   )r   r  s     r)   r   5YoutubeBaseInfoExtractor._get_text.<locals>.<genexpr>i  s'     bSaC#:GC$)GGSas   -/c                     U S   $ )N
simpleTextr   r  s    r)   rx  4YoutubeBaseInfoExtractor._get_text.<locals>.<lambda>l  s    qr(   c                     U S   $ )Nrunsr   r  s    r)   rx  r  o  s    qyr(   r   ).r  r  )
r   r  r   r   r  r  rJ  minlenr   )r  r  	path_listpathobjitemr  r  s           r)   r  "YoutubeBaseInfoExtractor._get_textb  s    '$'D|f"4r:bS[\`Sabbb%Ct%>DKt%8$?E2
4 6 6DBSTH,AD	BCww|D-sST4K  (r(   c           
          U R                   " U/UQ76 =(       d    Sn[        U5      nUc1  [        U R                  S[        R
                  " SSU5      SS S95      nU$ )Nr   z	^([\d,]+)z\scountr  )r  r   r   r  r  sub)r
  r  r  
count_textr  s        r)   
_get_count#YoutubeBaseInfoExtractor._get_countx  s_    ^^D595;
J'=""<r:1NPWae"fhEr(   
thumbnails)	final_keyc                z   / nU=(       d    S/ H  n[        U / [        U5      QUPSP75       H  n[        UR                  S5      5      nU(       d  M&  SU;   a  UR	                  S5      S   nUR                  U[        UR                  S5      5      [        UR                  S5      5      S	.5        M     M     U$ )
zm
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   r7  r   r  r   )r  r  r  r  r  	thumbnailthumbnail_urls          r)   _extract_thumbnails,YoutubeBaseInfoExtractor._extract_thumbnails  s     
%"%D)$0Q(4.0Q)0QS0QR	 +IMM%,@ A$ #m3$1$7$7$<Q$?M!!())--*AB(w)?@#  S & r(   c                    [         R                  " SU 5      nU(       a]  UR                  S5      nU(       a  [        U5      $  [        SR	                  UR                  S5      UR                  S5      5      5      $ g! [
         a     gf = f)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
   formatrE  )relative_time_textmobjr  s      r)   extract_relative_time.YoutubeBaseInfoExtractor.extract_relative_time  s     yy b  JJw'E(//():):4::f;MtzzZ`Oa)bcc   s   8A= =
B
	B
c           	         U(       d  g U R                  U5      nS n[        U[        R                  5      (       a$  [        R
                  " UR                  5       5      nUc;  [        U5      =(       d)    [        U R                  SUR                  5       SS S95      nU(       a.  U(       a'  Uc$  U R                  S;   a  U R                  SU S3SS9  U$ )	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  rJ  dtdatetimecalendartimegm	timetupler   r  r  r-  r+  )r
  r  report_failuredt_r  s        r)   _parse_time_text)YoutubeBaseInfoExtractor._parse_time_text  s    ((.	c2;;'' 8I!$' B+<&&|

k4 ' A,B  dy'8T=Q=QUa=a4TF!<   Nr(   c                 <   [        U R                  S[        S95      n[        U R	                  US95      n[        U5      n[        U R	                  5       5      n[        U5      n  U R                  USUXUU R                  XZ5      XS9	n U R1                  USS9  [7        U/[9        U5      Q76 (       d%  [        SSS9Ul        [        US 5      nU(       d  g Mv  U$ ! [         GaU  n[        UR                  [        5      (       d  U R                  UUS9s S nA$ [        UR                  [        5      (       d  UUl        [        U5         S nAM  UR                  R                  R!                  S5      n[#        U5      (       dh  [%        U R'                  U R)                  UR                  R                  S UUS9=(       d    SUS	S9S
 [*        5      nU(       a  U R-                  SU4/S	S9  UR                  R.                  S;  a  UUl        [        U5         S nAGM  U R                  UUS9s S nA$ S nAff = f! [         aQ  nSUR2                  R5                  5       ;   a  UUl        [        U5         S nAGM  U R                  UUS9s S nA$ S nAff = f)Nraise_incomplete_datar  r  T)	r  r  r  r  r  r  r  r  rz  i   )prefixr0  Fc                     U S   S   $ )NrM  r  r   r  s    r)   rx  <YoutubeBaseInfoExtractor._extract_response.<locals>.<lambda>  s    !G*Y"7r(   ERRORrG  r  zunknown errorzIncomplete data receivedr'  )r9   r)  r  iterrH  nextr  r  r   rJ  rK  r   rN  r   rM  r  readr   r   r1  _webpage_read_contentr  r  rL  r  msgr  r   r   )r
  r  r  r  r  r   check_get_keysr  r  r  rz  raise_for_incompleteicd_retriesicd_rmmain_retriesmain_rmr  rP  first_bytesyt_errorshould_retrys                        r)   _extract_response*YoutubeBaseInfoExtractor._extract_response  st     $D$;$;<S\q$;$rs4,,3G,HIk"D--/0|$ >>>w$ 11%H!-	 * N>	>//D/I  D8N+CDD-.HSWX#K6#O[ " >!!''+=>>11!51AA#AGGY7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 I  H=(.H8H=1H8C	H8#H82H=8H= 
J
0JJJJc                 4    [         R                  " SU 5      S L$ )Nz (https?://)?music\.youtube\.com/)r  r  )r  s    r)   is_music_url%YoutubeBaseInfoExtractor.is_music_url  s    xx;SAMMr(   )rM  )ru   )Nru   rS  )r  N)TNDownloading API JSONzUnable to download API pageNNNru   )T)TTF)r  NNNbrowseTNru   )Qr    r!   r"   r#   __doc___RESERVED_NAMES_PLAYLIST_ID_RErf  _INVIDIOUS_SITESr*  r  r  r	  _NETRC_MACHINErc  r  r  r  r  	functoolscached_propertyr-  r<  rJ  rP  rU  r\  propertyrY  rT  r  _YT_INITIAL_PLAYER_RESPONSE_RErn  rq  r|  r  r  r  r  staticmethodr  r6  r  r  rg  r5  r  r  r  r  r  r  r!  r  r-  r2  r;  r  rQ  rZ  ra  classmethodrm  rC  rw  r  r  r  r  r  r  r  r  r  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";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[ 
6 	 	 
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   )7r  rk  dataclassesr  r  r   r  r  r  r  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+   	dataclassr4   r<   r@   rE   r0   r1   r2   WEB_PO_TOKEN_POLICIESr   r   r   r   r   r  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 $ 
$ !7@ +!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 $ 
$ !9@ '!3Q
 *+  %h .!&
 ##%5 & ""$4 % !!#3 $ 
 *,+8 >!&
 *, 
k@ F>I
#>  		  " gN} gNr(   