diff --git a/extensions-builtin/Lora/extra_networks_lora.py b/extensions-builtin/Lora/extra_networks_lora.py index bee0477ed..84e0c53b4 100644 --- a/extensions-builtin/Lora/extra_networks_lora.py +++ b/extensions-builtin/Lora/extra_networks_lora.py @@ -17,7 +17,6 @@ class ExtraNetworkLora(extra_networks.ExtraNetwork): multipliers = [] for params in params_list: assert len(params.items) > 0 - names.append(params.items[0]) multipliers.append(float(params.items[1]) if len(params.items) > 1 else 1.0) @@ -29,15 +28,11 @@ class ExtraNetworkLora(extra_networks.ExtraNetwork): shorthash = item.lora_on_disk.shorthash if not shorthash: continue - alias = item.mentioned_name if not alias: continue - alias = alias.replace(":", "").replace(",", "") - lora_hashes.append(f"{alias}: {shorthash}") - if lora_hashes: p.extra_generation_params["Lora hashes"] = ", ".join(lora_hashes) diff --git a/extensions-builtin/Lora/lora.py b/extensions-builtin/Lora/lora.py index d7e8a264e..0822f3c10 100644 --- a/extensions-builtin/Lora/lora.py +++ b/extensions-builtin/Lora/lora.py @@ -87,24 +87,17 @@ class LoraOnDisk: m = {} for k, v in sorted(self.metadata.items(), key=lambda x: metadata_tags_order.get(x[0], 999)): m[k] = v - self.metadata = m self.ssmd_cover_images = self.metadata.pop('ssmd_cover_images', None) # those are cover images and they are too big to display in UI as text self.alias = self.metadata.get('ss_output_name', self.name) - self.hash = None self.shorthash = None - self.set_hash( - self.metadata.get('sshs_model_hash') or - hashes.sha256_from_cache(self.filename, "lora/" + self.name, use_addnet_hash=self.is_safetensors) or - '' - ) + self.set_hash(self.metadata.get('sshs_model_hash') or (hashes.sha256_from_cache(self.filename, "lora/" + self.name, use_addnet_hash=self.is_safetensors)) or '') def set_hash(self, v): self.hash = v self.shorthash = self.hash[0:12] - if self.shorthash: available_lora_hash_lookup[self.shorthash] = self diff --git a/extensions-builtin/Lora/ui_extra_networks_lora.py b/extensions-builtin/Lora/ui_extra_networks_lora.py index 8cbcbe9d3..fac1ecc51 100644 --- a/extensions-builtin/Lora/ui_extra_networks_lora.py +++ b/extensions-builtin/Lora/ui_extra_networks_lora.py @@ -16,19 +16,26 @@ class ExtraNetworksPageLora(ui_extra_networks.ExtraNetworksPage): for name, lora_on_disk in lora.available_loras.items(): path, _ext = os.path.splitext(lora_on_disk.filename) alias = lora_on_disk.get_alias() + prompt = (json.dumps(f"")) + metadata = json.dumps(lora_on_disk.metadata, indent=4) if lora_on_disk.metadata else None + possible_tags = lora_on_disk.metadata.get('ss_tag_frequency', {}) if lora_on_disk.metadata is not None else {} + tags = {} + for tag in possible_tags.keys(): + if '_' not in tag: + tag = f'0_{tag}' + words = tag.split('_') + tags[' '.join(words[1:])] = words[0] + # shared.log.debug(f'Lora: {path}: name={name} alias={alias} tags={tags}') yield { "name": name, "filename": path, "preview": self.find_preview(path), "description": self.find_description(path), "search_term": self.search_terms_from_path(lora_on_disk.filename), - "prompt": ( - json.dumps(f"") - ), + "prompt": prompt, "local_preview": f"{path}.{shared.opts.samples_format}", - "metadata": json.dumps(lora_on_disk.metadata, indent=4) if lora_on_disk.metadata else None, + "metadata": metadata, + "tags": tags, } def allowed_directories_for_previews(self): diff --git a/extensions-builtin/stable-diffusion-webui-images-browser b/extensions-builtin/stable-diffusion-webui-images-browser index 3348d524d..f42ada400 160000 --- a/extensions-builtin/stable-diffusion-webui-images-browser +++ b/extensions-builtin/stable-diffusion-webui-images-browser @@ -1 +1 @@ -Subproject commit 3348d524d544a6ed1700a99e0afcb6aef4b26cda +Subproject commit f42ada4007399376417bdb92b7979515bcc33b31 diff --git a/installer.py b/installer.py index dfe1781be..7471009d4 100644 --- a/installer.py +++ b/installer.py @@ -483,17 +483,12 @@ def run_extension_installer(folder): log.error(f'Exception running extension installer: {e}') # get list of all enabled extensions -def list_extensions(folder, quiet=False): +def list_extensions_folder(folder, quiet=False): name = os.path.basename(folder) disabled_extensions_all = opts.get('disable_all_extensions', 'none') if disabled_extensions_all != 'none': - if not quiet: - log.info(f'Disabled {name}: {disabled_extensions_all}') return [] disabled_extensions = opts.get('disabled_extensions', []) - if len(disabled_extensions) > 0: - if not quiet: - log.info(f'Disabled {name}: {disabled_extensions}') enabled_extensions = [x for x in os.listdir(folder) if x not in disabled_extensions and not x.startswith('.')] if not quiet: log.info(f'Enabled {name}: {enabled_extensions}') @@ -515,7 +510,7 @@ def install_extensions(): for folder in extension_folders: if not os.path.isdir(folder): continue - extensions = list_extensions(folder, quiet=True) + extensions = list_extensions_folder(folder, quiet=True) log.debug(f'Extensions all: {extensions}') for ext in extensions: if ext in extensions_enabled: @@ -623,15 +618,18 @@ def set_environment(): def check_extensions(): - if args.quick: - return 0 newest_all = os.path.getmtime('requirements.txt') from modules.paths_internal import extensions_builtin_dir, extensions_dir extension_folders = [extensions_builtin_dir] if args.safe else [extensions_builtin_dir, extensions_dir] + disabled_extensions_all = opts.get('disable_all_extensions', 'none') + if disabled_extensions_all != 'none': + log.info(f'Disabled extensions: {disabled_extensions_all}') + else: + log.info(f'Disabled extensions: {opts.get("disabled_extensions", [])}') for folder in extension_folders: if not os.path.isdir(folder): continue - extensions = list_extensions(folder) + extensions = list_extensions_folder(folder) for ext in extensions: newest = 0 extension_dir = os.path.join(folder, ext) diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 1a27b6a1c..44761e66c 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -234,6 +234,16 @@ function readCardMetadata(event, extraPage, cardName) { event.preventDefault(); } +function readCardTags(event, extraPage, cardTags) { + if ((cardTags || []).length === 0) return; + const textarea = activePromptTextarea[getENActiveTab()]; + const textToAdd = cardTags.join(' '); + if (!tryToRemoveExtraNetworkFromPrompt(textarea, textToAdd)) textarea.value = textarea.value + opts.extra_networks_add_text_separator + textToAdd; + updateInput(textarea); + event.stopPropagation(); + event.preventDefault(); +} + function readCardInformation(event, extraPage, cardName) { requestGet('./sd_extra_networks/info', { page: extraPage, item: cardName }, (data) => { if (data?.info && (typeof (data?.info) === 'string')) { diff --git a/javascript/style.css b/javascript/style.css index 4032742c4..2d7df486c 100644 --- a/javascript/style.css +++ b/javascript/style.css @@ -331,43 +331,12 @@ div#extras_scale_to_tab div.form{ .livePreview { position: absolute; z-index: 300; background-color: transparent; width: -webkit-fill-available; } .livePreview img { position: absolute; object-fit: contain; width: 100%; height: 100%; } .dark .livePreview { background-color: rgb(17 24 39 / var(--tw-bg-opacity)); } -.popup-metadata { color: black; background: white; display: inline-block; padding: 1em; white-space: pre-wrap; font-size: 0.8em; opacity: 80%; } - -.global-popup{ - display: flex; - position: fixed; - z-index: 10001; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgba(20, 20, 20, 0.95); -} - - -.global-popup-close:before { - content: "×"; -} - -.global-popup-close{ - position: fixed; - right: 0.25em; - top: 0; - cursor: pointer; - color: white; - font-size: 32pt; -} - -.global-popup-inner{ - display: inline-block; - margin: auto; - padding: 2em; -} - -.ui-defaults-none{ - color: #aaa !important; -} +.popup-metadata { color: white; background: #0000; display: inline-block; white-space: pre-wrap; font-size: 0.75em; } +.global-popup{ display: flex; position: fixed; z-index: 10001; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgba(20, 20, 20, 0.95);} +.global-popup-close:before { content: "×"; } +.global-popup-close{ position: fixed; right: 0.5em; top: 0; cursor: pointer; color: white; font-size: 32pt; } +.global-popup-inner{ display: inline-block; margin: auto; padding: 2em; } +.ui-defaults-none{ color: #aaa !important; } /* fullpage image viewer */ @@ -495,7 +464,7 @@ table.settings-value-table td{ .extra-networks .description { flex: 3; } .extra-networks .tab-nav > button { margin-right: 0; height: 24px; padding: 2px 4px 2px 4px; } .extra-networks-tab { padding: 0 !important; } -.extra-network-subdirs { background: var(--input-background-fill); overflow-x: hidden; overflow-y: auto; min-width: 120px; } +.extra-network-subdirs { background: var(--input-background-fill); overflow-x: hidden; overflow-y: auto; min-width: 120px; padding-top: 0.5em; } .extra-networks-page { display: flex } .extra-networks .custom-button { width: 120px; width: 100%; background: none; justify-content: left; text-align: left; padding: 2px 8px 2px 16px; text-indent: -8px; box-shadow: none; line-break: auto; } .extra-networks .custom-button:hover { background: var(--button-primary-background-fill) } @@ -504,7 +473,7 @@ table.settings-value-table td{ .extra-network-cards .card .overlay { position: absolute; bottom: 0; padding: 0.2em; z-index: 10; width: 100%; background: none; } .extra-network-cards .card:hover .overlay { background: rgba(0, 0, 0, 0.40); } .extra-network-cards .card .overlay .name { font-size: 1.2em; font-weight: bold; line-break: anywhere; text-shadow: 1px 1px black; color: white; } -.extra-network-cards .card .overlay .actions { font-size: 1.8em; display: none; text-align-last: justify; cursor: pointer; word-spacing: -6px; } +.extra-network-cards .card .overlay .actions { font-size: 2.2em; display: none; text-align-last: justify; cursor: pointer; word-spacing: -6px; font-variant: unicase; letter-spacing: 4px; } .extra-network-cards .card:hover .overlay .actions { display: block; } .extra-network-cards .card .overlay .description { line-break: anywhere; display: none; color: white; } .extra-network-cards .card:hover .overlay .description { display: block; } diff --git a/launch.py b/launch.py index 7e4b7c297..a645faf9a 100644 --- a/launch.py +++ b/launch.py @@ -169,6 +169,7 @@ if __name__ == "__main__": if installer.check_timestamp(): installer.log.info('No changes detected: Quick launch active') installer.install_requirements() + installer.check_extensions() else: installer.install_requirements() installer.install_packages() diff --git a/modules/lycoris b/modules/lycoris index b3776a3ab..c8a662d61 160000 --- a/modules/lycoris +++ b/modules/lycoris @@ -1 +1 @@ -Subproject commit b3776a3ab9a61e8aaa9ea71f3b2073b0f2135c4b +Subproject commit c8a662d61271a14968bc6e5ff6ce4461a3488772 diff --git a/modules/ui_extensions.py b/modules/ui_extensions.py index 519dcbb64..42552786d 100644 --- a/modules/ui_extensions.py +++ b/modules/ui_extensions.py @@ -250,7 +250,7 @@ def refresh_extensions_list(search_text, sort_column): with open(os.path.join(paths.script_path, "html", "extensions.json"), "w", encoding="utf-8") as outfile: json_object = json.dumps(extensions_list, indent=2) outfile.write(json_object) - shared.log.debug(f'Updated extensions list: {len(extensions_list)} {extensions_index} {outfile}') + shared.log.debug(f'Updated extensions list: {len(extensions_list)} {extensions_index}') except Exception as e: shared.log.warning(f'Updated extensions list failed: {extensions_index} {e}') update_extension_list() diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index 405ec059a..785b4e218 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -70,7 +70,7 @@ class ExtraNetworksPage: self.items = [] self.missing_thumbs = [] self.card = ''' -
+
{name}
@@ -81,6 +81,7 @@ class ExtraNetworksPage: 🛅 📘 â„šī¸ + #ī¸
@@ -203,9 +204,8 @@ class ExtraNetworksPage: return [] def create_html_for_item(self, item, tabname): - preview = item.get("preview", None) args = { - "preview": html.escape(preview), + "preview": html.escape(item.get("preview", None)), "width": shared.opts.extra_networks_card_size, "height": shared.opts.extra_networks_card_size if shared.opts.extra_networks_card_square else 'auto', "fit": shared.opts.extra_networks_card_fit, @@ -221,8 +221,14 @@ class ExtraNetworksPage: "card_save_desc": '"' + html.escape(f"""return saveCardDescription(event, {json.dumps(item["local_preview"])})""") + '"', "card_read_meta": '"' + html.escape(f"""return readCardMetadata(event, {json.dumps(self.name)}, {json.dumps(item["name"])})""") + '"', "card_read_info": '"' + html.escape(f"""return readCardInformation(event, {json.dumps(self.name)}, {json.dumps(item["name"])})""") + '"', + "card_read_tags": '"' + html.escape(f"""return readCardTags(event, {json.dumps(self.name)}, {json.dumps(list(item.get("tags", {}).keys()))})""") + '"', "card_save_preview": '"' + html.escape(f"""return saveCardPreview(event, {json.dumps(item["local_preview"])})""") + '"', + "title": f'Name: {item["name"]}', } + if item.get("alias", None) is not None: + args['title'] += f'\nAlias: {item["alias"]}' + if item.get("tags", None) is not None: + args['title'] += f'\nTags: {", ".join(item["tags"].keys())}' self.card.format(**args) return self.card.format(**args)