
    L3iH                    
   U d dl mZ 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ded<   i ad	ed
<   ej                   r&ej"                  j%                  ej                         Zn4ej"                  j)                  ej"                  j+                  e            Zej"                  j/                  ed      Zej"                  j/                  ed      geft        d<   ej"                  j/                  ed      gdgft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      gdgft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed      geft        d<   ej"                  j/                  ed       g e       ft        d <   ej"                  j/                  ed!      geft        d!<   ej"                  j/                  ed"      geft        d"<   ej"                  j/                  ed#      gd$hft        d#<   ej"                  j/                  ed%      geft        d%<   ej"                  j/                  ed&      geft        d&<   ej"                  j/                  ed'      aej"                  j/                  ed(      aej"                  j/                  ed)      aej"                  j/                  ed*      ai ad+ed,<    G d- d.      Z e       Z d/d0d1a!dOd2Z"ej"                  jG                  t8              s	  ejH                  t8               dPd4Z&dQd5Z'dRd6Z(dSd7Z)dSd8Z*dSd9Z+dSd:Z,dTd;Z-d<Z.dUdVd=Z/dWd>Z0dXd?Z1dYd@Z2dZdAZ3d[d\dBZ4d]dCZ5d^d_dDZ6d`dEZ7d[dadFZ8dbdGZ9dcdHZ:dddIZ;dedJZ<dfdKZ=d`dLZ>dgdhdMZ?didNZ@y#   ejJ                  d3       Y xY w)j    )annotationsN)LiteralList)
Collection)args>   .pt.bin.pkl.pt2.pth.sft.ckpt.safetensorszset[str]supported_pt_extensionsz%dict[str, tuple[list[str], set[str]]]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outputtempinputuserz4dict[str, tuple[list[str], dict[str, float], float]]filename_list_cachec                  :    e Zd ZdZd Zd	d
dZddZd Zd Zd Z	y)CacheHelperz9
    Helper class for managing file list cache data.
    c                     i | _         d| _        y NF)cacheactiveselfs    &/home/serv3090/ComfyUI/folder_paths.py__init__zCacheHelper.__init__B   s    KM
    Nc                V    | j                   s|S | j                  j                  ||      S N)r7   r6   get)r9   keydefaults      r:   r?   zCacheHelper.getF   s#    {{Nzz~~c7++r<   c                <    | j                   r|| j                  |<   y y r>   )r7   r6   )r9   r@   values      r:   setzCacheHelper.setK   s    ;;#DJJsO r<   c                8    | j                   j                          y r>   )r6   clearr8   s    r:   rF   zCacheHelper.clearO   s    

r<   c                    d| _         | S )NT)r7   r8   s    r:   	__enter__zCacheHelper.__enter__R   s    r<   c                2    d| _         | j                          y r5   )r7   rF   )r9   exc_type	exc_value	tracebacks       r:   __exit__zCacheHelper.__exit__V   s    

