
    VGh;                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z	d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ ddlmZmZmZ ddlmZm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1 dd	l2m3Z3 h d
Z4e4ddhz  Z5 G d de1      Z6d Z7 G d de'      Z8d Z9d e6       fddddZ:d Z;d Z<d Z=d Z>d Z?d Z@ G d d      ZAddddZB G d d eA      ZC G d! d"eA      ZD G d# d$eA      ZEd% ZF G d& d'eG      ZH G d( d)      ZId* ZJd+ ZKd, ZLd- ZMd e6       fd.ZN G d/ d0e      ZO G d1 d2e      ZPePj                  j                         ZSd3 ZTd4 ZUd5 ZVd6 ZWd7 ZXd8 ZYd9 ZZd: Z[d; Z\dKd<Z]dLd=Z^d> Z_d? Z`d@ ZadA ZbdB ZcdC ZddD ZedE ZfdMdFZg G dG dHe	j                  j                        Zj G dI dJe	j                  j                        Zmy)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                   <     e Zd Zd fd	Z G d de      Zd Z xZS )	YDLLoggerc                 &    t         |   ||      S )N)once)superwarning)selfmessage	only_once	__class__s      W/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/cookies.pyr(   zYDLLogger.warning6   s    wwY77    c                       e Zd Zd\  ZZd Zy)YDLLogger.ProgressBar)g?r   c                     t        j                          | j                  z
  | j                  kD  r/| j                  d| d       t        j                          | _        y y )Nz
[Cookies] r   )time_timer_DELAYprint_at_line)r)   r*   s     r-   printzYDLLogger.ProgressBar.print<   sF    yy{T[[(4;;6""Zy#91="iik 7r.   N)__name__
__module____qualname__r4   r3   r6    r.   r-   ProgressBarr0   9   s    	*r.   r;   c                 Z   | j                   rJ| j                   j                  j                  d      s%| j                   j                  j                  d      ry| j                   j                  j                  }	 |j                         sy	 | j                  |d      S # t        $ r Y yw xY w)z8Return a context manager with a print method. (Optional)
noprogressloggerNF)preserve_output)_ydlparamsget
_out_fileserrorisattyBaseExceptionr;   )r)   files     r-   progress_barzYDLLogger.progress_barA   s     yyDII,,00>$))BRBRBVBVW_B`yy##))	;;= ! e<<  		s   9B 	B*)B*F)r7   r8   r9   r(   r   r;   rH   __classcell__r,   s   @r-   r$   r$   5   s    8*& *=r.   r$   c                 j    t        | d      r| j                         }|r|S t               }d |_        |S )NrH   c                      y Nr:   )_s    r-   <lambda>z&_create_progress_bar.<locals>.<lambda>U   s    r.   )hasattrrH   r   r6   )r>   printers     r-   _create_progress_barrS   O   s6    v~&%%'N#%G"GMNr.   c                       e Zd Zy)CookieLoadErrorNr7   r8   r9   r:   r.   r-   rU   rU   Y       r.   rU   c           	         	 g }|5t        | \  }}}}|j                  t        ||t        |      ||             | jt	        |       }|rt        |       } t        |       }	|r$t        j                  | t        j                        r|	j                          |j                  |	       t        |      S # t        $ r t        d      w xY w)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	ExceptionrU   )
cookie_filebrowser_specificationydlcookie_jarsbrowser_nameprofilerZ   r[   is_filenamejars
             r-   load_cookiesrn   ]   s    8 ,8TVk8l5L'7I,\7IcN\coxy{ "&{3K)+6$[1C"))K"A
s#!+.. 86778s   B/B2 2CrY   c                    | dk(  rt        |||      S | dk(  rt        ||      S | t        v rt        | |||      S t	        d|        )Nr!   r"   zunknown browser: )_extract_firefox_cookies_extract_safari_cookiesCHROMIUM_BASED_BROWSERS_extract_chrome_cookies
ValueError)rj   rk   r>   rZ   r[   s        r-   r^   r^   t   s[    y 'FCC		!&w77	0	0&|WgvNN,\N;<<r.   c                    |j                  d       t        s|j                  d       t               S | t	        t                     }nDt        |       r| g}n5t               D cg c]"  }t        j                  j                  ||       $ }}dj                  t        t        |            }t        t        |            }|t        d|       |j                  d| d       d }dvrt        j                  j                  t        j                  j!                  |      d      }t        j                  j#                  |      r$t        j$                  |t        j&                        st        d	|       t)        |d
      5 }	t+        j,                  |	      j/                  dg       }
