From 5c55ce59383e06bbff2e5451c34aa8186d6679c3 Mon Sep 17 00:00:00 2001 From: Jacob Segal Date: Mon, 28 Apr 2025 18:40:13 -0700 Subject: [PATCH] Add a `LoadVideo` node to make testing easier --- comfy_extras/nodes_video.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/comfy_extras/nodes_video.py b/comfy_extras/nodes_video.py index 8694bdadb..650bd414f 100644 --- a/comfy_extras/nodes_video.py +++ b/comfy_extras/nodes_video.py @@ -7,7 +7,7 @@ import folder_paths import json from typing import Optional, Literal from fractions import Fraction -from comfy.comfy_types import IO, FileLocator, ComfyNodeABC, VideoInput, AudioInput, ImageInput, VideoFromComponents, VideoContainer, VideoCodec, VideoComponents +from comfy.comfy_types import IO, FileLocator, ComfyNodeABC, VideoInput, AudioInput, ImageInput, VideoFromComponents, VideoContainer, VideoCodec, VideoComponents, VideoFromFile from comfy.cli_args import args class SaveWEBM: @@ -189,15 +189,50 @@ class GetVideoComponents(ComfyNodeABC): return (components.images, components.audio, float(components.frame_rate)) +class LoadVideo(ComfyNodeABC): + @classmethod + def INPUT_TYPES(cls): + input_dir = folder_paths.get_input_directory() + files = [f for f in os.listdir(input_dir) if os.path.isfile(os.path.join(input_dir, f))] + files = folder_paths.filter_files_content_types(files, ["video"]) + return {"required": + {"file": (sorted(files), {"video_upload": True})}, + } + + CATEGORY = "image/video" + + RETURN_TYPES = (IO.VIDEO,) + FUNCTION = "load_video" + def load_video(self, file): + video_path = folder_paths.get_annotated_filepath(file) + return (VideoFromFile(video_path),) + + @classmethod + def IS_CHANGED(cls, file): + video_path = folder_paths.get_annotated_filepath(file) + mod_time = os.path.getmtime(video_path) + # Instead of hashing the file, we can just use the modification time to avoid + # rehashing large files. + return mod_time + + @classmethod + def VALIDATE_INPUTS(cls, file): + if not folder_paths.exists_annotated_filepath(file): + return "Invalid video file: {}".format(file) + + return True + NODE_CLASS_MAPPINGS = { "SaveWEBM": SaveWEBM, "SaveVideo": SaveVideo, "CreateVideo": CreateVideo, "GetVideoComponents": GetVideoComponents, + "LoadVideo": LoadVideo, } NODE_DISPLAY_NAME_MAPPINGS = { "SaveVideo": "Save Video", "CreateVideo": "Create Video", "GetVideoComponents": "Get Video Components", + "LoadVideo": "Load Video", }