
    +jK                     "   U 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 d dl	m
Z
 h dZee         ed<   i aeeeee         ee         f         f         ed<   e
j        r e j                            e
j                  Zn2e j                            e j                            e                    Ze j                            ed          Ze j                            ed	          geft          d	<   e j                            ed
          gdgft          d
<   e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed          e j                            ed          geft          d<   e j                            ed          e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed          gdgft          d<   e j                            ed          geft          d<   e j                            ed          e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed          g e            ft          d<   e j                            ed          geft          d<   e j                            ed          geft          d<   e j                            ed           gd!hft          d <   e j                            ed"          geft          d"<   e j                            ed#          geft          d#<   e j                            ed$          geft          d$<   e j                            ed%          geft          d%<   e j                            ed&          geft          d&<   e j                            ed'          geft          d'<   e j                            ed(          geft          d(<   e j                            ed)          ae j                            ed*          ae j                            ed+          ae j                            ed,          ai a eeeee         eee!f         e!f         f         ed-<    G d. d/          Z" e"            Z#d0d1d2a$d3ed4efd5Z%e j        &                    t<                    s.	  e j'        t<                     n#   ej(        d6           Y nxY wd7ed4dfd8Z)d9ed4dfd:Z*d;ed4dfd<Z+d4efd=Z,d4efd>Z-d4efd?Z.d4efd@Z/dAed4dfdBZ0dCZ1dfdEed4efdFZ2dGed4edz  fdHZ3dIed4edz  fdJZ4dKee         dLeedM                  d4ee         fdNZ5dEed4eeedz  f         fdOZ6dgdEedPedz  d4efdQZ7d4e8fdRZ9dhd3edTedUe8d4dfdVZ:d3ed4ee         fdWZ;dgdXedYee         dz  d4eee         eee!f         f         fdZZ<dKee         d[ee         d4ee         fd\Z=d3ed]ed4edz  fd^Z>d3ed]ed4efd_Z?d3ed4eee         eee!f         e!f         fd`Z@d3ed4eee         eee!f         e!f         dz  fdaZAd3ed4ee         fdbZBdidced7ed4eeeeCeef         fddZDd4ee         fdeZEdS )j    N)LiteralList)
Collection)args>   .pt.bin.pkl.pt2.pth.sft.ckpt.safetensorssupported_pt_extensionsfolder_names_and_pathsmodelscheckpointsconfigsz.yamllorasvaetext_encodersclipunetdiffusion_modelsclip_visionstyle_models
embeddings	diffusersfolder
vae_approx
controlnett2i_adaptergligenupscale_modelslatent_upscale_modelscustom_nodeshypernetworks
photomakerclassifiers model_patchesaudio_encodersbackground_removalframe_interpolationgeometry_estimationoptical_flow	detectionoutputtempinputuserfilename_list_cachec            	           e Zd ZdZd Zddedeee         eee	f         e	f         fdZ
dedeee         eee	f         e	f         ddfdZd	 Zd
 Zd ZdS )CacheHelperz9
    Helper class for managing file list cache data.
    c                 "    i | _         d| _        d S NF)cacheactiveselfs    ,/home/wildlama/comfy/ComfyUI/folder_paths.py__init__zCacheHelper.__init__J   s    KM
    Nkeyreturnc                 J    | j         s|S | j                            ||          S N)r;   r:   get)r=   rA   defaults      r>   rE   zCacheHelper.getN   s'    { 	Nz~~c7+++r@   valuec                 ,    | j         r|| j        |<   d S d S rD   )r;   r:   )r=   rA   rG   s      r>   setzCacheHelper.setS   s%    ; 	$#DJsOOO	$ 	$r@   c                 8    | j                                          d S rD   )r:   clearr<   s    r>   rK   zCacheHelper.clearW   s    
r@   c                     d| _         | S )NT)r;   r<   s    r>   	__enter__zCacheHelper.__enter__Z   s    r@   c                 <    d| _         |                                  d S r9   )r;   rK   )r=   exc_type	exc_value	tracebacks       r>   __exit__zCacheHelper.__exit__^   s    

