
    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mZ d dlmZ ddlmZ ddlmZmZmZmZmZ dZdZ G d	 d
ej2                  j4                        Zej8                  d        Z G d dej2                  j<                        Zd Z d Z!d Z"d Z#ejH                  jK                  d  ee de d             g dZ&y)    N)Path)ZipFile   )	functools)get_executable_pathget_system_config_dirsget_user_config_dirs
orderedSetwrite_stringyt_dlp_pluginsytdlp_pluginsc                       e Zd ZdZd Zy)PluginLoaderz+Dummy loader for virtual namespace packagesc                      y N )selfmodules     0/usr/lib/python3/dist-packages/yt_dlp/plugins.pyexec_modulezPluginLoader.exec_module   s        N)__name__
__module____qualname____doc__r   r   r   r   r   r      s
    5r   r   c                 Z   	 t        |       5 }t        t        j                  j	                  d |j                         D                    cd d d        S # 1 sw Y   t               S xY w# t        $ r Y t               S t        $ r%}t        d|  d| d       Y d }~t               S d }~ww xY w)Nc              3   F   K   | ]  }t        |      j                    y wr   )r   parents).0files     r   	<genexpr>zdirs_in_zip.<locals>.<genexpr>'   s!      5@'+T
""5@s   !z!WARNING: Could not read zip file z: 
)	r   set	itertoolschainfrom_iterablenamelistFileNotFoundError	Exceptionr   )archivezip_es      r   dirs_in_zipr-   #   s    KW 	Ay44 5@/3}}5@ @ A	A 	A 	A 5L	   5L  K8	A3bIJJ5LKs:   A) =A
	A) A&A) &A) )	B*=B*B%%B*c                   *    e Zd ZdZd Zd ZddZd Zy)PluginFinderz
    This class provides one or multiple namespace packages.
    It searches in sys.path and yt-dlp config folders for
    the existing subdirectories from which the modules can be imported
    c                 z    i | _         t        t        j                  j	                  d |D                    | _        y )Nc              3   h   K   | ]*  }t        j                  |j                  d       d        , yw).c                 (    dj                  | |f      S )Nr2   )join)abs     r   <lambda>z1PluginFinder.__init__.<locals>.<genexpr>.<lambda>:   s    sxxA?O r   N)r$   
accumulatesplit)r   names     r   r!   z(PluginFinder.__init__.<locals>.<genexpr>9   s.      :"   C2OP:"s   02)_zip_content_cacher#   r$   r%   r&   packages)r   r<   s     r   __init__zPluginFinder.__init__7   s4    "$IOO99 :" :" " #r   c              #   0  K   g }ddd}|j                   |g t        d      t        d      ddi       |j                   |t               gt        d      t        d      ddi       |j                  t	        t
        t        j                               t        j                  t              5  |j                  t        t              j                         d d d        t        |j                  d       }t        |d	
      D ]L  }||z  }	 |j!                         r| n/|j"                  dv r!|j%                         r|t'        |      v r| N y # 1 sw Y   }xY w# t(        $ r#}t+        d|j,                   d       Y d }~d }~ww xY ww)Nplugins)containing_folderc              7      K   t        t        t        |      d      D ]?  }t        j                  t
              5  || z  j                         E d {    d d d        A y 7 # 1 sw Y   NxY ww)NTlazy)r
   mapr   
contextlibsuppressOSErroriterdir)r@   
root_paths
config_dirs      r   _get_package_pathsz9PluginFinder.search_locations.<locals>._get_package_paths@   sm     (T:)>TJ J
((1 J *-> >GGIIIJ JJIJ Js.   8A/A#A!A#A/!A##A,	(A/zyt-dlpr@    zyt-dlp-pluginsr2   TrB   )z.zipz.eggz.whlz-Permission error while accessing modules in "z"
)extendr	   r   r   rD   r   syspathrE   rF   
ValueErrorremove__file__parentr9   r
   is_dirsuffixis_filer-   PermissionErrorr   filename)r   fullnamecandidate_locationsrK   partsrO   	candidater,   s           r   search_locationszPluginFinder.search_locations=   s     >G 	J 	""#5 $)!(+$)#H-$) ($) 	* 	""#5!$0!"%$0 $B'$0 /	$0 	1 	""3tSXX#67  , 	>&&tH~'<'<=	> hnnS)*2> 		^DuI^##%#O[[$<<D 11'		^		> 	> # ^LQZZLX[\]]^sI   B4F6)E4FAE'FE$ F'	F0F	FFFNc                     || j                   vry t        t        t        | j	                  |                  }|sy t
        j                  j                  |t               d      }||_	        |S )NT)
