diff --git a/extensions-builtin/Lora/lora.py b/extensions-builtin/Lora/lora.py index 0822f3c10..08d4d6f18 100644 --- a/extensions-builtin/Lora/lora.py +++ b/extensions-builtin/Lora/lora.py @@ -3,6 +3,7 @@ import re from typing import Union import torch from modules import shared, devices, sd_models, errors, scripts, sd_hijack, hashes +from modules.modelloader import filter_paths, directory_files, extension_filter metadata_tags_order = {"ss_sd_model_name": 1, "ss_resolution": 2, "ss_clip_skip": 3, "ss_num_train_images": 10, "ss_tag_frequency": 20} @@ -444,10 +445,7 @@ def list_available_loras(): os.makedirs(shared.cmd_opts.lora_dir, exist_ok=True) - candidates = list(shared.walk_files(shared.cmd_opts.lora_dir, allowed_extensions=[".pt", ".ckpt", ".safetensors"])) - for filename in sorted(candidates, key=str.lower): - if os.path.isdir(filename): - continue + for filename in sorted(filter_paths(directory_files(shared.cmd_opts.lora_dir), filter=extension_filter(['.PT', '.CKPT', '.SAFETENSORS'])), key=str.lower): name = os.path.splitext(os.path.basename(filename))[0] entry = LoraOnDisk(name, filename) diff --git a/modules/textual_inversion/textual_inversion.py b/modules/textual_inversion/textual_inversion.py index 25345a35a..845cc1ce3 100644 --- a/modules/textual_inversion/textual_inversion.py +++ b/modules/textual_inversion/textual_inversion.py @@ -13,6 +13,7 @@ import modules.textual_inversion.dataset from modules.textual_inversion.learn_schedule import LearnRateScheduler from modules.textual_inversion.image_embedding import embedding_to_b64, embedding_from_b64, insert_image_data_embed, extract_image_data_embed, caption_image_overlay from modules.textual_inversion.logging import save_settings_to_file +from modules.modelloader import filter_paths, directory_files, extension_filter, directory_mtime TextualInversionTemplate = namedtuple("TextualInversionTemplate", ["name", "path"]) textual_inversion_templates = {} @@ -85,15 +86,13 @@ class DirWithTextualInversionEmbeddings: if not os.path.isdir(self.path): return False - mt = os.path.getmtime(self.path) - if self.mtime is None or mt > self.mtime: - return True + return directory_mtime(self.path) != self.mtime def update(self): if not os.path.isdir(self.path): return - self.mtime = os.path.getmtime(self.path) + self.mtime = directory_mtime(self.path) class EmbeddingDatabase: @@ -216,16 +215,19 @@ class EmbeddingDatabase: def load_from_dir(self, embdir): if not os.path.isdir(embdir.path): return - for root, _dirs, fns in os.walk(embdir.path, followlinks=True): - for fn in fns: - try: - fullfn = os.path.join(root, fn) - if os.stat(fullfn).st_size == 0: - continue - self.load_from_file(fullfn, fn) - except Exception as e: - errors.display(e, f'embedding load {fn}') + + is_ext = extension_filter(['.PNG', '.WEBP', '.JXL', '.AVIF', '.BIN', '.PT', '.SAFETENSORS']) + is_not_preview = lambda fp: not next(iter(os.path.splitext(fp))).upper().endswith('.PREVIEW') + + for file_path in filter_paths(directory_files(embdir.path), filter=lambda fp: is_ext(fp) and is_not_preview(fp)): + try: + if os.stat(file_path).st_size == 0: continue + fn = os.path.basename(file_path) + self.load_from_file(file_path, fn) + except Exception as e: + errors.display(e, f'embedding load {fn}') + continue def load_textual_inversion_embeddings(self, force_reload=False): if not force_reload: