
    +j                         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  G d d          ZdS )    N)web)Image)BytesIO)
map_legacyfilter_files_extensionsfilter_files_content_typesc            
       (   e Zd ZddZddedeee         eeef         ef         dz  fdZ	dedeee         eeef         ef         fdZ
d Zd	 Zd
efdZdefdZdededeee         eeef         ef         fdZdedeeez           fdZd ZdS )ModelFileManagerreturnNc                     i | _         d S Ncacheselfs    1/home/wildlama/comfy/ComfyUI/app/model_manager.py__init__zModelFileManager.__init__   s    LN


    keyc                 8    | j                             ||          S r   )r   get)r   r   defaults      r   	get_cachezModelFileManager.get_cache   s    z~~c7+++r   valuec                     || j         |<   d S r   r   )r   r   r   s      r   	set_cachezModelFileManager.set_cache   s    
3r   c                 8    | j                                          d S r   )r   clearr   s    r   clear_cachezModelFileManager.clear_cache   s    
r   c                      |                     d          d             }|                     d           fd            }|                     d           fd            }d S )Nz/experiment/modelsc                    K   t          t          j                                                  }ddg}g }|D ]1}||v r|                    |t          j        |          d           2t          j        |          S )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_foldersz6ModelFileManager.add_routes.<locals>.get_model_folders   s      |BGGIIJJK!*N ;)+N% j j...%%v,B_`fBgBg&h&hiiii$^444r   z/experiment/models/{folder}c                    K   | j                             dd           }|t          j        vrt	          j        d          S                     |          }t	          j        |          S )Nr1     status)
match_infor   r'   r(   r   Responseget_model_file_listr,   )r-   r1   filesr   s      r   get_all_modelsz3ModelFileManager.add_routes.<locals>.get_all_models*   sd      '++Hd;;F\@@@|3////,,V44E$U+++r   z>/experiment/models/preview/{folder}/{path_index}/{filename:.*}c                   K   | j                             dd           }t          | j                             dd                     }| j                             dd           }|t          j        vrt          j        d          S t          j        |         }|d         |         }t          j        	                    ||          }
                    |          }t          |          dk    r|d         nd }|4t          |t                    r4t          j                            |          st          j        d          S 	 t          j        |          5 }	t#                      }
|	                    |
d           |
                    d           t          j        |
                                d	
          cd d d            S # 1 swxY w Y   d S #  t          j        d          cY S xY w)Nr1   
path_indexfilenamer4   r5   r   WEBP)formatz
image/webp)bodycontent_type)r7   r   intr'   r(   r   r8   ospathjoinget_model_previewslen
isinstancestrisfiler   openr   saveseekgetvalue)r-   folder_namer=   r>   r%   r1   full_filenamepreviewsdefault_previewimg	img_bytesr   s              r   get_model_previewz6ModelFileManager.add_routes.<locals>.get_model_preview2   s     !,004@@KW/33L$GGHHJ)--j$??H,"EEE|3////"9+FGQZ
+FGLL::M..}==H-0]]Q->->hqkkDO&:os+K+K&TVT[TbTbcrTsTs&|3////0Z00 ^C '		IHHYvH666NN1%%%<Y-?-?-A-AP\]]]	^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
0|3//////s1   G A"G9G G

G G
G G,)r   )r   routesr2   r;   rV   s   `    r   
add_routeszModelFileManager.add_routes   s    	(	)	)	5 	5 
*	)	5 
1	2	2	, 	, 	, 	, 
3	2	, 
T	U	U	0 	0 	0 	0 
V	U	0 	0 	0r   rP   c                 ~   t          |          }t          j        |         }g }t          |d                   D ]\  }}t          j                            |          s%|                     |          }|,|                     ||          }| 	                    ||           |
                    |d                    |S )Nr   )r   r'   r(   	enumeraterD   rE   isdircache_model_file_list_recursive_search_models_r   extend)r   rP   r%   output_listindexr1   outs          r   r9   z$ModelFileManager.get_model_file_listM   s     --5kB"$&wqz22 	' 	'ME67==(( --f55C{33FEBBvs+++s1v&&&&r   r1   c                 R   |                      |          }|d S t          j                            |          sd S t          j                            |          |d         k    rd S |d         D ]8}|d         |         }|}t          j                            |          |k    r d S 9|S )N   )r   rD   rE   r[   getmtime)r   r1   model_file_list_cachextime_modifieds        r   r\   z'ModelFileManager.cache_model_file_list_]   s     $v 6 6 (4w}}V$$ 	47F##'<Q'???4&q) 	 	A1!4Q7MFw''=88tt 9 %$r   	directory	pathIndexc           
      <   t           j                            |          sg i t          j                    fS dgd}g }i }t          j        |dd          D ]\  }}}fd|D             |d d <   |sd |D             |d d <   d |D             }t          |t          j                  }|D ]}		 t           j        	                    ||	          }