is_package)
r<   listrD   strr]   	importlib	machinery
ModuleSpecr   submodule_search_locations)r   rY   rO   targetr]   specs         r   	find_speczPluginFinder.find_specb   sa    4==(C)>)>x)H IJ""--hSW-X*:'r   c                     t         j                          | j                  D ]&  }|t        j                  v st        j                  |= ( y r   )r-   cache_clearr<   rN   modules)r   packages     r   invalidate_cacheszPluginFinder.invalidate_cachesn   s9    !}} 	)G#++%KK(	)r   )NN)r   r   r   r   r=   r]   rh   rm   r   r   r   r/   r/   0   s    ##^J
)r   r/   c                  h    t         j                  j                  t              } | r| j                  S g S r   )rb   utilrh   PACKAGE_NAMEre   )rg   s    r   directoriesrq   u   s)    >>##L1D.24**::r   c              #     K   t          d|  }t        j                  t              5  t	        j
                  |      }t        j                  |j                  | d      E d {    d d d        y 7 # 1 sw Y   y xY ww)Nr2   )rO   prefix)	rp   rE   rF   ModuleNotFoundErrorrb   import_modulepkgutiliter_modules__path__)
subpackagerY   pkgs      r   rw   rw   z   sw     q-H			0	1 R%%h/''S\\XJa.QQQR RQR Rs.   %B =A4$A2%A4)	B 2A44A=9B c                 >     t        j                    fd      S )Nc                 *   t        j                  |       xr| | j                  j                        xr_ | j                  j                        xrB | j                  j                  d       xr$ | j                  t        d| j                  g      v S )N___all__)inspectisclassr   endswithr   
startswithgetattr)objr   module_namerU   s    r   r7   zload_module.<locals>.<lambda>   s     	GLL!!&)	GNN%%k2	G '',,	G LLGFI~FF r   )r   
getmembers)r   r   rU   s   ```r   load_moduler      s     f 'H I Ir   c           
         i }t        |       D ]  \  }}}t        d |j                  d      D              r)	 t        j                  dk  r,t        |t        j                        r|j                  |      }n^|j                  |      }t        j                  j                  |      }|t        j                  |<   |j                  j                  |       |j)                  t        |||              t+        j,                  t.              5  t        j                  j1                  | t3        t5               t6        | d            }t        j                  j                  |      }|t        j                  |j8                  <   |j                  j                  |       |j)                  t        ||j8                  |             d d d        |S # t         $ r) t#        d|dt%        j&                  d              Y w xY w# 1 sw Y   |S xY w)	Nc              3   >   K   | ]  }|j                  d         yw)r}   N)r   )r   xs     r   r!   zload_plugins.<locals>.<genexpr>   s     AQq||C As   r2   )   
   zError while importing module r"   )limitz__init__.py)rw   anyr9   rN   version_info
isinstance	zipimportzipimporterr   rh   rb   ro   module_from_specrk   loaderr   r)   r   	traceback
format_excupdaterE   rF   r(   spec_from_file_locationr   r   COMPAT_PACKAGE_NAMEr:   )	r:   rU   classesfinderr   r}   r   rg   r?   s	            r   load_pluginsr      s   G".t"4 AQA+*;*;C*@AA	')jAVAV.W  ++K8''4"88>+1K(''/ 	{6;?@#A, 
		.	/ @~~55$*,.A4WY..11$7!(DII({7DIIv>?@ N!  	8r)J^J^egJhIijk	@ Ns   BGB6H.G>=G>Hz
.extractorz.postprocessor)rq   r   rp   r   )'rE   rb   importlib.abcimportlib.machineryimportlib.utilr   r$   rv   rN   r   r   pathlibr   zipfiler   compatr   utilsr   r   r	   r
   r   rp   r   abcLoaderr   cacher-   MetaPathFinderr/   rq   rw   r   r   	meta_pathinsertr~   r   r   r   <module>r      s            
        % 9==''  	 	B)9==// B)J;
RI!H   Q~Z%@\NR`Bab c
Pr   