r<   r>   )r@   strreturn)tuple[list[str], dict[str, float], float])r@   rN   rC   rP   rO   None)
__name__
__module____qualname____doc__r;   r?   rD   rF   rH   rM    r<   r:   r3   r3   >   s%    ,
$r<   r3   imagemodel)webpfbxc                0    ddd}|j                  | |       S )Nr   r   )r   r   )r?   )folder_namelegacys     r:   
map_legacyr^   a   s     (%'F::k;//r<   z Failed to create input directoryc                    | a y r>   output_directory)
output_dirs    r:   set_output_directoryrc   l   s    !r<   c                    | a y r>   temp_directory)temp_dirs    r:   set_temp_directoryrh   p       Nr<   c                    | a y r>   input_directory)	input_dirs    r:   set_input_directoryrn   t   s    Or<   c                     t         S r>   r`   rV   r<   r:   get_output_directoryrp   x   s    r<   c                     t         S r>   re   rV   r<   r:   get_temp_directoryrr   |   s    r<   c                     t         S r>   rk   rV   r<   r:   get_input_directoryrt      s    r<   c                     t         S r>   user_directoryrV   r<   r:   get_user_directoryrx      s    r<   c                    | a y r>   rv   )user_dirs    r:   set_user_directoryr{      ri   r<   __c                2   | rt        | t              st        d      | j                  dd      j	                         st        d|  d      | j                  d      rt        d      t        j                  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)
isinstancerN   
ValueErrorreplaceisalnum
startswithospathjoinrx   SYSTEM_USER_PREFIX)names    r:   get_system_user_directoryr      s    , z$,;<<<<R ((*6tfA>??sLMM77<<*,1C0DTF.KLLr<   c                    | rt        | t              sy| j                  t              ryt        j
                  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   rN   r   r   r   r   r   rx   )user_ids    r:   get_public_user_directoryr      s>    * *Wc2,-77<<*,g66r<   c                ^    | dk(  r
t               S | dk(  r
t               S | dk(  r
t               S y )Nr-   r.   r/   )rp   rr   rt   )	type_names    r:   get_directory_by_typer      s8    H#%%F!##G"$$r<   c                   g }| D ]x  }|j                  d      d   }|t        vr;t        j                  |d      \  }}|s<|j                  d      d   }|t        |<   n	t        |   }||v sh|j	                  |       z |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)filescontent_typesresultfile	extension	mime_typer~   content_types           r:   filter_files_content_typesr      s     F  JJsOB'	55$//UCLIq$??3/2L3?%i04Y?L=(MM$  Mr<   c                    | j                  d      rt               }| d d } | |fS | j                  d      rt               }| d d } | |fS | j                  d      rt               }| d d } | |fS | d fS )Nz[output]iz[input]iz[temp]i)endswithrp   rt   rr   )r   base_dirs     r:   annotated_filepathr      s    }}Z ')CRy > 
y	!&(CRy > 
x	 %'CRy > Tzr<   c                    t        |       \  } }|||}n
t               }t        j                  j	                  ||       S r>   )r   rt   r   r   r   )r   default_dirr   s      r:   get_annotated_filepathr     s>    '-ND(""H*,H77<<$''r<   c                    t        |       \  } }|
t               }t        j                  j	                  ||       }t        j                  j                  |      S r>   )r   rt   r   r   r   exists)r   r   filepaths      r:   exists_annotated_filepathr     sE    '-ND(&(ww||Hd+H77>>(##r<   c                    t        |       } | t        v rgt        |    \  }}||v r.|rT|d   |k7  rK|j                  |       |j                  d|       y |r|j                  d|       y |j	                  |       y y y |gt               ft        | <   y Nr   )r^   r   removeinsertr   rD   )r\   full_folder_path
is_defaultpaths_extss        r:   add_model_folder_pathr     s    [)K,,-k:uu$eAh*::-.Q 01Q 01-. ;z 1A/A35.I{+r<   c                6    t        |       } t        |    d   d d  S r   )r^   r   )r\   s    r:   get_folder_pathsr   +  s!    [)K!+.q1!44r<   c                   t         j                  j                  |       sg i fS |g }g }i }	 t         j                  j                  |       || <   t        j                  dj                  |              t        j                  | dd      D ]  \  }}}|D cg c]	  }||vs| c}|d d  |D ]R  }	 t         j                  j                  t         j                  j                  ||      |       }	|j                  |	       T |D ]E  }t         j                  j                  ||      }
	 t         j                  j                  |
      ||
<   G  t        j                  dj                  t        |                   ||fS # t        $ r t        j                  d|  d       Y Tw xY wc c}w #  t        j                  d| d       Y xY w# t        $ r t        j                  d|
 d       Y w xY w)NzWarning: Unable to access z. Skipping this path.z#recursive file list on directory {}T)followlinkstopdownz. Skipping this file.zfound {} files)r   r   isdirgetmtimeFileNotFoundErrorloggingwarningdebugformatwalkrelpathr   r   len)	directoryexcluded_dir_namesr   dirsdirpathsubdirs	filenamesd	file_namerelative_pathr   s              r:   recursive_searchr   /  s   77==#2v!FDW''**95Y MM7>>yIJ
 (*wwydTX'Y #)!(HAA5G,GaH
" 	I "Wi0PR[ \m,	  	AWa0DWW--d3T
	" MM"))#f+674<5  W4YK?TUVW I
"<YKG\ ]^ % "<TFBW XYs<   "E> 	F' F'0AF,'"G>"F$#F$,G
"G21G2c                F    t        t        t        fd|                   S )Nc                    t         j                  j                  |       d   j                         v xs t	              dk(  S )Nr   r   )r   r   splitextlowerr   )a
extensionss    r:   <lambda>z)filter_files_extensions.<locals>.<lambda>Y  s;    (8(8(;B(?(E(E(G:(U(mY\]gYhlmYm r<   )sortedlistfilter)r   r   s    `r:   filter_files_extensionsr   X  s    $vmotuvwwr<   c                   t        |       } | t        vryt        |    }t        j                  j	                  t        j                  j                  d|      d      }|d   D ]  }t        j                  j                  ||      }t        j                  j                  |      r|c S t        j                  j                  |      sft        j                  dj                  |              y)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.)r^   r   r   r   r   r   isfileislinkr   r   r   )r\   filenamefoldersx	full_paths        r:   get_full_pathr   ]  s    
 [)K00$[1Gwwrww||C:C@HQZ mGGLLH-	77>>)$WW^^I&OOY``ajklm r<   c                F    t        | |      }|t        d|  d| d      |S )r   zModel in folder 'z' with filename 'z' not found.)r   r   )r\   r   r   s      r:   get_full_path_or_raiser   q  s;     k84I"3K=@QRZQ[[g hiir<   c                   t        |       } t               }t        |    }i }|d   D ]7  }t        |dg      \  }}|j	                  t        ||d                i ||}9 t        t        |            |t        j                         fS )Nr   z.git)r      )
r^   rD   r   r   updater   r   r   timeperf_counter)r\   output_listr   output_foldersr   r   folders_alls          r:   get_filename_list_r   {  s    [)K%K$[1GNQZ ;-aVHM{25'!*EF:N:k:;
 ${#$nd6G6G6IIIr<   c                Z   t         j                  |       }||S t        |       } | t        vry t        |    }|d   D ]0  }|d   |   }|}t        j
                  j                  |      |k7  s0 y  t        |    }|d   D ]+  }t        j
                  j                  |      s#||d   vs+ y  |S )Nr   r   )	cache_helperr?   r^   r1   r   r   r   r   r   )r\   strong_cacheoutr   time_modifiedr   r   s          r:   cached_filename_list_r     s    ##K0L [)K--
k
*CV Aq	77F#}4	 %[1GQZ 77==A
 Jr<   c                    t        |       } t        |       }|t        |       }|t        | <   t        j                  | |       t        |d         S r   )r^   r   r   r1   r   rD   r   )r\   r   s     r:   get_filename_listr     sN    [)K

,C
{ -+.K([#&A<r<   c                   
 d fd}dd}d v r
 | ||       t         j                  j                  t         j                  j                               }t         j                  j	                  t         j                  j                               
t         j                  j                  ||      }t         j                  j                  |t         j                  j                  |      f      |k7  rdt         j                  j                  |      z   dz   |z   dz   t         j                  j                  |t         j                  j                  |      f      z   }t        j                  |       t        |      	 t        t        
fdt        |t        j                  |                        d   d	z   }	|
|	| fS # t        $ r d	}	Y t         $ r t        j"                  |d
       d	}	Y 7w xY w)Nc                    t        t        j                  j                              }| d |dz    }	 t	        | |dz   d  j                  d      d         }||fS #  d}Y ||fS xY w)Nr   r~   r   )r   r   r   basenameintr   )r   
prefix_lenprefixdigitsfilename_prefixs       r:   map_filenamez)get_save_image_path.<locals>.map_filename  sx    ))/:;
/:>*	*q./288=a@AF v~	Fv~s   #A A#c                   | j                  dt        |            } | j                  dt        |            } t        j                         }| j                  dt        |j                              } | j                  dt        |j
                        j                  d            } | j                  dt        |j                        j                  d            } | j                  dt        |j                        j                  d            } | j                  dt        |j                        j                  d            } | j                  d	t        |j                        j                  d            } | S )
