o
    i                     @  s   d dl m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 G dd dZdS )	    )annotationsN)web)Image)BytesIO)
map_legacyfilter_files_extensionsfilter_files_content_typesc                   @  sl   e Zd Zd%ddZd&d'd	d
Zd(ddZdd Zdd Zd)ddZd*ddZ	d+ddZ
d,d!d"Zd#d$ ZdS )-ModelFileManagerreturnNonec                 C  s
   i | _ d S Ncacheself r   //mnt/c/Users/fbmor/ComfyUI/app/model_manager.py__init__   s   
zModelFileManager.__init__Nkeystr1tuple[list[dict], dict[str, float], float] | Nonec                 C  s   | j ||S r   )r   get)r   r   defaultr   r   r   	get_cache      zModelFileManager.get_cachevalue*tuple[list[dict], dict[str, float], float]c                 C  s   || j |< d S r   r   )r   r   r   r   r   r   	set_cache   r   zModelFileManager.set_cachec                 C  s   | j   d S r   )r   clearr   r   r   r   clear_cache   r   zModelFileManager.clear_cachec                   sB   | ddd }| d fdd}| d fdd	}d S )
Nz/experiment/modelsc                   sP   t tj }ddg}g }|D ]}||v rq||t|d qt|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folderr   r   r   get_model_folders    s   
z6ModelFileManager.add_routes.<locals>.get_model_foldersz/experiment/models/{folder}c                   s:   | j dd }|tjvrtjddS  |}t|S )Nr/     status)
match_infor   r%   r&   r   Responseget_model_file_listr*   )r+   r/   filesr   r   r   get_all_models,   s   


z3ModelFileManager.add_routes.<locals>.get_all_modelsz>/experiment/models/preview/{folder}/{path_index}/{filename:.*}c                   s0  | j dd }t| j dd }| j dd }|tjvr#tjddS tj| }|d | }tj	||} 
|}t|dkrD|d nd }|d u sUt|tr[tj|s[tjddS z1t|!}	t }
|	j|
dd |
d tj|
 d	d
W  d    W S 1 sw   Y  W d S    tjdd Y S )Nr/   
path_indexfilenamer1   r2   r   WEBP)formatz
image/webp)bodycontent_type)r4   r   intr%   r&   r   r5   ospathjoinget_model_previewslen
isinstancer   isfiler   openr   saveseekgetvalue)r+   folder_namer9   r:   r#   r/   full_filenamepreviewsdefault_previewimg	img_bytesr   r   r   get_model_preview4   s,   



(z6ModelFileManager.add_routes.<locals>.get_model_preview)r   )r   routesr0   r8   rQ   r   r   r   
add_routes   s   
zModelFileManager.add_routesrK   c                 C  sv   t |}tj| }g }t|d D ]'\}}tj|sq| |}|d u r1| ||}| 	|| |
|d  q|S )Nr   )r   r%   r&   	enumerater@   rA   isdircache_model_file_list_recursive_search_models_r   extend)r   rK   r#   output_listindexr/   outr   r   r   r6   O   s   

z$ModelFileManager.get_model_file_listr/   c                 C  sv   |  |}|d u rd S tj|sd S tj||d krd S |d D ]}|d | }|}tj||kr8 d S q#|S )N   )r   r@   rA   rU   getmtime)r   r/   model_file_list_cachextime_modifiedr   r   r   rV   _   s   
z'ModelFileManager.cache_model_file_list_	directory	pathIndexr?   )tuple[list[str], dict[str, float], float]c                   s  t j|sg i t fS dg d}g }i }t j|dddD ]\}}} fdd|D |d d < |sDdd |D |d d < dd |D }t|tj}|D ]I}	z)t j	||	}
t j
|
|}||t j|
t j|
t j|
d	}|| W qL ty } ztd
|	 d| d W Y d }~qLd }~ww |D ]%}t j	||}z
t j|||< W q ty   td
| d Y qw q||t fS )Nz.gitFT)followlinkstopdownc                   s   g | ]}| vr|qS r   r   .0dexcluded_dir_namesr   r   
<listcomp>|   s    z=ModelFileManager.recursive_search_models_.<locals>.<listcomp>c                 S     g | ]	}| d s|qS .
startswithrf   r   r   r   rk   ~       c                 S  rl   rm   ro   )rg   fr   r   r   rk      rq   )r"   rb   modifiedcreatedsizezWarning: Unable to access z	. Error: z. Skipping this file.z. Skipping this path.)r@   rA   rU   timeperf_counterwalkr   r%   supported_pt_extensionsrB   relpathr]   getctimegetsizer(   	ExceptionloggingwarningFileNotFoundError)r   ra   rb   include_hidden_filesresultdirsdirpathsubdirs	filenames	file_name	full_pathrelative_path	file_infoerh   rA   r   ri   r   rW   p   sL   


z)ModelFileManager.recursive_search_models_filepathlist[str | BytesIO]c                 C  s  t j|}t j|sg S t j|d }tj| ddd}t|d}ttdd |d }i }g }|D ]}	t j|	d }
|
|krH|	|	 |
| dkrT|	|	 q5|rmt j
||}tjj|d	d
}|rmt|}|di dd }|rt|}|D ]}|	tt| q|S )Nr   z.*F)	recursiveimagec                 S  s
   |  dS )Nz.safetensors)endswith)r_   r   r   r   <lambda>   s   
 z5ModelFileManager.get_model_previews.<locals>.<lambda>z.previewi   )max_size__metadata__ssmd_cover_images)r@   rA   dirnameexistssplitextglobr   nextfilterr(   rB   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   r   r   r   rC      s6   




z#ModelFileManager.get_model_previewsc                 C  s   |    d S r   )r   )r   exc_type	exc_value	tracebackr   r   r   __exit__   s   zModelFileManager.__exit__)r
   r   r   )r   r   r
   r   )r   r   r   r   )rK   r   )r/   r   )ra   r   rb   r?   r
   rc   )r   r   r
   r   )__name__
__module____qualname__r   r   r   r   rS   r6   rV   rW   rC   r   r   r   r   r   r	      s    


1


0"r	   )
__future__r   r@   r   r   rv   r~   r%   r   comfy.utilsr   aiohttpr   PILr   ior   r   r   r   r	   r   r   r   r   <module>   s    