Files
havvk-ComfyUI_AIIA/__init__.py
T

173 lines
7.2 KiB
Python
Executable File

# /app/ComfyUI/custom_nodes/ComfyUI_AIIA/__init__.py
import sys
import os
# Smart Duplicate Detection
# Check if this file is already loaded under a different module name.
# This allows 'reload()' (same name) but prevents aliased double-loading (e.g. Path vs Package).
_current_file = os.path.abspath(__file__)
_is_duplicate = False
for _name, _module in list(sys.modules.items()): # construct list to avoid runtime change error
if _name == __name__: continue # Allow re-execution of self (reload)
if hasattr(_module, '__file__') and _module.__file__:
try:
if os.path.abspath(_module.__file__) == _current_file:
# print(f"[ComfyUI_AIIA] Skipping duplicate load (already loaded as {_name})")
_is_duplicate = True
break
except:
pass
if _is_duplicate:
NODE_CLASS_MAPPINGS = {}
NODE_DISPLAY_NAME_MAPPINGS = {}
else:
print("--- 正在加载 ComfyUI_AIIA 自定义节点包 ---")
# 初始化空的映射字典
NODE_CLASS_MAPPINGS = {}
NODE_DISPLAY_NAME_MAPPINGS = {}
# --- 模块导入和映射合并 ---
# (为了代码简洁,我将重复的导入逻辑封装成一个函数)
def _load_nodes_from_module(module_name_relative, module_alias_for_log):
"""
尝试从指定的模块加载节点映射。
module_name_relative: 相对模块名,例如 ".aiia_float_nodes"
module_alias_for_log: 用于日志记录的模块别名
"""
global NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS # 确保我们修改的是全局变量
module_object = None
try:
# 使用 importlib 进行更动态的导入
import importlib
module_object = importlib.import_module(module_name_relative, package=__name__) # __name__ 是当前包名 "ComfyUI_AIIA"
if hasattr(module_object, 'NODE_CLASS_MAPPINGS'):
NODE_CLASS_MAPPINGS.update(module_object.NODE_CLASS_MAPPINGS)
if hasattr(module_object, 'NODE_DISPLAY_NAME_MAPPINGS'):
NODE_DISPLAY_NAME_MAPPINGS.update(module_object.NODE_DISPLAY_NAME_MAPPINGS)
except ImportError as e_import:
print(f"错误: 导入 {module_alias_for_log} ({module_name_relative}) 失败: {e_import}")
except Exception as e_generic:
print(f"错误: 在 {module_alias_for_log} ({module_name_relative}) 导入或处理过程中发生错误: {e_generic}")
# 1. 处理 aiia_float_nodes.py
_load_nodes_from_module(".aiia_float_nodes", "aiia_float_nodes")
# 2. 处理 aiia_generate_segments.py
_load_nodes_from_module(".aiia_generate_segments", "aiia_generate_segments")
# 3. 处理 aiia_e2e_diarizer.py
_load_nodes_from_module(".aiia_e2e_diarizer", "aiia_e2e_diarizer")
# 4. 处理 aiia_utils_nodes.py
_load_nodes_from_module(".aiia_utils_nodes", "aiia_utils_nodes")
# 5. 处理 aiia_video_nodes.py
_load_nodes_from_module(".aiia_video_nodes", "aiia_video_nodes")
# 6. 处理 aiia_browser_node.py (确保HTTP路由被注册)
_load_nodes_from_module(".aiia_browser_node", "aiia_browser_node")
# 7. 处理 aiia_personalive_nodes.py
_load_nodes_from_module(".aiia_personalive_nodes", "aiia_personalive_nodes")
# 8. 处理 aiia_audio_isolator.py
_load_nodes_from_module(".aiia_audio_isolator", "aiia_audio_isolator")
# 9. 处理 aiia_audio_merger.py
_load_nodes_from_module(".aiia_audio_merger", "aiia_audio_merger")
# 10. 处理 aiia_cosyvoice_nodes.py
_load_nodes_from_module(".aiia_cosyvoice_nodes", "aiia_cosyvoice_nodes")
# 11. 处理 aiia_audio_debug.py (调试节点)
_load_nodes_from_module(".aiia_audio_debug", "aiia_audio_debug")
# 12. 处理 aiia_audio_processor.py
_load_nodes_from_module(".aiia_audio_processor", "aiia_audio_processor")
# 13. 处理 aiia_audio_denoise.py
_load_nodes_from_module(".aiia_audio_denoise", "aiia_audio_denoise")
# 14. 处理 aiia_audio_enhance.py
_load_nodes_from_module(".aiia_audio_enhance", "aiia_audio_enhance")
# 15. 处理 aiia_audio_info.py (元数据查看)
_load_nodes_from_module(".aiia_audio_info", "aiia_audio_info")
# 16. 处理 aiia_vibevoice_nodes.py (VibeVoice 支持)
_load_nodes_from_module(".aiia_vibevoice_nodes", "aiia_vibevoice_nodes")
# 17. 处理 aiia_vibevoice_realtime_tts.py
_load_nodes_from_module(".aiia_vibevoice_realtime_tts", "aiia_vibevoice_realtime_tts")
# 18. 处理 aiia_vibevoice_preset_maker.py
_load_nodes_from_module(".aiia_vibevoice_preset_maker", "aiia_vibevoice_preset_maker")
# 19. 处理 aiia_voxcpm_nodes.py (VoxCPM 1.5)
_load_nodes_from_module(".aiia_voxcpm_nodes", "aiia_voxcpm_nodes")
# 20. 处理 aiia_podcast_nodes.py (播客节点)
_load_nodes_from_module(".aiia_podcast_nodes", "aiia_podcast_nodes")
# 21. 处理 aiia_subtitle_nodes.py (字幕节点)
_load_nodes_from_module(".aiia_subtitle_nodes", "aiia_subtitle_nodes")
# 22. 处理 aiia_web_export_nodes.py (网页导出)
_load_nodes_from_module(".aiia_web_export_nodes", "aiia_web_export_nodes")
# 23. 处理 aiia_echomimic_nodes.py (EchoMimic V3)
_load_nodes_from_module(".aiia_echomimic_nodes", "aiia_echomimic_nodes")
# 24. 处理 aiia_ditto_nodes.py (Ditto)
_load_nodes_from_module(".aiia_ditto_nodes", "aiia_ditto_nodes")
# 25. 处理 aiia_image_nodes.py (Smart Crop)
_load_nodes_from_module(".aiia_image_nodes", "aiia_image_nodes")
# 26. 处理 aiia_debug_nodes.py (调试节点)
_load_nodes_from_module(".aiia_debug_nodes", "aiia_debug_nodes")
# 27. 处理 aiia_qwen_nodes.py (Qwen3-TTS)
_load_nodes_from_module(".aiia_qwen_nodes", "aiia_qwen_nodes")
# 28. 处理 aiia_asr_nodes.py (ASR 语音识别)
_load_nodes_from_module(".aiia_asr_nodes", "aiia_asr_nodes")
# 29. 处理 aiia_podcast_splitter.py (播客文本拆分)
_load_nodes_from_module(".aiia_podcast_splitter", "aiia_podcast_splitter")
# 30. 处理 aiia_podcast_stitcher.py (播客音频拼接)
_load_nodes_from_module(".aiia_podcast_stitcher", "aiia_podcast_stitcher")
# 31. 处理 aiia_emotion_annotator.py (LLM 情感标注)
_load_nodes_from_module(".aiia_emotion_annotator", "aiia_emotion_annotator")
# 32. 处理 aiia_text_splitter.py (单人文本拆分)
_load_nodes_from_module(".aiia_text_splitter", "aiia_text_splitter")
# 33. 处理 aiia_json_extractor.py (JSON 提取/构建)
_load_nodes_from_module(".aiia_json_extractor", "aiia_json_extractor")
# 34. 处理 aiia_indextts_nodes.py (IndexTTS-2 语音合成)
_load_nodes_from_module(".aiia_indextts_nodes", "aiia_indextts_nodes")
# 告诉 ComfyUI 这个节点包有一个包含网页资源的 'js' 目录
WEB_DIRECTORY = "js"
# --- 最终导出 ---
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY']
if not NODE_CLASS_MAPPINGS:
print("严重警告: [ComfyUI_AIIA __init__] 未从任何模块加载到节点类映射。AIIA 节点将不可用。")
else:
loaded_node_count = len(NODE_CLASS_MAPPINGS)
print(f"--- ComfyUI_AIIA 自定义节点包: 成功处理导入。最终 NODE_CLASS_MAPPINGS 包含 {loaded_node_count} 个条目 ---")