mirror of
https://github.com/vladmandic/automatic
synced 2026-09-20 01:31:13 +02:00
read model metadata
This commit is contained in:
Executable
+41
@@ -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()
|
||||
@@ -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;
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user