d d d        t1        fd
D        d       }t3        |t4              st7        d d      t9        j:                  d      5 }d }	 t=        ||      }t3        |t4              r3|j                  d d|        |j?                  dd| d| df       n9dk(  r#|j                  d       |j?                  d       n|j?                  d       t               }tA        |      5 }|jC                         }tE        |      }tG        |      D ]  \  }\  }}}}}}|jI                  d|dd|d       tJ        jL                  jO                  d||d d|tQ        |      |jS                  d       |tQ        |      ||dd d i !      }|jU                  |        	 d d d        |j                  d"tE        |       d#       |||jV                  jY                          cd d d        S c c}w # 1 sw Y   xY w# 1 sw Y   `xY w# ||jV                  jY                          w w xY w# 1 sw Y   y xY w)$Nz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      K   | ]7  j                  d       t        fd      fv s%j                  d       9 yw)namec                  R    t        j                  d d         j                         S )NzuserContext([^\.]+)\.labell10nID)re	fullmatchgroup)contexts   r-   rP   z4_extract_firefox_cookies.<locals>.<genexpr>.<lambda>   s"    R\\*GQYIZ[aac r.   userContextIdN)rB   r   ).0r   r[   s    @r-   	<genexpr>z+_extract_firefox_cookies.<locals>.<genexpr>   sB      gW`KKcde
 X
W[[9 s
   &AAz"could not find firefox container "z" in containers.jsonyt_dlpprefixz-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&%rx   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/r   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(   r_   list_firefox_browser_dirs_is_pathr`   r   joinmaprepr_newest_firefox_cookie_dbsFileNotFoundErrordebugdirnameisfilera   rb   openjsonrc   rB   next
isinstanceintrt   tempfileTemporaryDirectory_open_database_copyexecuterS   fetchalllen	enumerater6   http	cookiejarCookiebool
startswith
set_cookie
connectionclose)rk   r[   r>   search_rootsr   search_rootcookie_database_pathcontainer_idcontainers_path
containersr|   tmpdircursorrm   rH   tabletotal_cookie_countihostr~   r   expiry	is_securecookies    `                      r-   rp   rp      s   
KK12 W 	X!##134	'	y@U@WXT73XX))Cl34K"#6|#DE#"Mk] [\\
LL-.B-C1EFL&'',,rww7K'LN_`ww~~o.biiQSQXQX6Y#&H$VWW/F3 	Ez:.22<DJ	E    ,,A)L`abb		$	$H	5  *	*()=vFF,,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!^^22 !EUZ#d4jUYUdUdehUi!$t*YX^hm $$R	 3 AF
 NN6*+
+ KK*SXJ.CDE!!!'')A *  *- Y	E 	E4
+ 
+ !!!'') "? *  *sP   %'N&N#?OBN< B0N0'N<8O#N-0N9	5N<<OOO'c               #   T  K   t         j                  dv r-t        t        j                  j
                  d      E d {    y t         j                  dk(  r"t        j                  j                  d       y t        t        j                  j                  d      E d {    y 7 g7 w)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   r`   r   
expandvars
expanduserr:   r.   r-   r   r      s     
||**rww)) ,
  	 	
 
	!gg  !QRR rww)) ,
  	 			s"   :B(B$A!B(B&B(&B(c           	   #      K   t        t        j                  j                  |       D ]E  }dD ]>  }t	        j
                  t        j                  j                  ||d            E d {    @ G y 7 	w)N) z*/zProfiles/*/zcookies.sqlite)r   r`   r   abspathglobiglobr   )rootsrootpatterns      r-   r   r      s^     BGGOOU+ Q0 	QGzz"'',,tW>N"OPPP	QQPs   A$A2&A0'
A2c           
      
   t         j                  dv rt        j                  j	                  d      }t        j                  j	                  d      }t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d	      t        j                  j                  |d
      d|    }nt         j                  dk(  rt        j                  j                  d      }t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      d|    }nt               }t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      t        j                  j                  |d      d|    }dddt         j                  dk(  rdndt         j                  dk(  rdndt         j                  dk(  rdnddd|    }dh}||| |vd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   r`   r   r   r   r   _config_home)rj   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 ")	 #$)1JJ r.   c           
         |j                  d|         t        s|j                  d|  d       t               S t	        |       }||d   }nyt        |      r,|}|d   rt        j                  j                  |      n||d<   nB|d   r$t        j                  j                  |d   |      }n|j                  |  d       |d   }t        t        |d|            }|t        d|  d	| d
      |j                  d| d
       t        j                   d      5 }d }	 t#        ||      }t%        |j'                  d      j)                         d         }	t+        |d   |d   |||	      }
t,        |j.                  _        t3        |d      }d|v rdnd}|j'                  d| d       t               }d}d}t5        |      5 }|j7                         }t9        |      }t;        |      D ]M  \  }}|j=                  d|dd|d       t?        |
g| \  }}|s|dz  }6|s|dz  }|jA                  |       O 	 d d d        |dkD  rd| d}nd}|j                  dt9        |       d|  |        |
jB                  jE                         }||d <   |j                  d!|        |||j.                  jG                          cd d d        S # 1 sw Y   xY w# tH        $ rF}t        jJ                  d"k(  r-|jL                  d#k(  rd$}|j                  |       tO        |       d }~ww xY w# ||j.                  jG                          w w xY w# 1 sw Y   y xY w)%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 "rw   rv   r   r   z,SELECT value FROM meta WHERE key = "version"r   r   rZ   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(   r_   r   r   r`   r   r   r   rD   r   _find_filesr   r   r   r   r   r   r   fetchoneget_cookie_decryptorbytesr   text_factory_get_column_namesrS   r   r   r   r6   _process_chrome_cookier   _cookie_countscopyr   PermissionErrorr~   errnor   )rj   rk   rZ   r>   r   r   r   r   r   r   	decryptorcolumn_namessecure_columnrm   failed_cookiesunencrypted_cookiesrH   r   r   r   lineis_encryptedr   failed_messagecountsrD   r*   s                              r-   rs   rs     s   
KK*<.9: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 0*.	*()=vFF v~~.\]ffhijklL,}%vn'=vl<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*++ !#%n%55M!N!#KK*SXJn\N>JZ[\--224F$7F=!LL5fX>? !!!'')a0* 0*&+ +*  	ww$5;;"#4 DW%#G,,	 !!!'') "_0* 0*sX   MB$KA7K;A,K'MK	K	L("AL##L((L++M

MMc                 n   |j                         }|j                         }|j                         }|j                         }| xr |}|r| j                  |      }||d fS |sd }|t        j                  j	                  d||d d|t        |      |j                  d      |t        |      ||dd d i       fS )Nr   Fr   r   )decodedecryptr   r   r   r   r   )	r  host_keyr~   r   encrypted_valuer   expires_utcr   r  s	            r-   r  r  f  s     H;;=DLLNE;;=D90L!!/2=%% ..EU$x.XM`M`adMe$t*Y]b$R	 / 1 1 1r.   c                       e Zd ZdZi Zd Zy)ChromeCookieDecryptoraf  
    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                     t        d      )Nz"Must be implemented by sub classes)NotImplementedError)r)   r  s     r-   r  zChromeCookieDecryptor.decrypt  s    !"FGGr.   N)r7   r8   r9   __doc__r  r  r:   r.   r-   r  r  ~  s    6 NHr.   r  r   c                    t         j                  dk(  rt        |||      S t         j                  dv rt        | ||      S t	        ||||      S )Nr   )r   )r   r   r   )r   r   MacChromeCookieDecryptorWindowsChromeCookieDecryptorLinuxChromeCookieDecryptor)browser_rootbrowser_keyring_namer>   rZ   r   s        r-   r   r     sN    
||x'(<fS_``	,	,+L&|\\%&:FGbnoor.   c                   T    e Zd ZddddZej
                  d        Zed        Zd Z	y)r  Nr   c                    || _         | j                  d      | _        | j                  d      | _        dddd| _        || _        || _        |xs d| _        y )Ns   peanutsr.   r   )v10v11other)_logger
derive_key_v10_key
_empty_keyr  _browser_keyring_name_keyring_meta_version)r)   r  r>   rZ   r   s        r-   __init__z#LinuxChromeCookieDecryptor.__init__  sT    
3//#.&'A>%9").Qr.   c                     t        | j                  | j                  | j                        }|d S | j	                  |      S rN   )_get_linux_keyring_passwordr)  r*  r%  r&  )r)   passwords     r-   _v11_keyz#LinuxChromeCookieDecryptor._v11_key  s:    .t/I/I4==Z^ZfZfg'tFT__X-FFr.   c                      t        | ddd      S )N	   saltysaltr      salt
iterations
key_lengthpbkdf2_sha1r/  s    r-   r&  z%LinuxChromeCookieDecryptor.derive_key  s     8,1QSTTr.   c                 <   |dd }|dd }|dk(  rS| j                   dxx   dz  cc<   t        || j                  | j                  f| j                  | j
                  dk\        S |dk(  r}| j                   d	xx   dz  cc<   | j                  | j                  j                  d
d       yt        || j                  | j                  f| j                  | j
                  dk\        S | j                  j                  d| dd       | j                   dxx   dz  cc<   y)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      v10r"  r      hash_prefixs   v11r#  z(cannot decrypt v11 cookies: no key foundTr+   zunknown cookie version: "rw   r$  )r  _decrypt_aes_cbc_multir'  r(  r%  r+  r0  r(   r)   r  r   
ciphertexts       r-   r  z"LinuxChromeCookieDecryptor.decrypt  s#    ""1%$QR(
f&!+&)T]]DOO<dll .."46 6 &!+&}}$$$%O[_$`)T]]DOO<dll .."46 6
 LL  #<WIQ!GSW X(A-(r.   )
r7   r8   r9   r,  	functoolscached_propertyr0  staticmethodr&  r  r:   r.   r-   r  r    sD    @DSW / G G U U
 r.   r  c                   *    e Zd ZddZed        Zd Zy)r  Nc                     || _         t        ||      }|d n| j                  |      | _        ddd| _        |xs d| _        y Nr   )r"  r$  )r%  _get_mac_keyring_passwordr&  r'  r  r+  )r)   r  r>   r   r/  s        r-   r,  z!MacChromeCookieDecryptor.__init__  sG    ,-A6J ( 0dooh6O&'!4).Qr.   c                      t        | ddd      S )Nr2  i  r3  r4  r8  r:  s    r-   r&  z#MacChromeCookieDecryptor.derive_key  s     8,4TVWWr.   c                 6   |d d }|dd  }|dk(  rr| j                   dxx   dz  cc<   | j                  | j                  j                  dd       y t	        || j                  f| j                  | j
                  dk\  	      S | j                   d
xx   dz  cc<   |S )Nr<  r=  r"  r   (cannot decrypt v10 cookies: no key foundTrA  r>  r?  r$  )r  r'  r%  r(   rB  r+  rC  s       r-   r  z MacChromeCookieDecryptor.decrypt  s    !"1%$QR(
f&!+&}}$$$%O[_$`)T]],dllHZHZ^`H`b b (A-( #"r.   rN   )r7   r8   r9   r,  rG  r&  r  r:   r.   r-   r  r    s"    / X X
#r.   r  c                       e Zd ZddZd Zy)r  Nc                 ^    || _         t        ||      | _        ddd| _        |xs d| _        y rJ  )r%  _get_windows_v10_keyr'  r  r+  )r)   r  r>   r   s       r-   r,  z%WindowsChromeCookieDecryptor.__init__  s1    ,\6B&'!4).Qr.   c           	         |d d }|dd  }|dk(  r| j                   dxx   dz  cc<   | j                  | j                  j                  dd       y d}d	}|}|d | }|||  }|| d  }t	        || j                  ||| j                  | j
                  d
k\        S | j                   dxx   dz  cc<   t        || j                        j                         S )Nr<  r=  r"  r   rN  TrA     r3  r>  r?  r$  )r  r'  r%  r(   _decrypt_aes_gcmr+  _decrypt_windows_dpapir  )	r)   r  r   rD  nonce_lengthauthentication_tag_lengthraw_ciphertextnonceauthentication_tags	            r-   r  z$WindowsChromeCookieDecryptor.decrypt	  s   !"1%$QR(
f&!+&}}$$$%O[_$` #L )+%'N"=L1E'6O5OPJ!/1J0J0K!L#DMM52Ddll .."46 6
 (A-( */4<<HOOQQr.   rN   )r7   r8   r9   r,  r  r:   r.   r-   r  r    s    /Rr.   r  c                    t         j                  dk7  rt        dt         j                         | rIt        j                  j                  |       }t        j                  j                  |      st        d      t        j                  j                  d      }t        j                  j                  |      sZ|j                  d       t        j                  j                  d      }t        j                  j                  |      st        d      t        |d      5 }|j                         }d d d        t        |	      }|j                  d
