From d41bf3d6733ea0901a27df6a34de1d460956f97c Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Sun, 21 Sep 2025 20:06:45 -0400 Subject: [PATCH] add api to trigger civitai metadata update Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 ++ modules/civitai/api_civitai.py | 9 +++++++++ modules/civitai/metadata_civitai.py | 14 +++++++------- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dea21326..2f490ed68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,8 @@ - **ipex** simplify internal implementation - refactor to use new libraries - styles and wildcards now use same seed as main generate for reproducible results + - **api** new endpoint POST `/sdapi/v1/civitai` to trigger civitai models metadata update + accepts optional `page` parameter to search specific networks page - **Fixes** - framepack: add explicit hf-login before framepack load - benchmark: remove forced sampler from system info benchmark diff --git a/modules/civitai/api_civitai.py b/modules/civitai/api_civitai.py index 92add902f..4041f3f36 100644 --- a/modules/civitai/api_civitai.py +++ b/modules/civitai/api_civitai.py @@ -54,6 +54,15 @@ def get_civitai( return JSONResponse(content=[], status_code=200) +def post_civitai(page:str=None): + from modules.civitai import metadata_civitai + result = [] + for r in metadata_civitai.civit_search_metadata(title=page, raw=True): + result = r # get the last yielded result + return result + + def register_api(): from modules.shared import api api.add_api_route("/sdapi/v1/civitai", get_civitai, methods=["GET"], response_model=list) + api.add_api_route("/sdapi/v1/civitai", post_civitai, methods=["POST"], response_model=list) diff --git a/modules/civitai/metadata_civitai.py b/modules/civitai/metadata_civitai.py index 6d4315860..fab22e78f 100644 --- a/modules/civitai/metadata_civitai.py +++ b/modules/civitai/metadata_civitai.py @@ -26,7 +26,7 @@ class CivitModel: self.status = 'Not found' -def civit_update_metadata(): +def civit_update_metadata(raw:bool=False): def create_update_metadata_table(rows: list[CivitModel]): html = """ @@ -102,8 +102,8 @@ def civit_update_metadata(): model.status = 'Update available' break results.append(model) - yield create_update_metadata_table(results) - return create_update_metadata_table(results) + yield results if raw else create_update_metadata_table(results) + yield results if raw else create_update_metadata_table(results) def civit_search_model(name, tag, model_type): @@ -224,7 +224,7 @@ def atomic_civit_search_metadata(item, results): results.append(result) -def civit_search_metadata(title: str = None): +def civit_search_metadata(title: str = None, raw: bool = False): def create_search_metadata_table(rows): html = """
@@ -258,7 +258,7 @@ def civit_search_metadata(title: str = None): re_skip = [r.strip() for r in opts.extra_networks_scan_skip.split(',') if len(r.strip()) > 0] for page in get_pages(): if type(title) == str: - if page.title != title: + if page.title.lower() != title.lower(): continue if page.name == 'style' or page.name == 'wildcards': continue @@ -278,8 +278,8 @@ def civit_search_metadata(title: str = None): future_items[executor.submit(atomic_civit_search_metadata, fn, results)] = fn for future in concurrent.futures.as_completed(future_items): future.result() - yield create_search_metadata_table(results) + yield results if raw else create_search_metadata_table(results) t1 = time.time() log.debug(f'CivitAI search metadata: scanned={scanned} skipped={skipped} time={t1-t0:.2f}') - yield create_search_metadata_table(results) + yield results if raw else create_search_metadata_table(results)