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...", "loading": "Wird geladen...",
"unknown": "Unbekannt", "unknown": "Unbekannt",
"date": "Datum", "date": "Datum",
"version": "Version" "version": "Version",
"enabled": "Aktiviert",
"disabled": "Deaktiviert"
}, },
"language": { "language": {
"select": "Sprache", "select": "Sprache",
@@ -178,7 +180,8 @@
"folderSettings": "Ordner-Einstellungen", "folderSettings": "Ordner-Einstellungen",
"downloadPathTemplates": "Download-Pfad-Vorlagen", "downloadPathTemplates": "Download-Pfad-Vorlagen",
"exampleImages": "Beispielbilder", "exampleImages": "Beispielbilder",
"misc": "Verschiedenes" "misc": "Verschiedenes",
"metadataArchive": "Metadaten-Archiv-Datenbank"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "NSFW-Inhalte unscharf stellen", "blurNsfwContent": "NSFW-Inhalte unscharf stellen",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "Trigger Words in LoRA-Syntax einschließen", "includeTriggerWords": "Trigger Words in LoRA-Syntax einschließen",
"includeTriggerWordsHelp": "Trainierte Trigger Words beim Kopieren der LoRA-Syntax in die Zwischenablage 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": { "loras": {

View File

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

View File

@@ -16,7 +16,9 @@
"loading": "Cargando...", "loading": "Cargando...",
"unknown": "Desconocido", "unknown": "Desconocido",
"date": "Fecha", "date": "Fecha",
"version": "Versión" "version": "Versión",
"enabled": "Habilitado",
"disabled": "Deshabilitado"
}, },
"language": { "language": {
"select": "Idioma", "select": "Idioma",
@@ -178,7 +180,8 @@
"folderSettings": "Configuración de carpetas", "folderSettings": "Configuración de carpetas",
"downloadPathTemplates": "Plantillas de rutas de descarga", "downloadPathTemplates": "Plantillas de rutas de descarga",
"exampleImages": "Imágenes de ejemplo", "exampleImages": "Imágenes de ejemplo",
"misc": "Varios" "misc": "Varios",
"metadataArchive": "Base de datos de archivo de metadatos"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "Difuminar contenido NSFW", "blurNsfwContent": "Difuminar contenido NSFW",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "Incluir palabras clave en la sintaxis de LoRA", "includeTriggerWords": "Incluir palabras clave en la sintaxis de LoRA",
"includeTriggerWordsHelp": "Incluir palabras clave entrenadas al copiar la sintaxis de LoRA al portapapeles" "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": { "loras": {

View File

@@ -16,7 +16,9 @@
"loading": "Chargement...", "loading": "Chargement...",
"unknown": "Inconnu", "unknown": "Inconnu",
"date": "Date", "date": "Date",
"version": "Version" "version": "Version",
"enabled": "Activé",
"disabled": "Désactivé"
}, },
"language": { "language": {
"select": "Langue", "select": "Langue",
@@ -178,7 +180,8 @@
"folderSettings": "Paramètres des dossiers", "folderSettings": "Paramètres des dossiers",
"downloadPathTemplates": "Modèles de chemin de téléchargement", "downloadPathTemplates": "Modèles de chemin de téléchargement",
"exampleImages": "Images d'exemple", "exampleImages": "Images d'exemple",
"misc": "Divers" "misc": "Divers",
"metadataArchive": "Base de données d'archive des métadonnées"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "Flouter le contenu NSFW", "blurNsfwContent": "Flouter le contenu NSFW",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "Inclure les mots-clés dans la syntaxe LoRA", "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" "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": { "loras": {

View File

@@ -16,7 +16,9 @@
"loading": "読み込み中...", "loading": "読み込み中...",
"unknown": "不明", "unknown": "不明",
"date": "日付", "date": "日付",
"version": "バージョン" "version": "バージョン",
"enabled": "有効",
"disabled": "無効"
}, },
"language": { "language": {
"select": "言語", "select": "言語",
@@ -178,7 +180,8 @@
"folderSettings": "フォルダ設定", "folderSettings": "フォルダ設定",
"downloadPathTemplates": "ダウンロードパステンプレート", "downloadPathTemplates": "ダウンロードパステンプレート",
"exampleImages": "例画像", "exampleImages": "例画像",
"misc": "その他" "misc": "その他",
"metadataArchive": "メタデータアーカイブデータベース"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "NSFWコンテンツをぼかす", "blurNsfwContent": "NSFWコンテンツをぼかす",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "LoRA構文にトリガーワードを含める", "includeTriggerWords": "LoRA構文にトリガーワードを含める",
"includeTriggerWordsHelp": "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": { "loras": {

View File

@@ -16,7 +16,9 @@
"loading": "로딩 중...", "loading": "로딩 중...",
"unknown": "알 수 없음", "unknown": "알 수 없음",
"date": "날짜", "date": "날짜",
"version": "버전" "version": "버전",
"enabled": "활성화됨",
"disabled": "비활성화됨"
}, },
"language": { "language": {
"select": "언어", "select": "언어",
@@ -178,7 +180,8 @@
"folderSettings": "폴더 설정", "folderSettings": "폴더 설정",
"downloadPathTemplates": "다운로드 경로 템플릿", "downloadPathTemplates": "다운로드 경로 템플릿",
"exampleImages": "예시 이미지", "exampleImages": "예시 이미지",
"misc": "기타" "misc": "기타",
"metadataArchive": "메타데이터 아카이브 데이터베이스"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "NSFW 콘텐츠 블러 처리", "blurNsfwContent": "NSFW 콘텐츠 블러 처리",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "LoRA 문법에 트리거 단어 포함", "includeTriggerWords": "LoRA 문법에 트리거 단어 포함",
"includeTriggerWordsHelp": "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": { "loras": {

View File

@@ -16,7 +16,9 @@
"loading": "Загрузка...", "loading": "Загрузка...",
"unknown": "Неизвестно", "unknown": "Неизвестно",
"date": "Дата", "date": "Дата",
"version": "Версия" "version": "Версия",
"enabled": "Включено",
"disabled": "Отключено"
}, },
"language": { "language": {
"select": "Язык", "select": "Язык",
@@ -178,7 +180,8 @@
"folderSettings": "Настройки папок", "folderSettings": "Настройки папок",
"downloadPathTemplates": "Шаблоны путей загрузки", "downloadPathTemplates": "Шаблоны путей загрузки",
"exampleImages": "Примеры изображений", "exampleImages": "Примеры изображений",
"misc": "Разное" "misc": "Разное",
"metadataArchive": "Архив метаданных"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "Размывать NSFW контент", "blurNsfwContent": "Размывать NSFW контент",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "Включать триггерные слова в синтаксис LoRA", "includeTriggerWords": "Включать триггерные слова в синтаксис LoRA",
"includeTriggerWordsHelp": "Включать обученные триггерные слова при копировании синтаксиса 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": { "loras": {

View File

@@ -16,7 +16,9 @@
"loading": "加载中...", "loading": "加载中...",
"unknown": "未知", "unknown": "未知",
"date": "日期", "date": "日期",
"version": "版本" "version": "版本",
"enabled": "已启用",
"disabled": "已禁用"
}, },
"language": { "language": {
"select": "语言", "select": "语言",
@@ -178,7 +180,8 @@
"folderSettings": "文件夹设置", "folderSettings": "文件夹设置",
"downloadPathTemplates": "下载路径模板", "downloadPathTemplates": "下载路径模板",
"exampleImages": "示例图片", "exampleImages": "示例图片",
"misc": "其他" "misc": "其他",
"metadataArchive": "元数据归档数据库"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "模糊 NSFW 内容", "blurNsfwContent": "模糊 NSFW 内容",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "复制 LoRA 语法时包含触发词", "includeTriggerWords": "复制 LoRA 语法时包含触发词",
"includeTriggerWordsHelp": "复制 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": { "loras": {

View File

@@ -16,7 +16,9 @@
"loading": "載入中...", "loading": "載入中...",
"unknown": "未知", "unknown": "未知",
"date": "日期", "date": "日期",
"version": "版本" "version": "版本",
"enabled": "已啟用",
"disabled": "已停用"
}, },
"language": { "language": {
"select": "語言", "select": "語言",
@@ -178,7 +180,8 @@
"folderSettings": "資料夾設定", "folderSettings": "資料夾設定",
"downloadPathTemplates": "下載路徑範本", "downloadPathTemplates": "下載路徑範本",
"exampleImages": "範例圖片", "exampleImages": "範例圖片",
"misc": "其他" "misc": "其他",
"metadataArchive": "中繼資料封存資料庫"
}, },
"contentFiltering": { "contentFiltering": {
"blurNsfwContent": "模糊 NSFW 內容", "blurNsfwContent": "模糊 NSFW 內容",
@@ -273,6 +276,30 @@
"misc": { "misc": {
"includeTriggerWords": "在 LoRA 語法中包含觸發詞", "includeTriggerWords": "在 LoRA 語法中包含觸發詞",
"includeTriggerWordsHelp": "複製 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": { "loras": {

View File

@@ -611,10 +611,10 @@ class BaseModelRoutes(ABC):
success = 0 success = 0
needs_resort = False needs_resort = False
# Prepare models to process # Prepare models to process, only those without CivitAI data
to_process = [ to_process = [
model for model in cache.raw_data 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) 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 ..config import config
from ..utils.constants import SUPPORTED_MEDIA_EXTENSIONS, NODE_TYPES, DEFAULT_NODE_COLOR from ..utils.constants import SUPPORTED_MEDIA_EXTENSIONS, NODE_TYPES, DEFAULT_NODE_COLOR
from ..services.service_registry import ServiceRegistry 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 from ..services.websocket_manager import ws_manager
import re import re
@@ -736,8 +736,8 @@ class MiscRoutes:
# Update settings to enable metadata archive # Update settings to enable metadata archive
settings.set('enable_metadata_archive_db', True) settings.set('enable_metadata_archive_db', True)
# Update provider priority # Update metadata providers
await update_metadata_provider_priority() await update_metadata_providers()
return web.json_response({ return web.json_response({
'success': True, 'success': True,
@@ -768,8 +768,8 @@ class MiscRoutes:
# Update settings to disable metadata archive # Update settings to disable metadata archive
settings.set('enable_metadata_archive_db', False) settings.set('enable_metadata_archive_db', False)
# Update provider priority # Update metadata providers
await update_metadata_provider_priority() await update_metadata_providers()
return web.json_response({ return web.json_response({
'success': True, 'success': True,
@@ -796,7 +796,6 @@ class MiscRoutes:
is_available = archive_manager.is_database_available() is_available = archive_manager.is_database_available()
is_enabled = settings.get('enable_metadata_archive_db', False) is_enabled = settings.get('enable_metadata_archive_db', False)
priority = settings.get('metadata_provider_priority', 'archive_db')
db_size = 0 db_size = 0
if is_available: if is_available:
@@ -808,7 +807,6 @@ class MiscRoutes:
'success': True, 'success': True,
'isAvailable': is_available, 'isAvailable': is_available,
'isEnabled': is_enabled, 'isEnabled': is_enabled,
'priority': priority,
'databaseSize': db_size, 'databaseSize': db_size,
'databasePath': archive_manager.get_database_path() if is_available else None 'databasePath': archive_manager.get_database_path() if is_available else None
}) })

View File

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

View File

@@ -82,8 +82,7 @@ class SettingsManager:
"civitai_api_key": "", "civitai_api_key": "",
"show_only_sfw": False, "show_only_sfw": False,
"language": "en", "language": "en",
"enable_metadata_archive_db": False, # Enable metadata archive database "enable_metadata_archive_db": False # Enable metadata archive database
"metadata_provider_priority": "archive_db" # Default priority: 'archive_db' or 'civitai_api'
} }
def get(self, key: str, default: Any = None) -> Any: 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.exif_utils import ExifUtils
from ..utils.metadata_manager import MetadataManager from ..utils.metadata_manager import MetadataManager
from ..services.websocket_manager import ws_manager 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__) logger = logging.getLogger(__name__)
@@ -41,13 +41,15 @@ class ModelRouteUtils:
def is_civitai_api_metadata(meta: dict) -> bool: def is_civitai_api_metadata(meta: dict) -> bool:
""" """
Determine if the given civitai metadata is from the civitai API. 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): if not isinstance(meta, dict):
return False return False
files = meta.get('files') files = meta.get('files')
images = meta.get('images') 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 @staticmethod
async def update_model_metadata(metadata_path: str, local_metadata: Dict, 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 # 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): 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: 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)
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 # Special handling for trainedWords - ensure we don't lose any existing trained words
if 'trainedWords' in existing_civitai: if 'trainedWords' in existing_civitai:
existing_trained_words = existing_civitai.get('trainedWords', []) existing_trained_words = existing_civitai.get('trainedWords', [])
@@ -210,8 +217,12 @@ class ModelRouteUtils:
# Check if model metadata exists # Check if model metadata exists
local_metadata = await ModelRouteUtils.load_local_metadata(metadata_path) local_metadata = await ModelRouteUtils.load_local_metadata(metadata_path)
# Get metadata provider and fetch metadata from unified provider if model_data.get('from_civitai') is False:
metadata_provider = await get_default_metadata_provider() # 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) civitai_metadata = await metadata_provider.get_model_by_hash(sha256)
if not civitai_metadata: if not civitai_metadata:
# Mark as not from CivitAI if not found # Mark as not from CivitAI if not found

View File

@@ -850,7 +850,7 @@ export class SettingsManager {
} }
// Special handling for metadata archive settings // 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(); await this.updateMetadataArchiveStatus();
} }
@@ -879,8 +879,6 @@ export class SettingsManager {
state.global.settings.compactMode = (value !== 'default'); state.global.settings.compactMode = (value !== 'default');
} else if (settingKey === 'card_info_display') { } else if (settingKey === 'card_info_display') {
state.global.settings.cardInfoDisplay = value; state.global.settings.cardInfoDisplay = value;
} else if (settingKey === 'metadata_provider_priority') {
state.global.settings.metadata_provider_priority = value;
} else { } else {
// For any other settings that might be added in the future // For any other settings that might be added in the future
state.global.settings[settingKey] = value; state.global.settings[settingKey] = value;
@@ -891,7 +889,7 @@ export class SettingsManager {
try { try {
// For backend settings, make API call // 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 = {}; const payload = {};
if (settingKey === 'download_path_templates') { if (settingKey === 'download_path_templates') {
payload[settingKey] = state.global.settings.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'); 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 // Apply frontend settings immediately
@@ -932,11 +925,6 @@ export class SettingsManager {
showToast('toast.settings.displayDensitySet', { density: densityName }, 'success'); showToast('toast.settings.displayDensitySet', { density: densityName }, 'success');
} }
// Special handling for metadata archive settings
if (settingKey === 'metadata_provider_priority') {
await this.updateMetadataArchiveStatus();
}
} catch (error) { } catch (error) {
showToast('toast.settings.settingSaveFailed', { message: error.message }, '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; 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 // Load status
await this.updateMetadataArchiveStatus(); await this.updateMetadataArchiveStatus();
} catch (error) { } catch (error) {
@@ -987,12 +970,6 @@ export class SettingsManager {
${status.isEnabled ? translate('common.status.enabled') : translate('common.status.disabled')} ${status.isEnabled ? translate('common.status.enabled') : translate('common.status.disabled')}
</span> </span>
</div> </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 // Update button states

View File

@@ -419,23 +419,6 @@
</div> </div>
</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="setting-item">
<div class="metadata-archive-status" id="metadataArchiveStatus"> <div class="metadata-archive-status" id="metadataArchiveStatus">
<!-- Status will be populated by JavaScript --> <!-- Status will be populated by JavaScript -->