t        |       d       |S # 1 sw Y   6xY w)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)r>   r   z cookies from safari)r   r   rt   r`   r   r   r   r   r   r   readparse_safari_cookiesr   r   )rk   r>   cookies_pathfcookies_datarm   s         r-   rq   rq   *  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   E%%E.c                       e Zd Zy)ParserErrorNrV   r:   r.   r-   rc  rc  D  rW   r.   rc  c                   L    e Zd Zd Zd Zd ZddZddZd ZddZ	ddZ
dd	Zy
)
DataParserc                 .    || _         d| _        || _        y )Nr   )_datar   r%  )r)   datar>   s      r-   r,  zDataParser.__init__I  s    
r.   c                     |dk  rt        d| d      | j                  |z   }|t        | j                        kD  rt        d      | j                  | j                  | }|| _        |S )Nr   zinvalid read of  byteszreached end of input)rc  r   r   rg  )r)   	num_bytesendrh  s       r-   
read_byteszDataParser.read_bytesN  sh    q= 06BCCkkI%TZZ 455zz$++c*r.   c           	      l    | j                  t        |            }||k7  rt        d| d| d| d      y )Nzunexpected value: z != r   ))rm  r   rc  )r)   expected_valuer*   r   s       r-   expect_byteszDataParser.expect_bytesX  sF    N 34N" 25'n=MRPWyXYZ[[ #r.   c                 ^    |rdnd}t        j                  || j                  d            d   S )Nz>Iz<I   r   structunpackrm  r)   
big_endiandata_formats      r-   	read_uintzDataParser.read_uint]  *    (dd}}[$//!*<=a@@r.   c                 ^    |rdnd}t        j                  || j                  d            d   S )Nz>dz<d   r   rt  rw  s      r-   read_doublezDataParser.read_doublea  r{  r.   c                     g }	 | j                  d      }|dk(  rdj                  |      j                         S |j                  |       G)Nr       r.   )rm  r   r  r]   )r)   buffercs      r-   read_cstringzDataParser.read_cstringe  sH    "AG|xx'..00a  r.   c           
          |dkD  r4| j                   j                  d| d| d| j                  |             y |dk  rt        d| d      y )Nr   z	skipping z bytes (z): zinvalid skip of rj  )r%  r   rm  rc  )r)   rk  descriptions      r-   skipzDataParser.skipn  sZ    q=LL9+Xk]#doo^gNhMklm] 06BCC r.   c                 B    | j                  || j                  z
  |       y rN   )r  r   )r)   offsetr  s      r-   skip_tozDataParser.skip_tot  s    		&4;;&4r.   c                 N    | j                  t        | j                        |       y rN   )r  r   rg  )r)   r  s     r-   skip_to_endzDataParser.skip_to_endw  s    S_k2r.   NrI   )unknown)r7   r8   r9   r,  rm  rq  rz  r~  r  r  r  r  r:   r.   r-   re  re  H  s3    
