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

@@ -16,7 +16,9 @@
"loading": "Wird geladen...",
"unknown": "Unbekannt",
"date": "Datum",
"version": "Version"
"version": "Version",
"enabled": "Aktiviert",
"disabled": "Deaktiviert"
},
"language": {
"select": "Sprache",
@@ -178,7 +180,8 @@
"folderSettings": "Ordner-Einstellungen",
"downloadPathTemplates": "Download-Pfad-Vorlagen",
"exampleImages": "Beispielbilder",
"misc": "Verschiedenes"
"misc": "Verschiedenes",
"metadataArchive": "Metadaten-Archiv-Datenbank"
},
"contentFiltering": {
"blurNsfwContent": "NSFW-Inhalte unscharf stellen",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "Trigger Words in LoRA-Syntax einschließen",
"includeTriggerWordsHelp": "Trainierte Trigger Words beim Kopieren der LoRA-Syntax in die Zwischenablage einschließen"
},
"metadataArchive": {
"enableArchiveDb": "Metadaten-Archiv-Datenbank aktivieren",
"enableArchiveDbHelp": "Verwenden Sie eine lokale Datenbank, um auf Metadaten von Modellen zuzugreifen, die von Civitai gelöscht wurden.",
"status": "Status",
"statusAvailable": "Verfügbar",
"statusUnavailable": "Nicht verfügbar",
"enabled": "Aktiviert",
"management": "Datenbankverwaltung",
"managementHelp": "Laden Sie die Metadaten-Archiv-Datenbank herunter oder entfernen Sie sie",
"downloadButton": "Datenbank herunterladen",
"downloadingButton": "Wird heruntergeladen...",
"downloadedButton": "Heruntergeladen",
"removeButton": "Datenbank entfernen",
"removingButton": "Wird entfernt...",
"downloadSuccess": "Metadaten-Archiv-Datenbank erfolgreich heruntergeladen",
"downloadError": "Fehler beim Herunterladen der Metadaten-Archiv-Datenbank",
"removeSuccess": "Metadaten-Archiv-Datenbank erfolgreich entfernt",
"removeError": "Fehler beim Entfernen der Metadaten-Archiv-Datenbank",
"removeConfirm": "Sind Sie sicher, dass Sie die Metadaten-Archiv-Datenbank entfernen möchten? Dadurch wird die lokale Datenbankdatei gelöscht und Sie müssen sie erneut herunterladen, um diese Funktion zu nutzen.",
"preparing": "Download wird vorbereitet...",
"connecting": "Verbindung zum Download-Server wird hergestellt...",
"completed": "Abgeschlossen",
"downloadComplete": "Download erfolgreich abgeschlossen"
}
},
"loras": {

View File

@@ -279,16 +279,11 @@
},
"metadataArchive": {
"enableArchiveDb": "Enable Metadata Archive Database",
"enableArchiveDbHelp": "Use local database for faster metadata retrieval and access to deleted models. Recommended for better performance.",
"providerPriority": "Metadata Provider Priority",
"providerPriorityHelp": "Choose which metadata source to try first when loading model information",
"priorityArchiveDb": "Archive Database (Recommended)",
"priorityCivitaiApi": "Civitai API",
"enableArchiveDbHelp": "Use a local database to access metadata for models that have been deleted from Civitai.",
"status": "Status",
"statusAvailable": "Available",
"statusUnavailable": "Not Available",
"enabled": "Enabled",
"currentPriority": "Current Priority",
"management": "Database Management",
"managementHelp": "Download or remove the metadata archive database",
"downloadButton": "Download Database",

View File

@@ -16,7 +16,9 @@
"loading": "Cargando...",
"unknown": "Desconocido",
"date": "Fecha",
"version": "Versión"
"version": "Versión",
"enabled": "Habilitado",
"disabled": "Deshabilitado"
},
"language": {
"select": "Idioma",
@@ -178,7 +180,8 @@
"folderSettings": "Configuración de carpetas",
"downloadPathTemplates": "Plantillas de rutas de descarga",
"exampleImages": "Imágenes de ejemplo",
"misc": "Varios"
"misc": "Varios",
"metadataArchive": "Base de datos de archivo de metadatos"
},
"contentFiltering": {
"blurNsfwContent": "Difuminar contenido NSFW",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "Incluir palabras clave en la sintaxis de LoRA",
"includeTriggerWordsHelp": "Incluir palabras clave entrenadas al copiar la sintaxis de LoRA al portapapeles"
},
"metadataArchive": {
"enableArchiveDb": "Habilitar base de datos de archivo de metadatos",
"enableArchiveDbHelp": "Utiliza una base de datos local para acceder a metadatos de modelos que han sido eliminados de Civitai.",
"status": "Estado",
"statusAvailable": "Disponible",
"statusUnavailable": "No disponible",
"enabled": "Habilitado",
"management": "Gestión de base de datos",
"managementHelp": "Descargar o eliminar la base de datos de archivo de metadatos",
"downloadButton": "Descargar base de datos",
"downloadingButton": "Descargando...",
"downloadedButton": "Descargado",
"removeButton": "Eliminar base de datos",
"removingButton": "Eliminando...",
"downloadSuccess": "Base de datos de archivo de metadatos descargada exitosamente",
"downloadError": "Error al descargar la base de datos de archivo de metadatos",
"removeSuccess": "Base de datos de archivo de metadatos eliminada exitosamente",
"removeError": "Error al eliminar la base de datos de archivo de metadatos",
"removeConfirm": "¿Estás seguro de que quieres eliminar la base de datos de archivo de metadatos? Esto eliminará el archivo de base de datos local y tendrás que descargarlo de nuevo para usar esta función.",
"preparing": "Preparando descarga...",
"connecting": "Conectando al servidor de descarga...",
"completed": "Completado",
"downloadComplete": "Descarga completada exitosamente"
}
},
"loras": {

View File

@@ -16,7 +16,9 @@
"loading": "Chargement...",
"unknown": "Inconnu",
"date": "Date",
"version": "Version"
"version": "Version",
"enabled": "Activé",
"disabled": "Désactivé"
},
"language": {
"select": "Langue",
@@ -178,7 +180,8 @@
"folderSettings": "Paramètres des dossiers",
"downloadPathTemplates": "Modèles de chemin de téléchargement",
"exampleImages": "Images d'exemple",
"misc": "Divers"
"misc": "Divers",
"metadataArchive": "Base de données d'archive des métadonnées"
},
"contentFiltering": {
"blurNsfwContent": "Flouter le contenu NSFW",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "Inclure les mots-clés dans la syntaxe LoRA",
"includeTriggerWordsHelp": "Inclure les mots-clés d'entraînement lors de la copie de la syntaxe LoRA dans le presse-papiers"
},
"metadataArchive": {
"enableArchiveDb": "Activer la base de données d'archive des métadonnées",
"enableArchiveDbHelp": "Utiliser une base de données locale pour accéder aux métadonnées des modèles supprimés de Civitai.",
"status": "Statut",
"statusAvailable": "Disponible",
"statusUnavailable": "Non disponible",
"enabled": "Activé",
"management": "Gestion de la base de données",
"managementHelp": "Télécharger ou supprimer la base de données d'archive des métadonnées",
"downloadButton": "Télécharger la base de données",
"downloadingButton": "Téléchargement...",
"downloadedButton": "Téléchargé",
"removeButton": "Supprimer la base de données",
"removingButton": "Suppression...",
"downloadSuccess": "Base de données d'archive des métadonnées téléchargée avec succès",
"downloadError": "Échec du téléchargement de la base de données d'archive des métadonnées",
"removeSuccess": "Base de données d'archive des métadonnées supprimée avec succès",
"removeError": "Échec de la suppression de la base de données d'archive des métadonnées",
"removeConfirm": "Êtes-vous sûr de vouloir supprimer la base de données d'archive des métadonnées ? Cela supprimera le fichier local et vous devrez la télécharger à nouveau pour utiliser cette fonctionnalité.",
"preparing": "Préparation du téléchargement...",
"connecting": "Connexion au serveur de téléchargement...",
"completed": "Terminé",
"downloadComplete": "Téléchargement terminé avec succès"
}
},
"loras": {

View File

@@ -16,7 +16,9 @@
"loading": "読み込み中...",
"unknown": "不明",
"date": "日付",
"version": "バージョン"
"version": "バージョン",
"enabled": "有効",
"disabled": "無効"
},
"language": {
"select": "言語",
@@ -178,7 +180,8 @@
"folderSettings": "フォルダ設定",
"downloadPathTemplates": "ダウンロードパステンプレート",
"exampleImages": "例画像",
"misc": "その他"
"misc": "その他",
"metadataArchive": "メタデータアーカイブデータベース"
},
"contentFiltering": {
"blurNsfwContent": "NSFWコンテンツをぼかす",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "LoRA構文にトリガーワードを含める",
"includeTriggerWordsHelp": "LoRA構文をクリップボードにコピーする際、学習済みトリガーワードを含めます"
},
"metadataArchive": {
"enableArchiveDb": "メタデータアーカイブデータベースを有効化",
"enableArchiveDbHelp": "Civitaiから削除されたモデルのメタデータにアクセスするためにローカルデータベースを使用します。",
"status": "ステータス",
"statusAvailable": "利用可能",
"statusUnavailable": "利用不可",
"enabled": "有効",
"management": "データベース管理",
"managementHelp": "メタデータアーカイブデータベースのダウンロードまたは削除",
"downloadButton": "データベースをダウンロード",
"downloadingButton": "ダウンロード中...",
"downloadedButton": "ダウンロード済み",
"removeButton": "データベースを削除",
"removingButton": "削除中...",
"downloadSuccess": "メタデータアーカイブデータベースのダウンロードが完了しました",
"downloadError": "メタデータアーカイブデータベースのダウンロードに失敗しました",
"removeSuccess": "メタデータアーカイブデータベースが削除されました",
"removeError": "メタデータアーカイブデータベースの削除に失敗しました",
"removeConfirm": "本当にメタデータアーカイブデータベースを削除しますか?ローカルのデータベースファイルが削除され、この機能を再度利用するには再ダウンロードが必要です。",
"preparing": "ダウンロードを準備中...",
"connecting": "ダウンロードサーバーに接続中...",
"completed": "完了",
"downloadComplete": "ダウンロードが正常に完了しました"
}
},
"loras": {

View File

@@ -16,7 +16,9 @@
"loading": "로딩 중...",
"unknown": "알 수 없음",
"date": "날짜",
"version": "버전"
"version": "버전",
"enabled": "활성화됨",
"disabled": "비활성화됨"
},
"language": {
"select": "언어",
@@ -178,7 +180,8 @@
"folderSettings": "폴더 설정",
"downloadPathTemplates": "다운로드 경로 템플릿",
"exampleImages": "예시 이미지",
"misc": "기타"
"misc": "기타",
"metadataArchive": "메타데이터 아카이브 데이터베이스"
},
"contentFiltering": {
"blurNsfwContent": "NSFW 콘텐츠 블러 처리",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "LoRA 문법에 트리거 단어 포함",
"includeTriggerWordsHelp": "LoRA 문법을 클립보드에 복사할 때 학습된 트리거 단어를 포함합니다"
},
"metadataArchive": {
"enableArchiveDb": "메타데이터 아카이브 데이터베이스 활성화",
"enableArchiveDbHelp": "Civitai에서 삭제된 모델의 메타데이터에 접근하기 위해 로컬 데이터베이스를 사용합니다.",
"status": "상태",
"statusAvailable": "사용 가능",
"statusUnavailable": "사용 불가",
"enabled": "활성화됨",
"management": "데이터베이스 관리",
"managementHelp": "메타데이터 아카이브 데이터베이스를 다운로드하거나 제거합니다",
"downloadButton": "데이터베이스 다운로드",
"downloadingButton": "다운로드 중...",
"downloadedButton": "다운로드 완료",
"removeButton": "데이터베이스 제거",
"removingButton": "제거 중...",
"downloadSuccess": "메타데이터 아카이브 데이터베이스가 성공적으로 다운로드되었습니다",
"downloadError": "메타데이터 아카이브 데이터베이스 다운로드 실패",
"removeSuccess": "메타데이터 아카이브 데이터베이스가 성공적으로 제거되었습니다",
"removeError": "메타데이터 아카이브 데이터베이스 제거 실패",
"removeConfirm": "메타데이터 아카이브 데이터베이스를 제거하시겠습니까? 이 작업은 로컬 데이터베이스 파일을 삭제하며, 이 기능을 사용하려면 다시 다운로드해야 합니다.",
"preparing": "다운로드 준비 중...",
"connecting": "다운로드 서버에 연결 중...",
"completed": "완료됨",
"downloadComplete": "다운로드가 성공적으로 완료되었습니다"
}
},
"loras": {

View File

@@ -16,7 +16,9 @@
"loading": "Загрузка...",
"unknown": "Неизвестно",
"date": "Дата",
"version": "Версия"
"version": "Версия",
"enabled": "Включено",
"disabled": "Отключено"
},
"language": {
"select": "Язык",
@@ -178,7 +180,8 @@
"folderSettings": "Настройки папок",
"downloadPathTemplates": "Шаблоны путей загрузки",
"exampleImages": "Примеры изображений",
"misc": "Разное"
"misc": "Разное",
"metadataArchive": "Архив метаданных"
},
"contentFiltering": {
"blurNsfwContent": "Размывать NSFW контент",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "Включать триггерные слова в синтаксис LoRA",
"includeTriggerWordsHelp": "Включать обученные триггерные слова при копировании синтаксиса LoRA в буфер обмена"
},
"metadataArchive": {
"enableArchiveDb": "Включить архив метаданных",
"enableArchiveDbHelp": "Использовать локальную базу данных для доступа к метаданным моделей, удалённых с Civitai.",
"status": "Статус",
"statusAvailable": "Доступно",
"statusUnavailable": "Недоступно",
"enabled": "Включено",
"management": "Управление базой данных",
"managementHelp": "Скачать или удалить базу данных архива метаданных",
"downloadButton": "Скачать базу данных",
"downloadingButton": "Скачивание...",
"downloadedButton": "Скачано",
"removeButton": "Удалить базу данных",
"removingButton": "Удаление...",
"downloadSuccess": "База данных архива метаданных успешно загружена",
"downloadError": "Не удалось загрузить базу данных архива метаданных",
"removeSuccess": "База данных архива метаданных успешно удалена",
"removeError": "Не удалось удалить базу данных архива метаданных",
"removeConfirm": "Вы уверены, что хотите удалить базу данных архива метаданных? Это удалит локальный файл базы данных, и для использования этой функции потребуется повторная загрузка.",
"preparing": "Подготовка к загрузке...",
"connecting": "Подключение к серверу загрузки...",
"completed": "Завершено",
"downloadComplete": "Загрузка успешно завершена"
}
},
"loras": {

View File

@@ -16,7 +16,9 @@
"loading": "加载中...",
"unknown": "未知",
"date": "日期",
"version": "版本"
"version": "版本",
"enabled": "已启用",
"disabled": "已禁用"
},
"language": {
"select": "语言",
@@ -178,7 +180,8 @@
"folderSettings": "文件夹设置",
"downloadPathTemplates": "下载路径模板",
"exampleImages": "示例图片",
"misc": "其他"
"misc": "其他",
"metadataArchive": "元数据归档数据库"
},
"contentFiltering": {
"blurNsfwContent": "模糊 NSFW 内容",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "复制 LoRA 语法时包含触发词",
"includeTriggerWordsHelp": "复制 LoRA 语法到剪贴板时包含训练触发词"
},
"metadataArchive": {
"enableArchiveDb": "启用元数据归档数据库",
"enableArchiveDbHelp": "使用本地数据库访问已从 Civitai 删除的模型元数据。",
"status": "状态",
"statusAvailable": "可用",
"statusUnavailable": "不可用",
"enabled": "已启用",
"management": "数据库管理",
"managementHelp": "下载或移除元数据归档数据库",
"downloadButton": "下载数据库",
"downloadingButton": "正在下载...",
"downloadedButton": "已下载",
"removeButton": "移除数据库",
"removingButton": "正在移除...",
"downloadSuccess": "元数据归档数据库下载成功",
"downloadError": "元数据归档数据库下载失败",
"removeSuccess": "元数据归档数据库移除成功",
"removeError": "元数据归档数据库移除失败",
"removeConfirm": "你确定要移除元数据归档数据库吗?这将删除本地数据库文件,如需使用此功能需重新下载。",
"preparing": "正在准备下载...",
"connecting": "正在连接下载服务器...",
"completed": "已完成",
"downloadComplete": "下载成功完成"
}
},
"loras": {

View File

@@ -16,7 +16,9 @@
"loading": "載入中...",
"unknown": "未知",
"date": "日期",
"version": "版本"
"version": "版本",
"enabled": "已啟用",
"disabled": "已停用"
},
"language": {
"select": "語言",
@@ -178,7 +180,8 @@
"folderSettings": "資料夾設定",
"downloadPathTemplates": "下載路徑範本",
"exampleImages": "範例圖片",
"misc": "其他"
"misc": "其他",
"metadataArchive": "中繼資料封存資料庫"
},
"contentFiltering": {
"blurNsfwContent": "模糊 NSFW 內容",
@@ -273,6 +276,30 @@
"misc": {
"includeTriggerWords": "在 LoRA 語法中包含觸發詞",
"includeTriggerWordsHelp": "複製 LoRA 語法到剪貼簿時包含訓練觸發詞"
},
"metadataArchive": {
"enableArchiveDb": "啟用中繼資料封存資料庫",
"enableArchiveDbHelp": "使用本機資料庫以存取已從 Civitai 刪除模型的中繼資料。",
"status": "狀態",
"statusAvailable": "可用",
"statusUnavailable": "不可用",
"enabled": "已啟用",
"management": "資料庫管理",
"managementHelp": "下載或移除中繼資料封存資料庫",
"downloadButton": "下載資料庫",
"downloadingButton": "下載中...",
"downloadedButton": "已下載",
"removeButton": "移除資料庫",
"removingButton": "移除中...",
"downloadSuccess": "中繼資料封存資料庫下載成功",
"downloadError": "下載中繼資料封存資料庫失敗",
"removeSuccess": "中繼資料封存資料庫移除成功",
"removeError": "移除中繼資料封存資料庫失敗",
"removeConfirm": "您確定要移除中繼資料封存資料庫嗎?這將刪除本機資料庫檔案,若要再次使用此功能需重新下載。",
"preparing": "準備下載中...",
"connecting": "正在連接下載伺服器...",
"completed": "已完成",
"downloadComplete": "下載成功完成"
}
},
"loras": {

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

View File

@@ -850,7 +850,7 @@ export class SettingsManager {
}
// Special handling for metadata archive settings
if (settingKey === 'enable_metadata_archive_db' || settingKey === 'metadata_provider_priority') {
if (settingKey === 'enable_metadata_archive_db') {
await this.updateMetadataArchiveStatus();
}
@@ -879,8 +879,6 @@ export class SettingsManager {
state.global.settings.compactMode = (value !== 'default');
} else if (settingKey === 'card_info_display') {
state.global.settings.cardInfoDisplay = value;
} else if (settingKey === 'metadata_provider_priority') {
state.global.settings.metadata_provider_priority = value;
} else {
// For any other settings that might be added in the future
state.global.settings[settingKey] = value;
@@ -891,7 +889,7 @@ export class SettingsManager {
try {
// For backend settings, make API call
if (settingKey === 'default_lora_root' || settingKey === 'default_checkpoint_root' || settingKey === 'default_embedding_root' || settingKey === 'download_path_templates' || settingKey === 'metadata_provider_priority') {
if (settingKey === 'default_lora_root' || settingKey === 'default_checkpoint_root' || settingKey === 'default_embedding_root' || settingKey === 'download_path_templates') {
const payload = {};
if (settingKey === 'download_path_templates') {
payload[settingKey] = state.global.settings.download_path_templates;
@@ -912,11 +910,6 @@ export class SettingsManager {
}
showToast('toast.settings.settingsUpdated', { setting: settingKey.replace(/_/g, ' ') }, 'success');
// Refresh metadata archive status when provider priority changes
if (settingKey === 'metadata_provider_priority') {
await this.updateMetadataArchiveStatus();
}
}
// Apply frontend settings immediately
@@ -932,11 +925,6 @@ export class SettingsManager {
showToast('toast.settings.displayDensitySet', { density: densityName }, 'success');
}
// Special handling for metadata archive settings
if (settingKey === 'metadata_provider_priority') {
await this.updateMetadataArchiveStatus();
}
} catch (error) {
showToast('toast.settings.settingSaveFailed', { message: error.message }, 'error');
@@ -951,11 +939,6 @@ export class SettingsManager {
enableMetadataArchiveCheckbox.checked = state.global.settings.enable_metadata_archive_db || false;
}
const metadataProviderPrioritySelect = document.getElementById('metadataProviderPriority');
if (metadataProviderPrioritySelect) {
metadataProviderPrioritySelect.value = state.global.settings.metadata_provider_priority || 'archive_db';
}
// Load status
await this.updateMetadataArchiveStatus();
} catch (error) {
@@ -987,12 +970,6 @@ export class SettingsManager {
${status.isEnabled ? translate('common.status.enabled') : translate('common.status.disabled')}
</span>
</div>
<div class="archive-status-item">
<span class="archive-status-label">${translate('settings.metadataArchive.currentPriority')}:</span>
<span class="archive-status-value">
${status.priority === 'archive_db' ? translate('settings.metadataArchive.priorityArchiveDb') : translate('settings.metadataArchive.priorityCivitaiApi')}
</span>
</div>
`;
// Update button states

View File

@@ -419,23 +419,6 @@
</div>
</div>
<div class="setting-item">
<div class="setting-row">
<div class="setting-info">
<label for="metadataProviderPriority">{{ t('settings.metadataArchive.providerPriority') }}:</label>
</div>
<div class="setting-control select-control">
<select id="metadataProviderPriority" onchange="settingsManager.saveSelectSetting('metadataProviderPriority', 'metadata_provider_priority')">
<option value="archive_db">{{ t('settings.metadataArchive.priorityArchiveDb') }}</option>
<option value="civitai_api">{{ t('settings.metadataArchive.priorityCivitaiApi') }}</option>
</select>
</div>
</div>
<div class="input-help">
{{ t('settings.metadataArchive.providerPriorityHelp') }}
</div>
</div>
<div class="setting-item">
<div class="metadata-archive-status" id="metadataArchiveStatus">
<!-- Status will be populated by JavaScript -->