Merge pull request #4776 from awsr/extra-network-update

Minor Extra Networks cleanup and update
This commit is contained in:
Vladimir Mandic
2026-04-17 09:21:42 +02:00
committed by GitHub
+22 -27
View File
@@ -8,7 +8,6 @@ import html
import base64
import urllib.parse
import threading
from typing import TYPE_CHECKING
from types import SimpleNamespace
from pathlib import Path
from html.parser import HTMLParser
@@ -134,7 +133,7 @@ class DateTimeEncoder(json.JSONEncoder):
class ExtraNetworksPage:
def __init__(self, title):
def __init__(self, title: str):
self.title = title
self.name = title.lower()
self.allow_negative_prompt = False
@@ -198,7 +197,7 @@ class ExtraNetworksPage:
errors.display(e, 'Network version')
return all_versions[0]
def link_preview(self, filename):
def link_preview(self, filename: str):
quoted_filename = urllib.parse.quote(filename.replace('\\', '/'))
mtime = os.path.getmtime(filename) if os.path.exists(filename) else 0
preview = f"{shared.opts.subpath}/sdapi/v1/network/thumb?filename={quoted_filename}&mtime={mtime}"
@@ -256,7 +255,7 @@ class ExtraNetworksPage:
log.info(f'Network thumbnails: type={self.name} created={created}')
self.missing_thumbs.clear()
def create_items(self, tabname):
def create_items(self, tabname: str):
if self.refresh_time is not None and self.refresh_time > refresh_time: # cached results
return
t0 = time.time()
@@ -276,7 +275,7 @@ class ExtraNetworksPage:
debug(f'EN create-items: page={self.name} items={len(self.items)} time={t1-t0:.2f}')
self.list_time += t1-t0
def create_page(self, tabname, skip = False):
def create_page(self, tabname: str, skip = False):
debug(f'EN create-page: {self.name}')
if self.page_time > refresh_time and len(self.html) > 0: # cached page
return self.patch(self.html, tabname)
@@ -388,7 +387,7 @@ class ExtraNetworksPage:
def allowed_directories_for_previews(self):
return []
def create_html(self, item, tabname):
def create_html(self, item, tabname: str):
def random_bright_color():
r = random.randint(100, 255)
g = random.randint(100, 255)
@@ -429,7 +428,7 @@ class ExtraNetworksPage:
errors.display(e, 'Networks')
return ""
def find_preview_file(self, path):
def find_preview_file(self, path: str | None):
if path is None:
return 'html/missing.png'
if os.path.join('models', 'Reference') in path:
@@ -450,7 +449,7 @@ class ExtraNetworksPage:
return file
return 'html/missing.png'
def find_preview(self, filename):
def find_preview(self, filename: str):
t0 = time.time()
preview_file = self.find_preview_file(filename)
self.preview_time += time.time() - t0
@@ -503,7 +502,7 @@ class ExtraNetworksPage:
debug(f'EN missing-preview: {item["name"]}')
self.preview_time += time.time() - t0
def find_description(self, path, info=None):
def find_description(self, path: str | None, info=None):
t0 = time.time()
class HTMLFilter(HTMLParser):
text = ""
@@ -535,7 +534,7 @@ class ExtraNetworksPage:
self.desc_time += t1-t0
return f.text
def find_info(self, path):
def find_info(self, path: str | None):
data = {}
if shared.cmd_opts.no_metadata:
return data
@@ -594,7 +593,7 @@ def register_pages():
register_page(ExtraNetworksPageTextualInversion())
def get_pages(title=None):
def get_pages(title: str | None = None):
visible = shared.opts.extra_networks
pages: list[ExtraNetworksPage] = []
if 'All' in visible or visible == []: # default en sort order
@@ -646,7 +645,7 @@ class ExtraNetworksUi:
self.state: gr.State = None
def create_ui(container, button_parent, tabname, skip_indexing = False):
def create_ui(container, button_parent: gr.Button, tabname: str, skip_indexing = False):
if 'networks' in shared.opts.ui_disabled:
return None
debug(f'EN create-ui: {tabname}')
@@ -881,25 +880,19 @@ def create_ui(container, button_parent, tabname, skip_indexing = False):
from modules import images
page, item = get_item(state, params)
is_style = (page is not None) and (page.title == 'Style')
is_valid = (item is not None) and hasattr(item, 'name') and hasattr(item, 'filename')
is_valid = False
if is_valid:
if TYPE_CHECKING:
assert item is not None # Part of the definition of "is_valid"
if (item is not None) and hasattr(item, 'name') and hasattr(item, 'filename'):
is_valid = True
stat_size, stat_mtime = modelstats.stat(item.filename)
if hasattr(item, 'size') and item.size > 0:
stat_size = item.size
if hasattr(item, 'mtime') and item.mtime is not None:
stat_mtime = item.mtime
desc = item.description
fullinfo = shared.readfile(os.path.splitext(item.filename)[0] + '.json', silent=True, as_type="dict")
if 'modelVersions' in fullinfo: # sanitize massive objects
fullinfo['modelVersions'] = []
info = fullinfo
if isinstance(info, list):
item.filename = None
log.warning('Network: show details not supported for compound item')
info = None
info = shared.readfile(os.path.splitext(item.filename)[0] + '.json', silent=True, as_type="dict")
if 'modelVersions' in info: # sanitize massive objects
info['modelVersions'] = []
if prompt is not None and len(prompt) > 0:
item.prompt = prompt
if negative is not None and len(negative) > 0:
@@ -974,10 +967,12 @@ def create_ui(container, button_parent, tabname, skip_indexing = False):
'''
if item.name.startswith('Diffusers'):
url = item.name.replace('Diffusers/', '')
url = f'<a href="https://huggingface.co/{url}" target="_blank">https://huggingface.co/models/{url}</a>' if url is not None else 'N/A'
url = f'<a href="https://huggingface.co/{url}" target="_blank">https://huggingface.co/models/{url}</a>'
else:
url = info.get('id', None) if info is not None else None
url = f'<a href="https://civitai.com/models/{url}" target="_blank">civitai.com/models/{url}</a>' if url is not None else 'N/A'
info_id = info.get('id', None)
nsfw = info.get('nsfw', False) if info_id is not None else False
tld = "red" if nsfw else "com"
url = f'<a href="https://civitai.{tld}/models/{info_id}" target="_blank">civitai.{tld}/models/{info_id}</a>' if info_id is not None else 'N/A'
text = f'''
<h2 style="border-bottom: 1px solid var(--button-primary-border-color); margin: 0em 0px 1em 0 !important">{item.name}</h2>
<table style="width: 100%; line-height: 1.5em;"><tbody>