
    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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Jr  SSKJrJrJr  SSKJrJ r 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/  SSK0J1r1  SS	K2J3r3  1 S
kr4\4SS1-  r5 " S S\15      r6S r7 " S S\'5      r8S r9S\6" 5       4SSS.S jjr:S r;S r<S r=S r>S r?S r@ " S S5      rASSS.S jrB " S S \A5      rC " S! S"\A5      rD " S# S$\A5      rES% rF " S& S'\G5      rH " S( S)5      rIS* rJS+ rKS, rLS- rMS\6" 5       4S. jrN " S/ S0\5      rO " S1 S2\5      rP\PR                  R                  5       rSS3 rTS4 rUS5 rVS6 rWS7 rXS8 rYS9 rZS: r[S; r\SKS< jr]SLS= jr^S> r_S? r`S@ raSA rbSB rcSC rdSD reSE rfSMSF jrg " SG SH\	R                  R                  5      rj " SI SJ\	R                  R                  5      rmg)N    N)Enumauto   )aes_cbc_decrypt_bytes aes_gcm_decrypt_and_verify_bytesunpad_pkcs7)!_SECRETSTORAGE_UNAVAILABLE_REASONsecretstoragesqlite3)MultilinePrinterQuietMultilinePrinter)
DownloadErrorYoutubeDLErrorPopenerror_to_strexpand_pathis_path_likesanitize_urlstr_or_nonetry_callwrite_string)
_YDLLogger)normalize_url>   edgebraveoperawhalechromevivaldichromiumfirefoxsafaric                   H   ^  \ rS rSrSU 4S jjr " S S\5      rS rSrU =r	$ )	YDLLogger5   c                    > [         TU ]  XS9$ )N)once)superwarning)selfmessage	only_once	__class__s      H/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/cookies.pyr)   YDLLogger.warning6   s    ww77    c                   $    \ rS rSrSu  rrS rSrg)YDLLogger.ProgressBar9   )g?r   c                     [         R                   " 5       U R                  -
  U R                  :  a0  U R                  SU 3S5        [         R                   " 5       U l        g g )Nz
[Cookies] r   )time_timer_DELAYprint_at_line)r*   r+   s     r.   printYDLLogger.ProgressBar.print<   sF    yy{T[[(4;;6""Zy#91="iik 7r0   )r6   N)__name__
__module____qualname____firstlineno__r7   r6   r9   __static_attributes__ r0   r.   ProgressBarr2   9   s    	*r0   rA   c                 ~   U R                   (       aT  U R                   R                  R                  S5      (       d*  U R                   R                  R                  S5      (       a  gU R                   R                  R                  n UR                  5       (       d  g U R                  USS9$ ! [         a     gf = f)z8Return a context manager with a print method. (Optional)
noprogressloggerNF)preserve_output)_ydlparamsget
_out_fileserrorisattyBaseExceptionrA   )r*   files     r.   progress_barYDLLogger.progress_barA   s     yyDII,,00>>$))BRBRBVBVW_B`B`yy##))	;;== ! e<<  		s   B/ /
B<;B<r@   F)
r;   r<   r=   r>   r)   r   rA   rN   r?   __classcell__r-   s   @r.   r$   r$   5   s    8*& *= =r0   r$   c                 ~    [        U S5      (       a  U R                  5       nU(       a  U$ [        5       nS Ul        U$ )NrN   c                     g Nr@   )_s    r.   <lambda>&_create_progress_bar.<locals>.<lambda>U   s    dr0   )hasattrrN   r   r9   )rD   printers     r.   _create_progress_barr[   O   s9    v~&&%%'N#%G"GMNr0   c                       \ rS rSrSrg)CookieLoadErrorY   r@   Nr;   r<   r=   r>   r?   r@   r0   r.   r]   r]   Y       r0   r]   c           
          / nUb.  [        U6 u  pEpgUR                  [        XE[        U5      XgS95        U bz  [	        U 5      nU(       a  [        U 5      n [        U 5      n	U(       a*  [        R                  " U [        R                  5      (       a  U	R                  5         UR                  U	5        [        U5      $ ! [         a    [        S5      ef = f)Nkeyring	containerzfailed to load cookies)_parse_browser_specificationappendextract_cookies_from_browserr$   r   r   YoutubeDLCookieJarosaccessR_OKload_merge_cookie_jars	Exceptionr]   )
cookie_filebrowser_specificationydlcookie_jarsbrowser_nameprofilerc   rd   is_filenamejars
             r.   load_cookiesrw   ]   s    8 ,8TVk8l5L7,\IcN\cy{ "&{3K)+6$[1C"))K"A"A
s#!+.. 86778s   B:B= =Crb   c                    U S:X  a  [        XU5      $ U S:X  a  [        X5      $ U [        ;   a  [        XX25      $ [	        SU  35      e)Nr!   r"   zunknown browser: )_extract_firefox_cookies_extract_safari_cookiesCHROMIUM_BASED_BROWSERS_extract_chrome_cookies
ValueError)rs   rt   rD   rc   rd   s        r.   rg   rg   t   sS    y 'FCC		!&w77	0	0&|gNN,\N;<<r0   c                   ^ SnUR                  S5        [        (       d  UR                  S5        [        5       $ U c  [	        [        5       5      nOK[        U 5      (       a  U /nO7[        5        Vs/ s H"  n[        R                  R                  XP5      PM$     nnSR                  [        [        U5      5      n[        [        U5      5      nUc  [        SU 35      eUR                  SU S35        S nTS;  Ga  [        R                  R                  [        R                  R!                  U5      S	5      n	[        R                  R#                  U	5      (       a*  [        R$                  " U	[        R&                  5      (       d  [        S
U 35      e[)        U	SS9 n
[*        R,                  " U
5      R/                  S/ 5      nS S S 5        [1        U4S jW 5       S 5      n[3        U[4        5      (       d  [7        ST S35      e[8        R:                  " SS9 n[=        X|5      n[>        R@                  " URB                  5         URE                  S5      RG                  5       S   nX:  a  UR                  SU 35        [3        U[4        5      (       a3  UR                  ST SU 35        URE                  SSU 3SU S345        O:TS:X  a#  UR                  S5        URE                  S5        OURE                  S5        [        5       n[I        U5       nURK                  5       n[M        U5      n[O        U5       H  u  nu  nnnnnnURQ                  SUS  S!US  35        US:  a  Ub  US"-  n[R        RT                  RW                  SUUS S#U[Y        U5      UR[                  S$5      U[Y        U5      UUS#S S 0 S%9nUR]                  U5        M     S S S 5        UR                  S&[M        U5       S'35        UsS S S 5        sS S S 5        $ s  snf ! , (       d  f       GNX= f! , (       d  f       NW= f! , (       d  f       O= f S S S 5        g ! , (       d  f       g = f)(N   zExtracting cookies from firefoxzzCannot extract cookies from firefox without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportz, z+could not find firefox cookies database in Extracting cookies from: "")Nnonezcontainers.jsonz"could not read containers.json in utf8encoding
identitiesc              3      >^#    U  H<  mTTR                  S 5      [        U4S j5      4;   d  M)  TR                  S5      v   M>     g7f)namec                  T   > [         R                  " ST S   5      R                  5       $ )NzuserContext([^\.]+)\.labell10nID)re	fullmatchgroup)contexts   r.   rW   4_extract_firefox_cookies.<locals>.<genexpr>.<lambda>   s     R\\*GQYIZ[aacr0   userContextIdN)rH   r   ).0r   rd   s    @r.   	<genexpr>+_extract_firefox_cookies.<locals>.<genexpr>   sF      gW`KKcde
 X
9W[[99s
   (AAz"could not find firefox container "z" in containers.jsonyt_dlpprefixzPRAGMA user_version;r   z7Possibly unsupported firefox cookies database version: z-Only loading cookies from firefox container "z", ID zzSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE originAttributes LIKE ? OR originAttributes LIKE ?z%userContextId=z&%r   z3Only loading cookies not belonging to any containerztSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE NOT INSTR(originAttributes,"userContextId=")zASELECT host, name, value, path, expiry, isSecure FROM moz_cookiesLoading cookie  6d/i  F.versionr   valueportport_specifieddomaindomain_specifieddomain_initial_dotpathpath_specifiedsecureexpiresdiscardcommentcomment_urlrest
Extracted z cookies from firefox)/infor   r)   rh   list_firefox_browser_dirs_is_pathri   r   joinmaprepr_newest_firefox_cookie_dbsFileNotFoundErrordebugdirnameisfilerj   rk   openjsonrl   rH   next
isinstanceintr}   tempfileTemporaryDirectory_open_database_copy
contextlibclosing
connectionexecutefetchoner[   fetchalllen	enumerater9   http	cookiejarCookiebool
startswith
set_cookie)rt   rd   rD   MAX_SUPPORTED_DB_SCHEMA_VERSIONsearch_rootsr   search_rootcookie_database_pathcontainer_idcontainers_path
containersr   tmpdircursordb_schema_versionrv   rN   tabletotal_cookie_countihostr   r   expiry	is_securecookies    `                        r.   ry   ry      s   &(#
KK127 W 	X!##134	'		y@U@WX@WT3@WX))Cl34K"#6|#DE#"Mk] [\\
LL-.B-C1EFL&'',,rww7K'LN_`ww~~o..biiQSQXQX6Y6Y#&H$VWW/F3z:.22<DJ 4    ,,,A)L`abb		$	$H	5$%9B 1 12 &/E F O O QRS T B!XYjXklm,,,CI;fUaTbce Q&|n5VX7YZ\ f$RS KL bc$&C%f-)%(Z"GPQVGWCACdE4 &&3qASTW@X'YZ )B.63E$!^^22 !EUZ#d4jUYUdUdehUi!$t*YX^hm $$R	 3 AF
 NN6* HX . KK*SXJ.CDEC 32 
6	5- Y 438 .-# 322 
6	5	5sP   2)P"'P,QCP=B=P,'P=	Q
P),
P:6P==
Q	Q
Q&c               #   Z  #    [         R                  S;   a-  [        [        R                  R
                  S5       S h  vN   g [         R                  S:X  a"  [        R                  R                  S5      v   g [        [        R                  R                  S5       S h  vN   g  Nh N7f)Ncygwinwin32)z"%APPDATA%\Mozilla\Firefox\Profilesza%LOCALAPPDATA%\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox\Profilesdarwinz.~/Library/Application Support/Firefox/Profiles)z~/.mozilla/firefoxz&~/snap/firefox/common/.mozilla/firefoxz/~/.var/app/org.mozilla.firefox/.mozilla/firefox)sysplatformr   ri   r   
