64#h)< UddlmZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z hdZ ded<iad ed <e jr eje jZn2ejejeZejed Zejed ge ftd <ejed gdgftd <ejedge ftd<ejedge ftd<ejedejedge ftd<ejedejedge ftd<ejedge ftd<ejedge ftd<ejedge ftd<ejedgdgftd<ejedge ftd<ejedejedge ftd<ejedge ftd<ejedge ftd<ejedgeftd<ejed ge ftd <ejed!ge ftd!<ejed"gd#hftd"<ejed$aejed%aejed&aejed'aiad(ed)<Gd*d+ZeZ d,d-d.a!dhd2Z"ej#t8s. ej$t8n#ej%d3YnxYwdid6Z&djd8Z'dkd:Z(dld;Z)dld<Z*dld=Z+dld>Z,dmd@Z-dndCZ.dodHZ/dpdKZ0dqdrdMZ1dsdOZ2dtdudSZ3dvdTZ4dqdwdYZ5dxd\Z6dyd^Z7dzd_Z8d{daZ9d|dcZ:dvddZ;d}d~dgZ.pt.bin.pkl.pt2.pth.sft.ckpt .safetensorszset[str]supported_pt_extensionsz%dict[str, tuple[list[str], set[str]]]folder_names_and_pathsmodels checkpointsconfigsz.yamllorasvae text_encodersclipunetdiffusion_models clip_vision style_models embeddings diffusersfolder vae_approx controlnet t2i_adaptergligenupscale_models custom_nodes hypernetworks photomaker classifiersoutputtempinputuserz4dict[str, tuple[list[str], dict[str, float], float]]filename_list_cachec<eZdZdZdZdddZdd Zd Zd ZdZ dS) CacheHelperz9 Helper class for managing file list cache data. c"i|_d|_dSNF)cacheactiveselfs 3D:\ComfyUI_windows_portable\ComfyUI\folder_paths.py__init__zCacheHelper.__init__<sKM  Nkeystrreturn)tuple[list[str], dict[str, float], float]cJ|js|S|j||SN)r4r3get)r6r:defaults r7r@zCacheHelper.get@s'{ Nz~~c7+++r9valueNonec,|jr ||j|<dSdSr?)r4r3)r6r:rBs r7setzCacheHelper.setEs% ; $#DJsOOO $ $r9c8|jdSr?)r3clearr5s r7rGzCacheHelper.clearIs r9cd|_|S)NT)r4r5s r7 __enter__zCacheHelper.__enter__Ls  r9c<d|_|dSr2)r4rG)r6exc_type exc_value tracebacks r7__exit__zCacheHelper.__exit__Ps  r9r?)r:r;r<r=)r:r;rBr=r<rC) __name__ __module__ __qualname____doc__r8r@rErGrIrNr9r7r0r08s,,,,, $$$$r9r0imagemodel)webpfbx folder_namer;r<c8ddd}|||S)Nrr)rr)r@)rXlegacys r7 map_legacyr[[s((%''F ::k; / //r9z Failed to create input directory output_dirrCc |adSr?output_directory)r\s r7set_output_directoryr`fs!r9temp_dirc |adSr?temp_directory)ras r7set_temp_directoryrej NNNr9 input_dirc |adSr?input_directory)rgs r7set_input_directoryrkns OOOr9ctSr?r^rSr9r7get_output_directoryrmrs r9ctSr?rcrSr9r7get_temp_directoryrovs r9ctSr?rirSr9r7get_input_directoryrqzs r9ctSr?user_directoryrSr9r7get_user_directoryru~s r9user_dirc |adSr?rs)rvs r7set_user_directoryrxrfr9 type_name str | Nonec~|dkrtS|dkrtS|dkrtSdS)Nr*r+r,)rmrorq)rys r7get_directory_by_typer|sLH#%%%F!###G"$$$ 4r9files list[str] content_types1List[Literal['image', 'video', 'audio', 'model']]c,g}|D]}|dd}|tvrBtj|d\}}|sB|dd}|t|<n t|}||vr|||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)splitextension_mimetypes_cache mimetypes guess_typeappend)r}rresultfile extension mime_type_ content_types r7filter_files_content_typesrsF   JJsOOB' 5 5 5$/UCCCLIq $??3//2L3? %i 0 04Y?L = ( ( MM$    Mr9nametuple[str, str | None]c&|drt}|dd}n`|drt}|dd}n2|drt}|dd}n|dfS||fS)Nz[output]iz[input]iz[temp]i)endswithrmrqro)rbase_dirs r7annotated_filepathrs }}Z  '))CRCy y ! !&((CRCy x %''CRCyTz >r9 default_dirct|\}}|||}nt}tj||Sr?)rrqospathjoin)rrrs r7get_annotated_filepathrsG'--ND(  ""HH*,,H 7<<$ ' ''r9boolct|\}}|t}tj||}tj|Sr?)rrqrrrexists)rrfilepaths r7exists_annotated_filepathrsM'--ND(&((w||Hd++H 7>>( # ##r9Ffull_folder_path is_defaultcpt|}|tvrt|\}}||vr?|r9|d|kr/|||d|dSdSdS|r|d|dS||dS|gt ft|<dSNr)r[rremoveinsertrrE)rXrrpaths_extss r7add_model_folder_pathrs[))K,,,-k: u u $ $ 2eAh*::: -... Q 011111 2 2::  / Q 011111 -.....0@/A355.I{+++r9cVt|}t|dddSr)r[r)rXs r7get_folder_pathsrs([))K !+ .q 1!!! 44r9 directoryexcluded_dir_nameslist[str] | None"tuple[list[str], dict[str, float]]ctj|sgifSgg}i} tj|||<n(#t$rt jd|dYnwxYwt jd|tj |ddD]\}}}fd|D|dd<|D]u} tj tj |||}| |W#t jd|dYsxYw|D]m} tj || } tj| || <F#t$rt jd| dYjwxYwt jdt|||fS) NzWarning: Unable to access z. Skipping this path.z#recursive file list on directory {}T) followlinkstopdowncg|]}|v| SrSrS).0drs r7 z$recursive_search..s$HHHAA5G,G,Ga,G,G,Gr9z. Skipping this file.zfound {} files)rrisdirgetmtimeFileNotFoundErrorloggingwarningdebugformatwalkrelpathrrlen) rrrdirsdirpathsubdirs filenames file_name relative_pathrrs ` r7recursive_searchrs5 7== # #2v ! F DW'**955Y WWWUYUUUVVVVVW M7>>yIIJJJ (*wydTX'Y'Y'Y#)HHHHHHH "  I  " Wi0P0PR[ \ \  m,,,,  ]Y ] ] ]^^^  A Wa00D W--d33T $    XT X X XYYY    M"))#f++66777 4<s0"A"A65A6AD**E."F"F65F6Collection[str] extensionsc^tttfd|S)Nctj|dvpt dkS)Nrr)rrsplitextlowerr)ars r7z)filter_files_extensions..sB(8(8(;(;B(?(E(E(G(G:(U(mY\]gYhYhlmYmr9)sortedlistfilter)r}rs `r7filter_files_extensionsrs. $vmmmmotuuvv w wwr9filenamect|}|tvrdSt|}tjtjd|d}|dD]}tj||}tj|r|cStj|r'tj d |dS)Nrrz;WARNING path {} exists but doesn't link anywhere, skipping.) r[rrrrrisfileislinkrrr)rXrfoldersx full_paths r7 get_full_pathrs[))K000t$[1Gwrw||C::C@@H QZmmGLLH-- 7>>) $ $ m    W^^I & & m OY``ajkk l l l 4r9cVt||}|td|d|d|S)NzModel in folder 'z' with filename 'z ' not found.)rr)rXrrs r7get_full_path_or_raiser's@k844I hK h hRZ h h hiii r9r=cXt|}t}t|}i}|dD]F}t|dg\}}|t ||di||}Gt t||tj fS)Nrz.git)r) r[rErrupdaterrrtime perf_counter)rX output_listroutput_foldersrr} folders_alls r7get_filename_list_r.s[))K%%K$[1GN QZ;;-aVHMMM{25'!*EEFFF:N:k: ${## $ $nd6G6I6I IIr90tuple[list[str], dict[str, float], float] | Nonect|}||St|}|tvrdSt|}|dD]8}|d|}|}tj||krdS9t|}|dD].}tj|r ||dvrdS/|S)Nrr) cache_helperr@r[r.rrrrr)rX strong_cacheoutr time_modifiedrrs r7cached_filename_list_r;s##K00L[))K---t k *C VAq  7  F # #} 4 444 5%[1G QZ 7==   Att Jr9ct|}t|}|t|}|t|<t||t |dSr)r[rrr.rrEr)rXrs r7get_filename_listrUs_[))K  , ,C { --+.K([#&&& A<<r9filename_prefixtuple[str, str, int, str, str]c  dfd }dd }d vr |||tjtj}tjtj tj||}tj|tj|f|krd tj|zd z|zdztj|tj|fz}tj |t| tt fdt|tj|ddz} n5#t$rd} Yn't $rtj|dd} YnwxYw| | |fS)Nrr;r<tuple[int, str]cttj}|d|dz} t ||dzddd}n #d}YnxYw||fS)Nrrr)rrrbasenameintr)r prefix_lenprefixdigitsrs r7 map_filenamez)get_save_image_path..map_filename`s))/::;; /:>/* *q.//288==a@AAFF FFFv~s 3A00A6r, image_widthr image_heightcV|dt|}|dt|}tj}|dt|j}|dt|jd}|dt|jd}|dt|jd}|dt|j d}|d t|j d}|S) Nz%width%z%height%z%year%z%month%z%day%z%hour%z%minute%z%second%) replacer;r localtimetm_yeartm_monzfilltm_mdaytm_hourtm_mintm_sec)r,rrnows r7 compute_varsz)get_save_image_path..compute_varsis8 i[)9)9:: j#l*;*;<<n hCK(8(899 iSZ)>)>q)A)ABB gs3;'7'7'='=a'@'@AA hCK(8(8(>(>q(A(ABB j#cj//*?*?*B*BCC j#cj//*?*?*B*BCC r9%zX**** ERROR: Saving image outside the output folder is not allowed. full_output_folder: z output_dir: z commonpath: ctj|dddtjko|dddkS)Nrrr)rrnormcase)rrs r7rz%get_save_image_path..sQrw'7'7!SbS 'B'BbgFVFVW_F`F`'`'tefgheijlemqtetr9rrT)exist_ok)rr;r<r)r,r;rrrrr<r;)rrdirnamenormpathrr commonpathabspathrerror Exceptionmaxrmaplistdir ValueErrorrmakedirs) rr\rrrr  subfolderfull_output_foldererrcounterrs ` @r7get_save_image_pathr_sY     o&, \RR 0 0 A ABBIw 0 0 A ABBHj)<< w:rw7I'J'JKLLPZZZ(*,'//:L*M*MN'(*45((+-'*<*r*s"""""""  &&&&&&$l$l$lllll@BBBBB< 344II 0 0 : :;;I W\\)X . . *,',,z=*Q*Q)RTk(l}%&(gll:y&I&I%JWI$Vy!$&GLLW$E$E#FH_"`w"$',,z5"A"A!BD[ \u,.GLL_,U,UWYW^WcWcdnpvWwWw+x{R+S'/1w||J/O/OQSQXQ]Q]^hj|Q}Q}.~AX.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#bx -/W\\*FV-W-W,XZq+r'(+-7<< >+R+R*SUXUXUZUZ)[~&,.GLL_,U,U+VXo*p')+j,)O)O(PRi'j|$*,',,z=*Q*Q)RUWTX(Y}%7<< 844i00',,y'22i00LNNNNN8{}}   0000  w~~o&&:: O$$$$: 899999""""     8     ( ( ( ( ($$$$JJJJJ$5555'''''Rxxxx " J J J J4-M-M-M-M-M-M-Ms (Q>>R