|
|
|
from .categories import NodeCategories |
|
from .shared import ALWAYS_CHANGED_FLAG, list_images_in_directory, DreamImage |
|
from .dreamtypes import SharedTypes, FrameCounter |
|
import os |
|
|
|
|
|
class DreamImageSequenceInputWithDefaultFallback: |
|
NODE_NAME = "Image Sequence Loader" |
|
ICON = "💾" |
|
|
|
@classmethod |
|
def INPUT_TYPES(cls): |
|
return { |
|
"required": SharedTypes.frame_counter | { |
|
"directory_path": ("STRING", {"default": '', "multiline": False}), |
|
"pattern": ("STRING", {"default": '*', "multiline": False}), |
|
"indexing": (["numeric", "alphabetic order"],) |
|
}, |
|
"optional": { |
|
"default_image": ("IMAGE", {"default": None}) |
|
} |
|
} |
|
|
|
CATEGORY = NodeCategories.IMAGE_ANIMATION |
|
RETURN_TYPES = ("IMAGE","STRING") |
|
RETURN_NAMES = ("image","frame_name") |
|
FUNCTION = "result" |
|
|
|
@classmethod |
|
def IS_CHANGED(cls, *values): |
|
return ALWAYS_CHANGED_FLAG |
|
|
|
def result(self, frame_counter: FrameCounter, directory_path, pattern, indexing, **other): |
|
default_image = other.get("default_image", None) |
|
entries = list_images_in_directory(directory_path, pattern, indexing == "alphabetic order") |
|
entry = entries.get(frame_counter.current_frame, None) |
|
if not entry: |
|
return (default_image, "") |
|
else: |
|
image_names = [os.path.basename(file_path) for file_path in entry] |
|
images = map(lambda f: DreamImage(file_path=f), entry) |
|
return (DreamImage.join_to_tensor_data(images), image_names[0]) |
|
|