mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-08-09 07:20:15 -03:00
feat(metadata): add CivitAI AutoV3 hash support across all storage layers
- Three-state autov3 field (not-checked / checked-unavailable / 12-hex value) in .metadata.json sidecars, in-memory ModelHashIndex, and SQLite (models.autov3 column + autov3_index table) with column-presence migration - Background self-terminating backfill for legacy rows: per-model-type concurrency guard, executor-offloaded I/O, Civitai-first resolution (SHA256-matched version file) falling back to the embedded safetensors header hash - Civitai-first propagation on metadata refresh, scan, and download paths; reject the empty-string SHA256 placeholder and strip OneTrainer 0x prefix - List API hash filters and hash index lookups accept 12-char AutoV3 - Cap safetensors header reads at 64 MiB to prevent crafted-file allocation - Prevent stale AutoV3 mappings on file replacement while preserving them on same-file re-registration (lazy-hash completion)
This commit is contained in:
@@ -6,7 +6,7 @@ import time
|
||||
from typing import Any, Dict, Optional, Type, Union
|
||||
|
||||
from .models import BaseModelMetadata, LoraMetadata
|
||||
from .file_utils import normalize_path, find_preview_file, calculate_sha256
|
||||
from .file_utils import normalize_path, find_preview_file, calculate_sha256, calculate_autov3
|
||||
from .lora_metadata import extract_lora_metadata, extract_checkpoint_metadata
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -210,6 +210,11 @@ class MetadataManager:
|
||||
hash_duration = time.perf_counter() - start_hash_time
|
||||
logger.info(f"SHA256 hash calculated for {real_path} in {hash_duration:.3f}s")
|
||||
|
||||
# AutoV3 reads only the safetensors header, so it is cheap even for
|
||||
# large files. At creation time we always know the checked state:
|
||||
# store "" when no recognized hash is embedded (checked-unavailable).
|
||||
autov3 = calculate_autov3(real_path)
|
||||
|
||||
# Create instance based on model type
|
||||
if model_class.__name__ == "CheckpointMetadata":
|
||||
metadata = model_class(
|
||||
@@ -257,6 +262,9 @@ class MetadataManager:
|
||||
usage_tips="{}"
|
||||
)
|
||||
|
||||
# Record the AutoV3 state explicitly ("" = checked, no value).
|
||||
metadata.autov3 = autov3 or ""
|
||||
|
||||
# Try to extract model-specific metadata
|
||||
# await MetadataManager._enrich_metadata(metadata, real_path)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user