
    ^(j                     |    d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZ d dl	m
Z
 g dZdedefdZ G d	 d
      Zy)    N)web)	lru_cache)merge_json_recursive)znodeDefs.jsonzcommands.jsonzsettings.json	file_pathreturnc                    t         j                  j                  |       si S 	 t        | dd      5 }t	        j
                  |      cd d d        S # 1 sw Y   y xY w# t        j                  $ r t        j                  d|         i cY S w xY w)Nrzutf-8)encodingzError loading )	ospathexistsopenjsonloadJSONDecodeErrorloggingerror)r   fs     A/Users/danicosta/Desktop/Flux2/ComfyUI/app/custom_node_manager.pysafe_load_json_filer      sm    77>>)$	)S73q99Q< 433 yk23	s.   A A	A AA A -BBc                   0    e Zd Z ed      d        Zd Zy)CustomNodeManager   )maxsizec           	      f   i }t        j                  d      D ]  }t        t        j                  t        j
                  j                  |d                  D ]R  }t        j
                  j                  |d      }t        j
                  j                  |      sDt        j                  t        j
                  j                  |d            D ]  }t        j
                  j                  t        j
                  j                  |            }||vri ||<   t        j
                  j                  |d      }t        |      }t        D ]I  }	t        j
                  j                  ||	      }
|	j                  d      d   }t        |
      }|sE|||<   K |st        ||   |      ||<    U  |S )a  Load all custom nodes translations during initialization. Translations are
        expected to be loaded from `locales/` folder.

        The folder structure is expected to be the following:
        - custom_nodes/
            - custom_node_1/
                - locales/
                    - en/
                        - main.json
                        - commands.json
                        - settings.json

        returned translations are expected to be in the following format:
        {
            "en": {
                "nodeDefs": {...},
                "commands": {...},
                "settings": {...},
                ...{other main.json keys}
            }
        }
        custom_nodes*/localesz	main.json.r   )folder_pathsget_folder_pathssortedglobr   r   joinr   basenamedirnamer   EXTRA_LOCALE_FILESsplitr   )selftranslationsfoldercustom_node_dirlocales_dirlang_dir	lang_code	main_filenode_translations
extra_fileextra_file_pathkey	json_datas                r   build_translationsz$CustomNodeManager.build_translations!   sY   2 "33NCF#)$))BGGLL4N*O#P ggll?IFww~~k2 $		"'',,{D*I JH " 0 01J KI 424Y/ !#X{ CI(;I(F% '9
*,'',,x*L(..s3A6$7$H	$5>-c2 '9 )2F(35F3Y/' !K $Q D<     c                    
 g d
|j                  d      
fd       }|D ]  \  }}
D ]  }t        j                  j                  ||      }t        j                  j	                  |      sC|dk7  rt        j                  d||       |j                  t        j                  d|z   |      g         |j                  d       fd       }	y )	N)example_workflowsexampleexamplesworkflow	workflowsz/workflow_templatesc                   K   g }t        j                  d      D ]S  }
D ]L  }t        j                  j	                  |d| d      }t        j
                  |      }|j                  |       N U i }|D ]  }t        j                  j                  t        j                  j                  t        j                  j                  |                  }t        j                  j                  t        j                  j                  |            d   }	|j                  |g       j                  |	        t        j                  |      S w)zReturns a web response that contains the map of custom_nodes names and their associated workflow templates. The ones without templates are omitted.r   r   z/*.jsonr   )r    r!   r   r   r$   r#   extendr%   r&   splitext
setdefaultappendr   json_response)requestfilesr+   folder_namepatternmatched_filesworkflow_templates_dictfilecustom_nodes_nameworkflow_nameexample_workflow_folder_namess             r   get_workflow_templatesz<CustomNodeManager.add_routes.<locals>.get_workflow_templates`   s     E&77G#@K ggll6R}G3LMG$(IIg$6MLL/ $A H  $ $&GG$4$4GGOOBGGOOD$9:%! !# 0 01A1A$1G H K'223DbIPP!  $$%<==s   EEr9   zdFound example workflow folder '%s' for custom node '%s', consider renaming it to 'example_workflows'z/api/workflow_templates/z/i18nc                 R   K   t        j                  j                               S w)z<Returns translations from all custom nodes' locales folders.)r   rC   r6   )rD   r)   s    r   get_i18nz.CustomNodeManager.add_routes.<locals>.get_i18n   s#      $$T%<%<%>??s   $')
getr   r   r$   r   r   debug
add_routesr   static)r)   routeswebapploadedModulesrN   module_name
module_dirrF   workflows_dirrP   rM   s   `         @r   rS   zCustomNodeManager.add_routes\   s    (m%	)	*	> 
+	>2 (5#K< "Z E77>>-0"&99 C'6 %%JJ :[ H-  = (5$ 
G		@ 
	@r7   N)__name__
__module____qualname__r   r6   rS    r7   r   r   r       s     q8 8t3@r7   r   )r   r    r#   aiohttpr   r   r   	functoolsr   utils.json_utilr   r'   strdictr   r   r^   r7   r   <module>rd      sF    	       0 	3 	4 	o@ o@r7   