
    +j                         S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	J
r
  S SKJr  S SKJr  S SKJrJrJr   " S S5      rg)    N)web)Image)BytesIO)
map_legacyfilter_files_extensionsfilter_files_content_typesc            
          \ rS rSrSS jrSS\S\\\   \\\	4   \	4   S-  4S jjr
S\S\\\   \\\	4   \	4   4S jrS	 rS
 rS\4S jrS\4S jrS\S\S\\\   \\\	4   \	4   4S jrS\S\\\-     4S jrS rSrg)ModelFileManager   returnNc                     0 U l         g Ncacheselfs    1/home/wildlama/comfy/ComfyUI/app/model_manager.py__init__ModelFileManager.__init__   s	    LN
    keyc                 8    U R                   R                  X5      $ r   )r   get)r   r   defaults      r   	get_cacheModelFileManager.get_cache   s    zz~~c++r   valuec                      X R                   U'   g r   r   )r   r   r   s      r   	set_cacheModelFileManager.set_cache   s    

3r   c                 8    U R                   R                  5         g r   )r   clearr   s    r   clear_cacheModelFileManager.clear_cache   s    

r   c                    ^  UR                  S5      S 5       nUR                  S5      U 4S j5       nUR                  S5      U 4S j5       ng )Nz/experiment/modelsc                    #    [        [        R                  R                  5       5      nSS/n/ nU H2  nXB;   a  M
  UR	                  U[        R
                  " U5      S.5        M4     [        R                  " U5      $ 7f)Nconfigscustom_nodes)namefolders)listfolder_pathsfolder_names_and_pathskeysappendget_folder_pathsr   json_response)requestmodel_typesfolder_black_listoutput_foldersfolders        r   get_model_folders6ModelFileManager.add_routes.<locals>.get_model_folders   ss     |BBGGIJK!*N ;)+N%.%%v,B_B_`fBg&hi & $$^44s   A<A>z/experiment/models/{folder}c                    >#    U R                   R                  SS 5      nU[        R                  ;  a  [        R
                  " SS9$ TR                  U5      n[        R                  " U5      $ 7f)Nr6     status)
match_infor   r,   r-   r   Responseget_model_file_listr1   )r2   r6   filesr   s      r   get_all_models3ModelFileManager.add_routes.<locals>.get_all_models*   s\     ''++Hd;F\@@@||3//,,V4E$$U++s   A,A/z>/experiment/models/preview/{folder}/{path_index}/{filename:.*}c                   >#    U R                   R                  SS 5      n[        U R                   R                  SS 5      5      nU R                   R                  SS 5      nU[        R                  ;  a  [
        R                  " SS9$ [        R                  U   nUS   U   n[        R                  R                  XS5      nTR                  U5      n[        U5      S:  a  US   OS nUb9  [        U[        5      (       a8  [        R                  R                  U5      (       d  [
        R                  " SS9$  [        R                   " U5       n	[#        5       n
U	R%                  U
SS9  U
R'                  S5        [
        R                  " U
R)                  5       S	S
9sS S S 5        $ ! , (       d  f       g = f!   [
        R                  " SS9s $ = f7f)Nr6   
path_indexfilenamer:   r;   r   WEBP)formatz
image/webp)bodycontent_type)r=   r   intr,   r-   r   r>   ospathjoinget_model_previewslen
isinstancestrisfiler   openr   saveseekgetvalue)r2   folder_namerD   rE   r*   r6   full_filenamepreviewsdefault_previewimg	img_bytesr   s              r   get_model_preview6ModelFileManager.add_routes.<locals>.get_model_preview2   sm    !,,004@KW//33L$GHJ))--j$?H,"E"EE||3//"99+FGQZ
+FGGLL:M..}=H-0]Q->hqkDO&:os+K+KTVT[T[TbTbcrTsTs||3//0ZZ0C '	IHHYvH6NN1%<<Y-?-?-AP\]	 100
0||3//sC   D7G;F: AF)	F: (G)
F73F: 6G7F: :GG)r   )r   routesr7   rA   r]   s   `    r   
add_routesModelFileManager.add_routes   s\    	(	)	5 
*	5 
1	2	, 
3	, 
T	U	0 
V	0r   rW   c                 T   [        U5      n[        R                  U   n/ n[        US   5       Hu  u  pE[        R
                  R                  U5      (       d  M+  U R                  U5      nUc"  U R                  XT5      nU R                  XV5        UR                  US   5        Mw     U$ )Nr   )r   r,   r-   	enumeraterK   rL   isdircache_model_file_list_recursive_search_models_r   extend)r   rW   r*   output_listindexr6   outs          r   r?   $ModelFileManager.get_model_file_listM   s     -55kB"$&wqz2ME77==((--f5C{33FBv+s1v& 3 r   r6   c                 >   U R                  U5      nUc  g [        R                  R                  U5      (       d  g [        R                  R	                  U5      US   :w  a  g US    H2  nUS   U   nUn[        R                  R	                  U5      U:w  d  M2    g    U$ )N   )r   rK   rL   rd   getmtime)r   r6   model_file_list_cachextime_modifieds        r   re   'ModelFileManager.cache_model_file_list_]   s     $v 6 (ww}}V$$77F#'<Q'??&q)A1!4Q7MFww'=8	 * %$r   	directory	pathIndexc           
         [         R                  R                  U5      (       d  / 0 [        R                  " 5       4$ S/nSn/ n0 n[         R
                  " USSS9 GH  u  pxn	U V
s/ s H  oU;  d  M
  U
PM     sn
US S & U(       dV  U V
s/ s H  oR                  S5      (       a  M  U
PM     sn
US S & U	 Vs/ s H  oR                  S5      (       a  M  UPM     n	n[        U	[        R                  5      n	U	 H  n [         R                  R                  X|5      n[         R                  R                  X5      nUU[         R                  R                  U5      [         R                  R                  U5      [         R                  R                  U5      S.nUR                  U5        M     U HE  n
[         R                  R                  Xz5      n [         R                  R                  U5      UU'   MG     GM     XV[        R                  " 5       4$ s  sn
f s  sn
f s  snf ! [          a)  n["        R$                  " SU SU S	35         S nAGMZ  S nAff = f! [&         a    ["        R$                  " SU S
35         M  f = f)Nz.gitFT)followlinkstopdown.)r)   rt   modifiedcreatedsizezWarning: Unable to access z	. Error: z. Skipping this file.z. Skipping this path.)rK   rL   rd   timeperf_counterwalk
startswithr   r,   supported_pt_extensionsrM   relpathrn   getctimegetsizer/   	ExceptionloggingwarningFileNotFoundError)r   rs   rt   excluded_dir_namesinclude_hidden_filesresultdirsdirpathsubdirs	filenamesdf	file_name	full_pathrelative_path	file_infoerL   s                     r   rf   )ModelFileManager.recursive_search_models_n   s   ww}}Y''r4,,...$X$!#+-779$X\+]'Gi%,LW9K0K!WLGAJ')0JAS8IaJ
(1K	1c9JQ		K/	<;_;_`I&	 "W @I$&GGOOI$IM !.%.$&GG$4$4Y$?#%77#3#3I#> "	 :!I MM), '& GGLL4!#!1!1$!7DJ 7 ,^F T..000E MJK& ! OO&@9UVTWWl$mn ) OO&@F[$\]sO   '	H4HH(H8H H =B.H%"I%
I/II$JJfilepathc                    [         R                  R                  U5      n[         R                  R                  U5      (       d  / $ [         R                  R	                  U5      S   n[
        R
                  " U S3SS9n[        US5      n[        [        S U5      S 5      n0 n/ nU HV  n	[         R                  R	                  U	5      S   n
X:X  a  UR                  U	5        X S3:X  d  ME  UR                  U	5        MX     U(       aZ  [         R                  R                  X&5      n[        R                  R                  USS	9nU(       a  [        R                  " U5      nUR!                  S
0 5      R!                  SS 5      nU(       aM  [        R                  " U5      nU H1  nUR                  [#        [$        R&                  " U5      5      5        M3     U$ )Nr   z.*F)	recursiveimagec                 $    U R                  S5      $ )Nz.safetensors)endswith)rp   s    r   <lambda>5ModelFileManager.get_model_previews.<locals>.<lambda>   s    N1Kr   z.previewi   )max_size__metadata__ssmd_cover_images)rK   rL   dirnameexistssplitextglobr   nextfilterr/   rM   comfyutilssafetensors_headerjsonloadsr   r   base64	b64decode)r   r   r   basenamematch_filesimage_filessafetensors_filesafetensors_metadatar   rE   	_basenamesafetensors_filepathheadersafetensors_imagesr   s                  r   rN   #ModelFileManager.get_model_previews   s}   ''//(+ww~~g&&I77##H-a0ii8*B5A0gF'K[ Y[_`!&(#H((215I$h'j11h' $ #%77<<#J [[334HS^3_F'+zz&'9$155nbIMMNacgh!%,>!?+gf&6&6u&=>? , r   c                 $    U R                  5         g r   )r#   )r   exc_type	exc_value	tracebacks       r   __exit__ModelFileManager.__exit__   s    r   r   )r   Nr   )__name__
__module____qualname____firstlineno__r   rQ   tupler+   dictfloatr   r   r#   r`   r?   re   rJ   rf   r   rN   r   __static_attributes__ r   r   r
   r
      s    O,S ,5dT#u*EUW\9\3]`d3d , S  tDz4U
;KU/R)S  /0bs  %S %".1# .1# .1%PTUXPY[_`cej`j[kmrPrJs .1` 3  4g3F  Dr   r
   )rK   r   r   r|   r   r,   r   comfy.utilsr   aiohttpr   PILr   ior   r   r   r   r
   r   r   r   <module>r      s8    	           X Xr rr   