feat: Add recipe metadata repair functionality with UI, API, and progress tracking.

This commit is contained in:
Will Miao
2025-12-23 21:50:58 +08:00
parent 00e6904664
commit 6330c65d41
20 changed files with 1005 additions and 60 deletions

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "Recipe-Daten reparieren",
"loading": "Recipe-Daten werden repariert...",
"success": "{count} Rezepte erfolgreich repariert.",
"error": "Recipe-Reparatur fehlgeschlagen: {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "Vorschau ersetzen",
"setContentRating": "Inhaltsbewertung festlegen",
"moveToFolder": "In Ordner verschieben",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "Modell ausschließen",
"deleteModel": "Modell löschen",
"shareRecipe": "Rezept teilen",
@@ -635,6 +642,13 @@
"noMissingLoras": "Keine fehlenden LoRAs zum Herunterladen",
"getInfoFailed": "Fehler beim Abrufen der Informationen für fehlende LoRAs",
"prepareError": "Fehler beim Vorbereiten der LoRAs für den Download: {message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "Repair recipes data",
"loading": "Repairing recipe data...",
"success": "Successfully repaired {count} recipes.",
"error": "Recipe repair failed: {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "Replace Preview",
"setContentRating": "Set Content Rating",
"moveToFolder": "Move to Folder",
"repairMetadata": "Repair metadata",
"excludeModel": "Exclude Model",
"deleteModel": "Delete Model",
"shareRecipe": "Share Recipe",
@@ -635,6 +642,13 @@
"noMissingLoras": "No missing LoRAs to download",
"getInfoFailed": "Failed to get information for missing LoRAs",
"prepareError": "Error preparing LoRAs for download: {message}"
},
"repair": {
"starting": "Repairing recipe metadata...",
"success": "Recipe metadata repaired successfully",
"skipped": "Recipe already at latest version, no repair needed",
"failed": "Failed to repair recipe: {message}",
"missingId": "Cannot repair recipe: Missing recipe ID"
}
}
},

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "Reparar datos de recetas",
"loading": "Reparando datos de recetas...",
"success": "Se repararon con éxito {count} recetas.",
"error": "Error al reparar recetas: {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "Reemplazar vista previa",
"setContentRating": "Establecer clasificación de contenido",
"moveToFolder": "Mover a carpeta",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "Excluir modelo",
"deleteModel": "Eliminar modelo",
"shareRecipe": "Compartir receta",
@@ -635,6 +642,13 @@
"noMissingLoras": "No hay LoRAs faltantes para descargar",
"getInfoFailed": "Error al obtener información de LoRAs faltantes",
"prepareError": "Error preparando LoRAs para descarga: {message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "Réparer les données de recettes",
"loading": "Réparation des données de recettes...",
"success": "{count} recettes réparées avec succès.",
"error": "Échec de la réparation des recettes : {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "Remplacer l'aperçu",
"setContentRating": "Définir la classification du contenu",
"moveToFolder": "Déplacer vers un dossier",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "Exclure le modèle",
"deleteModel": "Supprimer le modèle",
"shareRecipe": "Partager la recipe",
@@ -635,6 +642,13 @@
"noMissingLoras": "Aucun LoRA manquant à télécharger",
"getInfoFailed": "Échec de l'obtention des informations pour les LoRAs manquants",
"prepareError": "Erreur lors de la préparation des LoRAs pour le téléchargement : {message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "תיקון נתוני מתכונים",
"loading": "מתקן נתוני מתכונים...",
"success": "תוקנו בהצלחה {count} מתכונים.",
"error": "תיקון המתכונים נכשל: {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "החלף תצוגה מקדימה",
"setContentRating": "הגדר דירוג תוכן",
"moveToFolder": "העבר לתיקייה",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "החרג מודל",
"deleteModel": "מחק מודל",
"shareRecipe": "שתף מתכון",
@@ -635,6 +642,13 @@
"noMissingLoras": "אין LoRAs חסרים להורדה",
"getInfoFailed": "קבלת מידע עבור LoRAs חסרים נכשלה",
"prepareError": "שגיאה בהכנת LoRAs להורדה: {message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "レシピデータの修復",
"loading": "レシピデータを修復中...",
"success": "{count} 件のレシピを正常に修復しました。",
"error": "レシピの修復に失敗しました: {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "プレビューを置換",
"setContentRating": "コンテンツレーティングを設定",
"moveToFolder": "フォルダに移動",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "モデルを除外",
"deleteModel": "モデルを削除",
"shareRecipe": "レシピを共有",
@@ -635,6 +642,13 @@
"noMissingLoras": "ダウンロードする不足LoRAがありません",
"getInfoFailed": "不足LoRAの情報取得に失敗しました",
"prepareError": "ダウンロード用LoRAの準備中にエラー{message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "레시피 데이터 복구",
"loading": "레시피 데이터 복구 중...",
"success": "{count}개의 레시피가 성공적으로 복구되었습니다.",
"error": "레시피 복구 실패: {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "미리보기 교체",
"setContentRating": "콘텐츠 등급 설정",
"moveToFolder": "폴더로 이동",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "모델 제외",
"deleteModel": "모델 삭제",
"shareRecipe": "레시피 공유",
@@ -635,6 +642,13 @@
"noMissingLoras": "다운로드할 누락된 LoRA가 없습니다",
"getInfoFailed": "누락된 LoRA 정보를 가져오는데 실패했습니다",
"prepareError": "LoRA 다운로드 준비 중 오류: {message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "Восстановить данные рецептов",
"loading": "Восстановление данных рецептов...",
"success": "Успешно восстановлено {count} рецептов.",
"error": "Ошибка восстановления рецептов: {message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "Заменить превью",
"setContentRating": "Установить рейтинг контента",
"moveToFolder": "Переместить в папку",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "Исключить модель",
"deleteModel": "Удалить модель",
"shareRecipe": "Поделиться рецептом",
@@ -635,6 +642,13 @@
"noMissingLoras": "Нет отсутствующих LoRAs для загрузки",
"getInfoFailed": "Не удалось получить информацию для отсутствующих LoRAs",
"prepareError": "Ошибка подготовки LoRAs для загрузки: {message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}