t           j        
                    |
|          }||t           j                            |
          t           j                            |
          t           j                            |
          d}|                    |           # t          $ r%}t!          j        d	|	 d
| d           Y d }~d }~ww xY w|D ]m}t           j        	                    ||          }	 t           j                            |          ||<   F# t$          $ r t!          j        d	| d           Y jw xY w||t          j                    fS )Nz.gitFT)followlinkstopdownc                     g | ]}|v|	S  rn   ).0dexcluded_dir_namess     r   
<listcomp>z=ModelFileManager.recursive_search_models_.<locals>.<listcomp>z   s$    LLL9K0K0K!0K0K0Kr   c                 <    g | ]}|                     d           |S .
startswith)ro   rp   s     r   rr   z=ModelFileManager.recursive_search_models_.<locals>.<listcomp>|   s)    JJJAS8I8IJaJJJr   c                 <    g | ]}|                     d           |S rt   rv   )ro   fs     r   rr   z=ModelFileManager.recursive_search_models_.<locals>.<listcomp>}   s)    KKK1c9J9JKQKKKr   )r$   ri   modifiedcreatedsizezWarning: Unable to access z	. Error: z. Skipping this file.z. Skipping this path.)rD   rE   r[   timeperf_counterwalkr   r'   supported_pt_extensionsrF   relpathrd   getctimegetsizer*   	ExceptionloggingwarningFileNotFoundError)r   rh   ri   include_hidden_filesresultdirsdirpathsubdirs	filenames	file_name	full_pathrelative_path	file_infoerp   rE   rq   s                   @r   r]   z)ModelFileManager.recursive_search_models_n   sg   w}}Y'' 	/r4,....$X$!#+-79$X\+]+]+] !	 !	'GWiLLLLWLLLGAAAJ' LJJJJJ
KK	KKK	/	<;_``I&  	 "Wi @ @I$&GOOIy$I$IM !.%.$&G$4$4Y$?$?#%7#3#3I#>#> "	 : :! !I MM),,,,    O$m$m$mUV$m$m$mnnnHHHH   GLL!44!#!1!1$!7!7DJJ(   O$\$\$\$\]]]H	 tT.0000s+   /B4E$$
F.FF;"G"HHfilepathc                    t           j                            |          }t           j                            |          sg S t           j                            |          d         }t          j        | dd          }t          |d          }t          t          d |          d           }i }g }|D ]`}	t           j                            |	          d         }
|
|k    r|	                    |	           |
| dk    r|	                    |	           a|rWt           j        
                    ||          }t          j                            |d	          }|rt          j        |          }|                    d
i                               dd           }|rMt          j        |          }|D ]6}|	                    t#          t%          j        |                               7|S )Nr   z.*F)	recursiveimagec                 ,    |                      d          S )Nz.safetensors)endswith)rf   s    r   <lambda>z5ModelFileManager.get_model_previews.<locals>.<lambda>   s    N1K1K r   z.previewi   )max_size__metadata__ssmd_cover_images)rD   rE   dirnameexistssplitextglobr   nextfilterr*   rF   comfyutilssafetensors_headerjsonloadsr   r   base64	b64decode)r   r   r   basenamematch_filesimage_filessafetensors_filesafetensors_metadatar   r>   	_basenamesafetensors_filepathheadersafetensors_imagesr   s                  r   rG   z#ModelFileManager.get_model_previews   s   '//(++w~~g&& 	I7##H--a0i85AAA0gFF'K'K[ Y Y[_``!&(# 	( 	(H((2215IH$$h'''x11111h''' 	:#%7<<9I#J#J [334HS^3__F :'+z&'9'9$155nbIIMMNacghh 	@!%,>!?!?+ @ @gf&6u&=&=>>????r   c                 .    |                                   d S r   )r   )r   exc_type	exc_value	tracebacks       r   __exit__zModelFileManager.__exit__   s    r   )r   Nr   )__name__
__module____qualname__r   rJ   tupler&   dictfloatr   r   r   rX   r9   r\   rC   r]   r   rG   r   rn   r   r   r
   r
      s       O O O O, ,S ,5dT#u*EUW\9\3]`d3d , , , , S  tDz4U
;KU/R)S          /0 /0 /0bs     %S % % % %".1# .1# .1%PTUXPY[_`cej`j[kmrPrJs .1 .1 .1 .1` 3  4g3F        D    r   r
   )rD   r   r   r}   r   r'   r   comfy.utilsr   aiohttpr   PILr   ior   r   r   r   r
   rn   r   r   <module>r      s    				                                X X X X X X X X X Xr r r r r r r r r rr   