
    yf<                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZmZ d dlmZ ddlmZmZmZ ddlmZ ddl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/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 h dZ6e6ddhz  Z7 G d de3      Z8d Z9d Z:d e8       fddddZ;d Z<d Z=d Z>d Z?d Z@d ZA G d d      ZBdddZC G d  d!eB      ZD G d" d#eB      ZE G d$ d%eB      ZFd& ZG G d' d(eH      ZI G d) d*      ZJd+ ZKd, ZLd- ZMd. ZNd e8       fd/ZO G d0 d1e      ZP G d2 d3e      ZQeQj                  j                         ZTd4 ZUd5 ZVd6 ZWd7 ZXd8 ZYd9 ZZd: Z[d; Z\d< Z]dLd=Z^d> Z_d? Z`d@ ZadA ZbdB ZcdC ZddD ZedE ZfdF ZgdMdGZh G dH dIej                  j                        Zk G dJ dKej                  j                        Zny)N    N)Enumautopbkdf2_hmac   )aes_cbc_decrypt_bytes aes_gcm_decrypt_and_verify_bytesunpad_pkcs7)	functools)compat_os_name)!_SECRETSTORAGE_UNAVAILABLE_REASONsecretstoragesqlite3)MultilinePrinterQuietMultilinePrinter)	DownloadErrorPopenerror_to_strexpand_pathis_path_likesanitize_urlstr_or_nonetry_callwrite_string)