\
AA!D53r.   re  c           
          t        t        j                  dddddt        j                  j                        t        j
                  |       z   j                               S )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ur.   c                     t        | |      }|j                  dd       |j                  d      }t        |      D cg c]  }|j                  d       }}||j                  fS c c}w )Ns   cookzdatabase signatureT)rx  )re  rq  rz  ranger   )rh  r>   pnumber_of_pagesrO   
page_sizess         r-   _parse_safari_cookies_headerr    se    4 ANN701kkTk2O8=o8NO1!+++.OJOqxx Ps   A'c           	      J   t        | |      }|j                  dd       |j                         }t        |      D cg c]  }|j                          }}|dk(  r|j	                  dt        |        d       y |j                  |d   d       t        |      5 }t        |      D ]Q  \  }}	|j                  d|dd	|d       |j                  |	d
       t        | |	d  ||      }
|j                  |
       S 	 d d d        |j                  d       y c c}w # 1 sw Y    xY w)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)re  rq  rz  r  r   r   r  rS   r   r6   _parse_safari_cookies_recordrm  r  )rh  rm   r>   r  number_of_cookiesrO   record_offsetsrH   r   record_offsetrecord_lengths              r-   _parse_safari_cookies_pager    s!   4 ANN&(89-23D-EFakkmFNFA.s4ykIJIInQ!<=	f	% ( ). 9 	(A}3q9J38OPQIIm%<=8mn9MsTZ[MLL'		(( MM*+ G( (s   DA DD"c                    t        | |      }|j                         }|j                  dd       |j                         }t        |dz        }|j                  dd       |j                         }|j                         }|j                         }	|j                         }
