From 9d4194edc24f86b8982fb0c923b7bfab59520a52 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 31 Aug 2023 09:05:38 -0400 Subject: [PATCH] read model metadata --- cli/model-metadata.py | 41 ++++++++++++++++++++++++ javascript/extraNetworks.js | 3 +- modules/ui_extra_networks.py | 18 ++++++----- modules/ui_extra_networks_checkpoints.py | 1 + 4 files changed, 54 insertions(+), 9 deletions(-) create mode 100755 cli/model-metadata.py diff --git a/cli/model-metadata.py b/cli/model-metadata.py new file mode 100755 index 000000000..c4c5b6411 --- /dev/null +++ b/cli/model-metadata.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +import os +import sys +import json +from rich import print # pylint: disable=redefined-builtin + + +def read_metadata(fn): + res = {} + with open(fn, mode="rb") as f: + metadata_len = f.read(8) + metadata_len = int.from_bytes(metadata_len, "little") + json_start = f.read(2) + if metadata_len <= 2 or json_start not in (b'{"', b"{'"): + print(f"Not a valid safetensors file: {fn}") + json_data = json_start + f.read(metadata_len-2) + json_obj = json.loads(json_data) + for k, v in json_obj.get("__metadata__", {}).items(): + res[k] = v + if isinstance(v, str) and v[0:1] == '{': + try: + res[k] = json.loads(v) + except Exception: + pass + print(f"{fn}: {json.dumps(res, indent=4)}") + + +def main(): + if len(sys.argv) == 0: + print('metadata:', 'no files specified') + for fn in sys.argv: + if os.path.isfile(fn): + read_metadata(fn) + elif os.path.isdir(fn): + for root, _dirs, files in os.walk(fn): + for file in files: + read_metadata(os.path.join(root, file)) + +if __name__ == '__main__': + sys.argv.pop(0) + main() diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index be44c2952..ce982881b 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -222,7 +222,8 @@ function popup(contents) { function readCardMetadata(event, extraPage, cardName) { requestGet('./sd_extra_networks/metadata', { page: extraPage, item: cardName }, (data) => { - if (data?.metadata && (typeof (data?.metadata) === 'string')) { + if (data?.metadata) { + if (typeof (data?.metadata) !== 'string') data.metadata = JSON.stringify(data.metadata, null, 2); const elem = document.createElement('pre'); elem.classList.add('popup-metadata'); elem.textContent = data.metadata; diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index daf0da6ad..ef64a9812 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -9,10 +9,12 @@ from pathlib import Path from collections import OrderedDict import gradio as gr from PIL import Image +from starlette.responses import FileResponse, JSONResponse from modules import shared, scripts, modelloader from modules.generation_parameters_copypaste import image_from_url_text from modules.ui_components import ToolButton + extra_pages = [] allowed_dirs = set() dir_cache = {} # key=path, value=(mtime, listdir(path)) @@ -42,7 +44,6 @@ def register_page(page): def fetch_file(filename: str = ""): - from starlette.responses import FileResponse, JSONResponse if filename.startswith('html/'): return FileResponse(filename, headers={"Accept-Ranges": "bytes"}) if not any(Path(x).absolute() in Path(filename).absolute().parents for x in allowed_dirs): @@ -53,20 +54,24 @@ def fetch_file(filename: str = ""): def get_metadata(page: str = "", item: str = ""): - from starlette.responses import JSONResponse page = next(iter([x for x in extra_pages if x.name == page]), None) if page is None: return JSONResponse({ 'metadata': 'none' }) metadata = page.metadata.get(item, 'none') + if metadata is None: + metadata = '' + shared.log.debug(f'Extra networks metadata: page={page} item={item} len={len(metadata)}') return JSONResponse({"metadata": metadata}) def get_info(page: str = "", item: str = ""): - from starlette.responses import JSONResponse page = next(iter([x for x in extra_pages if x.name == page]), None) if page is None: return JSONResponse({ 'info': 'none' }) info = page.info.get(item, 'none') + if info is None: + info = '' + shared.log.debug(f'Extra networks info: page={page} item={item} len={len(info)}') return JSONResponse({"info": info}) @@ -267,7 +272,6 @@ class ExtraNetworksPage: preview_extensions = ["jpg", "jpeg", "png", "webp", "tiff", "jp2"] files = listdir(os.path.dirname(path)) for file in [f'{path}{mid}{ext}' for ext in preview_extensions for mid in ['.thumb.', '.preview.', '.']]: - # if os.path.exists(file): if file in files: if '.thumb.' not in file: self.missing_thumbs.append(file) @@ -277,7 +281,6 @@ class ExtraNetworksPage: def find_description(self, path): files = listdir(os.path.dirname(path)) for file in [f"{path}.txt", f"{path}.description.txt"]: - # if os.path.exists(file): if file in files: try: with open(file, "r", encoding="utf-8", errors="replace") as f: @@ -286,13 +289,12 @@ class ExtraNetworksPage: return txt except OSError: pass - return None + return '' def find_info(self, path): basename, _ext = os.path.splitext(path) files = listdir(os.path.dirname(path)) for file in [f"{path}.info", f"{path}.civitai.info", f"{basename}.info", f"{basename}.civitai.info"]: - # if os.path.exists(file): if file in files: try: with open(file, "r", encoding="utf-8", errors="replace") as f: @@ -301,7 +303,7 @@ class ExtraNetworksPage: return txt except OSError: pass - return None + return '' def initialize(): diff --git a/modules/ui_extra_networks_checkpoints.py b/modules/ui_extra_networks_checkpoints.py index 3ab515b0c..48d4e7bc5 100644 --- a/modules/ui_extra_networks_checkpoints.py +++ b/modules/ui_extra_networks_checkpoints.py @@ -26,6 +26,7 @@ class ExtraNetworksPageCheckpoints(ui_extra_networks.ExtraNetworksPage): "search_term": f'{self.search_terms_from_path(checkpoint.filename)} {(checkpoint.sha256 or "")} /{checkpoint.type}/', "onclick": '"' + html.escape(f"""return selectCheckpoint({json.dumps(name)})""") + '"', "local_preview": f"{path}.{shared.opts.samples_format}", + "metadata": checkpoint.metadata, } def allowed_directories_for_previews(self):