feat(metadata): update metadata archive management and remove provider priority settings

This commit is contained in:
Will Miao
2025-09-10 15:55:29 +08:00
parent 68f8871403
commit a4fbeb6295
16 changed files with 269 additions and 98 deletions

View File

@@ -611,10 +611,10 @@ class BaseModelRoutes(ABC):
success = 0
needs_resort = False
# Prepare models to process
# Prepare models to process, only those without CivitAI data
to_process = [
model for model in cache.raw_data
if model.get('sha256') and (not model.get('civitai') or 'id' not in model.get('civitai')) and model.get('from_civitai', True)
if model.get('sha256') and (not model.get('civitai') or 'id' not in model.get('civitai'))
]
total_to_process = len(to_process)

View File

@@ -11,7 +11,7 @@ from ..utils.lora_metadata import extract_trained_words
from ..config import config
from ..utils.constants import SUPPORTED_MEDIA_EXTENSIONS, NODE_TYPES, DEFAULT_NODE_COLOR
from ..services.service_registry import ServiceRegistry
from ..services.metadata_service import get_metadata_archive_manager, update_metadata_provider_priority
from ..services.metadata_service import get_metadata_archive_manager, update_metadata_providers
from ..services.websocket_manager import ws_manager
import re
@@ -736,8 +736,8 @@ class MiscRoutes:
# Update settings to enable metadata archive
settings.set('enable_metadata_archive_db', True)
# Update provider priority
await update_metadata_provider_priority()
# Update metadata providers
await update_metadata_providers()
return web.json_response({
'success': True,
@@ -768,8 +768,8 @@ class MiscRoutes:
# Update settings to disable metadata archive
settings.set('enable_metadata_archive_db', False)
# Update provider priority
await update_metadata_provider_priority()
# Update metadata providers
await update_metadata_providers()
return web.json_response({
'success': True,
@@ -796,7 +796,6 @@ class MiscRoutes:
is_available = archive_manager.is_database_available()
is_enabled = settings.get('enable_metadata_archive_db', False)
priority = settings.get('metadata_provider_priority', 'archive_db')
db_size = 0
if is_available:
@@ -808,7 +807,6 @@ class MiscRoutes:
'success': True,
'isAvailable': is_available,
'isEnabled': is_enabled,
'priority': priority,
'databaseSize': db_size,
'databasePath': archive_manager.get_database_path() if is_available else None
})

View File

@@ -22,7 +22,6 @@ async def initialize_metadata_providers():
# Get settings
enable_archive_db = settings.get('enable_metadata_archive_db', False)
priority = settings.get('metadata_provider_priority', 'archive_db')
providers = []
@@ -54,23 +53,17 @@ async def initialize_metadata_providers():
except Exception as e:
logger.error(f"Failed to initialize Civitai API metadata provider: {e}")
# Set up fallback provider based on priority and available providers
# Set up fallback provider based on available providers
if len(providers) > 1:
# Order providers based on priority setting
# Always use Civitai API first, then Archive DB
ordered_providers = []
if priority == 'archive_db':
# Archive DB first, then Civitai API
ordered_providers = [p[1] for p in providers if p[0] == 'sqlite']
ordered_providers.extend([p[1] for p in providers if p[0] == 'civitai_api'])
else:
# Civitai API first, then Archive DB
ordered_providers = [p[1] for p in providers if p[0] == 'civitai_api']
ordered_providers.extend([p[1] for p in providers if p[0] == 'sqlite'])
ordered_providers.extend([p[1] for p in providers if p[0] == 'civitai_api'])
ordered_providers.extend([p[1] for p in providers if p[0] == 'sqlite'])
if ordered_providers:
fallback_provider = FallbackMetadataProvider(ordered_providers)
provider_manager.register_provider('fallback', fallback_provider, is_default=True)
logger.info(f"Fallback metadata provider registered with {len(ordered_providers)} providers, priority: {priority}")
logger.info(f"Fallback metadata provider registered with {len(ordered_providers)} providers, Civitai API first")
elif len(providers) == 1:
# Only one provider available, set it as default
provider_name, provider = providers[0]
@@ -81,20 +74,19 @@ async def initialize_metadata_providers():
return provider_manager
async def update_metadata_provider_priority():
"""Update metadata provider priority based on current settings"""
async def update_metadata_providers():
"""Update metadata providers based on current settings"""
try:
# Get current settings
enable_archive_db = settings.get('enable_metadata_archive_db', False)
priority = settings.get('metadata_provider_priority', 'archive_db')
# Reinitialize all providers with new settings
provider_manager = await initialize_metadata_providers()
logger.info(f"Updated metadata provider priority to: {priority}, archive_db enabled: {enable_archive_db}")
logger.info(f"Updated metadata providers, archive_db enabled: {enable_archive_db}")
return provider_manager
except Exception as e:
logger.error(f"Failed to update metadata provider priority: {e}")
logger.error(f"Failed to update metadata providers: {e}")
return await ModelMetadataProviderManager.get_instance()
async def get_metadata_archive_manager():

View File

@@ -82,8 +82,7 @@ class SettingsManager:
"civitai_api_key": "",
"show_only_sfw": False,
"language": "en",
"enable_metadata_archive_db": False, # Enable metadata archive database
"metadata_provider_priority": "archive_db" # Default priority: 'archive_db' or 'civitai_api'
"enable_metadata_archive_db": False # Enable metadata archive database
}
def get(self, key: str, default: Any = None) -> Any:

View File

@@ -12,7 +12,7 @@ from ..services.downloader import get_downloader
from ..utils.exif_utils import ExifUtils
from ..utils.metadata_manager import MetadataManager
from ..services.websocket_manager import ws_manager
from ..services.metadata_service import get_default_metadata_provider
from ..services.metadata_service import get_default_metadata_provider, get_metadata_provider
logger = logging.getLogger(__name__)
@@ -41,13 +41,15 @@ class ModelRouteUtils:
def is_civitai_api_metadata(meta: dict) -> bool:
"""
Determine if the given civitai metadata is from the civitai API.
Returns True if both 'files' and 'images' exist and are non-empty.
Returns True if both 'files' and 'images' exist and are non-empty,
and the 'source' is not 'archive_db'.
"""
if not isinstance(meta, dict):
return False
files = meta.get('files')
images = meta.get('images')
return bool(files) and bool(images)
source = meta.get('source')
return bool(files) and bool(images) and source != 'archive_db'
@staticmethod
async def update_model_metadata(metadata_path: str, local_metadata: Dict,
@@ -58,12 +60,17 @@ class ModelRouteUtils:
# Check if we should skip the update to avoid overwriting richer data
if civitai_metadata.get('source') == 'archive_db' and ModelRouteUtils.is_civitai_api_metadata(existing_civitai):
logger.info(f"Skip civitai update for {local_metadata.get('model_name', '')}: {existing_civitai.get('name', '')}")
logger.info(f"Skip civitai update for {local_metadata.get('model_name', '')} ({existing_civitai.get('name', '')})")
else:
# Create a new civitai metadata by updating existing with new
merged_civitai = existing_civitai.copy()
merged_civitai.update(civitai_metadata)
if civitai_metadata.get('source') == 'archive_db':
model_name = civitai_metadata.get('model', {}).get('name', '')
version_name = civitai_metadata.get('name', '')
logger.info(f"Recovered metadata from archive_db for deleted model: {model_name} ({version_name})")
# Special handling for trainedWords - ensure we don't lose any existing trained words
if 'trainedWords' in existing_civitai:
existing_trained_words = existing_civitai.get('trainedWords', [])
@@ -210,8 +217,12 @@ class ModelRouteUtils:
# Check if model metadata exists
local_metadata = await ModelRouteUtils.load_local_metadata(metadata_path)
# Get metadata provider and fetch metadata from unified provider
metadata_provider = await get_default_metadata_provider()
if model_data.get('from_civitai') is False:
# Likely deleted from CivitAI, use archive_db if available
metadata_provider = await get_metadata_provider('sqlite')
else:
metadata_provider = await get_default_metadata_provider()
civitai_metadata = await metadata_provider.get_model_by_hash(sha256)
if not civitai_metadata:
# Mark as not from CivitAI if not found