read model metadata

This commit is contained in:
Vladimir Mandic
2023-08-31 09:05:38 -04:00
parent 27a517cedd
commit 9d4194edc2
4 changed files with 54 additions and 9 deletions
+41
View File
@@ -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()
+2 -1
View File
@@ -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;
+10 -8
View File
@@ -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():
+1
View File
@@ -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):