
    +j.                        S SK r S SKJr  S SKJr  S SKrS SKJr  \" S15      r	S\
\\\
\   4      4S jrS\
\   S\\\
\   4   4S	 jrS
\S\SS4S jrS\S\S-  4S jrS\S\\S   \4   4S jrS\S\\\
\   4   4S jrg)    N)Path)Literal)normalize_tagscustom_nodesreturnc                      / n [         R                  R                  5        H5  u  pU[        ;   a  M  US   US   pCU(       d  M#  U R	                  X45        M7     U $ )zBuild list of (folder_name, base_paths[]) for all model locations.

Includes every category registered in folder_names_and_paths,
regardless of whether its paths are under the main models_dir,
but excludes non-model entries like custom_nodes.
r      )folder_pathsfolder_names_and_pathsitems_NON_MODEL_FOLDER_NAMESappend)targetsnamevaluespaths_extss        >/home/wildlama/comfy/ComfyUI/app/assets/services/path_utils.pyget_comfy_models_foldersr      sZ     ,.G$;;AAC**ay&)u5NND=) D N    tagsc                 J   U (       d  [        S5      eU S   R                  5       nUS:X  au  [        U 5      S:  a  [        S5      e [        R                  U S      S   nU(       d  [        S	U S    S35      e[        R                  R                  US   5      nU SS
 nOUS:X  a8  [        R                  R                  [        R                  " 5       5      nU SS
 nOPUS:X  a8  [        R                  R                  [        R                  " 5       5      nU SS
 nO[        SU S    S35      e[        SS[        R                  45      nU H'  nUS;   d  U[        U5      -  (       d  M  [        S5      e   X4(       a  U4$ / 4$ ! [
         a    [        SU S    S35      ef = f)z5Validates and maps tags -> (base_dir, subdirs_for_fs)ztags must not be emptyr   models   z*at least two tags required for model assetr	   zunknown model category ''z&no base path configured for category 'Ninputoutputzunknown root tag 'z*'; expected 'models', 'input', or 'output'/\)...zinvalid path component in tags)
ValueErrorlowerlenr
   r   KeyErrorospathabspathget_input_directoryget_output_directory	frozensetsepset)r   rootbasesbase_dirraw_subdirs
_sep_charsis          r   resolve_destination_from_tagsr4      s   1227==?Dxt9q=IJJ	D 77Q@CE Ed1gYaPQQ77??58,12h	77??<#C#C#EF12h		77??<#D#D#FG12h-d1gY6`abbCrvv./JzCF22=>>  K[77R77'  	D7QyBCC	Ds   F F"	candidatebasec                     [        [        R                  R                  U 5      5      n[        [        R                  R                  U5      5      nUR	                  U5      (       d  [        S5      eg )Nz"destination escapes base directory)r   r&   r'   r(   is_relative_tor"   )r5   r6   cand_absbase_abss       r   validate_path_within_baser;   =   sR    BGGOOI./HBGGOOD)*H""8,,=>> -r   	file_pathc                 R    [        U 5      u  p[        U5      nUR                   Vs/ s H  oDSSUR                  4;  d  M  UPM     nnU(       d  gUS:X  a+  [        U5      S:  a  USS OUS   /nSR                  U5      $ SR                  U5      $ ! [         a     gf = fs  snf )a/  
Return the model's path relative to the last well-known folder (the model category),
using forward slashes, eg:
  /.../models/checkpoints/flux/123/flux.safetensors -> "flux/123/flux.safetensors"
  /.../models/text_encoders/clip_g.safetensors -> "clip_g.safetensors"

For non-model paths, returns None.
Nr    r!   r   r	   r   r   )$get_asset_category_and_relative_pathr"   r   partsanchorr$   join)r<   root_categoryrel_pathpsegr?   insides          r   compute_relative_filenamerG   D   s    "Fy"Q 	XAGGHGS3ahh2G'GSGEH !%j1nqr58*xx88E?   Is   B B$B$
B! B!)r   r   tempr   c                 X   [         R                  R                  U 5      nS[        S[        S[        4S jnS[        S[        S[        4S jn[         R                  R                  [
        R                  " 5       5      nU" X5      (       a
  SU" X5      4$ [         R                  R                  [
        R                  " 5       5      nU" X5      (       a
  SU" X5      4$ [         R                  R                  [
        R                  " 5       5      nU" X5      (       a
  SU" X5      4$ S	n[        5        Hb  u  pU	 HW  n
[         R                  R                  U
5      nU" X5      (       d  M1  [        U5      X" X5      4nUb  US
   US
   :  d  MU  UnMY     Md     Ub  Uu  pn[         R                  R                  X5      nS[         R                  R                  [         R                  R                  [         R                  U5      [         R                  5      4$ [        SU  35      e)a  Determine which root category a file path belongs to.

Categories:
  - 'input': under folder_paths.get_input_directory()
  - 'output': under folder_paths.get_output_directory()
  - 'temp': under folder_paths.get_temp_directory()
  - 'models': under any base path from get_comfy_models_folders()

Returns:
    (root_category, relative_path_inside_that_root)

Raises:
    ValueError: path does not belong to any known root.
childparentr   c                 6    [        U 5      R                  U5      $ N)r   r8   rJ   rK   s     r   _check_is_within>get_asset_category_and_relative_path.<locals>._check_is_withinq   s    E{))&11r   c           	          [         R                  R                  [         R                  R                  [         R                  [         R                  R                  X5      5      [         R                  5      $ rM   )r&   r'   relpathrA   r,   rN   s     r   _compute_relative?get_asset_category_and_relative_path.<locals>._compute_relativet   sB     wwGGLL!?@"&&
 	
r   r   r   rH   Nr   r   zCPath is not within input, output, temp, or configured model bases: )r&   r'   r(   strboolr
   r)   r*   get_temp_directoryr   r$   rA   rR   r,   r"   )r<   fp_absrO   rS   
input_baseoutput_base	temp_basebestbucketr/   br:   cand_
rel_insidecombineds                   r   r>   r>   ^   s   " WW__Y'F2 2S 2T 2
 
c 
c 
 !A!A!CDJ++)&=== ''//,"C"C"EFK,,*6???  ? ? ABI**(;;; )-D13Awwq)H#F55M6+<V+NOD|tAwa0  4  $:77<<3bffh)GPPP

Mi[Y r   c           	         [        U 5      u  p[        U5      nUR                  R                   Vs/ s H  oDSSUR                  4;  d  M  UPM     nnUR
                  [        [        R                  [        U/UQ5      5      5      4$ s  snf )zReturn (name, tags) derived from a filesystem path.

- name: base filename with extension
- tags: [root_category] + parent folder names in order

Raises:
    ValueError: path does not belong to any known root.
r    r!   )
r>   r   rK   r?   r@   r   listdictfromkeysr   )r<   rB   	some_pathrD   partparent_partss         r   !get_name_and_tags_from_asset_pathrj      s      DINMYA'T1887L+L   664nm5Sl5S&TUVVVs   B	B	)r&   pathlibr   typingr   r
   app.assets.helpersr   r+   r   rd   tuplerU   r   r4   r;   rG   r>   rj    r   r   <module>rp      s    	    - $^$45 $uS$s)^'<"= "8S	 8eCcN6K 8@? ?C ?D ? t 4>>
767<=>BW WsDI~9N Wr   