Merge pull request #3 from idrirap/dev/fix_issue2

Dev/fix issue2
This commit is contained in:
dijkstra
2023-11-01 18:45:53 +01:00
committed by GitHub
4 changed files with 57 additions and 12 deletions

View File

@@ -3,6 +3,7 @@
This project is a fork of https://github.com/Extraltodeus/LoadLoraWithTags This project is a fork of https://github.com/Extraltodeus/LoadLoraWithTags
The aim of these custom nodes is to get an _easy_ access to the tags used to trigger a lora. The aim of these custom nodes is to get an _easy_ access to the tags used to trigger a lora.
This project is compatible with Stacked Loras from https://github.com/LucianoCirino/efficiency-nodes-comfyui/releases This project is compatible with Stacked Loras from https://github.com/LucianoCirino/efficiency-nodes-comfyui/releases
I talk about **lora**, but works with **lycoris** too.
## Install ## Install
Some of this project nodes depends on https://github.com/pythongosssss/ComfyUI-Custom-Scripts : Some of this project nodes depends on https://github.com/pythongosssss/ComfyUI-Custom-Scripts :
@@ -27,6 +28,10 @@ These loaders have two custom outputs:
This outputs needs to be filtered by two othere nodes: This outputs needs to be filtered by two othere nodes:
- TagsFormater: Helper to show the available tag and their indexes - TagsFormater: Helper to show the available tag and their indexes
- tagsSelector: allow to filter tags and apply a weight to it. - tagsSelector: allow to filter tags and apply a weight to it.
- TagSelector contains four parameters. First the selector (see Filtering next)
- The weight `(tag:weight)`
- The boolean `ensure_comma`. To properly append comma if a prefix or suffix is added.
- The boolean `append_loraname_if_empty` which will add the name of the lora in the list of outputs if they are empty.
#### Filtering #### Filtering
The format is simple. It's the same as python list index, but can select multiple index or ranges of indexes separated by comas. The format is simple. It's the same as python list index, but can select multiple index or ranges of indexes separated by comas.
`Ex: 0, 3, 5:8, -8:` `Ex: 0, 3, 5:8, -8:`

View File