|j                  dd       t	        |j                               }t	        |j                               }	 |j                  |       |j                         }|j                  |       |j                         }|j                  |	       |j                         }|j                  |
       |j                         }|j                  |d
       t        j                  j                  d||d d|t        |      |j                  d      |t        |      ||dd d i       }|j                  |       |S # t        $ r |j                  dd	       |cY S w xY w)Nrs  zunknown record field 1r   zunknown record field 2r}  zunknown record field 3z;failed to parse Safari cookie because UTF-8 decoding failedTrA  zspace at the end of the recordr   Fr   r   )re  rz  r  r   r  r~  r  r  UnicodeDecodeErrorr(   r   r   r   r   r   )rh  rm   r>   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*Yaf$R	 # 1F
 NN6  T`des   $BG G>=G>c                     |
t               }t        | |      \  }}t        | |d |      }|D ]  }t        |j	                  |      ||         |j                  d       |S )a9  
    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)r_   r  re  r  rm  r  )rh  rm   r>   r  
body_startr  	page_sizes          r-   r^  r^    sl     { "9$GJ
4
$f-A I	"1<<	#:CHIMM(Jr.   c                       e Zd ZdZ e       Z e       Z e       Z e       Z e       Z	 e       Z
 e       Z e       Z e       Z e       Z e       Z e       Z e       Zy)_LinuxDesktopEnvironmentzu
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/base/nix/xdg_util.h
    DesktopEnvironment
    N)r7   r8   r9   r  r   OTHERCINNAMONDEEPINGNOMEKDE3KDE4KDE5KDE6PANTHEONUKUIUNITYXFCELXQTr:   r.   r-   r  r    sd     FEvHVFFE6D6D6D6DvH6DFE6D6Dr.   r  c                   V    e Zd ZdZ e       Z e       Z e       Z e       Z e       Z	y)_LinuxKeyringz
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/key_storage_util_linux.h
    SelectedLinuxBackend
    N)
r7   r8   r9   r  r   KWALLETKWALLET5KWALLET6GNOMEKEYRING	BASICTEXTr:   r.   r-   r  r    s,     fGvHvH6LIr.   r  c                 f   | j                  dd      }| j                  dd      }|t        t        j                  |j	                  d            D ]T  }|dk(  r(d|v rt
        j                  c S t
        j                  c S |dk(  rt
        j                  c S |d	k(  rt
        j                  c S |d
k(  rt
        j                  c S |dk(  r~| j                  dd      }|dk(  rt
        j                  c S |dk(  rt
        j                  c S |dk(  rt
        j                  c S |j                  d| d       t
        j                  c S |dk(  rt
        j                  c S |dk(  rt
        j                  c S |dk(  rt
        j                   c S |dk(  sEt
        j"                  c S  |j%                  d| d       |dk(  rt
        j                  S |dv rt
        j                  S |dv rt
        j                  S |dk(  r$d| v rt
        j                  S t
        j&                  S d|v s|dk(  rt
        j                  S |dk(  rt
        j                   S |j%                  d| d       d | v rt
        j                  S d!| v r$d| v rt
        j                  S t
        j&                  S t
        j(                  S )"zy
    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: "rw   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)rB   r   strstripsplitr  r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  )envr>   xdg_current_desktopdesktop_sessionpartkde_versions         r-   _get_linux_desktop_environmentr    s   
 ''"7>gg/4O&		#6#<#<S#AB 	5D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=	5> 	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#)))r.   c                    t        t        j                  |       }| j                  d|j                          |t
        j                  k(  rt        j                  }|S |t
        j                  k(  rt        j                  }|S |t
        j                  k(  rt        j                  }|S |t
        j                  t
        j                  t
        j                  fv rt        j                   }|S t        j"                  }|S )aG  
    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  r`   environr   r~   r  r  r  r  r  r  r  r  r  r  r  r  r  )r>   desktop_environmentlinux_keyrings      r-   _choose_linux_keyringr  ?  s     9VL
LL12E2J2J1KLM6;;;%--  
 8 = =	=%..  
 8 = =	=%..  
 %%'?'D'DF^FdFd! 
 &//  &22r.   c                    d}	 | t         j                  k(  rd}d}n;| t         j                  k(  rd}d}n#| t         j                  k(  rd}d}nt	        |       t        j                  dd	d
