feat(metadata): add source tracking for SQLite metadata and implement Civitai API metadata validation

This commit is contained in:
Will Miao
2025-09-10 11:20:58 +08:00
parent 6fd74952b7
commit 68f8871403
2 changed files with 33 additions and 15 deletions

View File

@@ -127,7 +127,8 @@ class SQLiteModelMetadataProvider(ModelMetadataProvider):
'model': { 'model': {
'name': model_row['name'], 'name': model_row['name'],
'type': model_type, 'type': model_type,
} },
'source': 'archive_db'
} }
# Update with any additional data # Update with any additional data
version_entry.update(version_data) version_entry.update(version_data)
@@ -266,7 +267,8 @@ class SQLiteModelMetadataProvider(ModelMetadataProvider):
"creator": { "creator": {
"username": model_row['username'] or model_data.get("creator", {}).get("username"), "username": model_row['username'] or model_data.get("creator", {}).get("username"),
"image": model_data.get("creator", {}).get("image") "image": model_data.get("creator", {}).get("image")
} },
"source": "archive_db"
} }
# Add any additional fields from version data # Add any additional fields from version data

View File

@@ -37,6 +37,18 @@ class ModelRouteUtils:
local_metadata['from_civitai'] = False local_metadata['from_civitai'] = False
await MetadataManager.save_metadata(metadata_path, local_metadata) await MetadataManager.save_metadata(metadata_path, local_metadata)
@staticmethod
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.
"""
if not isinstance(meta, dict):
return False
files = meta.get('files')
images = meta.get('images')
return bool(files) and bool(images)
@staticmethod @staticmethod
async def update_model_metadata(metadata_path: str, local_metadata: Dict, async def update_model_metadata(metadata_path: str, local_metadata: Dict,
civitai_metadata: Dict, metadata_provider=None) -> None: civitai_metadata: Dict, metadata_provider=None) -> None:
@@ -44,6 +56,10 @@ class ModelRouteUtils:
# Save existing trainedWords and customImages if they exist # Save existing trainedWords and customImages if they exist
existing_civitai = local_metadata.get('civitai') or {} # Use empty dict if None existing_civitai = local_metadata.get('civitai') or {} # Use empty dict if None
# 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', '')}")
else:
# Create a new civitai metadata by updating existing with new # Create a new civitai metadata by updating existing with new
merged_civitai = existing_civitai.copy() merged_civitai = existing_civitai.copy()
merged_civitai.update(civitai_metadata) merged_civitai.update(civitai_metadata)