View File

@@ -159,6 +159,12 @@
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
},
"repairRecipes": {
"label": "修复配方数据",
"loading": "正在修复配方数据...",
"success": "成功修复了 {count} 个配方。",
"error": "配方修复失败:{message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "替换预览",
"setContentRating": "设置内容评级",
"moveToFolder": "移动到文件夹",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "排除模型",
"deleteModel": "删除模型",
"shareRecipe": "分享配方",
@@ -635,6 +642,13 @@
"noMissingLoras": "没有缺失的 LoRA 可下载",
"getInfoFailed": "获取缺失 LoRA 信息失败",
"prepareError": "准备下载 LoRA 时出错:{message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "浏览器插件教程"
}
}
}
}

View File

@@ -154,11 +154,17 @@
"error": "清理範例圖片資料夾失敗:{message}"
},
"fetchMissingLicenses": {
"label": "Refresh license metadata",
"loading": "Refreshing license metadata for {typePlural}...",
"success": "Updated license metadata for {count} {typePlural}",
"none": "All {typePlural} already have license metadata",
"error": "Failed to refresh license metadata for {typePlural}: {message}"
"label": "重新整理授權中繼資料",
"loading": "正在重新整理 {typePlural} 的授權中繼資料...",
"success": "已更新 {count} {typePlural} 的授權中繼資料",
"none": "所有 {typePlural} 已具備授權中繼資料",
"error": "重新整理 {typePlural} 授權中繼資料失敗:{message}"
},
"repairRecipes": {
"label": "修復配方資料",
"loading": "正在修復配方資料...",
"success": "成功修復 {count} 個配方。",
"error": "配方修復失敗:{message}"
}
},
"header": {
@@ -520,6 +526,7 @@
"replacePreview": "更換預覽圖",
"setContentRating": "設定內容分級",
"moveToFolder": "移動到資料夾",
"repairMetadata": "[TODO: Translate] Repair metadata",
"excludeModel": "排除模型",
"deleteModel": "刪除模型",
"shareRecipe": "分享配方",
@@ -635,6 +642,13 @@
"noMissingLoras": "無缺少的 LoRA 可下載",
"getInfoFailed": "取得缺少 LoRA 資訊失敗",
"prepareError": "準備下載 LoRA 時發生錯誤:{message}"
},
"repair": {
"starting": "[TODO: Translate] Repairing recipe metadata...",
"success": "[TODO: Translate] Recipe metadata repaired successfully",
"skipped": "[TODO: Translate] Recipe already at latest version, no repair needed",
"failed": "[TODO: Translate] Failed to repair recipe: {message}",
"missingId": "[TODO: Translate] Cannot repair recipe: Missing recipe ID"
}
}
},
@@ -1498,4 +1512,4 @@
"learnMore": "LM Civitai Extension Tutorial"
}
}
}
}