r@   rD   )__name__
__module____qualname____doc__r?   strtuplelistdictfloatrE   rI   rK   rM   rR    r@   r>   r7   r7   F   s           , ,s ,U49d3:>NPU3U-V , , , ,
$s $5cDe4De)K#L $QU $ $ $ $        r@   r7   imagemodel)webpfbxfolder_namerB   c                 8    ddd}|                     | |           S )Nr   r   )r   r   )rE   )ra   legacys     r>   
map_legacyrd   i   s(    (%' 'F::k;///r@   z Failed to create input directory
output_dirc                 
    | a d S rD   output_directory)re   s    r>   set_output_directoryri   t   s    !r@   temp_dirc                 
    | a d S rD   temp_directory)rj   s    r>   set_temp_directoryrn   x       NNNr@   	input_dirc                 
    | a d S rD   input_directory)rp   s    r>   set_input_directoryrt   |   s    OOOr@   c                      t           S rD   rg   r\   r@   r>   get_output_directoryrv      s    r@   c                      t           S rD   rl   r\   r@   r>   get_temp_directoryrx      s    r@   c                      t           S rD   rr   r\   r@   r>   get_input_directoryrz      s    r@   c                      t           S rD   user_directoryr\   r@   r>   get_user_directoryr~      s    r@   user_dirc                 
    | a d S rD   r|   )r   s    r>   set_user_directoryr      ro   r@   __systemnamec                 v   | rt          | t                    st          d          |                     dd                                          st          d|  d          |                     d          rt          d          t          j                            t                      t           |            S )a  
    Get the path to a System User directory.

    System User directories (prefixed with '__') are only accessible via internal API,
    not through HTTP endpoints. Use this for storing system-internal data that
    should not be exposed to users.

    Args:
        name: System user name (e.g., "system", "cache"). Must be alphanumeric
              with underscores allowed, but cannot start with underscore.

    Returns:
        Absolute path to the system user directory.

    Raises:
        ValueError: If name is empty, invalid, or starts with underscore.

    Example:
        >>> get_system_user_directory("cache")
        '/path/to/user/__cache'
    z System user name cannot be empty_r)   zInvalid system user name: ''z1System user name should not start with underscore)
isinstancerW   
ValueErrorreplaceisalnum
startswithospathjoinr~   SYSTEM_USER_PREFIX)r   s    r>   get_system_user_directoryr      s    ,  =z$,, =;<<<<<R  ((** @>t>>>???s NLMMM7<<*,,1C.KT.K.KLLLr@   user_idc                     | rt          | t                    sdS |                     t                    rdS t          j                            t                      |           S )ar  
    Get the path to a Public User directory for HTTP endpoint access.

    This function provides structural security by returning None for any
    System User (prefixed with '__'). All HTTP endpoints should use this
    function instead of directly constructing user paths.

    Args:
        user_id: User identifier from HTTP request.

    Returns:
        Absolute path to the user directory, or None if user_id is invalid
        or refers to a System User.

    Example:
        >>> get_public_user_directory("default")
        '/path/to/user/default'
        >>> get_public_user_directory("__system")
        None
    N)r   rW   r   r   r   r   r   r~   )r   s    r>   get_public_user_directoryr      s[    *  *Wc22 t,-- t7<<*,,g666r@   	type_namec                 ~    | dk    rt                      S | dk    rt                      S | dk    rt                      S d S )Nr1   r2   r3   )rv   rx   rz   )r   s    r>   get_directory_by_typer      sL    H#%%%F!###G"$$$4r@   filescontent_types)r]   videoaudior^   c                 ,   g }| D ]}|                     d          d         }|t          vrBt          j        |d          \  }}|sB|                     d          d         }|t          |<   nt          |         }||v r|                    |           |S )a  
    Example:
        files = os.listdir(folder_paths.get_input_directory())
        videos = filter_files_content_types(files, ["video"])

    Note:
        - 'model' in MIME context refers to 3D models, not files containing trained weights and parameters
    .F)strict/r   )splitextension_mimetypes_cache	mimetypes
