Add folder image loader node

This commit is contained in:
2026-08-19 08:17:23 +00:00
parent 24baee44e1
commit 34e9bea6d9
8 changed files with 1284 additions and 0 deletions
+107
View File
@@ -387,6 +387,113 @@ class DumasImageNodeTests(unittest.TestCase):
self.assertEqual(result["ui"]["images"], [])
self.assertEqual(FakePILImage.saved_paths, [])
def test_load_images_folder_uses_manual_selected_files(self):
node = self.image_nodes.DumasLoadImagesFolderNode()
folder = tempfile.mkdtemp(prefix="dumas-load-folder-manual-")
for name in ("b.png", "a.png", "notes.txt"):
open(os.path.join(folder, name), "a", encoding="utf-8").close()
state = json.dumps(
{
"folder": folder,
"recursive": False,
"sort": "name",
"sort_dir": "asc",
"selection_mode": "selected",
"selected": ["b.png", "a.png"],
}
)
with mock.patch.object(
self.image_nodes,
"_load_folder_image",
side_effect=lambda path: (f"image:{os.path.basename(path)}", f"mask:{os.path.basename(path)}", 32, 24),
):
result = node.load(state)
self.assertEqual(result[0], ["image:b.png", "image:a.png"])
self.assertEqual(result[1], ["mask:b.png", "mask:a.png"])
self.assertEqual(result[4], ["b", "a"])
self.assertEqual(result[5], [1, 2])
self.assertEqual(result[6], [2, 2])
def test_load_images_folder_first_n_uses_sorted_files(self):
node = self.image_nodes.DumasLoadImagesFolderNode()
folder = tempfile.mkdtemp(prefix="dumas-load-folder-first-")
for name in ("c.png", "a.png", "b.png"):
open(os.path.join(folder, name), "a", encoding="utf-8").close()
state = json.dumps(
{
"folder": folder,
"recursive": False,
"sort": "name",
"sort_dir": "asc",
"selection_mode": "first_n",
"first_n": 2,
}
)
with mock.patch.object(
self.image_nodes,
"_load_folder_image",
side_effect=lambda path: (f"image:{os.path.basename(path)}", f"mask:{os.path.basename(path)}", 64, 48),
):
result = node.load(state)
self.assertEqual(result[0], ["image:a.png", "image:b.png"])
self.assertEqual(result[4], ["a", "b"])
self.assertEqual(result[6], [2, 2])
def test_load_images_folder_random_selects_one_visible_image(self):
node = self.image_nodes.DumasLoadImagesFolderNode()
folder = tempfile.mkdtemp(prefix="dumas-load-folder-random-")
for name in ("a.png", "b.png", "c.png"):
open(os.path.join(folder, name), "a", encoding="utf-8").close()
state = json.dumps(
{
"folder": folder,
"recursive": False,
"sort": "name",
"sort_dir": "asc",
"selection_mode": "random",
}
)
with mock.patch.object(
self.image_nodes.random,
"choice",
side_effect=lambda files: files[1],
), mock.patch.object(
self.image_nodes,
"_load_folder_image",
side_effect=lambda path: (f"image:{os.path.basename(path)}", f"mask:{os.path.basename(path)}", 80, 60),
):
result = node.load(state)
self.assertEqual(result[0], ["image:b.png"])
self.assertEqual(result[4], ["b"])
self.assertEqual(result[5], [1])
self.assertEqual(result[6], [1])
def test_load_images_folder_random_is_changed_changes_each_run(self):
node = self.image_nodes.DumasLoadImagesFolderNode()
folder = tempfile.mkdtemp(prefix="dumas-load-folder-changed-")
open(os.path.join(folder, "a.png"), "a", encoding="utf-8").close()
state = json.dumps(
{
"folder": folder,
"recursive": False,
"sort": "name",
"sort_dir": "asc",
"selection_mode": "random",
}
)
with mock.patch.object(self.image_nodes.time, "time_ns", side_effect=[1, 2]):
changed_1 = node.IS_CHANGED(state)
changed_2 = node.IS_CHANGED(state)
self.assertNotEqual(changed_1, changed_2)
def test_h3_plan_scene_images_attach_and_extract(self):
attach_node = self.image_nodes.DumasH3PlanAttachSceneImagesNode()
extract_node = self.image_nodes.DumasH3PlanExtractSceneImagesNode()