d| |dgdt        j                  t        j                        \  }}}|r|j                  d       |S |j                  d|j                          d       |j                         S # t        $ r }|j                  d|        |cY d}~S d}~ww xY w)ag   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 = "rw   z)exception while obtaining NetworkWallet: N)r  r  r  r  rt   r   run
subprocessPIPEDEVNULLr(   r   r  re   )	rZ   r>   default_walletservice_namewallet_pathr  rO   
returncodees	            r-   _get_kwallet_network_walletr  \  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! .2C! !	D
*D?D
D
c                 j   |j                  d|j                          t        j                  d      |j	                  d       yt        ||      }	 t        j                  dd|  dd|  d|gt        j                  t        j                  	      \  }}}|r|j	                  d
| d       y|j                         j                  d      r|j                  d       y|j                  d       |j                  d      S # t        $ r'}|j                  dt!        |              Y d }~yd }~ww xY w)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 distributionr.   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whichrD   r  r   r  r  r  r  lowerr   rstripre   r(   r   )r  rZ   r>   network_walletr  rO   r  r  s           r-   _get_kwallet_passwordr    s7   
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 /0D  !D 	D2D--D2c                    t         s|j                  dt                yt        j                  t        j
                               5 }t        j                  |      }|j                         D ]3  }|j                         |  dk(  s|j                         c cd d d        S  |j                  d       	 d d d        y# 1 sw Y   y xY w)Nzsecretstorage not available r.   r  zfailed to read from keyring)
r
   rD   r	   
contextlibclosing	dbus_initget_default_collectionget_all_items	get_label
get_secret)r  r>   concolitems        r-   _get_gnome_keyring_passwordr    s    34U3VWX
 
		M335	6 #2237%%' 	)D~~&:%;=#II((	 	) 	23  s   ?B>B>"B>>Cc                 `   |r	t         |   n
t        |      }|j                  d|j                          |t         j                  t         j
                  t         j                  fv rt        | ||      S |t         j                  k(  rt        | |      S |t         j                  k(  ry J d|        )NzChosen keyring: zUnknown keyring )r  r  r   r~   r  r  r  r  r  r  r  )r  rZ   r>   s      r-   r.  r.    s     )0mG$5J65RG
LL#GLL>23=((-*@*@-BXBXYY$%97FKK	M..	.*+?HH	M++	+.$WI..5r.   c           
      Z   |j                  d       	 t        j                  dddd| d|  dgt        j                  t        j
                        \  }}}|r|j                  d	       y |j                  d
      S # t        $ r'}|j                  dt        |              Y d }~y d }~ww xY w)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  re   r   )r  r>   r  rO   r  r  s         r-   rK  rK    s    
LLST %		0'*+=9; ??:+=+=!?: NN9:}}U## B<PQ?BSTUs   AA: )A: :	B*B%%B*c                    t        t        | d|            }||j                  d       y|j                  d| d       t	        |d      5 }t        j                  |      }ddd       	 d   d	   }t        j                  |      }d}|j                  |      s|j                  d       yt        |t        |      d |      S # 1 sw Y   dxY w# t        $ r |j                  d
       Y yw xY w)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 "rw   ry   rz   os_cryptencrypted_keyzno encrypted key in Local States   DPAPIzinvalid key)r   r   rD   r   r   r   rc   KeyErrorbase64	b64decoder   rU  r   )r  r>   r   r`  rh  
base64_keyr  r   s           r-   rQ  rQ    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/.C/c                 4    t        j                  d| |||      S )Nsha1)hashlibpbkdf2_hmac)r/  r5  r6  r7  s       r-   r9  r9    s    vxz:NNr.   c                     |D ]A  }t        t        | ||            }	 |r|dd  j                         c S |j                         c S  |j	                  dd       y # t        $ r Y cw xY w)N    z\failed to decrypt cookie (AES-CBC) because UTF-8 decoding failed. Possibly the key is wrong?TrA  )r   r   r  r  r(   )rD  keysr>   initialization_vectorr@  key	plaintexts          r-   rB  rB    s      5j#G\ ]^		 ~,,..##%% NNq  ~BN  C " 		s   AA	A'&A'c                     	 t        | |||      }	 |r|dd  j                         S |j                         S # t        $ r |j                  dd       Y y w xY w# t        $ r |j                  dd       Y y w xY w)Nz[failed to decrypt cookie (AES-GCM) because the MAC check failed. Possibly the key is wrong?TrA  r!  z\failed to decrypt cookie (AES-GCM) because UTF-8 decoding failed. Possibly the key is wrong?)r   rt   r(   r  r  )rD  r$  rY  rZ  r>   r@  r%  s          r-   rT  rT    s    4ZFXZ_`	
RS>((**!!  t  AE  	F  u  BF  	Gs%   6 A A AAA76A7c                 "  	 ddl 	ddl	 G 	fdd	j                        }	j                  |       } |	j	                  |      |      } |       }	j
                  j                  j                  	j                  |      ddddd	j                  |            }|sd}|j                  |       t        |      	j                  |j                  |j                        }	j
                  j                  j                  |j                         |S )zt
    References:
        - https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata
    r   Nc                   ~    e Zd ZdW  j                  j                  fdW  j                  W  j                        fgZy))_decrypt_windows_dpapi.<locals>.DATA_BLOBcbDatapbDataN)r7   r8   r9   wintypesDWORDPOINTERc_char_fields_)ctypess   r-   	DATA_BLOBr)  ,  s1    v445v~~fmm<=?r.   r2  z_Failed to decrypt with DPAPI. See  https://github.com/yt-dlp/yt-dlp/issues/10927  for more info)r1  ctypes.wintypes	Structurecreate_string_buffersizeofwindllcrypt32CryptUnprotectDatabyrefrD   r   	string_atr+  r*  kernel32	LocalFree)