_YDLLogger)normalize_url>   edgebraveopera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      0/usr/lib/python3/dist-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 7r0   N)__name__
__module____qualname__r6   r5   r8    r0   r/   ProgressBarr2   9   s    	*r0   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)r9   r:   r;   r*   r   r=   rJ   __classcell__r.   s   @r/   r&   r&   5   s    8*& *=r0   r&   c                 j    t        | d      r| j                         }|r|S t               }d |_        |S )NrJ   c                      y Nr<   )_s    r/   <lambda>z&_create_progress_bar.<locals>.<lambda>U   s    r0   )hasattrrJ   r   r8   )r@   printers     r/   _create_progress_barrU   O   s6    v~&%%'N#%G"GMNr0   c           	      b   g }|5t        | \  }}}}|j                  t        ||t        |      ||             | jt	        |       }|rt        |       } t        |       }	|r$t        j                  | t        j                        r|	j                          |j                  |	       t        |      S )Nkeyring	container)_parse_browser_specificationappendextract_cookies_from_browserr&   r   r   YoutubeDLCookieJarosaccessR_OKload_merge_cookie_jars)
cookie_filebrowser_specificationydlcookie_jarsbrowser_nameprofilerX   rY   is_filenamejars
             r/   load_cookiesrk   Y   s    K(4PRg4h1gw	(w	#X_ktu	w ";/%k2K -biiRWW=HHJ3k**r0   rW   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)rg   rh   r@   rX   rY   s        r/   r\   r\   m   s[    y 'FCC		!&w77	0	0&|WgvNN,\N;<<r0   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/   rR   z4_extract_firefox_cookies.<locals>.<genexpr>.<lambda>   s"    R\\*GQYIZ[aac r0   userContextIdN)rD   r   ).0r   rY   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&%ru   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isfiler_   r`   openjsonra   rD   next
isinstanceintrq   tempfileTemporaryDirectory_open_database_copyexecuterU   fetchalllen	enumerater8   http	cookiejarCookiebool
startswith
set_cookie
connectionclose)rh   rY   r@   search_rootsr   search_rootcookie_database_pathcontainer_idcontainers_path
containersry   tmpdircursorrj   rJ   tabletotal_cookie_countihostr{   r   expiry	is_securecookies    `                      r/   rm   rm   x   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               #   :  K   t         j                  dv r"t        j                  j	                  d       y t         j                  dk(  r"t        j                  j                  d       y t        t        j                  j
                  d      E d {    y 7 w)Ncygwinwin32z"%APPDATA%\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   
expandvars
expanduserr   r<   r0   r/   r   r      sp     
||**gg  !FGG		!gg  !QRR rww)) ,
  	 	s   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           	      N   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	      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      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      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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 Data)r   r    r"   r   r   r!   r   z~/Library/Application SupportzBraveSoftware/Brave-BrowserzGoogle/ChromeChromiumzMicrosoft Edgezcom.operasoftware.OperaVivaldizgoogle-chromer"   zmicrosoft-edger   r!   BraveChromeOpera)browser_dirkeyring_namesupports_profiles)r   r   r^   r   r   r   r   _config_home)rg   appdata_localappdata_roamingr   appdataconfigr   browsers_without_profiless           r/   $_get_chromium_based_browser_settingsr      sX   
||****+;<'',,[9WW\\-1YZggll=2LM]4IJGGLL0KLWW\\/3QRww||M3GH
  
	!''$$%DEWW\\'+HIggll7O<Wj9GGLL*:;WW\\'+DEww||GY7
  WW\\&*GHggll6?;VZ8GGLL)9:WW\\&'2ww||FI6
  $'LLH$< *LLH4* # 89h L ")	 #$)1JJ r0   c           
      F   |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        |d   |d   ||      }t!        j"                  d      5 }d }		 t%        ||      }	t&        |	j(                  _        t-        |	d      }
d|
v rdnd}|	j/                  d| d       t               }d}d}t1        |      5 }|	j3                         }t5        |      }t7        |      D ]M  \  }}|j9                  d|dd|d       t;        |g| \  }}|s|dz  }6|s|dz  }|j=                  |       O 	 d d d        |dkD  rd| d}nd}|j                  dt5        |       d|  |        |j>                  jA                         }||d<   |j                  d |        ||	|	j(                  jC                          cd d d        S # 1 sw Y   xY w# tD        $ r<}tF        d!k(  r-|jH                  d"k(  rd#}|j                  |       tK        |       d }~ww xY w# |	|	j(                  jC                          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 "rt   rs   r   rX   r   r   cookiesr   r   zBSELECT host_key, name, value, encrypted_value, path, expires_utc, z FROM cookiesr   r   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   rF   r   _find_filesr   r   get_cookie_decryptorr   r   r   bytesr   text_factory_get_column_namesr   rU   r   r   r   r8   _process_chrome_cookier   _cookie_countscopyr   PermissionErrorr   errnor   )rg   rh   rX   r@   r   r   r   	decryptorr   r   column_namessecure_columnrj   failed_cookiesunencrypted_cookiesrJ   r   r   r   lineis_encryptedr   failed_messagecountsrF   r,   s                             r/   rp   rp   
  sq   
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$VM%:F><RTZdklI		$	$H	5 (*&	*()=vFF-2F*,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>? !!!'')Q(* (*+ +*  	%%++*; DW%#G,,	 !!!'') "O(* (*sW   0L4A#J-A7J!A,J-;L!J*	&J--	K267K--K22K55LLL c                 f   |j                         }|j                         }|j                         }|j                         }| xr |}|r| j                  |      }||d fS |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   R  s     H;;=DLLNE;;=D90L!!/2=%%..EU$x.XM`M`adMe$t*Y]b$R	 / 1 1 1r0   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Gr0   N)r9   r:   r;   __doc__r   r  r<   r0   r/   r  r  e  s    6 NHr0   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   MacChromeCookieDecryptorWindowsChromeCookieDecryptorLinuxChromeCookieDecryptor)browser_rootbrowser_keyring_namer@   rX   s       r/   r   r     sF    
||x'(<fEE	,	,+L&AA%&:FGTTr0   c                   R    e Zd Z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| _        || _        || _        y )Ns   peanutsr0   r   )v10v11other)_logger
derive_key_v10_key
_empty_keyr   _browser_keyring_name_keyring)r+   r  r@   rX   s       r/   __init__z#LinuxChromeCookieDecryptor.__init__  sG    
3//#.&'A>%9"r0   c                     t        | j                  | j                  | j                        }|d S | j	                  |      S rP   )_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Fr0   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Tr0   c                     |dd }|dd }|dk(  rD| j                   dxx   dz  cc<   t        || j                  | j                  f| j                        S |dk(  rn| j                   dxx   dz  cc<   | j
                  | j                  j                  dd	
       yt        || j
                  | j                  f| j                        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   s   v11r  z(cannot decrypt v11 cookies: no key foundTr-   zunknown cookie version: "rt   r  )r   _decrypt_aes_cbc_multir!  r"  r  r)  r*   r+   r  r   
ciphertexts       r/   r  z"LinuxChromeCookieDecryptor.decrypt  s    ""1%$QR(
f&!+&)*t}}doo6VX\XdXdee&!+&}}$$$%O[_$`)*t}}doo6VX\XdXdee LL  #<WIQ!GSW X(A-(r0   )
r9   r:   r;   r%  r   cached_propertyr)  staticmethodr   r  r<   r0   r/   r  r    sA    @D   G G U U
r0   r  c                   (    e Zd Zd Zed        Zd Zy)r  c                 r    || _         t        ||      }|d n| j                  |      | _        ddd| _        y Nr   )r  r  )r  _get_mac_keyring_passwordr   r!  r   )r+   r  r@   r(  s       r/   r%  z!MacChromeCookieDecryptor.__init__  s:    ,-A6J ( 0dooh6O&'!4r0   c                      t        | ddd      S )Nr+  i  r,  r-  r1  r3  s    r/   r   z#MacChromeCookieDecryptor.derive_key  s     8,4TVWWr0   c                    |d d }|dd  }|dk(  rc| j                   dxx   dz  cc<   | j                  | j                  j                  dd       y t	        || j                  f| j                        S | j                   dxx   dz  cc<   |S )	Nr5  r6  r  r   (cannot decrypt v10 cookies: no key foundTr7  r  )r   r!  r  r*   r8  r9  s       r/   r  z MacChromeCookieDecryptor.decrypt  s    !"1%$QR(
f&!+&}}$$$%O[_$`)*t}}6FUU (A-( #"r0   N)r9   r:   r;   r%  r<  r   r  r<   r0   r/   r  r    s"    5 X X
#r0   r  c                       e Zd Zd Zd Zy)r  c                 H    || _         t        ||      | _        ddd| _        y r?  )r  _get_windows_v10_keyr!  r   )r+   r  r@   s      r/   r%  z%WindowsChromeCookieDecryptor.__init__  s$    ,\6B&'!4r0   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                        S | j                   d
xx   dz  cc<   t        || j                        j                         S )Nr5  r6  r  r   rC  Tr7     r,  r  )r   r!  r  r*   _decrypt_aes_gcm_decrypt_windows_dpapir
  )	r+   r  r   r:  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#JuFXZ^ZfZfgg (A-( */4<<HOOQQr0   N)r9   r:   r;   r%  r  r<   r0   r/   r  r    s    5
Rr0   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   rq   r^   r   r   r   r   r   r   readparse_safari_cookiesr   r   )rh   r@   cookies_pathfcookies_datarj   s         r/   rn   rn     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)ParserErrorN)r9   r:   r;   r<   r0   r/   rX  rX  !  s    r0   rX  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__&  s    
r0   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)rX  r   r   r\  )r+   	num_bytesendr]  s       r/   
read_byteszDataParser.read_bytes+  sh    q= 06BCCkkI%TZZ 455zz$++c*r0   c           	      l    | j                  t        |            }||k7  rt        d| d| d| d      y )Nzunexpected value: z != r   ))rb  r   rX  )r+   expected_valuer,   r   s       r/   expect_byteszDataParser.expect_bytes5  sF    N 34N" 25'n=MRPWyXYZ[[ #r0   c                 ^    |rdnd}t        j                  || j                  d            d   S )Nz>Iz<I   r   structunpackrb  r+   
big_endiandata_formats      r/   	read_uintzDataParser.read_uint:  *    (dd}}[$//!*<=a@@r0   c                 ^    |rdnd}t        j                  || j                  d            d   S )Nz>dz<d   r   ri  rl  s      r/   read_doublezDataParser.read_double>  rp  r0   c                     g }	 | j                  d      }|dk(  rdj                  |      j                         S |j                  |       G)Nr       r0   )rb  r   r
  r[   )r+   buffercs      r/   read_cstringzDataParser.read_cstringB  sH    "AG|xx'..00a  r0   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 r_  )r  r   rb  rX  )r+   r`  descriptions      r/   skipzDataParser.skipK  sZ    q=LL9+Xk]#doo^gNhMklm] 06BCC r0   c                 B    | j                  || j                  z
  |       y rP   )r{  r   )r+   offsetrz  s      r/   skip_tozDataParser.skip_toQ  s    		&4;;&4r0   c                 N    | j                  t        | j                        |       y rP   )r~  r   r\  )r+   rz  s     r/   skip_to_endzDataParser.skip_to_endT  s    S_k2r0   NrK   )unknown)r9   r:   r;   r%  rb  rf  ro  rs  rx  r{  r~  r  r<   r0   r/   rZ  rZ  %  s3    
\
AA!D53r0   rZ  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  X  s@    D!Q1R[[__E]fHggrrtuur0   c                     t        | |      }|j                  dd       |j                  d      }t        |      D cg c]  }|j                  d       }}||j                  fS c c}w )Ns   cookzdatabase signatureT)rm  )rZ  rf  ro  ranger   )r]  r@   pnumber_of_pagesrQ   
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)rZ  rf  ro  r  r   r   r~  rU   r   r8   _parse_safari_cookies_recordrb  r  )r]  rj   r@   r  number_of_cookiesrQ   record_offsetsrJ   r   record_offsetrecord_lengths              r/   _parse_safari_cookies_pager  d  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)Nrh  zunknown record field 1r   zunknown record field 2rr  zunknown record field 3z;failed to parse Safari cookie because UTF-8 decoding failedTr7  zspace at the end of the recordr   Fr   r   )rZ  ro  r{  r   r  rs  r~  rx  UnicodeDecodeErrorr*   r   r   r   r   r   )r]  rj   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  x  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  rZ  r  rb  r  )r]  rj   r@   r  
body_startr  	page_sizes          r/   rS  rS    sl     { "9$GJ
4
$f-A I	"1<<	#:CHIMM(Jr0   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)r9   r:   r;   r  r   OTHERCINNAMONDEEPINGNOMEKDE3KDE4KDE5KDE6PANTHEONUKUIUNITYXFCELXQTr<   r0   r/   r  r    sd     FEvHVFFE6D6D6D6DvH6DFE6D6Dr0   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)
r9   r:   r;   r  r   KWALLETKWALLET5KWALLET6GNOMEKEYRING	BASICTEXTr<   r0   r/   r  r    s,     fGvHvH6LIr0   r  c                 ^   | j                  dd      }| j                  dd      }||j                  d      d   j                         }|dk(  r&|d|v rt        j                  S t        j
                  S |dk(  rt        j                  S |d	k(  rt        j                  S |d
k(  rt        j                  S |dk(  rv| j                  dd      }|dk(  rt        j                  S |dk(  rt        j                  S |dk(  rt        j                  S |j                  d| d       t        j                  S |dk(  rt        j                  S |dk(  rt        j                  S |dk(  rt        j                  S |dk(  rt        j                  S |j                  d| d       t        j"                  S ||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       t        j"                  S 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_SESSION:r   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: "rt   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)rD   splitstripr  r  r  r  r  r  r  r  r   r  r  r  r  r  r  )envr@   xdg_current_desktopdesktop_sessionkde_versions        r/   _get_linux_desktop_environmentr    s   
 ''"7>gg/6O&177<Q?EEG')*/??/R/555/555 H,+222 G++111 L0+444 E)''"7>Kc!/444#/444#/4444[MAQRS/444 J.+444 F*+000 F*+000 F*+000KKKL_K``abc: $)))7 
	$h&+222 11+111 66+000%$+/444/444&/Y*F+000&+000KKGGXXYZ[ $))) &,+1113&$+/444/444#)))r0   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r0   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 = "rt   z)exception while obtaining NetworkWallet: N)r  r  r  r  rq   r   run
subprocessPIPEDEVNULLr*   r   r  	Exception)	rX   r@   default_walletservice_namewallet_pathr  rQ   
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 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whichrF   r  r   r  r  r  r  lowerr   rstripr  r*   r   )r  rX   r@   network_walletr  rQ   r  r  s           r/   _get_kwallet_passwordr  e  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 r0   r  zfailed to read from keyring)
r   rF   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((	 	 LL67  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  rX   r@   s      r/   r'  r'    s     )0mG$5J65RG
LL#GLL>23=((-*@*@-BXBXYY$%97FKK	M..	.*+?HH	M++	+.$WI..5r0   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  r  r   )r  r@   r  rQ   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                    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 "rt   rv   rw   os_cryptencrypted_keyzno encrypted key in Local States   DPAPIzinvalid key)r   r   rF   r   r   r   ra   KeyErrorbase64	b64decoder   rJ  r   )r  r@   r   rU  r]  
base64_keyr  r   s           r/   rF  rF    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                      t        d| |||      S )Nsha1r   )r(  r.  r/  r0  s       r/   r2  r2    s    vxz:FFr0   c                     |D ]*  }t        t        | ||            }	 |j                         c S  |j	                  dd       y # t        $ r Y Lw xY w)Nz\failed to decrypt cookie (AES-CBC) because UTF-8 decoding failed. Possibly the key is wrong?Tr7  )r
   r   r
  r  r*   )r:  keysr@   initialization_vectorkey	plaintexts         r/   r8  r8    sl      5j#G\ ]^		##%% NNq  ~BN  C " 		s   A	AAc                     	 t        | |||      }	 |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?Tr7  z\failed to decrypt cookie (AES-GCM) because UTF-8 decoding failed. Possibly the key is wrong?)r	   rq   r*   r
  r  )r:  r  rN  rO  r@   r  s         r/   rI  rI    s    4ZFXZ_`	
!!  t  AE  	F  u  BF  	Gs   ! A A A A"!A"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|j                  dd       y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)r9   r:   r;   wintypesDWORDPOINTERc_char_fields_)ctypess   r/   	DATA_BLOBr  	  s1    v445v~~fmm<=?r0   r#  zfailed to decrypt with DPAPITr7  )r"  ctypes.wintypes	Structurecreate_string_buffersizeofwindllcrypt32CryptUnprotectDatabyrefr*   	string_atr  r  kernel32	LocalFree)	r:  r@   r#  rv  blob_inblob_outretresultr"  s	           @r/   rJ  rJ     s     ?F$$ ? ((4Ff-v6G{H
--


2
2W	XC 5Fhoox?F
MM$$X__5Mr0   c                  |    t         j                  j                  dt         j                  j	                  d            S )NXDG_CONFIG_HOMEz	~/.config)r^   r  rD   r   r   r<   r0   r/   r   r   "  s'    ::>>+RWW-?-?-LMMr0   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   &  sB    f.@A
KK12??-.D;;=r0   c                     | j                  d| d      j                         }|D cg c]  }|d   j                          c}S c c}w )NzPRAGMA table_info(rd  r   )r   r   r
  )r   
table_name
table_inforows       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 rP   )r^   lstatst_mtime)r   s    r/   rR   z_newest.<locals>.<lambda>4  s    rxx~'>'> r0   )r  default)max)filess    r/   r   r   3  s    u>MMr0   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)rU   r^   walkr8   r   r   )	r   filenamer@   r   rJ   	curr_rootrQ   rD  rI   s	            r/   r   r   7  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 rP   )r]   r   rG  )jars
output_jarrj   r   s       r/   rb   rb   C  sT    #%J / 	*F!!&)	*<<#"%,,J	/
 r0   c                      t         fdt        j                  j                  t        j                  j                  fD              S )Nc              3   ,   K   | ]  }|s|v   y wrP   r<   )r   sepr   s     r/   r   z_is_path.<locals>.<genexpr>N  s     Lse|Ls   	)anyr^   r   rN  altsep)r   s   `r/   r   r   M  s)    LRWW^^'DLLLr0   c                     | t         vrt        d|  d      |d gt        vrt        d| d      |t        t	        |            rt	        |      }| |||fS )Nzunsupported browser: "rt   zunsupported keyring: ")SUPPORTED_BROWSERSrq   SUPPORTED_KEYRINGSr   r   )rg   rh   rX   rY   s       r/   rZ   rZ   Q  sq    --1,qABBt10111'!<==xG(<=g&'944r0   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   rW  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   strr)   ra   _COOKIE_PATTERNfinditerr   r   r  	_RESERVED_FLAGSvalue_decoderD   r   r   Morselset)r+   r]  morselmatchr  r   is_attribute	lower_keyrQ   
real_valuecoded_valuer.   s              r/   ra   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%	r0   )r9   r:   r;   r  r~   escape_LEGAL_KEY_CHARS_LEGAL_VALUE_CHARSr`  ra  compileASCIIVERBOSEr^  ra   rL   rM   s   @r/   rU  rU  [  s    ; +>!??)IBIIo,FF
I 
#F !bjj "  " 
#" """%"* XX

"+$O.+ +r0   rU  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 rP   )r)   r%  r   r^   fspathrG  )r+   rG  argskwargsr.   s       r/   r%  zYoutubeDLCookieJar.__init__  s7    ///!yy*H r0   c                     | rdS dS )NTRUEFALSEr<   )cndns    r/   _true_or_falsez!YoutubeDLCookieJar._true_or_false  s    v*7*r0   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-8rw   r   )r   r   truncate)r+   rI   r  rU  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dj                  |j                  | j                  |j                  j                  d            |j                  | j                  |j                        t        |j                  d      ||f      z          y )Nr   z%s
	r   )rB  )r4   r   
is_expiredr{   r   r  r   r   r  r   r   r   r   r   )r+   rU  ignore_discardignore_expiresnowr   r{   r   s           r/   _really_savezYoutubeDLCookieJar._really_save  s    iik 	F"v~~)f.?.?.D ++v||%D} !$eGGFTYY##FMM$<$<S$AB##FMM2FNNB7e(   	r0   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  )
rG  rq   r   r   MISSING_FILENAME_TEXTr   r   r  _HEADERr  )r+   rG  r  r  r   rU  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        |      z         j                  | }|j                  rF|j                  j                         s,t        j                  j                  d|j                  z        | S )N#r  zinvalid length %dzinvalid expires at %s)r   _HTTPONLY_PREFIXr   r  r  
_ENTRY_LENr   r   	LoadError_CookieFileEntryrw  isdigit)r  cookie_listr   r+   s      r/   prepare_linez-YoutubeDLCookieJar.load.<locals>.prepare_line  s    t445C 5 5678s#4::<**T*K;4??2nn../BSEU/UVV*T**K8F  ):):)B)B)Dnn../FIZIZ/Z[[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)rG  rq   r   r   r  ioStringIOr   r  r  r  r   seek_really_loadr   r   )
r+   rG  r  r  r  cfrU  r  r  r   s
   `         r/   ra   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_header7  s?    ^^++M,s:K,LM
z*$$X..r0   c           	          t        t        j                               x| j                  _        | _        | j	                  t
        j                  j                  t        t        |                        S )z1Generate a list of Cookie objects for a given url)
r   r4   _policy_now_cookies_for_requestr  r  r  r   r   )r+   r  s     r/   get_cookies_for_urlz&YoutubeDLCookieJar.get_cookies_for_url=  sM     ),DIIK(88DI(()?)?l[^N_@`)abbr0   c                     t        j                  t              5  t        |   |i |cd d d        S # 1 sw Y   y xY wrP   )r  suppressr  r)   clear)r+   rz  r{  r.   s      r/   r  zYoutubeDLCookieJar.clearD  s7      * 	27=$1&1	2 	2 	2s   4=rP   )NTT)r9   r:   r;   r  r  r  r  collections
namedtupler  r%  r<  r  r  contextmanagerr   r  r  ra   r  r  r  rL   rM   s   @r/   r]   r]     s    
 $JG .{--bd! + + "'  *A*1&f/c2 2r0   r]   )s                   )NNN)or  r  r  r  r  r   http.cookiejarr   http.cookiesr  r   r^   r~   r  rj  r  r   r   r4   urllib.requestr  enumr   r   hashlibr   aesr   r	   r
   compatr   r   dependenciesr   r   r   
minicursesr   r   utilsr   r   r   r   r   r   r   r   r   utils._utilsr   utils.networkingr   ro   rR  r&   rU   rk   r\   rm   r   r   r   rp   r   r  r   r  r  r  rn   r  rX  rZ  r  r  r  r  rS  r  r  __members__r  rS  r  r  r  r  r  r'  r@  rF  r2  r8  rI  rJ  r   r   r   r   r   rb   r   rZ   r   SimpleCookierU  r   MozillaCookieJarr]   r<   r0   r/   <module>r     s7          	  	 	    
      
  " 
 @
 
 
 % +U ,	8/DD =
 =4+( 8<IK =\`lp =B*JQ5pE*P1&H HD QU U0!6 0f#4 #@"R#8 "RJ4	) 	03 03fv ,('T $(	 "t (	D 	 #..335 F*R:&R(V$/($G6GDN3
N	8M5X$,,33 XvP288 P2r0   