@@ -19,6 +19,7 @@ class LoraLoaderVanilla:
"strength_model": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}), "strength_model": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}),
"strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}), "strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
} }
} }
@@ -27,9 +28,13 @@ class LoraLoaderVanilla:
FUNCTION = "load_lora" FUNCTION = "load_lora"
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch): def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch, append_loraname_if_empty):
meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name, "loras")) meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name, "loras"))
output_tags_list = load_and_save_tags(lora_name, force_fetch) civitai_tags_list = load_and_save_tags(lora_name, force_fetch)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name, append_loraname_if_empty)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name, append_loraname_if_empty)
lora_path = folder_paths.get_full_path("loras", lora_name) lora_path = folder_paths.get_full_path("loras", lora_name)
lora = None lora = None
if self.loaded_lora is not None: if self.loaded_lora is not None:
@@ -46,7 +51,7 @@ class LoraLoaderVanilla:
model_lora, clip_lora = load_lora_for_models(model, clip, lora, strength_model, strength_clip) model_lora, clip_lora = load_lora_for_models(model, clip, lora, strength_model, strength_clip)
return (model_lora, clip_lora, output_tags_list, meta_tags_list) return (model_lora, clip_lora, civitai_tags_list, meta_tags_list)
class LoraLoaderStackedVanilla: class LoraLoaderStackedVanilla:
@classmethod @classmethod
@@ -57,6 +62,7 @@ class LoraLoaderStackedVanilla:
"lora_name": (LORA_LIST,), "lora_name": (LORA_LIST,),
"lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
}, },
"optional": { "optional": {
"lora_stack": ("LORA_STACK", ), "lora_stack": ("LORA_STACK", ),
@@ -69,12 +75,15 @@ class LoraLoaderStackedVanilla:
#OUTPUT_NODE = False #OUTPUT_NODE = False
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def set_stack(self, lora_name, lora_weight, force_fetch, lora_stack=None): def set_stack(self, lora_name, lora_weight, force_fetch, append_loraname_if_empty, lora_stack=None):
civitai_tags_list = load_and_save_tags(lora_name, force_fetch) civitai_tags_list = load_and_save_tags(lora_name, force_fetch)
meta_tags = get_metadata(lora_name, "loras") meta_tags = get_metadata(lora_name, "loras")
meta_tags_list = sort_tags_by_frequency(meta_tags) meta_tags_list = sort_tags_by_frequency(meta_tags)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name, append_loraname_if_empty)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name, append_loraname_if_empty)
if lora_stack is not None: if lora_stack is not None:
lora_stack.append((lora_name,lora_weight,lora_weight,)) lora_stack.append((lora_name,lora_weight,lora_weight,))
else: else:
@@ -99,6 +108,7 @@ class LoraLoaderAdvanced:
"strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}), "strength_clip": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.1}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"enable_preview": ("BOOLEAN", {"default": False}), "enable_preview": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
} }
} }
@@ -107,9 +117,13 @@ class LoraLoaderAdvanced:
FUNCTION = "load_lora" FUNCTION = "load_lora"
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch, enable_preview): def load_lora(self, model, clip, lora_name, strength_model, strength_clip, force_fetch, enable_preview, append_loraname_if_empty):
meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name["content"], "loras")) meta_tags_list = sort_tags_by_frequency(get_metadata(lora_name["content"], "loras"))
output_tags_list = load_and_save_tags(lora_name["content"], force_fetch) civitai_tags_list = load_and_save_tags(lora_name["content"], force_fetch)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name["content"], append_loraname_if_empty)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name["content"], append_loraname_if_empty)
lora_path = folder_paths.get_full_path("loras", lora_name["content"]) lora_path = folder_paths.get_full_path("loras", lora_name["content"])
lora = None lora = None
if self.loaded_lora is not None: if self.loaded_lora is not None:
@@ -133,10 +147,10 @@ class LoraLoaderAdvanced:
"subfolder": "lora_preview", "subfolder": "lora_preview",
"type": "temp" "type": "temp"
} }
return {"ui": {"images": [preview_output]}, "result": (model_lora, clip_lora, output_tags_list, meta_tags_list)} return {"ui": {"images": [preview_output]}, "result": (model_lora, clip_lora, civitai_tags_list, meta_tags_list)}
return (model_lora, clip_lora, output_tags_list, meta_tags_list) return (model_lora, clip_lora, civitai_tags_list, meta_tags_list)
class LoraLoaderStackedAdvanced: class LoraLoaderStackedAdvanced:
@classmethod @classmethod
@@ -149,6 +163,7 @@ class LoraLoaderStackedAdvanced:
"lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "lora_weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"force_fetch": ("BOOLEAN", {"default": False}), "force_fetch": ("BOOLEAN", {"default": False}),
"enable_preview": ("BOOLEAN", {"default": False}), "enable_preview": ("BOOLEAN", {"default": False}),
"append_loraname_if_empty": ("BOOLEAN", {"default": False}),
}, },
"optional": { "optional": {
"lora_stack": ("LORA_STACK", ), "lora_stack": ("LORA_STACK", ),
@@ -161,12 +176,15 @@ class LoraLoaderStackedAdvanced:
#OUTPUT_NODE = False #OUTPUT_NODE = False
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def set_stack(self, lora_name, lora_weight, force_fetch, enable_preview, lora_stack=None): def set_stack(self, lora_name, lora_weight, force_fetch, enable_preview, append_loraname_if_empty, lora_stack=None):
civitai_tags_list = load_and_save_tags(lora_name["content"], force_fetch) civitai_tags_list = load_and_save_tags(lora_name["content"], force_fetch)
meta_tags = get_metadata(lora_name["content"], "loras") meta_tags = get_metadata(lora_name["content"], "loras")
meta_tags_list = sort_tags_by_frequency(meta_tags) meta_tags_list = sort_tags_by_frequency(meta_tags)
civitai_tags_list = append_lora_name_if_empty(civitai_tags_list, lora_name["content"], append_loraname_if_empty)
meta_tags_list = append_lora_name_if_empty(meta_tags_list, lora_name["content"], append_loraname_if_empty)
if lora_stack is not None: if lora_stack is not None:
lora_stack.append((lora_name["content"],lora_weight,lora_weight,)) lora_stack.append((lora_name["content"],lora_weight,lora_weight,))
else: else:

View File

@@ -74,7 +74,7 @@ class TagsSelector:
"tags_list": ("LIST", {"default": []}), "tags_list": ("LIST", {"default": []}),
"selector": ("STRING", {"default": ":"}), "selector": ("STRING", {"default": ":"}),
"weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}), "weight": ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.01}),
"ensure_coma": ("BOOLEAN", {"default": True}) "ensure_comma": ("BOOLEAN", {"default": True})
}, },
"optional": { "optional": {
"prefix":("STRING", {"default":"", "forceInput": True}), "prefix":("STRING", {"default":"", "forceInput": True}),
@@ -86,11 +86,11 @@ class TagsSelector:
FUNCTION = "select_tags" FUNCTION = "select_tags"
CATEGORY = "autotrigger" CATEGORY = "autotrigger"
def select_tags(self, tags_list, selector, weight, ensure_coma, prefix="", suffix=""): def select_tags(self, tags_list, selector, weight, ensure_comma, prefix="", suffix=""):
if weight != 1.0: if weight != 1.0:
tags_list = [f"({tag}:{weight})" for tag in tags_list] tags_list = [f"({tag}:{weight})" for tag in tags_list]
output = parse_selector(selector, tags_list) output = parse_selector(selector, tags_list)
if ensure_coma: if ensure_comma:
striped_prefix = prefix.strip() striped_prefix = prefix.strip()
striped_suffix = suffix.strip() striped_suffix = suffix.strip()
if striped_prefix != "" and not striped_prefix.endswith(",") and output != "" and not output.startswith(","): if striped_prefix != "" and not striped_prefix.endswith(",") and output != "" and not output.startswith(","):

View File

@@ -171,12 +171,20 @@ def sort_tags_by_frequency(meta_tags):
return [] return []
def parse_selector(selector, tags_list): def parse_selector(selector, tags_list):
if len(tags_list) == 0:
return ""
range_index_list = selector.split(",") range_index_list = selector.split(",")
output = {} output = {}
for range_index in range_index_list: for range_index in range_index_list:
# single value # single value
if range_index.count(":") == 0: if range_index.count(":") == 0:
# remove empty values
if range_index.strip() == "":
continue
index = int(range_index) index = int(range_index)
# ignore out of bound indexes
if abs(index) > len(tags_list) - 1:
continue
output[index] = tags_list[index] output[index] = tags_list[index]
# actual range # actual range
@@ -196,7 +204,21 @@ def parse_selector(selector, tags_list):
start = len(tags_list) + start start = len(tags_list) + start
if end < 0: if end < 0:
end = len(tags_list) + end end = len(tags_list) + end
# clamp start and end values within list boundaries
start, end = min(start, len(tags_list)), min(end, len(tags_list))
start, end = max(start, 0), max(end, 0)
# merge all # merge all
for i in range(start, end): for i in range(start, end):
output[i] = tags_list[i] output[i] = tags_list[i]
return ", ".join(list(output.values())) return ", ".join(list(output.values()))
def append_lora_name_if_empty(tags_list, lora_path, enabled):
if not enabled or len(tags_list) > 0:
return tags_list
print("AAA : " + lora_path)
filename = os.path.splitext(lora_path)[0]
filename = os.path.basename(filename)
print("BBB : " + filename)
tags_list.append(filename)
return tags_list