
    Ği                        d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ	d dl
Z	d dlZd dlZd dl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          ZPePjQ        R                                ZSd3 ZTd4 ZUd5 ZVd6 ZWd7 ZXd8 ZYd9 ZZd: Z[d; Z\dMd>Z]dNd?Z^d@ Z_dA Z`dB ZadC ZbdD ZcdE ZddF ZedG ZfdOdHZg G dI dJe	jh        ji                  Zj G dK dLe	jk        jl                  ZmdS )P    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                   B     e Zd Zd fd	Z G d de          Zd Z xZS )	YDLLoggerFc                 J    t                                          ||          S )N)once)superwarning)selfmessage	only_once	__class__s      SC:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/cookies.pyr(   zYDLLogger.warning6   s    wwwY777    c                       e Zd Zd\  ZZd ZdS )YDLLogger.ProgressBar)g?r   c                     t          j                     | j        z
  | j        k    r3|                     d| d           t          j                     | _        d S d S )Nz
[Cookies] r   )time_timer_DELAYprint_at_line)r)   r*   s     r-   printzYDLLogger.ProgressBar.print<   sT    y{{T[(4;66""#9#9#91==="ikk 76r.   N)__name__
__module____qualname__r4   r3   r6    r.   r-   ProgressBarr0   9   s,        	* 	* 	* 	* 	*r.   r;   c                 2   | j         r>| j         j                            d          s| j         j                            d          rdS | j         j        j        }	 |                                sdS n# t          $ r Y dS w xY w|                     |d          S )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     y 	DI,00>> 	$)BRBVBVW_B`B` 	Fy#)	;;==  	 	 	FF	e<<<s   A1 1
A?>A?F)r7   r8   r9   r(   r   r;   rH   __classcell__r,   s   @r-   r$   r$   5   sw        8 8 8 8 8 8* * * * *& * * *= = = = = = =r.   r$   c                     t          | d          r|                                 }|r|S t                      }d |_        |S )NrH   c                     d S Nr:   )_s    r-   <lambda>z&_create_progress_bar.<locals>.<lambda>U   s    d r.   )hasattrrH   r   r6   )r>   printers     r-   _create_progress_barrS   O   sK    v~&& %%'' 	N#%%G"NGMNr.   c                       e Zd ZdS )CookieLoadErrorNr7   r8   r9   r:   r.   r-   rU   rU   Y           Dr.   rU   c           	         	 g }|Bt          | \  }}}}|                    t          ||t          |          ||                     | yt	          |           }|rt          |           } t          |           }	|rt          j        | t          j	                  r|	
                                 |                    |	           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,\7IcNN\coxyyy{ { { "&{33K 7)+66$[11C ")K"A"A 


s###!+... 8 8 867778s   CC 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   sq    y  'FCCC		!	!&w777	0	0	0&|WgvNNN;\;;<<<r.   c                 	    d}|                     d           t          s#|                    d           t                      S  t	          t                                }n-t                     r g}n fdt                      D             }d                    t          t          |                    }t          t          |                    }|t          d|           |                    d| d           d }d	vr"t          j                            t          j                            |          d
          }t          j                            |          rt          j        |t          j                  st          d|           t)          |d          5 }	t+          j        |	                              dg           }
d d d            n# 1 swxY w Y   t1          fd|
D             d           }t3          |t4                    st7          d d          t9          j        d          5 }t=          ||          }t?          j         |j!                  5  |"                    d          #                                d         }||k    r|                    d|            n|                    d|            t3          |t4                    r;|                    d d|            |"                    dd| d| df           nFdk    r+|                    d           |"                    d           n|"                    d            t                      }tI          |          5 }|%                                }tM          |          }tO          |          D ]\  }\  }}}}}}|(                    d!|d"d#|d"           |d$k    r||d%z  }tR          j*        +                    d||d d&|tY          |          |-                    d'          |tY          |          ||d&d d i (          }|.                    |           	 d d d            n# 1 swxY w Y   |                     d)tM          |           d*           |cd d d            cd d d            S # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S )+N   zExtracting cookies from firefoxzzCannot extract cookies from firefox without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportc                 P    g | ]"}t           j                            |          #S r:   )r`   pathjoin).0rx   rk   s     r-   
<listcomp>z,_extract_firefox_cookies.<locals>.<listcomp>   s)    XXXT733XXXr.   z, 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   | ]B                     d           t          fd          fv +                     d          V  CdS )namec                  ^    t          j        d d                                                   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c r.   userContextIdN)rB   r   )rz   r   r[   s    @r-   	<genexpr>z+_extract_firefox_cookies.<locals>.<genexpr>   s}        gW`KKccccdde
 X
 X
W[[99 X
 X
 X
 X
  r.   z"could not find firefox container "z" in containers.jsonyt_dlpprefixzPRAGMA user_version;r   z7Possibly unsupported firefox cookies database version: z"Firefox cookies database version: z-Only loading cookies from firefox container "z", ID zzSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE originAttributes LIKE ? OR originAttributes LIKE ?z%userContextId=z&%r~   z3Only loading cookies not belonging to any containerztSELECT host, name, value, path, expiry, isSecure FROM moz_cookies WHERE NOT INSTR(originAttributes,"userContextId=")zASELECT host, name, value, path, expiry, isSecure FROM moz_cookiesLoading cookie  6d/   i  F.versionr   valueportport_specifieddomaindomain_specifieddomain_initial_dotrx   path_specifiedsecureexpiresdiscardcommentcomment_urlrest
Extracted z cookies from firefox)/infor   r(   r_   list_firefox_browser_dirs_is_pathry   maprepr_newest_firefox_cookie_dbsFileNotFoundErrordebugr`   rx   dirnameisfilera   rb   openjsonrc   rB   next
isinstanceintrt   tempfileTemporaryDirectory_open_database_copy
contextlibclosing
connectionexecutefetchonerS   fetchalllen	enumerater6   http	cookiejarCookiebool
startswith
set_cookie)rk   r[   r>   MAX_SUPPORTED_DB_SCHEMA_VERSIONsearch_rootssearch_rootcookie_database_pathcontainer_idcontainers_path
containersr   tmpdircursordb_schema_versionrm   rH   tabletotal_cookie_countihostr   r   rx   expiry	is_securecookies   ``                        r-   rp   rp      s   &(#
KK1222 $ W 	X 	X 	X!###13344	'		 YyXXXX@U@W@WXXX))Cl3344K"#6|#D#DEE# [k [ [\\\
LLE.BEEEFFFL&&',,rw7K'L'LN_``w~~o.. 	XbiQSQX6Y6Y 	X#$V$V$VWWW/F333 	Ez:..22<DDJ	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E          ,,, 	ca)aaabbb		$H	5	5	5 %$%96BB 122 #	 #	 &/E F F O O Q QRS T #BBBlYjllmmmmUBSUUVVV,,, dcIccUacce e e Q5|557Y7Y7Y7YZ\ \ \ \ f$$RSSS KL L L L bccc$&&C%f-- +))%(ZZ"GPQVGWGW + +CACdE4 &&'Y'Y'Y'YAS'Y'Y'YZZZ )B..63E$!^22 !EUZ#d4jjUYUdUdehUiUi!$t**YX^hm $$R	 3 A AF
 NN6****++ + + + + + + + + + + + + + + KKDSXXDDDEEEG#	 #	 #	 #	 #	 #	 #	% % % % % % % %#	 #	 #	 #	 #	 #	 #	 #	 #	% % % % % % % % % % % % % % % % % %sn   %)GG!G>*S(DR3 CQ(R3(Q,,R3/Q,0*R3S3R7	7S:R7	;SSSc               #     K   t           j        dv r't          t          j        j        d          E d {V  d S t           j        dk    r#t          j                            d          V  d S t          t          j        j        t          j                            t                      d          dddd	f          E d {V  d S )
Ncygwinwin32)z"%APPDATA%\Mozilla\Firefox\Profilesza%LOCALAPPDATA%\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox\Profilesdarwinz.~/Library/Application Support/Firefox/Profileszmozilla/firefoxz~/.mozilla/firefoxz5~/.var/app/org.mozilla.firefox/config/mozilla/firefoxz/~/.var/app/org.mozilla.firefox/.mozilla/firefoxz&~/snap/firefox/common/.mozilla/firefox)	sysplatformr   r`   rx   
expandvars
expanduserry   _config_homer:   r.   r-   r   r      s      
|***rw) ,
   	 	 	 	 	 	 	 	 	
 
	!	!g  !QRRRRRRR rw) GLL):;; C=4,
   	 	 	 	 	 	 	 	 	r.   c           	   #      K   t          t          j        j        |           D ]@}dD ];}t	          j        t          j                            ||d                    E d {V  <Ad S )N) z*/zProfiles/*/zcookies.sqlite)r   r`   rx   abspathglobiglobry   )rootsrootpatterns      r-   r   r      s      BGOU++ Q Q0 	Q 	QGz"',,tW>N"O"OPPPPPPPPPP	QQ Qr.   c           
         t           j        dv r"t          j                            d          }t          j                            d          }t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d	          t          j                            |d
          d|          }nt           j        dk    rt          j                            d          }t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          d|          }nt                      }t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          j                            |d          t          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`   rx   r   ry   r   r   )rj   appdata_localappdata_roamingr   appdataconfigr   browsers_without_profiless           r-   $_get_chromium_based_browser_settingsr      s   
|*****+;<<',,[99W\\-1YZZgll=2LMM]4IJJGLL0KLLW\\/3QRRw||M3GHHW\\-1OPP
 
  
	!	!'$$%DEEW\\'+HIIgll7O<<Wj99GLL*:;;W\\'+DEEw||GY77W\\'=99
 
  W\\&*GHHgll6?;;VZ88GLL)9::W\\&'22w||FI66W\\&-88
 
  $'LH$<$<  *LH44* # 8 899h  L ")	 #$)1JJ  r.   c           
         |                     d|             t          s'|                    d|  d           t                      S t	          |           }|	|d         }nt          |          r/|}|d         rt          j                            |          n||d<   nO|d         r't          j        	                    |d         |          }n |
                    |  d           |d         }t          t          |d|                    }|t          d|  d	| d
          |                    d| d
           t          j        d          5 }d }	 t#          ||          }t%          |                    d                                          d                   }	t+          |d         |d         |||	          }
t,          |j        _        t3          |d          }d|v rdnd}|                    d| d           t                      }d}d}t5          |          5 }|                                }t9          |          }t;          |          D ]V\  }}|                    d|dd|d           t?          |
g|R  \  }}|s|dz  }:|s|dz  }|                     |           W	 d d d            n# 1 swxY w Y   |dk    rd| d}nd}|                     dt9          |           d|  |            |
j!        "                                }||d <   |                    d!|            |||j        #                                 cd d d            S # tH          $ rG}t          j%        d"k    r1|j&        d#k    r&d$}|
                    |           tO          |           d }~ww xY w# ||j        #                                 w w xY w# 1 swxY w Y   d S )%NzExtracting cookies from zCannot extract cookies from zW without sqlite3 support. Please use a Python interpreter compiled with sqlite3 supportr   r   z does not support profilesCookieszcould not find z cookies database in "r}   r|   r   r   z,SELECT value FROM meta WHERE key = "version"r   r   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`   rx   r   ry   rD   r   _find_filesr   r   r   r   r   r   r   r   get_cookie_decryptorbytesr   text_factory_get_column_namesrS   r   r   r   r6   _process_chrome_cookier   _cookie_countscopyclose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<99::: $ Wl W W W 	X 	X 	X!###1,??F]+	'		 0<BCV<W d 8 8 8]d}%& 	0',,vm'<gFFKKLLLDDDEEE /K";{Iv#N#NOO# d, d dVa d d deee
LLE.BEEEFFF		$H	5	5	5 0*.	*()=vFFF v~~.\]]ffhhijkllL,}%vn'=vl< < <I .3F*,VY??L+6,+F+FKKHMNN|`m|||}}}$&&CN"#%f-- +))%(ZZ"(// + +GAt &&'Y'Y'Y'YAS'Y'Y'YZZZ+A)+Sd+S+S+S(L&! 1&!+ ) 1+q0+NN6****++ + + + + + + + + + + + + + + !!!Nn!N!N!N!#KK[SXX[[\[>[[\\\-2244F$7F=!LL>f>>??? !!'')))a0* 0* 0* 0* 0* 0* 0* 0*P  	 	 	w$5;"#4#4 DW%%%#G,,,	 !!'')))) "_0* 0* 0* 0* 0* 0* 0* 0* 0* 0*sj   OCM#B
J:.M:J>	>MJ>	A3M5O
N.'AN))N..N11OOOOc                    |                                 }|                                 }|                                 }|                                 }| o|}|r|                     |          }||d fS |sd }|t          j                            d||d d|t          |          |                    d          |t          |          ||dd d i           fS )Nr   Fr   r   )decodedecryptr   r   r   r   r   )	r  host_keyr   r   encrypted_valuerx   expires_utcr   r  s	            r-   r  r  t  s      H;;==DLLNNE;;==D90L &!!/22=%%  ..EU$x..XM`M`adMeMe$t**Y]b$R	 / 1 1 1 1r.   c                       e Zd ZdZi Zd ZdS )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GGr.   N)r7   r8   r9   __doc__r	  r  r:   r.   r-   r  r    s9         6 NH H H H 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    sb    
|x'(<fS_````	,	,	,+L&|\\\\%&:FGbnoooor.   c                   X    e Zd ZddddZej        d             Zed             Zd Z	dS )r%  Nr   c                    || _         |                     d          | _        |                     d          | _        dddd| _        || _        || _        |pd| _        d S )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__  sc    
33//#..&'A>>%9").Qr.   c                 t    t          | j        | j        | j                  }|d n|                     |          S rN   )_get_linux_keyring_passwordr1  r2  r-  r.  )r)   passwords     r-   _v11_keyz#LinuxChromeCookieDecryptor._v11_key  s7    .t/I4=Z^Zfgg'ttT__X-F-FFr.   c                 (    t          | ddd          S )N	   saltysaltr   r   salt
iterations
key_lengthpbkdf2_sha1r7  s    r-   r.  z%LinuxChromeCookieDecryptor.derive_key  s     8,1QSTTTTr.   c                    |dd         }|dd         }|dk    rB| j         dxx         dz  cc<   t          || j        | j        f| j        | j        dk              S |dk    rg| j         d	xx         dz  cc<   | j        | j                            d
d           dS t          || j        | j        f| j        | j        dk              S | j                            d| dd           | j         dxx         dz  cc<   dS )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: "r}   r,  )r	  _decrypt_aes_cbc_multir/  r0  r-  r3  r8  r(   r)   r  r   
ciphertexts       r-   r  z"LinuxChromeCookieDecryptor.decrypt  sV    ""1"%$QRR(
f&&&!+&&&)T]DO<dl ."46 6 6 6 &&&!+&&&}$$$%O[_$```t)T]DO<dl ."46 6 6 6
 L  !GW!G!G!GSW XXX(((A-(((4r.   )
r7   r8   r9   r4  	functoolscached_propertyr8  staticmethodr.  r  r:   r.   r-   r%  r%    s        @DSW / / / / / G G G U U \U
         r.   r%  c                   2    e Zd ZddZed             Zd ZdS )r#  Nc                     || _         t          ||          }|d n|                     |          | _        ddd| _        |pd| _        d S Nr   )r*  r,  )r-  _get_mac_keyring_passwordr.  r/  r	  r3  )r)   r'  r>   r   r7  s        r-   r4  z!MacChromeCookieDecryptor.__init__  sX    ,-A6JJ ( 0dooh6O6O&'!44).Qr.   c                 (    t          | ddd          S )Nr:  i  r   r;  r?  rA  s    r-   r.  z#MacChromeCookieDecryptor.derive_key  s     8,4TVWWWWr.   c                 &   |d d         }|dd          }|dk    ra| j         dxx         dz  cc<   | j        | j                            dd           d S t	          || j        f| j        | j        dk    	          S | j         d
xx         dz  cc<   |S )NrC  rD  r*  r   (cannot decrypt v10 cookies: no key foundTrH  rE  rF  r,  )r	  r/  r-  r(   rI  r3  rJ  s       r-   r  z MacChromeCookieDecryptor.decrypt  s    !"1"%$QRR(
f&&&!+&&&}$$$%O[_$```t)T],dlHZ^`H`b b b b (((A-((( #"r.   rN   )r7   r8   r9   r4  rN  r.  r  r:   r.   r-   r#  r#    sU        / / / / X X \X
# # # # #r.   r#  c                       e Zd ZddZd ZdS )r$  Nc                 d    || _         t          ||          | _        ddd| _        |pd| _        d S rQ  )r-  _get_windows_v10_keyr/  r	  r3  )r)   r&  r>   r   s       r-   r4  z%WindowsChromeCookieDecryptor.__init__  s=    ,\6BB&'!44).Qr.   c           	         |d d         }|dd          }|dk    r| j         dxx         dz  cc<   | j        | j                            dd           d S d}d	}|}|d |         }|||          }|| d          }t	          || j        ||| j        | j        d
k              S | j         dxx         dz  cc<   t          || j                                                  S )NrC  rD  r*  r   rU  TrH     r   rE  rF  r,  )r	  r/  r-  r(   _decrypt_aes_gcmr3  _decrypt_windows_dpapir  )	r)   r  r   rK  nonce_lengthauthentication_tag_lengthraw_ciphertextnonceauthentication_tags	            r-   r  z$WindowsChromeCookieDecryptor.decrypt  s/   !"1"%$QRR(
f&&&!+&&&}$$$%O[_$```t #L )+%'N"=L=1E'6O5O(OPJ!/1J0J0K0K!L#DM52Ddl ."46 6 6 6
 (((A-((( */4<HHOOQQQr.   rN   )r7   r8   r9   r4  r  r:   r.   r-   r$  r$    s<        / / / /R R R R Rr.   r$  c                     t           j        dvrt          dt           j                   | rNt          j                            |           }t          j                            |          st          d          nt          j                            d          }t          j                            |          sb|                    d           t          j                            d          }t          j                            |          st          d          t          |d          5 }|
                                }d d d            n# 1 swxY w Y   t          ||	          }|                    d
t          |           d           |S )N)r   iosz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`   rx   r   r   r   r   r   readparse_safari_cookiesr   r   )rk   r>   cookies_pathfcookies_datarm   s         r-   rq   rq   8  s   
|,,,@#,@@AAA Rw))'22w~~l++ 	P#$NOOO	P w))*STTw~~l++ 	RLL;<<<7--  /A  B  BL7>>,// R'(PQQQ	lD	!	!  Qvvxx                              |F
;
;
;C
KK;SXX;;;<<<Js   +EEEc                       e Zd ZdS )ParserErrorNrV   r:   r.   r-   rk  rk  R  rW   r.   rk  c                   N    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dS )
DataParserc                 0    || _         d| _        || _        d S )Nr   )_datar   r-  )r)   datar>   s      r-   r4  zDataParser.__init__W  s    
r.   c                     |dk     rt          d| d          | j        |z   }|t          | j                  k    rt          d          | j        | j        |         }|| _        |S )Nr   zinvalid read of  byteszreached end of input)rk  r   r   ro  )r)   	num_bytesendrp  s       r-   
read_byteszDataParser.read_bytes\  sq    q==BBBBCCCkI%TZ  4555z$+c/*r.   c           	          |                      t          |                    }||k    rt          d| d| d| d          d S )Nzunexpected value: z != r   ))ru  r   rk  )r)   expected_valuer*   r   s       r-   expect_byteszDataParser.expect_bytesf  sY    N 3 344N""Z5ZZnZZPWZZZ[[[ #"r.   Fc                 j    |rdnd}t          j        ||                     d                    d         S )Nz>Iz<I   r   structunpackru  r)   
big_endiandata_formats      r-   	read_uintzDataParser.read_uintk  3    (2ddd}[$//!*<*<==a@@r.   c                 j    |rdnd}t          j        ||                     d                    d         S )Nz>dz<d   r   r|  r  s      r-   read_doublezDataParser.read_doubleo  r  r.   c                     g }	 |                      d          }|dk    r'd                    |                                          S |                    |           X)NTr       r.   )ru  ry   r  r]   )r)   buffercs      r-   read_cstringzDataParser.read_cstrings  s[    	!""AG||xx''..000a   	!r.   unknownc           
          |dk    r8| j                             d| d| d|                     |                     d S |dk     rt          d| d          d S )Nr   z	skipping z bytes (z): zinvalid skip of rr  )r-  r   ru  rk  )r)   rs  descriptions      r-   skipzDataParser.skip|  sw    q==Ll9llklldoo^gNhNhllmmmmm]]BBBBCCC ]r.   c                 B    |                      || j        z
  |           d S rN   )r  r   )r)   offsetr  s      r-   skip_tozDataParser.skip_to  s#    		&4;&44444r.   c                 V    |                      t          | j                  |           d S rN   )r  r   ro  )r)   r  s     r-   skip_to_endzDataParser.skip_to_end  s$    S__k22222r.   NrI   )r  )r7   r8   r9   r4  ru  ry  r  r  r  r  r  r  r:   r.   r-   rm  rm  V  s          
  \ \ \
A A A AA A A A! ! !D D D D5 5 5 53 3 3 3 3 3r.   rm  c           
          t          t          j        dddddt          j        j                  t          j        |           z                                             S )Ni  r   r   )tzinfo)seconds)r   dtdatetimetimezoneutc	timedelta	timestamp)r  s    r-   _mac_absolute_time_to_posixr    sJ    D!Q1R[_EEE]fHgHgHggrrttuuur.   c                     t          | |                              dd                               d          }fdt          |          D             }|j        fS )Ns   cookzdatabase signatureTr  c                 <    g | ]}                     d           S )Tr  r  rz   rO   ps     r-   r{   z0_parse_safari_cookies_header.<locals>.<listcomp>  s'    OOO1!+++..OOOr.   )rm  ry  r  ranger   )rp  r>   number_of_pages
page_sizesr  s       @r-   _parse_safari_cookies_headerr    sh    4  ANN70111kkTk22OOOOOo8N8NOOOJqxr.   c           	        	 t          | |          		                    dd           	                                }	fdt          |          D             }|dk    r(|                    dt          |            d           d S 	                    |d         d           t          |          5 }t          |          D ]f\  }}|	                    d|d	d
|d	           	                    |d           t          | |d          ||          }	                    |           g	 d d d            n# 1 swxY w Y   	                    d           d S )Ns      zpage signaturec                 8    g | ]}                                 S r:   r  r  s     r-   r{   z._parse_safari_cookies_page.<locals>.<listcomp>  s!    FFFakkmmFFFr.   r   za cookies page of size z has no cookieszunknown page header fieldr   r   r   zspace between recordszspace in between pages)rm  ry  r  r  r   r   r  rS   r   r6   _parse_safari_cookies_recordru  r  )
rp  rm   r>   number_of_cookiesrecord_offsetsrH   r   record_offsetrecord_lengthr  s
            @r-   _parse_safari_cookies_pager    s   4  ANN&(8999FFFFU3D-E-EFFFNAIs4yyIIIJJJIInQ!<===	f	%	% ( ). 9 9 	( 	(A}PPPP9JPPPQQQIIm%<===8mnn9MsTZ[[MLL''''		(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( MM*+++++s   0A7D44D8;D8c                    t          | |          }|                                }|                    dd           |                                }t          |dz            }|                    dd           |                                }|                                }|                                }	|                                }
|                    dd           t	          |                                          }t	          |                                          }	 |                    |           |                                }|                    |           |                                }|                    |	           |                                }|                    |
           |                                }n)# t          $ r |	                    dd	           |cY S w xY w|                    |d
           t          j                            d||d d|t          |          |                    d          |t          |          ||dd d i           }|                    |           |S )Nr{  zunknown record field 1r   zunknown record field 2r  zunknown record field 3z;failed to parse Safari cookie because UTF-8 decoding failedTrH  zspace at the end of the recordr   Fr   r   )rm  r  r  r   r  r  r  r  UnicodeDecodeErrorr(   r   r   r   r   r   )rp  rm   r>   r  record_sizeflagsr   domain_offsetname_offsetpath_offsetvalue_offsetexpiration_date_creation_dater   r   rx   r   r   s                     r-   r  r    s0   4  A++--KFF1&'''KKMMEUV^$$IFF1&'''KKMMM++--K++--K;;==LFF1&'''1!--//BBO0AAN			-   !!			+~~			+~~			,     T`deee IIk;<<<^""EUVIZIZ[^I_I_$t**Yaf$R	 # 1 1F
 NN6s    B$G #G+*G+c                     |t                      }t          | |          \  }}t          | |d         |          }|D ]&}t          |                    |          ||           '|                    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  rm  r  ru  r  )rp  rm   r>   r  
body_startr  	page_sizes          r-   rf  rf    s     { ""9$GGJ
4
$f--A I I	"1<<	#:#:CHHHH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dS )_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    s          DFFEtvvHTVVFDFFE466D466D466D466DtvvH466DDFFE466D466DDDr.   r  c                   v    e Zd ZdZ e            Z e            Z e            Z e            Z e            Z	dS )_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    sQ          dffGtvvHtvvH466LIIIr.   r  c                    |                      dd          }|                      dd          }||t          t          j        |                    d                    D ]4}|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    ry|                      dd          }|dk    rt
          j
        c S |dk    rt
          j        c S |dk    rt
          j        c S |                    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    rt
          j        c S 6|                    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 |                    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: "r}   deepin)mategnome)kde4z
kde-plasmakdexfcexubuntuukuiz-DESKTOP_SESSION is set to an unknown value: "GNOME_DESKTOP_SESSION_IDKDE_FULL_SESSION)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/44O&	#6#<#<S#A#ABB 	5 	5Dw#663999939999!!/6666/5555%%/8888!gg&;TBB#%%38888 C''38888 C''38888KK V V V VWWW38888##/8888/4444/4444/4444  _I\___```(""'..	-	-	-'--	2	2	2',,	E	!	! C''+00+00	?	"	"o&B&B',,	F	"	"',,W_WWWXXX!S(('--	s	"	" C''+00+00#))r.   c                    t          t          j        |           }|                     d|j                    |t
          j        k    rt          j        }nx|t
          j	        k    rt          j
        }n[|t
          j        k    rt          j        }n>|t
          j        t
          j        t
          j        fv rt          j        }n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  M  s     9VLL
LLL2E2JLLMMM6;;;%-	 8 =	=	=%.	 8 =	=	=%.	 %'?'DF^Fd! 
 
 &/%2r.   c                 (   d}	 | t           j        k    rd}d}n9| 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|
                    d           |S |                    d|                                 d           |                                S # t          $ r$}|
                    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 = "r}   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  j  s\    !Nm+++-L-KK....L.KK....L.KKW%%% %	&=$l$$+	+

 Z_Z5G!I !I !I:  	"NN9:::!!LL>V\\^^>>>???<<>>!   F1FFGGGs$   BC# $>C# #
D-DDDc                    |                     d|j                    t          j        d          |                    d           dS t          ||          }	 t          j        dd|  dd|  d|gt          j	        t          j
        	          \  }}}|r|                    d
| d           dS |                                                    d          r|                     d           dS |                     d           |                    d          S # t          $ r0}|                    dt!          |                      Y d }~dS 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    s   
LLNNNOOO|O$$, M 	N 	N 	N s0&AAN %	"6EEE/666	+

 /**<!> !> !>:  	,LL Q* Q Q Q R R R3||~~(():;; ,_``` s-...}}U+++   L<??LLMMMssssss%   AD 2<D 0)D 
E$%EEc                    t           s|                    dt                      dS t          j        t          j                              5 }t          j        |          }|                                D ]?}|                                |  dk    r"|	                                c cd d d            S @|                    d           	 d d d            dS # 1 swxY w Y   d S )Nzsecretstorage not available r.   r
  zfailed to read from keyring)
r
   rD   r	   r   r   	dbus_initget_default_collectionget_all_items	get_label
get_secret)r'  r>   concolitems        r-   _get_gnome_keyring_passwordr    sI    W4UWWXXXs
 
	M355	6	6 #2377%%'' 	) 	)D~~&:#I#I#III((((	        J2333                 s   AC4CCCc                 b   |rt           |         nt          |          }|                    d|j                    |t           j        t           j        t           j        fv rt          | ||          S |t           j        k    rt          | |          S |t           j
        k    rd S J d|             )NzChosen keyring: FzUnknown keyring )r  r  r   r   r  r  r  r  r  r  r  )r'  rZ   r>   s      r-   r6  r6    s     )0RmG$$5J65R5RG
LL2GL22333=(-*@-BXYYY$%97FKKK	M.	.	.*+?HHH	M+	+	+t..W.....r.   c           
      v   |                     d           	 t          j        dddd| d|  dgt          j        t          j                  \  }}}|r|                    d	           d S |                    d
          S # t          $ r0}|                    dt          |                      Y d }~d S 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-   rR  rR    s    
LLSTTT %	0'*999; ?:+=!? !? !?:  	NN9:::4}}U###   T<PQ??TTUUUttttts   AA> )A> >
B8%B33B8c                 V   t          t          | d|                    }||                    d           dS |                    d| d           t	          |d          5 }t          j        |          }ddd           n# 1 swxY w Y   	 |d         d	         }n&# t          $ r |                    d
           Y dS w xY wt          j	        |          }d}|
                    |          s|                    d           dS t          |t          |          d         |          S )z
    References:
        - [1] https://chromium.googlesource.com/chromium/src/+/refs/heads/main/components/os_crypt/sync/os_crypt_win.cc
    zLocal StateNzcould not find local state filezFound local state file at "r}   r   r   os_cryptencrypted_keyzno encrypted key in Local States   DPAPIzinvalid key)r   r  rD   r   r   r   rc   KeyErrorbase64	b64decoder   r\  r   )r&  r>   rx   rh  rp  
base64_keyr"  r   s           r-   rX  rX    sx   
 ;|]FCCDDD|6777t
LL6t666777	dV	$	$	$ y||              *%o6

   6777tt $Z00MF##F++ ]###t!-F"=vFFFs$   "BB
BB C Cc                 2    t          j        d| |||          S )Nsha1)hashlibpbkdf2_hmac)r7  r<  r=  r>  s       r-   r@  r@    s    vxz:NNNr.                      Fc                    |D ]f}t          t          | ||                    }	 |r|dd                                          c S |                                c S # t          $ r Y cw xY w|                    dd           d S )N    z\failed to decrypt cookie (AES-CBC) because UTF-8 decoding failed. Possibly the key is wrong?TrH  )r   r   r  r  r(   )rK  keysr>   initialization_vectorrG  key	plaintexts          r-   rI  rI    s       5j#G\ ] ]^^		 / ~,,.....##%%%%%! 	 	 	D	
NNq  ~BN  C  C  C4s   AA
A'&A'c                 0   	 t          | |||          }n(# t          $ r |                    dd           Y d S w xY w	 |r|dd                                          S |                                S # t          $ r |                    dd           Y d S w xY w)Nz[failed to decrypt cookie (AES-GCM) because the MAC check failed. Possibly the key is wrong?TrH  r-  z\failed to decrypt cookie (AES-GCM) because UTF-8 decoding failed. Possibly the key is wrong?)r   rt   r(   r  r  )rK  r0  r`  ra  r>   rG  r1  s          r-   r[  r[  !  s    4ZFXZ_``		   t  AE  	F  	F  	Ftt 	+RSS>((***!!!   u  BF  	G  	G  	Gtts#    !::A0 A0 0!BBc                 ,  	 ddl 	ddl	 G 	fdd	j                  }	                    |           } |	                    |          |          } |            }	j        j                            	                    |          ddddd	                    |                    }|s&d}|	                    |           t          |          	                    |j        |j                  }	j        j                            |j                   |S )zt
    References:
        - https://docs.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptunprotectdata
    r   Nc                   d    e Zd Zd j        j        fd                      j                  fgZdS ))_decrypt_windows_dpapi.<locals>.DATA_BLOBcbDatapbDataN)r7   r8   r9   wintypesDWORDPOINTERc_char_fields_)ctypess   r-   	DATA_BLOBr5  :  s9        v45v~~fm<<=?r.   r>  z_Failed to decrypt with DPAPI. See  https://github.com/yt-dlp/yt-dlp/issues/10927  for more info)r=  ctypes.wintypes	Structurecreate_string_buffersizeofwindllcrypt32CryptUnprotectDatabyrefrD   r   	string_atr7  r6  kernel32	LocalFree)
rK  r>   r>  r  blob_inblob_outretr*   resultr=  s
            @r-   r\  r\  1  s=    MMM? ? ? ? ? ? ?F$ ? ? ? ((44Fif--v66Gy{{H
-

2
2W	X C  %sWG$$$hox??F
M$$X_555Mr.   c                  |    t           j                            dt           j                            d                    S )NXDG_CONFIG_HOMEz	~/.config)r`   r  rB   rx   r   r:   r.   r-   r   r   T  s)    :>>+RW-?-?-L-LMMMr.   c                     t           j                            |d          }t          j        | |           t          j        |          }|                                S )Nztemporary.sqlite)r`   rx   ry   r  r
  r   connectr   )database_pathr   database_copy_pathconns       r-   r   r   X  sJ    f.@AA
K1222?-..D;;==r.   c                 p    |                      d| d                                          }d |D             S )NzPRAGMA table_info(rw  c                 B    g | ]}|d                                           S )r   )r  )rz   rows     r-   r{   z%_get_column_names.<locals>.<listcomp>b  s$    222CFMMOO222r.   )r   r   )r   
table_name
table_infos      r-   r  r  `  s?     BZ B B BCCLLNNJ22z2222r.   c                 (    t          | d d           S )Nc                 4    t          j        |           j        S rN   )r`   lstatst_mtime)rx   s    r-   rP   z_newest.<locals>.<lambda>f  s    rx~~'> r.   )r0  default)max)filess    r-   r   r   e  s    u>>MMMMr.   c           
   #   4  K   d}t          |          5 }t          j        |           D ]U\  }}}|D ]L}|dz  }|                    d| d|dd           ||k    r"t          j                            ||          V  MV	 d d d            d S # 1 swxY w Y   d S )Nr   r   zSearching for "z": r   z files searched)rS   r`   walkr6   rx   ry   )	r   filenamer>   r   rH   	curr_rootrO   r`  rG   s	            r-   r  r  i  s     	A	f	%	% 8#%74== 	8 	8Iq% 8 8Q""#XX#X#X!#X#X#X#XYYY8##',,y$77777	8	88 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   A+BBBc                     t                      }| D ]/}|D ]}|                    |           |j        |j        |_        0|S rN   )r_   r   rc  )jars
output_jarrm   r   s       r-   rd   rd   u  s[    #%%J / / 	* 	*F!!&))))<#"%,Jr.   c                 z     t           fdt          j        j        t          j        j        fD                       S )Nc              3   $   K   | ]
}||v V  d S rN   r:   )rz   sepr   s     r-   r   z_is_path.<locals>.<genexpr>  s,      LLLse|LLLLLLr.   )anyr`   rx   rj  altsep)r   s   `r-   r   r     s3    LLLLRW^'DLLLLLLr.   c                     | t           vrt          d|  d          |d gt          R vrt          d| d          |+t          t	          |                    rt	          |          }| |||fS )Nzunsupported browser: "r}   zunsupported keyring: ")SUPPORTED_BROWSERSrt   SUPPORTED_KEYRINGSr   r   )rj   rk   rZ   r[   s       r-   r\   r\     s    ---A,AAABBBt101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-agerx   r   r   r   r   r   httponlysamesiter   rs  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                    t          |t                    s!t                                          |          S d }| j                            |          D ]}|                    d          rd }|                    dd          \  }}d}|                    d          r|dd          }d}|                                }|| j	        v r2|w||| j
        vrd }d}n|                     |          \  }}|||<   |rd }|h|                     |t          j                                                  }|                     |          \  }	}
|                    ||	|
           || |<   d }d S )Nbadr0  valF$r   T)r   r  r'   rc   _COOKIE_PATTERNfinditerr   r   r  	_RESERVED_FLAGSvalue_decoderB   r   r   Morselset)r)   rp  morselmatchr0  r   is_attribute	lower_keyrO   
real_valuecoded_valuer,   s              r-   rc   zLenientSimpleCookie.load  s   $$$ 	&77<<%%%)22488 %	 %	E{{5!! UE22JC L~~c"" $!""g#		IDN**>= 33!%  EE#0077HE1#s 
"#t|':':'<'<==*.*;*;E*B*B'
K

3
K888"S		 K%	 %	r.   )r7   r8   r9   r!  r   escape_LEGAL_KEY_CHARS_LEGAL_VALUE_CHARSr{  r|  compileASCIIVERBOSEry  rc   rJ   rK   s   @r-   rq  rq    s        ;; +>!?!??)IBIo,F,FF
 
 
I 
#F !bj "  " 
#" """%"* X
"+$ $O.+ + + + + + + + +r.   rq  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_subdomainsrx   
https_only
expires_atr   r   Nc                      t                      j        d g|R i | t          |          rt          j        |          }|| _        d S rN   )r'   r4  r   r`   fspathrc  )r)   rc  argskwargsr,   s       r-   r4  zYoutubeDLCookieJar.__init__  sT    ///////!! 	+y**H r.   c                     | rdndS )NTRUEFALSEr:   )cndns    r-   _true_or_falsez!YoutubeDLCookieJar._true_or_false  s    *vv7*r.   Fwritec             #      K   t          |          r5t          ||rdndd          5 }|V  d d d            d S # 1 swxY w Y   d S |r|                    d           |V  d S )Nwrzutf-8r   r   )r   r   truncate)r)   rG   r  rh  s       r-   r   zYoutubeDLCookieJar.open  s       	d51CCcGDDD                    !a   JJJJJs   :>>c                    t          j                     }| D ]}|s|j        s|s|                    |          r#|j        |j        }}|d|}}|                    d                    d                    |j        | 	                    |j        
                    d                    |j        | 	                    |j                  t          |j        d          ||f                               d S )Nr   z{}
	r   )r^  )r2   r   
is_expiredr   r   r  formatry   r   r  r   rx   r   r   r   )r)   rh  ignore_discardignore_expiresnowr   r   r   s           r-   _really_savezYoutubeDLCookieJar._really_save  s
   ikk 	 	F#  */5/@/@/E/E +v|%D} !$eGGFMM$))##FM$<$<S$A$ABB##FM22FNB777e- # #      	 	r.   Tc                 L   |-| j         | j         }nt          t          j        j                  | D ]}|j        d|_        |                     |d          5 }|                    | j                   | 	                    |||           ddd           dS # 1 swxY w Y   dS )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  )
rc  rt   r   r   MISSING_FILENAME_TEXTr   r   r  _HEADERr  )r)   rc  r  r  r   rh  s         r-   savezYoutubeDLCookieJar.save!  s    }(= !EFFF  	# 	#F~%!"YYxtY,, 	AGGDL!!!a@@@	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	As   2BB Bc           
          |- j          j         }nt          t          j        j                   fd}t          j                    }                     |          5 }|D ]}	 |                     ||                     "# t          j        j	        $ r^}|
                                 dd         dv rt          j        	                    d          t          d| d|d	           Y d}~d}~ww xY w	 ddd           n# 1 swxY w Y   |                    d                                ||||            D ]}	|	j        dk    rd|	_        d
|	_        dS )zLoad cookies from a file.Nc                 &   |                      j                  r| t          j                  d          } |                      d          s|                                 s| S |                     d          }t          |          j        k    r/t          j                            dt          |                      j	        | }|j
        rAt          j        d|j
                  s't          j                            d|j
                   | S )N#r  zinvalid length z[0-9]+(?:\.[0-9]+)?zinvalid expires at )r   _HTTPONLY_PREFIXr   r  r  
_ENTRY_LENr   r   	LoadError_CookieFileEntryr  r   r   )r  cookie_listr   r)   s      r-   prepare_linez-YoutubeDLCookieJar.load.<locals>.prepare_line>  s   t455 9C 566778s## 4::<< **T**K;4?22n../S[AQAQ/S/STTT*T*K8F  Z6LfN_)`)` Zn../XVEV/X/XY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)rc  rt   r   r   r  ioStringIOr   r  r  r  r   seek_really_loadr   r   )
r)   rc  r  r  r  cfrh  r  r  r   s
   `         r-   rc   zYoutubeDLCookieJar.load6  s   }(= !EFFF	 	 	 	 	 []]YYx   
	A 	 	HH\\$//0000~/   **,,)))!,55"n66hi i i !!^q!^!^TX!^!^!^___HHHH	
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 	


"hGGG  	& 	&F~""!%!%		& 	&s=   D$BDC5AC0+D0C55DD	D	c                     t           j                            t          t	          |                              }|                     |           |                    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_headeri  sO    ^++M,s:K:K,L,LMM
z***$$X...r.   c           	          t          t          j                              x| j        _        | _        |                     t
          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_urlo  sX     ),DIKK(8(88DI(()?)?l[^N_N_@`@`)a)abbbr.   c                     t          j        t                    5   t                      j        |i |cd d d            S # 1 swxY w Y   d S rN   )r   suppressr#  r'   clear)r)   r  r  r,   s      r-   r  zYoutubeDLCookieJar.clearv  s     ** 	2 	2 577=$1&11	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   AAArN   )NTT)r7   r8   r9   r!  r  r  r  collections
namedtupler  r4  rN  r  r   contextmanagerr   r  r  rc   r  r  r  rJ   rK   s   @r-   r_   r_     s7        
 $JG .{-bd d! ! ! ! ! ! + + \+ "'       *A A A A*1& 1& 1& 1&f/ / /c c c2 2 2 2 2 2 2 2 2r.   r_   )r+  FrI   )NNN)nr$  r  r   r  r  rL  r   r)  http.cookiejarr   http.cookiesr  r   r`   r   r  r}  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   rn  r$   rS   rU   rn   r^   rp   r   r   r   rs   r  r  r  r%  r#  r$  rq   re   rk  rm  r  r  r  r  rf  r  r  __members__r.  ro  r  r  r  r  r  r6  rR  rX  r@  rI  r[  r\  r   r   r  r   r  rd   r   r\   r   SimpleCookierq  r   MozillaCookieJarr_   r:   r.   r-   <module>r     s
                              				  				 				       



                       
         
 @ ? ? ? ? ? ? ?                        % $ $ $ $ $ + + + + + +^^^ ,	8/DD = = = = =
 = = =4  	 	 	 	 	n 	 	 	8 8 8. 8<IIKK =\`lp = = = = =I I IX  2Q Q Q9 9 9xK* K* K*\1 1 10H H H H H H H HD QUcg p p p p p5 5 5 5 5!6 5 5 5p# # # # #4 # # #D%R %R %R %R %R#8 %R %R %RP  4	 	 	 	 	) 	 	 	03 03 03 03 03 03 03 03fv v v     , , ,(' ' 'T $(		    "    t   (	 	 	 	 	D 	 	 	 #.3355 C* C* C*L  :& & &R( ( (V  "/ / /(  $G G G6O O O
 
 
 
         FN N N  3 3 3
N N N	8 	8 	8  M M M5 5 5 5X X X X X$,3 X X XvP2 P2 P2 P2 P28 P2 P2 P2 P2 P2r.   