From 06d915fd0cd72099951aaf65b8096b223fe8eec2 Mon Sep 17 00:00:00 2001 From: bash-j Date: Sat, 5 Aug 2023 09:02:09 +0930 Subject: [PATCH] modified: mikey_nodes.py --- mikey_nodes.py | 104 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 97 insertions(+), 7 deletions(-) diff --git a/mikey_nodes.py b/mikey_nodes.py index 7282ba6..a7e9c32 100644 --- a/mikey_nodes.py +++ b/mikey_nodes.py @@ -173,6 +173,31 @@ def find_and_replace_wildcards(prompt, offset_seed, debug=False): print(f'Wildcard file {wildcard_file}.txt not found in {search_path}') return prompt +def strip_all_syntax(text): + # replace any with nothing + text = re.sub(r'', '', text) + # replace any with nothing + text = re.sub(r'', '', text) + # replace any __wildcard_name__ with nothing + text = re.sub(r'__(.*?)__', '', text) + # replace any __wildcard_name|word__ with nothing + text = re.sub(r'__(.*?)\|(.*?)__', '', text) + # replace any [2$__wildcard__] with nothing + text = re.sub(r'\[\d+\$(.*?)\]', '', text) + # replace any [2$__wildcard|word__] with nothing + text = re.sub(r'\[\d+\$(.*?)\|(.*?)\]', '', text) + # replace double spaces with single spaces + text = text.replace(' ', ' ') + # replace double commas with single commas + text = text.replace(',,', ',') + # replace ` , ` with `, ` + text = text.replace(' , ', ', ') + # replace leading and trailing spaces and commas + text = text.strip(' ,') + # clean up any < > [ ] or _ that are left over + text = text.replace('<', '').replace('>', '').replace('[', '').replace(']', '').replace('_', '') + return text + def add_metadata_to_dict(info_dict, **kwargs): for key, value in kwargs.items(): if isinstance(value, (int, float, str)): @@ -427,7 +452,7 @@ class SaveImagesMikey: pos_trunc = clean_pos.replace(' ', '_')[0:80] if negative_prompt: metadata.add_text("negative_prompt", json.dumps(negative_prompt)) - ts_str = datetime.datetime.now().strftime("%y%m%d%H%M%S") + ts_str = datetime.datetime.now().strftime("%y%m%d%H%M") file = f"{ts_str}_{pos_trunc}_{filename}_{counter:05}_.png" img.save(os.path.join(full_output_folder, file), pnginfo=metadata, compress_level=4) results.append({ @@ -442,26 +467,82 @@ class SaveImagesMikey: class AddMetaData: @classmethod def INPUT_TYPES(s): - return {"required": {"label": ("STRING", {"multiline": False, "placeholder": "Label for metadata"}), + return {"required": {"image": ("IMAGE",), + "label": ("STRING", {"multiline": False, "placeholder": "Label for metadata"}), "text_value": ("STRING", {"multiline": True, "placeholder": "Text to add to metadata"})}, "hidden": {"extra_pnginfo": "EXTRA_PNGINFO"}, } - RETURN_TYPES = () + RETURN_TYPES = ('IMAGE',) FUNCTION = "add_metadata" CATEGORY = "Mikey/Meta" OUTPUT_NODE = True - def add_metadata(self, label, text_value, prompt=None, extra_pnginfo=None): + def add_metadata(self, image, label, text_value, prompt=None, extra_pnginfo=None): if extra_pnginfo is None: extra_pnginfo = {} if label in extra_pnginfo: extra_pnginfo[label] += ', ' + text_value else: extra_pnginfo[label] = text_value - return ({ - 'extra_pnginfo': extra_pnginfo - }) + return (image,) + +class SaveMetaData: + @classmethod + def INPUT_TYPES(s): + return {"required": {'image': ('IMAGE',), + 'filename_prefix': ("STRING", {"default": ""}), + 'timestamp_prefix': (['true','false'], {'default':'true'}), + 'counter': (['true','false'], {'default':'true'}),}, + "hidden": {"prompt": "PROMPT", "extra_pnginfo": "EXTRA_PNGINFO"},} + + RETURN_TYPES = () + FUNCTION = "save_metadata" + CATEGORY = "Mikey/Meta" + OUTPUT_NODE = True + + def save_metadata(self, image, filename_prefix, timestamp_prefix, counter, prompt=None, extra_pnginfo=None): + # save metatdata to txt file + full_output_folder, filename, counter, subfolder, filename_prefix = folder_paths.get_save_image_path(filename_prefix, folder_paths.get_output_directory(), 1, 1) + ts_str = datetime.datetime.now().strftime("%y%m%d%H%M") + filen = '' + if timestamp_prefix == 'true': + filen += ts_str + '_' + filen = filen + filename_prefix + if counter == 'true': + filen += '_' + str(counter) + filename = filen + '.txt' + file_path = os.path.join(full_output_folder, filename) + with open(file_path, 'w') as file: + for key, value in extra_pnginfo.items(): + file.write(f'{key}: {value}\n') + for key, value in prompt.items(): + file.write(f'{key}: {value}\n') + return {'save_metadata': {'filename': filename, 'subfolder': subfolder}} + +class FileNamePrefix: + @classmethod + def INPUT_TYPES(s): + return {"required": {'date': (['true','false'], {'default':'true'}), + 'date_directory': (['true','false'], {'default':'true'}), + 'custom_text': ('STRING', {'default': ''})}} + + RETURN_TYPES = ('STRING',) + RETURN_NAMES = ('filename_prefix',) + FUNCTION = 'get_filename_prefix' + CATEGORY = 'Mikey/Meta' + + def get_filename_prefix(self, date, date_directory, custom_directory, custom_text): + filename_prefix = '' + if date_directory == 'true': + ts_str = datetime.datetime.now().strftime("%y%m%d") + filename_prefix += ts_str + '/' + if date == 'true': + ts_str = datetime.datetime.now().strftime("%y%m%d%H%M") + filename_prefix += ts_str + if custom_text != '': + filename_prefix += '_' + custom_text + return (filename_prefix,) class PromptWithStyle: @classmethod @@ -680,6 +761,7 @@ class PromptWithStyleV3: # apply the lora to the clip model, clip_lora = LoraLoader.load_lora(self, model, clip, lora_filename, lora_multiplier, lora_multiplier) stripped_text = stripped_text.replace(f'', '') + stripped_text = stripped_text.replace(f'', '') return model, clip, stripped_text def parse_prompts(self, positive_prompt, negative_prompt, style, seed): @@ -798,6 +880,8 @@ class PromptWithStyleV3: style_ = 'none' pos_prompt_, neg_prompt_ = self.parse_prompts(positive_prompt, negative_prompt, style_, seed) pos_style_, neg_style_ = pos_prompt_, neg_prompt_ + pos_prompt_, neg_prompt_ = strip_all_syntax(pos_prompt_), strip_all_syntax(neg_prompt_) + pos_style_, neg_style_ = strip_all_syntax(pos_style_), strip_all_syntax(neg_style_) # encode text add_metadata_to_dict(prompt_with_style, style=style_, clip_g_positive=pos_prompt, clip_l_positive=pos_style_) add_metadata_to_dict(prompt_with_style, clip_g_negative=neg_prompt, clip_l_negative=neg_style_) @@ -829,6 +913,8 @@ class PromptWithStyleV3: neg_prompt_ = re.sub(style_re, '', neg_prompt) pos_prompt_, neg_prompt_ = self.parse_prompts(pos_prompt_, neg_prompt_, style_, seed) pos_style_, neg_style_ = str(self.pos_style[style_]), str(self.neg_style[style_]) + pos_prompt_, neg_prompt_ = strip_all_syntax(pos_prompt_), strip_all_syntax(neg_prompt_) + pos_style_, neg_style_ = strip_all_syntax(pos_style_), strip_all_syntax(neg_style_) add_metadata_to_dict(prompt_with_style, style=style_, positive_prompt=pos_prompt_, negative_prompt=neg_prompt_, positive_style=pos_style_, negative_style=neg_style_) #base_model, clip_base_pos, pos_prompt_ = self.extract_and_load_loras(pos_prompt_, base_model, clip_base) @@ -847,6 +933,8 @@ class PromptWithStyleV3: style_ = 'none' pos_prompt_, neg_prompt_ = self.parse_prompts(positive_prompt, negative_prompt, style_, seed) pos_style_, neg_style_ = pos_prompt_, neg_prompt_ + pos_prompt_, neg_prompt_ = strip_all_syntax(pos_prompt_), strip_all_syntax(neg_prompt_) + pos_style_, neg_style_ = strip_all_syntax(pos_style_), strip_all_syntax(neg_style_) # encode text add_metadata_to_dict(prompt_with_style, style=style_, clip_g_positive=pos_prompt_, clip_l_positive=pos_style_) add_metadata_to_dict(prompt_with_style, clip_g_negative=neg_prompt_, clip_l_negative=neg_style_) @@ -1022,6 +1110,7 @@ NODE_CLASS_MAPPINGS = { 'Prompt With SDXL': PromptWithSDXL, 'Style Conditioner': StyleConditioner, 'AddMetaData': AddMetaData, + 'SaveMetaData': SaveMetaData, 'HaldCLUT ': HaldCLUT, 'VAE Decode 6GB SDXL (deprecated)': VAEDecode6GB, } @@ -1039,6 +1128,7 @@ NODE_DISPLAY_NAME_MAPPINGS = { 'Prompt With SDXL': 'Prompt With SDXL (Mikey)', 'Style Conditioner': 'Style Conditioner (Mikey)', 'AddMetaData': 'AddMetaData (Mikey)', + 'SaveMetaData': 'SaveMetaData (Mikey)', 'HaldCLUT': 'HaldCLUT (Mikey)', 'VAE Decode 6GB SDXL (deprecated)': 'VAE Decode 6GB SDXL (deprecated) (Mikey)', } \ No newline at end of file