guess_typeappend)r   r   resultfile	extension	mime_typer   content_types           r>   filter_files_content_typesr      s     F    JJsOOB'	555$/UCCCLIq $??3//2L3?%i004Y?L=((MM$Mr@   c                 &   |                      d          rt                      }| d d         } n`|                      d          rt                      }| d d         } n2|                      d          rt                      }| d d         } n| d fS | |fS )Nz[output]iz[input]iz[temp]i)endswithrv   rz   rx   )r   base_dirs     r>   annotated_filepathr      s    }}Z   
'))CRCy	y	!	! &((CRCy	x	 	  %''CRCyTz>r@   default_dirc                     t          |           \  } }|||}nt                      }t          j                            ||           S rD   )r   rz   r   r   r   )r   r   r   s      r>   get_annotated_filepathr     sG    '--ND(""HH*,,H7<<$'''r@   c                     t          |           \  } }|t                      }t          j                            ||           }t          j                            |          S rD   )r   rz   r   r   r   exists)r   r   filepaths      r>   exists_annotated_filepathr     sM    '--ND(&((w||Hd++H7>>(###r@   Ffull_folder_path
is_defaultc                 p   t          |           } | t          v rt          |          \  }}||v r?|r9|d         |k    r/|                    |           |                    d|           d S d S d S |r|                    d|           d S |                    |           d S |gt                      ft          | <   d S Nr   )rd   r   removeinsertr   rI   )ra   r   r   paths_extss        r>   add_model_folder_pathr   !  s    [))K,,,-k:uu$$ 2eAh*:::-...Q 0111112 2::
  /Q 011111-.....0@/A355.I{+++r@   c                 V    t          |           } t          |          d         d d          S r   )rd   r   )ra   s    r>   get_folder_pathsr   3  s(    [))K!+.q1!!!44r@   	directoryexcluded_dir_namesc                    t           j                            |           sg i fS g g }i }	 t           j                            |           || <   n(# t          $ r t          j        d|  d           Y nw xY wt          j        d                    |                      t          j	        | dd          D ]\  }}}fd|D             |d d <   |D ]u}	 t           j        
                    t           j                            ||          |           }|                    |           W#  t          j        d| d           Y sxY w|D ]m}	t           j                            ||	          }
	 t           j                            |
          ||
<   F# t          $ r t          j        d|
 d           Y jw xY wt          j        d                    t          |                               ||fS )	NzWarning: Unable to access z. Skipping this path.z#recursive file list on directory {}T)followlinkstopdownc                     g | ]}|v|	S r\   r\   ).0dr   s     r>   
<listcomp>z$recursive_search.<locals>.<listcomp>M  s$    HHHAA5G,G,Ga,G,G,Gr@   z. Skipping this file.zfound {} files)r   r   isdirgetmtimeFileNotFoundErrorloggingwarningdebugformatwalkrelpathr   r   len)r   r   r   dirsdirpathsubdirs	filenames	file_namerelative_pathr   r   s    `         r>   recursive_searchr   7  s5   7==## 2v!FDW'**955Y W W WUYUUUVVVVVW M7>>yIIJJJ
 (*wydTX'Y'Y'Y  #)HHHHHHH
" 	 	I "Wi0P0PR[ \ \m,,,, ]Y ] ] ]^^^ 	 	AWa00DW--d33T

$    XT X X XYYY		 M"))#f++667774<s0   "A "A65A6AD**E."F"F65F6
extensionsc                 ^    t          t          t          fd|                               S )Nc                     t           j                            |           d                                         v pt	                    dk    S )Nr   r   )r   r   splitextlowerr   )ar   s    r>   <lambda>z)filter_files_extensions.<locals>.<lambda>a  sB    (8(8(;(;B(?(E(E(G(G:(U(mY\]gYhYhlmYm r@   )sortedrY   filter)r   r   s    `r>   filter_files_extensionsr   `  s.    $vmmmmotuuvvwwwr@   filenamec                    t          |           } | t          vrdS t          |          }t          j                            t          j                            d|          d          }|d         D ]}t          j                            ||          }t          j                            |          r|c S t          j                            |          r't          j	        d
                    |                     dS )C
    Get the full path of a file in a folder, has to be a file
    Nr   r   z;WARNING path {} exists but doesn't link anywhere, skipping.)rd   r   r   r   r   r   isfileislinkr   r   r   )ra   r   foldersx	full_paths        r>   get_full_pathr   e  s    
 [))K000t$[1Gwrw||C::C@@HQZ m mGLLH--	7>>)$$ 	mW^^I&& 	mOY``ajkklll4r@   c                 V    t          | |          }|t          d|  d| d          |S )r   NzModel in folder 'z' with filename 'z' not found.)r   r   )ra   r   r   s      r>   get_full_path_or_raiser   y  sB     k844I hK h hRZ h h hiiir@   c                 X   t          |           } t                      }t          |          }i }|d         D ]F}t          |dg          \  }}|                    t          ||d                              i ||}Gt          t          |                    |t          j	                    fS )Nr   z.git)r      )
rd   rI   r   r   updater   r   rY   timeperf_counter)ra   output_listr   output_foldersr   r   folders_alls          r>   get_filename_list_r     s    [))K%%K$[1GNQZ ; ;-aVHMMM{25'!*EEFFF:N:k:${##$$nd6G6I6IIIr@   c                    t                               |           }||S t          |           } | t          vrd S t          |          }|d         D ]8}|d         |         }|}t          j                            |          |k    r d S 9t          |          }|d         D ].}t          j                            |          r||d         vr d S /|S )Nr   r   )	cache_helperrE   rd   r5   r   r   r   r   r   )ra   strong_cacheoutr   time_modifiedr   r   s          r>   cached_filename_list_r     s    ##K00L [))K---t
k
*CV  Aq	7F##}4444 5 %[1GQZ  7== 	AttJr@   c                     t          |           } t          |           }|t          |           }|t          | <   t                              | |           t          |d                   S r   )rd   r   r   r5   r   rI   rY   )ra   r   s     r>   get_filename_listr    s_    [))K

,
,C
{ --+.K([#&&&A<<r@   filename_prefixc                    
 dt           dt          t          t           f         f fd}dt           dt          dt          dt           fd}d v r | ||           t          j                            t          j                                                 }t          j                            t          j                                                 
t          j                            ||          }t          j        	                    |t          j        
                    |          f          |k    rd	t          j        
                    |          z   d
z   |z   dz   t          j        	                    |t          j        
                    |          f          z   }t          j        |           t          |          	 t          t          
fdt!          |t          j        |                                        d         dz   }	n5# t$          $ r d}	Y n't&          $ r t          j        |d           d}	Y nw xY w|
|	| fS )Nr   rB   c                 4   t          t          j                                                }| d |dz            }	 | |dz   d          }|                    d          d         }t          |                    d          d                   }n	#  d}Y nxY w||fS )Nr   r   r   r   )r   r   r   basenamer   int)r   
prefix_lenprefix	remainderbase_remainderdigitsr  s         r>   map_filenamez)get_save_image_path.<locals>.map_filename  s    ))/::;;
/:>/*	 a1I&__S11!4N--c221566FF	FFFv~s   AB Br3   image_widthimage_heightc                 V   |                      dt          |                    } |                      dt          |                    } t          j                    }|                      dt          |j                            } |                      dt          |j                                      d                    } |                      dt          |j                                      d                    } |                      dt          |j                                      d                    } |                      dt          |j	                                      d                    } |                      d	t          |j
                                      d                    } | S )
Nz%width%z%height%z%year%z%month%   z%day%z%hour%z%minute%z%second%)r   rW   r   	localtimetm_yeartm_monzfilltm_mdaytm_hourtm_mintm_sec)r3   r  r  nows       r>   compute_varsz)get_save_image_path.<locals>.compute_vars  s8   i[)9)9::j#l*;*;<<nhCK(8(899iSZ)>)>q)A)ABBgs3;'7'7'='=a'@'@AAhCK(8(8(>(>q(A(ABBj#cj//*?*?*B*BCCj#cj//*?*?*B*BCCr@   %zX**** ERROR: Saving image outside the output folder is not allowed.
 full_output_folder: z
         output_dir: z
         commonpath: c                     t           j                            | d         d d                   t           j                                      k    o| d         d         dk    S )Nr   r   r   )r   r   normcase)r   r   s    r>   r   z%get_save_image_path.<locals>.<lambda>  sQ    rw'7'7!SbS	'B'BbgFVFVW_F`F`'`'tefgheijlemqtet r@   r   r   T)exist_ok)rW   rX   r  r   r   dirnamenormpathr  r   
commonpathabspathr   error	Exceptionmaxr   maplistdirr   r   makedirs)r  re   r  r  r  r  	subfolderfull_output_foldererrcounterr   s   `         @r>   get_save_image_pathr-    s   	s 	uS#X 	 	 	 	 	 	
C 
c 
 
 
 
 
 
 o&,\RR 0 0 A ABBIw 0 0 A ABBHj)<<	w:rw7I'J'JKLLPZZZ(*,'//:L*M*MN'(*45 (( +-'*<*<j"'//ZlJmJm=n*o*op 	cnnfttttvy  {G  IK  IS  Tf  Ig  Ig  wh  wh  i  i  j  j  kl  m  pq  q      
&6666 x)_LLs   A	H H>!H>=H>c                     t                      } g }	 t          j                            |           sg S t          j        |           D ]_\  }}}t          j                            ||           }|dk    r3|                    |                    t          j        d                     `t          |          S # t          $ r g cY S w xY w)zReturns a list of all subfolder paths in the input directory, recursively.

    Returns:
        List of folder paths relative to the input directory, excluding the root directory
    r   r   )rz   r   r   r   r   r   r   r   sepr   r   )rp   r   rootr   r   rel_paths         r>   get_input_subfoldersr2    s     $%%IGw~~i(( 	IWY// 	> 	>MD$wtY77H3x//<<===g   			s    B6 BB6 6CC)r   rD   )F)r   r   )Fr   r   r   r   typingr   r   collections.abcr   comfy.cli_argsr   r   rI   rW   __annotations__r   rZ   rX   rY   base_directoryr   r"  	base_pathr  realpath__file__r   
models_dirrh   rm   rs   r}   r5   r[   r7   r   r   rd   r   r(  r#  ri   rn   rt   rv   rx   rz   r~   r   r   r   r   r   r   r   r   boolr   r   r   r   r   r   r   r   r   r  r  r-  r2  r\   r@   r>   <module>r=     s   					                       & & & & & &      $l$l$l S l l l@B S%S	3s8(;"<<= B B B  < 344II 0 0 : :;;IW\\)X..
*,',,z=*Q*Q)RTk(l } %&(gll:y&I&I%JWI$V y !$&GLLW$E$E#FH_"` w "$',,z5"A"A!BD[ \ u ,.GLL_,U,UWYW^WcWcdnpvWwWw+x  {R  +S  '/1w||J/O/OQSQXQ]Q]^hj|Q}Q}.~  AX  .Y ) **,',,z=*Q*Q)RTk(l } %+-7<<
N+S+S*TVm)n ~ &)+j,)O)O(PRi'j | $(*Z(M(M'NQYPZ&[ { #)+j,)O)O(PRi'j | $)+j,)O)OQSQXQ]Q]^hjwQxQx(y  |S  (T | $%'W\\*h%G%G$HJa#b x  -/W\\*FV-W-W,XZq+r ' (46GLLMd4e4e3fh  3A . /+-7<<	>+R+R*SUXUXUZUZ)[ ~ &,.GLL_,U,U+VXo*p  ')+j,)O)O(PRi'j | $*,',,z=*Q*Q)RUWTX(Y } %,.GLL_,U,U+VXo*p  '-/W\\*FV-W-W,XZq+r ' (13jJ^1_1_0`by/z + ,24',,zK`2a2a1bd{0| , -24',,zK`2a2a1bd{0| , -+-7<<
N+S+S*TVm)n ~ &(*Z(M(M'NPg&h { #7<<	844 i00',,y'22i00LN T#uT#YS%Z0@%%GHHI N N N       8 {}}   
0C 0C 0 0 0 0
 
w~~o&& ::O$$$$:899999"S "T " " " "      3  4        c    C    S    C           M MC Ms M M M M>7s 7sTz 7 7 7 7:S S4Z    d3i WMoEp@q vz{~v    8S U3d
?%;     	( 	( 	(3: 	(s 	( 	( 	( 	($t $ $ $ $J Js Jc Jt J`d J J J J$5# 5$s) 5 5 5 5' ' 'cT9I 'SXY]^aYbdhilnsisdtYtSu ' ' ' 'Rx:c? x
3 xTXY\T] x x x x
s c cDj    ( s s    JC JE$s)T#u*=Mu2T,U J J J Js uT#YS%Z@PRW5W/X[_/_    43 49    /M /M /M# /Mafgjloqtvy{~g~a /M /M /M /Mbd3i      s   W- -X