- DecodeTranscriptNode to parse transcript text - YoutubeUploadNode to upload videos to YouTube - Audio metadata and file list nodes - Image stack blending and stripping alpha channel - Sampler dataset creation node - Utils for deep copying tensors and arrays Also includes: - Testing for new utils module - Git nodes marked with base class - Renamed nodes.py to avoid conflicts - Import refactoring to handle naming Specifics: - descript.py: New transcript parsing node - youtube_nodes.py: New YouTube upload node - audio.py: New audio metadata and file list nodes - utils.py: Deep copy utility functions - image.py: New image stack blending and alpha stripping - tests/test_utils.py: Tests for new utils - git.py: Marked git nodes with base class - __init__.py: Refactored imports and mappings - requirements.txt: Added YouTube dependencies - functional.py: Minor tweaks - modules/youtube.py: Helper for upload node - video.py: Minor cleanup - tests/test_youtube_nodes.py: Test for YouTube upload
82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
import os
|
|
import importlib
|
|
|
|
OLD_NODE_CLASS_MAPPINGS = {
|
|
"Interpolation": "LatentInterpolation",
|
|
"Image Pad To Match": "PadToMatch",
|
|
"Image Stack": "StackImages",
|
|
"Image B/C": "ImageBC",
|
|
"Image RGBA Mod": "RGBA_MOD",
|
|
"Image RGBA Lower Clip": "rgba_lower_clip",
|
|
"Image RGBA Upper Clip": "rgba_upper_clip",
|
|
"Image RGBA Merge": "rgba_merge",
|
|
"Image RGBA Split": "rgba_split",
|
|
"Select From Batch": "select_from_batch",
|
|
"Quantize": "Quantize",
|
|
"Select From RGB Similarity": "SelectFromRGBSimilarity",
|
|
"Load Layered Image": "LoadImage",
|
|
"Code Execution Widget": "ExecWidget",
|
|
"Image Distance Mask": "ImageDistanceMask",
|
|
"Image Text": "TextRender",
|
|
"function": "FuncBase",
|
|
"function render": "FuncRender",
|
|
"function render image": "FuncRenderImage",
|
|
"Tiny Txt 2 Img": "TinyTxtToImg",
|
|
"Preview Image Test": "PreviewImageTest",
|
|
"ETK_KSampler": "KSampler",
|
|
}
|
|
# reverse the dict
|
|
OLD_NODE_CLASS_MAPPINGS = {v: k for k, v in OLD_NODE_CLASS_MAPPINGS.items()}
|
|
|
|
NODE_CLASS_MAPPINGS = {}
|
|
NODE_DISPLAY_NAME_MAPPINGS = {}
|
|
# Try importing optional dependencies
|
|
|
|
|
|
if os.getenv("UNIT_TEST", False):
|
|
pass
|
|
else: # if not a unit test
|
|
try:
|
|
import comfy.samplers
|
|
use_generic_nodes = False
|
|
except ImportError:
|
|
use_generic_nodes = True
|
|
print("ETK> Failed to import comfy.samplers, assuming no comfyui skipping SD related nodes")
|
|
|
|
# Load classes from modules in the custom_nodes.EternalKernelLiteGraphNodes package
|
|
folder = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
for file in os.listdir(folder):
|
|
if file == "nodes.py":
|
|
raise ValueError("nodes.py is not an allowed name in this folder")
|
|
if file.endswith(".py") and file[0] != "_":
|
|
# import the NODE_CLASS_MAPPINGS from the file
|
|
try:
|
|
module = importlib.import_module(f".{file[:-3]}", __name__)
|
|
except ImportError:
|
|
try:
|
|
module = importlib.import_module(f"{file[:-3]}") # needed for testing?
|
|
except ModuleNotFoundError:
|
|
module = importlib.import_module(f".{file[:-3]}", __name__)
|
|
|
|
if hasattr(module, "NODE_CLASS_MAPPINGS"):
|
|
mappings = module.NODE_CLASS_MAPPINGS
|
|
NODE_CLASS_MAPPINGS.update(mappings)
|
|
print(f"ETK: updated with {mappings}")
|
|
|
|
if hasattr(module, "NODE_DISPLAY_NAME_MAPPINGS"):
|
|
NODE_DISPLAY_NAME_MAPPINGS.update(module.NODE_DISPLAY_NAME_MAPPINGS)
|
|
|
|
# use OLD_NODE_CLASS_MAPPINGS to add the old names to the new nodes
|
|
new_node_class_mappings = {}
|
|
for k, v in OLD_NODE_CLASS_MAPPINGS.items():
|
|
if k in NODE_CLASS_MAPPINGS:
|
|
new_node_class_mappings[v] = NODE_CLASS_MAPPINGS[k]
|
|
# mark it for removeal
|
|
NODE_CLASS_MAPPINGS[k] = None
|
|
else:
|
|
print(f"ETK> Failed to find node {k} in new nodes, skipping...")
|
|
# remove the nodes with None
|
|
NODE_CLASS_MAPPINGS = {k: v for k, v in NODE_CLASS_MAPPINGS.items() if v is not None}
|
|
NODE_CLASS_MAPPINGS.update(new_node_class_mappings)
|