expandvars
expanduserr@   r0   r.   r   r      s     
||**rww)) ,
  	 	
 
	!gg  !QRR rww)) ,
  	 			s"   <B+B'A"B+!B)"B+)B+c           	   #      #    [        [        R                  R                  U 5       HH  nS H?  n[        R
                  " [        R                  R                  XS5      5       S h  vN   MA     MJ     g  N7f)N) z*/zProfiles/*/zcookies.sqlite)r   ri   r   abspathglobiglobr   )rootsrootpatterns      r.   r   r      sM     BGGOOU+0Gzz"'',,t>N"OPPP 1 ,Ps   A$A6&A4'A6c           
         [         R                  S;   Ga  [        R                  R	                  S5      n[        R                  R	                  S5      n[        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US	5      [        R                  R                  US
5      S.U    nGO[         R                  S:X  a  [        R                  R                  S5      n[        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      S.U    nO[        5       n[        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      [        R                  R                  US5      S.U    nSSS[         R                  S:X  a  SOS[         R                  S:X  a  SOS[         R                  S:X  a  SOSSS.U    nS1nUUX;  S.$ ) Nr   z%LOCALAPPDATA%z	%APPDATA%z%BraveSoftware\Brave-Browser\User DatazGoogle\Chrome\User DatazChromium\User DatazMicrosoft\Edge\User DatazOpera Software\Opera StablezVivaldi\User DatazNaver\Naver Whale\User Data)r   r   r    r   r   r   r   r   z~/Library/Application SupportzBraveSoftware/Brave-BrowserzGoogle/ChromeChromiumzMicrosoft Edgezcom.operasoftware.OperaVivaldizNaver/Whalezgoogle-chromer    zmicrosoft-edger   r   znaver-whaleBraveChromeOperaWhale)browser_dirkeyring_namesupports_profiles)r   r   ri   r   r   r   r   _config_home)rs   appdata_localappdata_roamingr   appdataconfigr   browsers_without_profiless           r.   $_get_chromium_based_browser_settingsr     s   
||****+;<'',,[9WW\\-1YZggll=2LM]4IJGGLL0KLWW\\/3QRww||M3GHWW\\-1OP
  
	!''$$%DEWW\\'+HIggll7O<Wj9GGLL*:;WW\\'+DEww||GY7WW\\'=9
  WW\\&*GHggll6?;VZ8GGLL)9:WW\\&'2ww||FI6WW\\&-8
  $'LLH$< *LLH4* # 89h L ")	 #$)J r0   c           
         UR                  SU  35        [        (       d  UR                  SU  S35        [        5       $ [	        U 5      nUc  US   nO[        U5      (       a1  UnUS   (       a  [        R                  R                  U5      OUUS'   OGUS   (       a$  [        R                  R                  US   U5      nOUR                  U  S35        US   n[        [        USU5      5      nUc  [        SU  S	U S
35      eUR                  SU S
35        [        R                   " SS9 nS n [#        Xg5      n[%        UR'                  S5      R)                  5       S   5      n	[+        US   US   UX)S9n
[,        UR.                  l        [3        US5      nSU;   a  SOSnUR'                  SU S35        [        5       nSnSn[5        U5       nUR7                  5       n[9        U5      n[;        U5       HY  u  nnUR=                  SUS SUS 35        [?        U
/UQ76 u  nnU(       d  US-  nM<  U(       d  US-  nURA                  U5        M[     S S S 5        US:  a  SU S3nOSnUR                  S[9        U5       SU  U 35        U
RB                  RE                  5       nUUS '   UR                  S!U 35        UUb  UR.                  RG                  5         sS S S 5        $ ! , (       d  f       N= f! [H         aH  n[        RJ                  S":X  a.  URL                  S#:X  a  S$nUR                  U5        [O        U5      ee S nAff = f! Ub  UR.                  RG                  5         f f = f! , (       d  f       g = f)%NzExtracting cookies from zCannot extract cookies from zW without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportr   r   z does not support profilesCookieszcould not find z cookies database in "r   r   r   r   z,SELECT value FROM meta WHERE key = "version"r   r   rc   meta_versioncookiesr   r   zBSELECT host_key, name, value, encrypted_value, path, expires_utc, z FROM cookiesr   r   r   r    (z could not be decrypted)r   r   z cookies from unencryptedzcookie version breakdown: nt   zgCould not copy Chrome cookie database. See  https://github.com/yt-dlp/yt-dlp/issues/7271  for more info)(r   r   r)   rh   r  r   ri   r   r   r   rJ   r   _find_filesr   r   r   r   r   r   r   r   get_cookie_decryptorbytesr   text_factory_get_column_namesr[   r   r   r   r9   _process_chrome_cookier   _cookie_countscopyclosePermissionErrorr   errnor   )rs   rt   rc   rD   r   r   r   r   r   r  	decryptorcolumn_namessecure_columnrv   failed_cookiesunencrypted_cookiesrN   r   r   r   lineis_encryptedr   failed_messagecountsrJ   r+   s                              r.   r|   r|     s   
KK*<.9:75l^ DW W 	X!##1,?F]+	'		<BCV<W 8]d}%&'',,vm'<gFKLLL>)CDE /K";{Iv#NO#/,?UVaUbbc dee
LL-.B-C1EF		$	$H	5.	*()=FF v~~.\]ffhijklL,}%vn'=v<I .3F*,VY?L+6,+FKHMNN_`m_nn{|}$&CN"#%f-)%(Z"(/GAt &&3qASTW@X'YZ+A)+Sd+S(L&!&!+ )+q0+NN6*  0 . !#%n%55M!N!#KK*SXJn\N>JZ[\--224F$7F=!LL5fX>? !!!'')a 
6	5& .-*  	ww$5;;"#4 DW%#G,,	 !!!'') "_ 
6	5sX   /M53B!K=BK,A-K=M5,
K:	6K==
MAM

MM M22M55
Nc                    UR                  5       nUR                  5       nUR                  5       nUR                  5       nU(       + =(       a    UnU(       a  U R                  U5      nUc  US 4$ U(       d  S nU[        R                  R	                  SX#S SU[        U5      UR                  S5      U[        U5      XvSS S 0 S94$ )Nr   Fr   r   )decodedecryptr   r   r   r   r   )	r  host_keyr   r   encrypted_valuer   expires_utcr   r  s	            r.   r  r  k  s     H;;=DLLNE;;=D90L!!/2=%% ..U$x.XM`M`adMe$t*Y]b$R	 / 1 1 1r0   c                   "    \ rS rSrSr0 rS rSrg)ChromeCookieDecryptori  a  
Overview:

    Linux:
    - cookies are either v10 or v11
        - v10: AES-CBC encrypted with a fixed key
            - also attempts empty password if decryption fails
        - v11: AES-CBC encrypted with an OS protected key (keyring)
            - also attempts empty password if decryption fails
        - v11 keys can be stored in various places depending on the activate desktop environment [2]

    Mac:
    - cookies are either v10 or not v10
        - v10: AES-CBC encrypted with an OS protected key (keyring) and more key derivation iterations than linux
        - not v10: 'old data' stored as plaintext

    Windows:
    - cookies are either v10 or not v10
        - v10: AES-GCM encrypted with a key which is encrypted with DPAPI
        - not v10: encrypted with DPAPI

Sources:
- [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/
- [2] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_linux.cc
    - KeyStorageLinux::CreateService
c                     [        S5      e)Nz"Must be implemented by sub classes)NotImplementedError)r*   r#  s     r.   r!  ChromeCookieDecryptor.decrypt  s    !"FGGr0   r@   N)r;   r<   r=   r>   __doc__r  r!  r?   r@   r0   r.   r&  r&    s    6 NHr0   r&  r  c                    [         R                  S:X  a
  [        XUS9$ [         R                  S;   a
  [        XUS9$ [	        XX4S9$ )Nr   )r  )r   r   r  )r   r   MacChromeCookieDecryptorWindowsChromeCookieDecryptorLinuxChromeCookieDecryptor)browser_rootbrowser_keyring_namerD   rc   r  s        r.   r  r    sE    
||x'(<S_``	,	,+L|\\%&:Goor0   c                   ^    \ rS rSrSSS.S jr\R                  S 5       r\S 5       r	S r
Srg)	r.  i  Nr  c                    X l         U R                  S5      U l        U R                  S5      U l        SSSS.U l        Xl        X0l        U=(       d    SU l        g )Ns   peanutsr0   r   )v10v11other)_logger
derive_key_v10_key
_empty_keyr  _browser_keyring_name_keyring_meta_version)r*   r0  rD   rc   r  s        r.   __init__#LinuxChromeCookieDecryptor.__init__  sN    
3//#.&'A>%9").Qr0   c                     [        U R                  U R                  U R                  5      nUc  S $ U R	                  U5      $ rU   )_get_linux_keyring_passwordr:  r;  r6  r7  )r*   passwords     r.   _v11_key#LinuxChromeCookieDecryptor._v11_key  s:    .t/I/I4==Z^ZfZfg'tFT__X-FFr0   c                     [        U SSSS9$ )N	   saltysaltr   r   salt
iterations
key_lengthpbkdf2_sha1rA  s    r.   r7  %LinuxChromeCookieDecryptor.derive_key  s     8,1QSTTr0   c                 &   USS nUSS nUS:X  aO  U R                   S==   S-  ss'   [        X0R                  U R                  4U R                  U R
                  S:  S9$ US:X  aw  U R                   S	==   S-  ss'   U R                  c  U R                  R                  S
SS9  g[        X0R                  U R                  4U R                  U R
                  S:  S9$ U R                  R                  SU S3SS9  U R                   S==   S-  ss'   g)a  

following the same approach as the fix in [1]: if cookies fail to decrypt then attempt to decrypt
with an empty password. The failure detection is not the same as what chromium uses so the
results won't be perfect

References:
    - [1] https://chromium.googlesource.com/chromium/src/+/bbd54702284caca1f92d656fdcadf2ccca6f4165%5E%21/
        - a bugfix to try an empty password as a fallback
N      v10r3  r      hash_prefixs   v11r4  z(cannot decrypt v11 cookies: no key foundTr,   zunknown cookie version: "r   r5  )r  _decrypt_aes_cbc_multir8  r9  r6  r<  rB  r)   r*   r#  r   
ciphertexts       r.   r!  "LinuxChromeCookieDecryptor.decrypt  s    ""1%$QR(
f&!+&)]]DOO<dll .."46 6 &!+&}}$$$%O[_$`)]]DOO<dll .."46 6
 LL  #<WIQ!GSW X(A-(r0   )r:  r  r9  r;  r6  r<  r8  )r;   r<   r=   r>   r=  	functoolscached_propertyrB  staticmethodr7  r!  r?   r@   r0   r.   r.  r.    sD    @DSW / G G U U
 r0   r.  c                   4    \ rS rSrSS jr\S 5       rS rSrg)r,  i  Nc                     X l         [        X5      nUc  S OU R                  U5      U l        SSS.U l        U=(       d    SU l        g Nr   )r3  r5  )r6  _get_mac_keyring_passwordr7  r8  r  r<  )r*   r0  rD   r  rA  s        r.   r=  !MacChromeCookieDecryptor.__init__  sC    ,-AJ ( 0dooh6O&'!4).Qr0   c                     [        U SSSS9$ )NrE  i  r   rF  rJ  rL  s    r.   r7  #MacChromeCookieDecryptor.derive_key  s     8,4TVWWr0   c                 ,   US S nUSS  nUS:X  al  U R                   S==   S-  ss'   U R                  c  U R                  R                  SSS9  g [	        X0R                  4U R                  U R
                  S:  S	9$ U R                   S
==   S-  ss'   U$ )NrO  rP  r3  r   (cannot decrypt v10 cookies: no key foundTrT  rQ  rR  r5  )r  r8  r6  r)   rU  r<  rV  s       r.   r!   MacChromeCookieDecryptor.decrypt  s    !"1%$QR(
f&!+&}}$$$%O[_$`)]],dllHZHZ^`H`b b (A-( #"r0   r  r6  r<  r8  rU   )	r;   r<   r=   r>   r=  r[  r7  r!  r?   r@   r0   r.   r,  r,    s"    / X X
#r0   r,  c                   $    \ rS rSrSS jrS rSrg)r-  i  Nc                 d    X l         [        X5      U l        SSS.U l        U=(       d    SU l        g r^  )r6  _get_windows_v10_keyr8  r  r<  )r*   r/  rD   r  s       r.   r=  %WindowsChromeCookieDecryptor.__init__  s-    ,\B&'!4).Qr0   c           	         US S nUSS  nUS:X  a  U R                   S==   S-  ss'   U R                  c  U R                  R                  SSS9  g SnS	nUnUS U nXdU*  nXe* S  n[	        X0R                  XxU R                  U R
                  S
:  S9$ U R                   S==   S-  ss'   [        XR                  5      R                  5       $ )NrO  rP  r3  r   rd  TrT     r   rQ  rR  r5  )r  r8  r6  r)   _decrypt_aes_gcmr<  _decrypt_windows_dpapir   )	r*   r#  r   rW  nonce_lengthauthentication_tag_lengthraw_ciphertextnonceauthentication_tags	            r.   r!  $WindowsChromeCookieDecryptor.decrypt  s    !"1%$QR(
f&!+&}}$$$%O[_$` #L )+%'N"=L1E'6O5OPJ!/0J0K!L#MM5dll .."46 6
 (A-( */<<HOOQQr0   rf  rU   )r;   r<   r=   r>   r=  r!  r?   r@   r0   r.   r-  r-    s    /Rr0   r-  c                    [         R                  S:w  a  [        S[         R                   35      eU (       aO  [        R                  R                  U 5      n[        R                  R                  U5      (       d  [        S5      eO[        R                  R                  S5      n[        R                  R                  U5      (       d_  UR                  S5        [        R                  R                  S5      n[        R                  R                  U5      (       d  [        S5      e[        US5       nUR                  5       nS S S 5        [        WUS	9nUR                  S
[        U5       S35        U$ ! , (       d  f       N8= f)Nr   zunsupported platform: z(custom safari cookies database not foundz'~/Library/Cookies/Cookies.binarycookiesz Trying secondary cookie locationzP~/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookiesz&could not find safari cookies databaserb)rD   r   z cookies from safari)r   r   r}   ri   r   r   r   r   r   r   readparse_safari_cookiesr   r   )rt   rD   cookies_pathfcookies_datarv   s         r.   rz   rz   /  s#   
||x1#,,@AAww))'2ww~~l++#$NOO , ww))*STww~~l++LL;<77--  /A  BL77>>,//'(PQQ	lD	!Qvvx 
" |F
;C
KK*SXJ&:;<J 
"	!s   5E88
Fc                       \ rS rSrSrg)ParserErroriI  r@   Nr_   r@   r0   r.   r}  r}  I  r`   r0   r}  c                   ^    \ rS rSrS rS rS rSS jrSS jrS r	SS jr
SS	 jrSS
 jrSrg)
DataParseriM  c                 *    Xl         SU l        X l        g )Nr   )_datar   r6  )r*   datarD   s      r.   r=  DataParser.__init__N  s    
r0   c                     US:  a  [        SU S35      eU R                  U-   nU[        U R                  5      :  a  [        S5      eU R                  U R                  U nX l        U$ )Nr   zinvalid read of  byteszreached end of input)r}  r   r   r  )r*   	num_bytesendr  s       r.   
read_bytesDataParser.read_bytesS  sf    q= 06BCCkkI%TZZ 455zz$++c*r0   c           	      l    U R                  [        U5      5      nX1:w  a  [        SU SU SU S35      eg )Nzunexpected value: z != r  ))r  r   r}  )r*   expected_valuer+   r   s       r.   expect_bytesDataParser.expect_bytes]  sD    N 34" 25'n=MRPWyXYZ[[ #r0   c                 h    U(       a  SOSn[         R                  " X R                  S5      5      S   $ )Nz>Iz<I   r   structunpackr  r*   
big_endiandata_formats      r.   	read_uintDataParser.read_uintb  (    (dd}}[//!*<=a@@r0   c                 h    U(       a  SOSn[         R                  " X R                  S5      5      S   $ )Nz>dz<d   r   r  r  s      r.   read_doubleDataParser.read_doublef  r  r0   c                     / n U R                  S5      nUS:X  a  SR                  U5      R                  5       $ UR                  U5        MI  )Nr       r0   )r  r   r   rf   )r*   buffercs      r.   read_cstringDataParser.read_cstringj  sH    "AG|xx'..00a  r0   c           
          US:  a5  U R                   R                  SU SU SU R                  U5      < 35        g US:  a  [        SU S35      eg )Nr   z	skipping z bytes (z): zinvalid skip of r  )r6  r   r  r}  )r*   r  descriptions      r.   skipDataParser.skips  sZ    q=LL9+Xk]#doo^gNhMklm] 06BCC r0   c                 @    U R                  XR                  -
  U5        g rU   )r  r   )r*   offsetr  s      r.   skip_toDataParser.skip_toy  s    		&;;&4r0   c                 N    U R                  [        U R                  5      U5        g rU   )r  r   r  )r*   r  s     r.   skip_to_endDataParser.skip_to_end|  s    S_k2r0   )r  r6  r   NrP   )unknown)r;   r<   r=   r>   r=  r  r  r  r  r  r  r  r  r?   r@   r0   r.   r  r  M  s3    
\
AA!D53r0   r  c                     [        [        R                  " SSSSS[        R                  R                  S9[        R
                  " U S9-   R                  5       5      $ )Ni  r   r   )tzinfo)seconds)r   dtdatetimetimezoneutc	timedelta	timestamp)r  s    r.   _mac_absolute_time_to_posixr    s@    D!Q1R[[__E]fHggrrtuur0   c                     [        X5      nUR                  SS5        UR                  SS9n[        U5       Vs/ s H  oBR                  SS9PM     nnXRR                  4$ s  snf )Ns   cookzdatabase signatureT)r  )r  r  r  ranger   )r  rD   pnumber_of_pagesrV   
page_sizess         r.   _parse_safari_cookies_headerr    sb    4 ANN701kkTk2O8=o8NO8N1+++.8NJOxx Ps   A!c           	      T   [        X5      nUR                  SS5        UR                  5       n[        U5       Vs/ s H  oSR                  5       PM     nnUS:X  a  UR	                  S[        U 5       S35        g UR                  US   S5        [        U5       n[        U5       HO  u  pUR                  SUS S	US 35        UR                  U	S
5        [        X	S  X5      n
UR                  U
5        MQ     S S S 5        UR                  S5        g s  snf ! , (       d  f       N%= f)Ns      zpage signaturer   za cookies page of size z has no cookieszunknown page header fieldr   r   r   zspace between recordszspace in between pages)r  r  r  r  r   r   r  r[   r   r9   _parse_safari_cookies_recordr  r  )r  rv   rD   r  number_of_cookiesrV   record_offsetsrN   r   record_offsetrecord_lengths              r.   _parse_safari_cookies_pager    s   4 ANN&(89-23D-EF-Ekkm-ENFA.s4ykIJIInQ!<=	f	% ). 9A3q9J38OPQIIm%<=8n9Ms[MLL'	 !: 
& MM*+ G 
&	%s   DAD
D'c                    [        X5      nUR                  5       nUR                  SS5        UR                  5       n[        US-  5      nUR                  SS5        UR                  5       nUR                  5       nUR                  5       n	UR                  5       n
UR                  SS5        [	        UR                  5       5      n[	        UR                  5       5      n UR                  U5        UR                  5       nUR                  U5        UR                  5       nUR                  U	5        UR                  5       nUR                  U
5        UR                  5       nUR                  US
5        [        R                  R                  SUUS SU[        U5      UR                  S5      U[        U5      XkSS S 0 S9nUR                  U5        U$ ! [         a    UR                  SSS	9  Us $ f = f)Nr  zunknown record field 1r   zunknown record field 2r  zunknown record field 3z;failed to parse Safari cookie because UTF-8 decoding failedTrT  zspace at the end of the recordr   Fr   r   )r  r  r  r   r  r  r  r  UnicodeDecodeErrorr)   r   r   r   r   r   )r  rv   rD   r  record_sizeflagsr   domain_offsetname_offsetpath_offsetvalue_offsetexpiration_date_creation_dater   r   r   r   r   s                     r.   r  r    s   4 A++-KFF1&'KKMEUV^$IFF1&'KKMM++-K++-K;;=LFF1&'1!--/BO0AN			- !			+~~			+~~			, 
 IIk;<^^""EUVIZIZ[^I_$t*Yaf$R	 # 1F
 NN6  T`des   #BG G76G7c                     Uc
  [        5       n[        X5      u  p4[        XS U5      nU H  n[        UR	                  U5      X5        M      UR                  S5        U$ )a%  
References:
    - https://github.com/libyal/dtformats/blob/main/documentation/Safari%20Cookies.asciidoc
        - this data appears to be out of date but the important parts of the database structure is the same
        - there are a few bytes here and there which are skipped during parsing
Nfooter)rh   r  r  r  r  r  )r  rv   rD   r  
body_startr  	page_sizes          r.   rx  rx    s]     { "9$GJ4$f-A	"1<<	#:CH  MM(Jr0   c                       \ rS rSrSr\" 5       r\" 5       r\" 5       r\" 5       r	\" 5       r
\" 5       r\" 5       r\" 5       r\" 5       r\" 5       r\" 5       r\" 5       r\" 5       rSrg)_LinuxDesktopEnvironmenti  zi
https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/nix/xdg_util.h
DesktopEnvironment
r@   N)r;   r<   r=   r>   r*  r   OTHERCINNAMONDEEPINGNOMEKDE3KDE4KDE5KDE6PANTHEONUKUIUNITYXFCELXQTr?   r@   r0   r.   r  r    sd     FEvHVFFE6D6D6D6DvH6DFE6D6Dr0   r  c                   ^    \ rS rSrSr\" 5       r\" 5       r\" 5       r\" 5       r	\" 5       r
Srg)_LinuxKeyringi  z
https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_util_linux.h
SelectedLinuxBackend
r@   N)r;   r<   r=   r>   r*  r   KWALLETKWALLET5KWALLET6GNOMEKEYRING	BASICTEXTr?   r@   r0   r.   r  r    s,     fGvHvH6LIr0   r  c                    U R                  SS5      nU R                  SS5      nUGb  [        [        R                  UR	                  S5      5       GHc  nUS:X  a*  SU;   a  [
        R                  s  $ [
        R                  s  $ US:X  a  [
        R                  s  $ US	:X  a  [
        R                  s  $ US
:X  a  [
        R                  s  $ US:X  a  U R                  SS5      nUS:X  a  [
        R                  s  $ US:X  a  [
        R                  s  $ US:X  a  [
        R                  s  $ UR                  SU S35        [
        R                  s  $ US:X  a  [
        R                  s  $ US:X  a  [
        R                  s  $ US:X  a  [
        R                   s  $ US:X  d  GMT  [
        R"                  s  $    UR%                  SU S35        US:X  a  [
        R                  $ US;   a  [
        R                  $ US;   a  [
        R                  $ US:X  a&  SU ;   a  [
        R                  $ [
        R&                  $ SU;   d  US:X  a  [
        R                  $ US:X  a  [
        R                   $ UR%                  SU S35        S U ;   a  [
        R                  $ S!U ;   a&  SU ;   a  [
        R                  $ [
        R&                  $ [
        R(                  $ )"zm
https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/nix/xdg_util.cc
GetDesktopEnvironment
XDG_CURRENT_DESKTOPNDESKTOP_SESSIONr   :Unityzgnome-fallbackDeepinr  z
X-CinnamonKDEKDE_SESSION_VERSION564zunknown KDE version: "z". Assuming KDE4Pantheonr  r  LXQtz1XDG_CURRENT_DESKTOP is set to an unknown value: "r   deepin)mategnome)kde4z
kde-plasmakdexfcexubuntuukuiz-DESKTOP_SESSION is set to an unknown value: "GNOME_DESKTOP_SESSION_IDKDE_FULL_SESSION)rH   r   strstripsplitr  r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  )envrD   xdg_current_desktopdesktop_sessionpartkde_versions         r.   _get_linux_desktop_environmentr
    s   
 ''"7>gg/4O&		#6#<#<S#ABDw#639993999!/666/555%/888!gg&;TB#%3888 C'3888 C'3888KK"8EU VW3888#/888/444/444/444= C> 	HI\H]]^_`("'...	-	-'---	2	2',,,	E	! C'+000+000	?	"o&B',,,	F	"',,,D_DUUVWX!S('---	s	" C'+000+000#)))r0   c                    [        [        R                  U 5      nU R                  SUR                   35        U[
        R                  :X  a  [        R                  nU$ U[
        R                  :X  a  [        R                  nU$ U[
        R                  :X  a  [        R                  nU$ U[
        R                  [
        R                  [
        R                  4;   a  [        R                   nU$ [        R"                  nU$ )a'  
SelectBackend in [1]

There is currently support for forcing chromium to use BASIC_TEXT by creating a file called
`Disable Local Encryption` [1] in the user data dir. The function to write this file (`WriteBackendUse()` [1])
does not appear to be called anywhere other than in tests, so the user would have to create this file manually
and so would be aware enough to tell yt-dlp to use the BASIC_TEXT keyring.

References:
    - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_util_linux.cc
zdetected desktop environment: )r
  ri   environr   r   r  r  r  r  r  r  r  r  r  r  r  r  r  )rD   desktop_environmentlinux_keyrings      r.   _choose_linux_keyringr  D  s     9VL
LL12E2J2J1KLM6;;;%--  
 8 = =	=%..  
 8 = =	=%..  
 %%'?'D'DF^FdFd! 
 &//  &22r0   c                 &   Sn U [         R                  :X  a  SnSnO=U [         R                  :X  a  SnSnO$U [         R                  :X  a  SnSnO[	        U 5      e[
        R                  " SS	S
SU 3US/S[        R                  [        R                  S9u  pVnU(       a  UR                  S5        U$ UR                  SUR                  5        S35        UR                  5       $ ! [         a   nUR                  SU 35        Us SnA$ SnAff = f)aN  The name of the wallet used to store network passwords.

https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/kwallet_dbus.cc
KWalletDBus::NetworkWallet
which does a dbus call to the following function:
https://api.kde.org/frameworks/kwallet/html/classKWallet_1_1Wallet.html
Wallet::NetworkWallet
	kdewalletzorg.kde.kwalletdz/modules/kwalletdzorg.kde.kwalletd5z/modules/kwalletd5zorg.kde.kwalletd6z/modules/kwalletd6z	dbus-sendz	--sessionz--print-reply=literalz--dest=zorg.kde.KWallet.networkWalletT)textstdoutstderrzfailed to read NetworkWalletzNetworkWallet = "r   z)exception while obtaining NetworkWallet: N)r  r  r  r  r}   r   run
subprocessPIPEDEVNULLr)   r   r  rn   )	rc   rD   default_walletservice_namewallet_pathr  rV   
returncodees	            r.   _get_kwallet_network_walletr  a  s    !Nm+++-L-K....L.K....L.KW%% %		&=l^$+	+

 Z__Z5G5G!I: NN9:!!LL,V\\^,<A>?<<>! B1#FGs$   B.C& 32C& &
D0DDDc                 |   UR                  SUR                   35        [        R                  " S5      c  UR	                  S5        g[        X5      n [        R                  " SSU  S3SU  S3U/[        R                  [        R                  S	9u  pEnU(       a  UR	                  S
U S35        gUR                  5       R                  S5      (       a  UR                  S5        gUR                  S5        UR                  S5      $ ! [         a'  nUR                  S[!        U5       35         S nAgS nAff = f)Nz,using kwallet-query to obtain password from zkwallet-queryzkwallet-query command not found. KWallet and kwallet-query must be installed to read from KWallet. kwallet-query should beincluded in the kwallet package for your distributionr0   z--read-password Safe Storagez--folderz Keysr  r  z&kwallet-query failed with return code z7. Please consult the kwallet-query man page for detailss   failed to readz@failed to read password from kwallet. Using empty string insteadzpassword found   
z!exception running kwallet-query: )r   r   shutilwhichrJ   r  r   r  r  r  r  lowerr   rstriprn   r)   r   )r0  rc   rD   network_walletr  rV   r  r  s           r.   _get_kwallet_passwordr(    s6   
LL?~NO||O$, M 	N 0AN %		"6!7}E/06	+

 //**<*<!>: LLA* NQ Q R||~(():;;_` -.}}U++ :<?:KLMs%   AD
 25D
 (!D
 

D;D66D;c                    [         (       d  UR                  S[         35        g[        R                  " [         R
                  " 5       5       n[         R                  " U5      nUR                  5        H5  nUR                  5       U  S3:X  d  M  UR                  5       s  sS S S 5        $    UR                  S5         S S S 5        g! , (       d  f       g = f)Nzsecretstorage not available r0   r   zfailed to read from keyring)
r
   rJ   r	   r   r   	dbus_initget_default_collectionget_all_items	get_label
get_secret)r0  rD   concolitems        r.   _get_gnome_keyring_passwordr2    s    =34U3VWX
 
		M335	6#2237%%'D~~&:%;=#II((	 
7	6' 	23 
7	6	6s   ?C	C	,C		
Cc                 n   U(       a	  [         U   O
[        U5      nUR                  SUR                   35        U[         R                  [         R
                  [         R                  4;   a  [        XU5      $ U[         R                  :X  a  [        X5      $ U[         R                  :X  a  g  SU 35       e)NzChosen keyring: zUnknown keyring )r  r  r   r   r  r  r  r(  r  r2  r  )r0  rc   rD   s      r.   r@  r@    s     )0mG$5J65RG
LL#GLL>23=((-*@*@-BXBXYY$%9FKK	M..	.*+?HH	M++	+.$WI..5r0   c           
      `   UR                  S5         [        R                  " SSSSU SU  S3/[        R                  [        R
                  S9u  p#nU(       a  UR                  S	5        g UR                  S
5      $ ! [         a'  nUR                  S[        U5       35         S nAg S nAff = f)Nz@using find-generic-password to obtain password from OSX keychainsecurityzfind-generic-passwordz-wz-az-sr   r!  zfind-generic-password failedr"  z)exception running find-generic-password: )
r   r   r  r  r  r  r)   r&  rn   r   )r0  rD   r  rV   r  r  s         r.   r_  r_    s    
LLST %		0'*+=9; ??:+=+=!?: NN9:}}U## B<PQ?BSTUs   AA< +A< <
B-B((B-c                    [        [        U SU5      5      nUc  UR                  S5        gUR                  SU S35        [	        USS9 n[
        R                  " U5      nSSS5         WS   S	   n[        R                  " U5      nSnUR                  U5      (       d  UR                  S5        g[        U[        U5      S U5      $ ! , (       d  f       No= f! [         a    UR                  S
5         gf = f)z
References:
    - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/os_crypt_win.cc
zLocal StateNzcould not find local state filezFound local state file at "r   r   r   os_cryptencrypted_keyzno encrypted key in Local States   DPAPIzinvalid key)r   r  rJ   r   r   r   rl   KeyErrorbase64	b64decoder   rn  r   )r/  rD   r   rz  r  
base64_keyr8  r   s           r.   ri  ri    s    
 ;|]FCDD|67
LL.tfA67	dV	$yy| 
%*%o6
 $$Z0MF##F++]#!-F"=vFF 
%	$
  67s   C+C 
CC:9C:c                 2    [         R                  " SXX#5      $ )Nsha1)hashlibpbkdf2_hmac)rA  rG  rH  rI  s       r.   rK  rK    s    vxzNNr0   c                     U HE  n[        [        XU5      5      n U(       a  USS  R                  5       s  $ UR                  5       s  $    UR	                  SSS9  g ! [         a     Mg  f = f)N    z\failed to decrypt cookie (AES-CBC) because UTF-8 decoding failed. Possibly the key is wrong?TrT  )r   r   r   r  r)   )rW  keysrD   initialization_vectorrS  key	plaintexts          r.   rU  rU    s}     5jG\ ]^		 ~,,..##%%  NNq  ~BN  C " 		s   AA
A+*A+c                      [        XX25      n U(       a  USS  R                  5       $ UR                  5       $ ! [         a    UR                  SSS9   g f = f! [         a    UR                  SSS9   g f = f)Nz[failed to decrypt cookie (AES-GCM) because the MAC check failed. Possibly the key is wrong?TrT  rB  z\failed to decrypt cookie (AES-GCM) because UTF-8 decoding failed. Possibly the key is wrong?)r   r}   r)   r   r  )rW  rE  rr  rs  rD   rS  rF  s          r.   rm  rm    s    4ZFX`	
RS>((**!!  t  AE  	F  u  BF  	Gs%   9 A A AAA65A6c                 .  ^	 SSK m	SSKm	 " U	4S jST	R                  5      nT	R                  U 5      nU" T	R	                  U5      U5      nU" 5       nT	R
                  R                  R                  T	R                  U5      SSSSST	R                  U5      5      nU(       d  SnUR                  U5        [        U5      eT	R                  UR                  UR                  5      nT	R
                  R                  R                  UR                  5        U$ )zh
References:
    - https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata
r   Nc                      > \ rS rSrS Y R                  R
                  4S Y R                   Y R                  5      4/rSr	g))_decrypt_windows_dpapi.<locals>.DATA_BLOBi1  cbDatapbDatar@   N)
r;   r<   r=   r>   wintypesDWORDPOINTERc_char_fields_r?   )ctypess   r.   	DATA_BLOBrJ  1  s1    v445v~~fmm<=?r0   rS  z_Failed to decrypt with DPAPI. See  https://github.com/yt-dlp/yt-dlp/issues/10927  for more info)rR  ctypes.wintypes	Structurecreate_string_buffersizeofwindllcrypt32CryptUnprotectDatabyrefrJ   r   	string_atrL  rK  kernel32	LocalFree)
rW  rD   rS  r  blob_inblob_outretr+   resultrR  s
            @r.   rn  rn  (  s     ?F$$ ? ((4Ff-v6G{H
--


2
2W	XC sWG$$hoox?F
MM$$X__5Mr0   c                  |    [         R                  R                  S[         R                  R	                  S5      5      $ )NXDG_CONFIG_HOMEz	~/.config)ri   r  rH   r   r   r@   r0   r.   r   r   K  s'    ::>>+RWW-?-?-LMMr0   c                     [         R                  R                  US5      n[        R                  " X5        [
        R                  " U5      nUR                  5       $ )Nztemporary.sqlite)ri   r   r   r#  r  r   connectr   )database_pathr   database_copy_pathconns       r.   r   r   O  s?    f.@A
KK2??-.D;;=r0   c                     U R                  SU S35      R                  5       nU Vs/ s H  o3S   R                  5       PM     sn$ s  snf )NzPRAGMA table_info(r  r   )r   r   r   )r   
table_name
table_inforows       r.   r  r  W  sC    "4ZL BCLLNJ'12zFMMOz222s   Ac                     [        U S S S9$ )Nc                 B    [         R                  " U 5      R                  $ rU   )ri   lstatst_mtime)r   s    r.   rW   _newest.<locals>.<lambda>]  s    rxx~'>'>r0   )rE  default)max)filess    r.   r   r   \  s    u>MMr0   c           
   #   8  #    Sn[        U5       n[        R                  " U 5       HU  u  pVnU HI  nUS-  nUR                  SU SUS S35        X:X  d  M(  [        R                  R                  XX5      v   MK     MW     S S S 5        g ! , (       d  f       g = f7f)Nr   r   zSearching for "z": r   z files searched)r[   ri   walkr9   r   r   )	r   filenamerD   r   rN   	curr_rootrV   ru  rM   s	            r.   r  r  `  s     	A	f	%#%774=I%Q""_XJc!C#XY#'',,y77	  $1 
&	%	%s#   BAB	)B	 	B	
BBc                     [        5       nU  H=  nU H  nUR                  U5        M     UR                  c  M,  UR                  Ul        M?     U$ rU   )rh   r   rx  )jars
output_jarrv   r   s       r.   rm   rm   l  sJ    #%JF!!&) <<#"%,,J	 
 r0   c                    ^  [        U 4S j[        R                  R                  [        R                  R                  4 5       5      $ )Nc              3   >   >#    U  H  o(       d  M  UT;   v   M     g 7frU   r@   )r   sepr   s     r.   r   _is_path.<locals>.<genexpr>w  s     L'D|se|'Ds   
)anyri   r   r  altsep)r   s   `r.   r   r   v  s)    LRWW^^'DLLLr0   c                     U [         ;  a  [        SU  S35      eUS /[        Q7;  a  [        SU S35      eUb$  [        [	        U5      5      (       a  [	        U5      nXX#4$ )Nzunsupported browser: "r   zunsupported keyring: ")SUPPORTED_BROWSERSr}   SUPPORTED_KEYRINGSr   r   )rs   rt   rc   rd   s       r.   re   re   z  sp    --1,qABBt10111'!<==xG(<==g&'44r0   c                      ^  \ rS rSrSrS\R                  " S5      -   r\\R                  " S5      -   r1 Skr	SS1r
\R                  " S	\-   S
-   \-   S-   \R                  \R                  -  5      rU 4S jrSrU =r$ )LenientSimpleCookiei  z1More lenient version of http.cookies.SimpleCookiez\w\dz!#$%&'*+-.:^_`|~z(),/<=>?@[]{}>	   r   r   r   r   r   r   httponlysamesitemax-ager   r  z
        \s*                            # Optional whitespace at start of cookie
        (?P<key>                       # Start of group 'key'
        [au  ]+?# Any word of at least one letter
        )                              # End of group 'key'
        (                              # Optional group: there may not be a value.
        \s*=\s*                          # Equal Sign
        (                                # Start of potential value
        (?P<val>                           # Start of group 'val'
        "(?:[^\\"]|\\.)*"                    # Any doublequoted string
        |                                    # or
        \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Special case for "expires" attr
        |                                    # or
        [a	  ]*     # Any word or empty string
        )                                  # End of group 'val'
        |                                  # or
        (?P<bad>(?:\\;|[^;])*?)            # 'bad' group fallback for invalid values
        )                                # End of potential value
        )?                             # End of optional value group
        \s*                            # Any number of spaces.
        (\s+|;|$)                      # Ending either at space, semicolon, or EOS.
        c                   > [        U[        5      (       d  [        TU ]  U5      $ S nU R                  R                  U5       GH  nUR                  S5      (       a  S nM  UR                  SS5      u  pESnUR                  S5      (       a  USS  nSnUR                  5       nXpR                  ;   a7  Uc  Mu  Uc  XpR                  ;  a  S nM  SnOU R                  U5      u  pXXRU'   M  U(       a  S nM  UbZ  U R                  U[        R                  R                  5       5      nU R                  U5      u  pUR!                  XIU
5        X U'   GM  S nGM     g )NbadrE  valF$r   T)r   r  r(   rl   _COOKIE_PATTERNfinditerr   r   r%  	_RESERVED_FLAGSvalue_decoderH   r   r  Morselset)r*   r  morselmatchrE  r   is_attribute	lower_keyrV   
real_valuecoded_valuer-   s              r.   rl   LenientSimpleCookie.load  s9   $$$7<%%))2248E{{5!!UE2JC L~~c""!"g#		INN*>= 3!%  E#007HE#s"#t||':':'<=*.*;*;E*B'


3K8"S	 K 9r0   r@   )r;   r<   r=   r>   r*  r   escape_LEGAL_KEY_CHARS_LEGAL_VALUE_CHARSr  r  compileASCIIVERBOSEr  rl   r?   rQ   rR   s   @r.   r  r    s    ; +>!??)BIIo,FF
I 
#F jj "  " 
#" """%"* XX

"+$O.+ +r0   r  c                      ^  \ rS rSrSrSrSrSr\R                  " SS5      r
SU 4S jjr\S	 5       r\R                  S
S.S j5       rS rSS jrSS jrS rS rU 4S jrSrU =r$ )rh   i  zQ
See [1] for cookie file format.

1. https://curl.haxx.se/docs/http-cookies.html
z
#HttpOnly_   zO# Netscape HTTP Cookie File
# This file is generated by yt-dlp.  Do not edit.

CookieFileEntry)domain_nameinclude_subdomainsr   
https_only
expires_atr   r   c                    > [         TU ]  " S /UQ70 UD6  [        U5      (       a  [        R                  " U5      nXl        g rU   )r(   r=  r   ri   fspathrx  )r*   rx  argskwargsr-   s       r.   r=  YoutubeDLCookieJar.__init__  s8    ///!!yy*H r0   c                     U (       a  S$ S$ )NTRUEFALSEr@   )cndns    r.   _true_or_false!YoutubeDLCookieJar._true_or_false  s    v*7*r0   Fwritec             #      #    [        U5      (       a!  [        X(       a  SOSSS9 nUv   S S S 5        g U(       a  UR                  S5        Uv   g ! , (       d  f       g = f7f)Nwrzutf-8r   r   )r   r   truncate)r*   rM   r  rz  s       r.   r   YoutubeDLCookieJar.open  sO     d5CcGD ED a J EDs   $A"A&A"
AA"c                     [         R                   " 5       nU  H  nU(       d  UR                  (       d  U(       d  UR                  U5      (       a  M:  UR                  UR                  pvUc  SUpvUR                  SR                  SR                  UR                  U R                  UR                  R                  S5      5      UR                  U R                  UR                  5      [        UR                  SS9Xg45      5      5        M     g )Nr   z{}
	r   )rs  )r5   r   
is_expiredr   r   r  formatr   r   r  r   r   r   r   r   )r*   rz  ignore_discardignore_expiresnowr   r   r   s           r.   _really_saveYoutubeDLCookieJar._really_save  s    iikF#*v/@/@/E/E ++v||%} !$eGGFMM$))##FMM$<$<S$AB##FMM2FNNB7- #   r0   c                 p   Uc=  U R                   b  U R                   nO#[        [        R                  R                  5      eU  H  nUR
                  b  M  SUl        M     U R                  USS9 nUR                  U R                  5        U R                  XRU5        SSS5        g! , (       d  f       g= f)z
Save cookies to a file.
Code is taken from CPython 3.6
https://github.com/python/cpython/blob/8d999cbf4adea053be6dbb612b9844635c4dfb8e/Lib/http/cookiejar.py#L2091-L2117 Nr   Tr  )
rx  r}   r   r   MISSING_FILENAME_TEXTr   r   r  _HEADERr  )r*   rx  r  r  r   rz  s         r.   saveYoutubeDLCookieJar.save  s     }}(== !E!EFF F~~%!"  YYxtY,GGDLL!a@ -,,s   0.B''
B5c           
        ^  Uc=  T R                   b  T R                   nO#[        [        R                  R                  5      eU 4S jn[
        R                  " 5       nT R                  U5       nU H  n UR                  U" U5      5        M     SSS5        UR                  S5        T R                  XQX#5        T  H#  n	U	R                  S:X  d  M  SU	l        S
U	l        M%     g! [        R                  R                   aW  nUR                  5        S3S   S;   a  [        R                  R                  S5      e[        SU SU< S	35         SnAM  SnAff = f! , (       d  f       N= f)zLoad cookies from a file.Nc                 `  > U R                  TR                  5      (       a  U [        TR                  5      S  n U R                  S5      (       d  U R                  5       (       d  U $ U R	                  S5      n[        U5      TR
                  :w  a+  [        R                  R                  S[        U5       35      eTR                  " U6 nUR                  (       aR  [        R                  " SUR                  5      (       d,  [        R                  R                  SUR                   35      eU $ )N#r  zinvalid length z[0-9]+(?:\.[0-9]+)?zinvalid expires at )r   _HTTPONLY_PREFIXr   r  r  
_ENTRY_LENr   r   	LoadError_CookieFileEntryr  r   r   )r  cookie_listr   r*   s      r.   prepare_line-YoutubeDLCookieJar.load.<locals>.prepare_line5  s    t4455C 5 5678s##4::<<**T*K;4??2nn..[AQ@R/STT**K8F  6LfN_N_)`)`nn..1DVEVEVDW/XYYKr0    r   z[{"zCookies file must be Netscape formatted, not JSON. See  https://github.com/yt-dlp/yt-dlp/wiki/FAQ#how-do-i-pass-cookies-to-yt-dlpz+WARNING: skipping cookie file entry due to z: 
T)rx  r}   r   r   r  ioStringIOr   r  r  r  r   seek_really_loadr   r   )
r*   rx  r  r  r  cfrz  r  r  r   s
   `         r.   rl   YoutubeDLCookieJar.load-  s8   }}(== !E!EFF	 [[]YYx AHH\$/0  ! 	
"G F~~"!%!%	 % ~~// **,q)!,5"nn66hi i !#NqcQSTXS[[]!^_	 ! s7   .E5C%E%EAEEEE
E+c                     [         R                  R                  [        [	        U5      5      5      nU R                  U5        UR                  S5      $ )z-Generate a Cookie HTTP header for a given urlr   )urllibrequestRequestr   r   add_cookie_header
get_header)r*   url
cookie_reqs      r.   get_cookie_header$YoutubeDLCookieJar.get_cookie_header`  s?    ^^++M,s:K,LM
z*$$X..r0   c           	          [        [        R                  " 5       5      =U R                  l        U l        U R	                  [
        R                  R                  [        [        U5      5      5      5      $ )z1Generate a list of Cookie objects for a given url)
r   r5   _policy_now_cookies_for_requestr  r  r  r   r   )r*   r  s     r.   get_cookies_for_url&YoutubeDLCookieJar.get_cookies_for_urlf  sM     ),DIIK(88DI(()?)?l[^N_@`)abbr0   c                    > [         R                  " [        5         [        TU ]  " U0 UD6sS S S 5        $ ! , (       d  f       g = frU   )r   suppressr9  r(   clear)r*   r  r  r-   s      r.   r  YoutubeDLCookieJar.clearm  s.      *7=$1&1 +**s	   6
A)r  rx  rU   )NTT)r;   r<   r=   r>   r*  r  r  r  collections
namedtupler  r=  r[  r  r   contextmanagerr   r  r  rl   r  r  r  r?   rQ   rR   s   @r.   rh   rh     s    
 $JG #--bd! + + "'  *A*1&f/c2 2r0   rh   )s                   FrP   )NNN)nr:  r  r   r  r  rY  r   r?  http.cookiejarr   http.cookiesr  r   ri   r   r#  r  r  r   r   r5   urllib.requestr  enumr   r   aesr   r   r   dependenciesr	   r
   r   
minicursesr   r   utilsr   r   r   r   r   r   r   r   r   r   utils._utilsr   utils.networkingr   r{   r  r$   r[   r]   rw   rg   ry   r   r   r  r|   r  r&  r  r.  r,  r-  rz   rn   r}  r  r  r  r  r  rx  r  r  __members__rC  r  r
  r  r  r(  r2  r@  r_  ri  rK  rU  rm  rn  r   r   r  r   r  rm   r   re   r  SimpleCookier  r   MozillaCookieJarrh   r@   r0   r.   <module>r      sA            	  	 	    
     
 
 @   % +^ ,	8/DD =
 =4	n 	8. 8<IK =\`lp =GT$Q9xK*\10H HD QUcg p5!6 5p#4 #D%R#8 %RP4	) 	03 03fv ,('T $(	 "t (	D 	 #..335 C*L:&R(V"/($G6O
  FN3
N	8M5X$,,33 XvP288 P2r0   