75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
import os
|
|
import folder_paths
|
|
|
|
class ListVideoFiles:
|
|
@classmethod
|
|
def INPUT_TYPES(cls):
|
|
return {
|
|
"required": {
|
|
"subfolder": ("STRING", {"default": ""}),
|
|
"filter": ("STRING", {"default": "*"}),
|
|
"load_cap": ("INT", {"default": 100, "min": 0, "max": 10000, "step": 1}),
|
|
"deep_search": (("false", "true"), {"default": "false"}),
|
|
}
|
|
}
|
|
|
|
RETURN_TYPES = ("STRING_LIST", "INT")
|
|
RETURN_NAMES = ("paths", "count")
|
|
FUNCTION = "execute"
|
|
CATEGORY = "FrameIO"
|
|
DESCRIPTION = """
|
|
Lists video file paths from the ComfyUI input directory.
|
|
- Filters by common video extensions (mp4, mkv, mov, avi, webm, etc.).
|
|
- `load_cap`: Maximum number of files to return (0 for no limit).
|
|
- `deep_search`: If true, searches all subdirectories recursively.
|
|
- Returns a list of strings and the total count.
|
|
"""
|
|
|
|
def execute(self, subfolder, filter, load_cap, deep_search):
|
|
deep_search = deep_search == "true"
|
|
input_dir = folder_paths.get_input_directory()
|
|
target_dir = os.path.abspath(os.path.join(input_dir, subfolder))
|
|
|
|
if not os.path.exists(target_dir):
|
|
return ([], 0)
|
|
|
|
video_extensions = {
|
|
".mp4", ".mkv", ".mov", ".avi", ".webm",
|
|
".mpg", ".mpeg", ".m4v", ".flv", ".wmv",
|
|
".3gp", ".ts", ".m2ts"
|
|
}
|
|
|
|
files = []
|
|
if deep_search:
|
|
for root, _, filenames in os.walk(target_dir):
|
|
for filename in filenames:
|
|
ext = os.path.splitext(filename)[1].lower()
|
|
if ext in video_extensions:
|
|
if filter == "*" or filter.lower() in filename.lower():
|
|
files.append(os.path.abspath(os.path.join(root, filename)))
|
|
else:
|
|
for filename in os.listdir(target_dir):
|
|
full_path = os.path.join(target_dir, filename)
|
|
if os.path.isfile(full_path):
|
|
ext = os.path.splitext(filename)[1].lower()
|
|
if ext in video_extensions:
|
|
if filter == "*" or filter.lower() in filename.lower():
|
|
files.append(os.path.abspath(full_path))
|
|
|
|
# Sort files naturally
|
|
files.sort()
|
|
|
|
# Apply load cap
|
|
if load_cap > 0:
|
|
files = files[:load_cap]
|
|
|
|
return (files, len(files))
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
"ListVideoFiles": ListVideoFiles
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
"ListVideoFiles": "List Video Files (Input Dir)"
|
|
}
|