rD  r>   r2  r  blob_inblob_outretr*   resultr1  s
            @r-   rU  rU  #  s     ?F$$ ? ((4Ff-v6G{H
--


2
2W	XC sWG$$hoox?F
MM$$X__5Mr.   c                  |    t         j                  j                  dt         j                  j	                  d            S )NXDG_CONFIG_HOMEz	~/.config)r`   r  rB   r   r   r:   r.   r-   r   r   F  s'    ::>>+RWW-?-?-LMMr.   c                     t         j                  j                  |d      }t        j                  | |       t        j                  |      }|j                         S )Nztemporary.sqlite)r`   r   r   r   r  r   connectr   )database_pathr   database_copy_pathconns       r-   r   r   J  sB    f.@A
KK12??-.D;;=r.   c                     | j                  d| d      j                         }|D cg c]  }|d   j                          c}S c c}w )NzPRAGMA table_info(ro  r   )r   r   r  )r   
table_name
table_inforows       r-   r   r   R  sA    "4ZL BCLLNJ'12CFMMO222s   Ac                      t        | d d       S )Nc                 @    t        j                  |       j                  S rN   )r`   lstatst_mtime)r   s    r-   rP   z_newest.<locals>.<lambda>X  s    rxx~'>'> r.   )r$  default)max)filess    r-   r   r   W  s    u>MMr.   c           
   #   (  K   d}t        |      5 }t        j                  |       D ]S  \  }}}|D ]H  }|dz  }|j                  d| d|dd       ||k(  s't        j                  j                  ||       J U 	 d d d        y # 1 sw Y   y xY ww)Nr   r   zSearching for "z": r   z files searched)rS   r`   walkr6   r   r   )	r   filenamer>   r   rH   	curr_rootrO   rS  rG   s	            r-   r   r   [  s     	A	f	% 8#%774= 	8Iq% 8Q""_XJc!C#XY8#'',,y$77	8	88 8 8s#   BAB&B=	BBBc                     t               }| D ]8  }|D ]  }|j                  |        |j                  (|j                  |_        : |S rN   )r_   r   rV  )jars
output_jarrm   r   s       r-   rd   rd   g  sT    #%J / 	*F!!&)	*<<#"%,,J	/
 r.   c                      t         fdt        j                  j                  t        j                  j                  fD              S )Nc              3   ,   K   | ]  }|s|v   y wrN   r:   )r   sepr   s     r-   r   z_is_path.<locals>.<genexpr>r  s     Lse|Ls   	)anyr`   r   r]  altsep)r   s   `r-   r   r   q  s)    LRWW^^'DLLLr.   c                     | t         vrt        d|  d      |d gt        vrt        d| d      |t        t	        |            rt	        |      }| |||fS )Nzunsupported browser: "rw   zunsupported keyring: ")SUPPORTED_BROWSERSrt   SUPPORTED_KEYRINGSr   r   )rj   rk   rZ   r[   s       r-   r\   r\   u  sq    --1,qABBt10111'!<==xG(<=g&'944r.   c                        e Zd ZdZd ej
                  d      z   Ze ej
                  d      z   Zh dZddhZ	 ej                  dez   d	z   ez   d
z   ej                  ej                  z        Z fdZ xZS )LenientSimpleCookiez1More lenient version of http.cookies.SimpleCookiez\w\dz!#$%&'*+-.:^_`|~z(),/<=>?@[]{}>	   max-ager   r   r   r   r   r   httponlysamesiter   rf  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                 x   t        |t              st        |   |      S d }| j                  j                  |      D ]  }|j                  d      rd }|j                  dd      \  }}d}|j                  d      r|dd  }d}|j                         }|| j                  v r3|g||| j                  vrd }zd}n| j                  |      \  }}|||<   |rd }|[| j                  |t        j                  j                               }| j                  |      \  }	}
|j!                  ||	|
       || |<   d } y )Nbadr$  valF$r   T)r   r  r'   rc   _COOKIE_PATTERNfinditerr   r   r  	_RESERVED_FLAGSvalue_decoderB   r   r   Morselset)r)   rh  morselmatchr$  r   is_attribute	lower_keyrO   
real_valuecoded_valuer,   s              r-   rc   zLenientSimpleCookie.load  sE   $$7<%%))2248 %	E{{5!UE2JC L~~c"!"g#		IDNN*>= 3!%  E#007HE1#s"#t||':':'<=*.*;*;E*B'
K

3
K8"S	 K%	r.   )r7   r8   r9   r  r   escape_LEGAL_KEY_CHARS_LEGAL_VALUE_CHARSrn  ro  compileASCIIVERBOSErl  rc   rJ   rK   s   @r-   rd  rd    s    ; +>!??)IBIIo,FF
I 
#F !bjj "  " 
#" """%"* XX

"+$O.+ +r.   rd  c                        e Zd ZdZdZdZdZ ej                  dd      Z	d fd	Z
ed        Zej                  d	d
d       Zd ZddZddZd Zd Z fdZ xZS )r_   z]
    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                 z    t        |   d g|i | t        |      rt        j                  |      }|| _        y rN   )r'   r,  r   r`   fspathrV  )r)   rV  argskwargsr,   s       r-   r,  zYoutubeDLCookieJar.__init__  s7    ///!yy*H r.   c                     | rdS dS )NTRUEFALSEr:   )cndns    r-   _true_or_falsez!YoutubeDLCookieJar._true_or_false  s    v*7*r.   Fwritec             #      K   t        |      r t        ||rdndd      5 }| d d d        y |r|j                  d       | y # 1 sw Y   y xY ww)Nwrzutf-8rz   r   )r   r   truncate)r)   rG   r  r`  s       r-   r   zYoutubeDLCookieJar.open  sT     d5CcGD   a J s   AA!AAAc                    t        j                          }| D ]  }|s|j                  s|s|j                  |      r%|j                  |j                  }}|d|}}|j                  dj                  dj                  |j                  | j                  |j                  j                  d            |j                  | j                  |j                        t        |j                  d      ||f                    y )Nr   z{}
	r   )rQ  )r2   r   
