| |
| 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]) |
|
|