Nz%width%z%height%z%year%z%month%   z%day%z%hour%z%minute%z%second%)r   rN   r   	localtimetm_yeartm_monzfilltm_mdaytm_hourtm_mintm_sec)r/   image_widthimage_heightnows       r:   compute_varsz)get_save_image_path.<locals>.compute_vars  s   i[)9:j#l*;<nnhCKK(89iSZZ)>)>q)ABgs3;;'7'='=a'@AhCKK(8(>(>q(ABj#cjj/*?*?*BCj#cjj/*?*?*BCr<   %zX**** ERROR: Saving image outside the output folder is not allowed.
 full_output_folder: z
         output_dir: z
         commonpath: c                    t         j                  j                  | d   d d       t         j                  j                        k(  xr | d   d   dk(  S )Nr   r   r~   )r   r   normcase)r   r   s    r:   r   z%get_save_image_path.<locals>.<lambda>  sM    rww'7'7!Sb	'BbggFVFVW_F`'`'tefgheijlemqtet r<   r   r   T)exist_ok)r   rN   rO   ztuple[int, str])r/   rN   r
  r   r  r   rO   rN   )r   r   dirnamenormpathr   r   
commonpathabspathr   error	Exceptionmaxr   maplistdirr   r   makedirs)r   rb   r
  r  r   r  	subfolderfull_output_foldererrcounterr   s   `         @r:   get_save_image_pathr     s   
 o&\R 0 0 ABIww 0 0 ABHj)<	ww:rww7I'JKLPZZ(*,''//:L*MN'(*45 (( +-''*<*<j"''//ZlJm=n*op 	cnftvy  {G  IK  IS  IS  Tf  Ig  wh  i  j  kl  m  pq  q x)_LL   
&6s   ?;G G2!G21G2c                 |   t               } g }	 t        j                  j                  |       sg S t        j                  |       D ][  \  }}}t        j                  j                  ||       }|dk7  s-|j                  |j                  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   )rt   r   r   r   r   r   r   r   sepr   r   )rm   r   rootr   r~   rel_paths         r:   get_input_subfoldersr%    s     $%IGww~~i(IWWY/ 	>MD$wwtY7H3x//<=		> g 	s    B- AB- 1;B- -B;:B;)r\   rN   rO   rN   )rb   rN   rO   rQ   )rg   rN   rO   rQ   )rm   rN   rO   rQ   )rO   rN   )rz   rN   rO   rQ   )system)r   rN   rO   rN   )r   rN   rO   
str | None)r   rN   rO   r'  )r   	list[str]r   z1List[Literal['image', 'video', 'audio', 'model']]rO   r(  )r   rN   rO   ztuple[str, str | None]r>   )r   rN   r   r'  rO   rN   )rO   bool)F)r\   rN   r   rN   r   r)  rO   rQ   )r\   rN   rO   r(  )r   rN   r   zlist[str] | NonerO   z"tuple[list[str], dict[str, float]])r   Collection[str]r   r*  rO   r(  )r\   rN   r   rN   rO   r'  )r\   rN   r   rN   rO   rN   )r\   rN   rO   rP   )r\   rN   rO   z0tuple[list[str], dict[str, float], float] | None)r   r   )r   rN   rb   rN   rO   ztuple[str, str, int, str, str])rO   r(  )A
__future__r   r   r   r   r   typingr   r   collections.abcr   comfy.cli_argsr   r   __annotations__r   base_directoryr   r  	base_pathr  realpath__file__r   
models_dirrD   ra   rf   rl   rw   r1   r3   r   r   r^   r   r  r  rc   rh   rn   rp   rr   rt   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%  rV   r<   r:   <module>r5     s.   " 	      & $l  l@B = B  3 34I 0 0 :;IWW\\)X.
*,'',,z=*Q)RTk(l } %&(ggll:y&I%JWI$V y !$&GGLLW$E#FH_"` w "$'',,z5"A!BD[ \ u ,.GGLL_,UWYW^W^WcWcdnpvWw+x  {R  +S  '/1ww||J/OQSQXQXQ]Q]^hj|Q}.~  AX  .Y ) **,'',,z=*Q)RTk(l } %+-77<<
N+S*TVm)n ~ &)+j,)O(PRi'j | $(*Z(M'NQYPZ&[ { #)+j,)O(PRi'j | $)+j,)OQSQXQXQ]Q]^hjwQx(y  |S  (T | $%'WW\\*h%G$HJa#b x  -/WW\\*FV-W,XZq+r ' (46GGLLMd4e3fh  3A . /+-77<<	>+R*SUXUZ)[ ~ &,.GGLL_,U+VXo*p  ')+j,)O(PRi'j | $*,'',,z=*Q)RUWTX(Y } %,.GGLL_,U+VXo*p  '-/WW\\*FV-W,XZq+r ' (77<<	84 i0'',,y'2i0LN I N 8 }  
0
 
ww~~o&:O$"   M>7:8 	($J$5'Rx
(J4-M^e:89s   &U, ,V