is_expiredr~   r   r  formatr   r   r  r   r   r   r   r   )r)   r`  ignore_discardignore_expiresnowr   r~   r   s           r-   _really_savezYoutubeDLCookieJar._really_save  s    iik 	F#*v/@/@/E ++v||%D} !$eGGFMM$))##FMM$<$<S$AB##FMM2FNNB7e- #  	r.   c                 b   |<| j                   | j                   }n#t        t        j                  j                        | D ]  }|j
                  d|_         | j                  |d      5 }|j                  | j                         | j                  |||       ddd       y# 1 sw Y   yxY w)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  )
rV  rt   r   r   MISSING_FILENAME_TEXTr   r   r  _HEADERr  )r)   rV  r  r  r   r`  s         r-   savezYoutubeDLCookieJar.save  s     }}(== !E!EFF  	#F~~%!"	# YYxtY, 	AGGDLL!a@	A 	A 	As   -/B%%B.c           
          |< j                    j                   }n#t        t        j                  j                         fd}t        j                         } j                  |      5 }|D ]  }	 |j                   ||              	 ddd       |j                  d        j                  ||||        D ]   }	|	j                  dk(  sd|	_        d
|	_        " y# t        j                  j                  $ rS}|j                          dd   dv rt        j                  j                  d      t        d| d|d	       Y d}~d}~ww xY w# 1 sw Y   xY w)zLoad cookies from a file.Nc                    | j                  j                        r| t        j                        d  } | j                  d      s| j                         s| S | j	                  d      }t        |      j
                  k7  r+t        j                  j                  dt        |              j                  | }|j                  rF|j                  j                         s,t        j                  j                  d|j                         | S )N#r  zinvalid length zinvalid expires at )r   _HTTPONLY_PREFIXr   r  r  
_ENTRY_LENr   r   	LoadError_CookieFileEntryr  isdigit)r  cookie_listr   r)   s      r-   prepare_linez-YoutubeDLCookieJar.load.<locals>.prepare_line0  s    t445C 5 5678s#4::<**T*K;4??2nn..[AQ@R/STT*T**K8F  ):):)B)B)Dnn..1DVEVEVDW/XYYKr.    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)rV  rt   r   r   r  ioStringIOr   r  r  r  r   seek_really_loadr   r   )
r)   rV  r  r  r  cfr`  r  r  r   s
   `         r-   rc   zYoutubeDLCookieJar.load(  sM   }}(== !E!EFF	 [[]YYx  
	A 	HH\$/0	
	 	
"hG  	&F~~"!%!%		&% ~~// **,q)!,5"nn66hi i !#NqcQSTXS[[]!^_	
	 
	s7   *E1CEE;A	E	E	EEEc                     t         j                  j                  t        t	        |                  }| j                  |       |j                  d      S )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_headerz$YoutubeDLCookieJar.get_cookie_header[  s?    ^^++M,s:K,LM
z*$$X..r.   c           	          t        t        j                               x| j                  _        | _        | j	                  t
        j                  j                  t        t        |                        S )z1Generate a list of Cookie objects for a given url)
r   r2   _policy_now_cookies_for_requestr  r  r  r   r   )r)   r  s     r-   get_cookies_for_urlz&YoutubeDLCookieJar.get_cookies_for_urla  sM     ),DIIK(88DI(()?)?l[^N_@`)abbr.   c                     t        j                  t              5  t        |   |i |cd d d        S # 1 sw Y   y xY wrN   )r  suppressr  r'   clear)r)   r  r  r,   s      r-   r  zYoutubeDLCookieJar.clearh  s7      * 	27=$1&1	2 	2 	2s   4=rN   )NTT)r7   r8   r9   r  r  r  r  collections
namedtupler  r,  rG  r  r  contextmanagerr   r  r  rc   r  r  r  rJ   rK   s   @r-   r_   r_     s    
 $JG .{--bd! + + "'  *A*1&f/c2 2r.   r_   )s                   FrI   )NNN)nr  r  r  r  r  rE  r   r  http.cookiejarr   http.cookiesr  r   r`   r   r   ru  r  r   r   r2   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   rr   ra  r$   rS   rU   rn   r^   rp   r   r   r   rs   r  r  r   r  r  r  rq   re   rc  re  r  r  r  r  r^  r  r  __members__r"  rb  r  r  r  r  r  r.  rK  rQ  r9  rB  rT  rU  r   r   r   r   r   rd   r   r\   r   SimpleCookierd  r   MozillaCookieJarr_   r:   r.   r-   <module>r     sA            	  	 	    
     
 
 @   % +^ ,	8/DD =
 =4	n 	8. 8<IK =\`lp =B*J$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2r.   