mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
fix(library): multi-genre local index with track_genre and backfill (#1059)
* fix(library): multi-genre local index with track_genre and backfill Restore atomic genre browse, filters, and counts via track_genre: OpenSubsonic genres[] first with Navidrome-default split fallback, sync write path, read-path query switches, blocking startup backfill with progress, and v12 repair migration for DBs that recorded legacy 002–011. TS fallback adds genreTagsFor and migration gate i18n across locales. * fix(library): address multi-genre review — robust TS genres and scope join genreTagsFor routes raw genres through parseItemGenres (single-object Subsonic quirk and bare strings). Library-scoped genre browse/counts join track for raw_json library_id fallback. Statistics keeps empty-genre bucket. * docs: CHANGELOG and credits for multi-genre local index (PR #1059) * docs(changelog): credit HiveMind on Discord for multi-genre report (PR #1059)
This commit is contained in:
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const deTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const deTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Datenaktualisierung wird vorbereitet…',
|
||||
preparingBody: 'Bibliothek und Analyse-Cache werden geprüft…',
|
||||
migrating: 'Daten werden migriert',
|
||||
working: 'wird ausgeführt…',
|
||||
skippedRows: 'Einträge entfernter Server wurden übersprungen; die alte Sicherungs-DB wird nach erfolgreichem Wechsel entfernt.',
|
||||
failed: 'Migration fehlgeschlagen',
|
||||
retry: 'Erneut versuchen',
|
||||
copyDetails: 'Details kopieren',
|
||||
complete: 'Aktualisierung abgeschlossen',
|
||||
completeRows: '{{count}} Zeilen migriert',
|
||||
genreTagsTitle: 'Genre-Index wird aktualisiert…',
|
||||
genreTagsBody: 'Genres werden für Durchsuchen und Filter indexiert. Läuft einmal nach dem Update.',
|
||||
genreTagsFailed: 'Genre-Index-Aktualisierung fehlgeschlagen',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const enTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const enTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Preparing data update…',
|
||||
preparingBody: 'Looking at your library and analysis cache…',
|
||||
migrating: 'Migrating data',
|
||||
working: 'working…',
|
||||
skippedRows: 'Rows for removed servers were skipped and old backup DB will be removed after successful switch.',
|
||||
failed: 'Migration failed',
|
||||
retry: 'Retry',
|
||||
copyDetails: 'Copy details',
|
||||
complete: 'Update complete',
|
||||
completeRows: '{{count}} rows migrated',
|
||||
genreTagsTitle: 'Updating genre index…',
|
||||
genreTagsBody: 'Indexing genres for browse and filters. This runs once after upgrade.',
|
||||
genreTagsFailed: 'Genre index update failed',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const esTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const esTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Preparando actualización de datos…',
|
||||
preparingBody: 'Revisando la biblioteca local y la caché de análisis…',
|
||||
migrating: 'Migrando datos',
|
||||
working: 'en curso…',
|
||||
skippedRows: 'Se omitieron filas de servidores eliminados; la copia de seguridad antigua se eliminará tras el cambio exitoso.',
|
||||
failed: 'Error en la migración',
|
||||
retry: 'Reintentar',
|
||||
copyDetails: 'Copiar detalles',
|
||||
complete: 'Actualización completada',
|
||||
completeRows: '{{count}} filas migradas',
|
||||
genreTagsTitle: 'Actualizando índice de géneros…',
|
||||
genreTagsBody: 'Indexando géneros para exploración y filtros. Se ejecuta una vez tras la actualización.',
|
||||
genreTagsFailed: 'Error al actualizar el índice de géneros',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const frTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const frTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Préparation de la mise à jour des données…',
|
||||
preparingBody: 'Analyse de la bibliothèque locale et du cache d\'analyse…',
|
||||
migrating: 'Migration des données',
|
||||
working: 'en cours…',
|
||||
skippedRows: 'Les entrées des serveurs supprimés ont été ignorées ; l\'ancienne sauvegarde sera supprimée après le basculement.',
|
||||
failed: 'Échec de la migration',
|
||||
retry: 'Réessayer',
|
||||
copyDetails: 'Copier les détails',
|
||||
complete: 'Mise à jour terminée',
|
||||
completeRows: '{{count}} lignes migrées',
|
||||
genreTagsTitle: 'Mise à jour de l\'index des genres…',
|
||||
genreTagsBody: 'Indexation des genres pour la navigation et les filtres. Exécuté une fois après la mise à jour.',
|
||||
genreTagsFailed: 'Échec de la mise à jour de l\'index des genres',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const nbTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const nbTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Forbereder dataoppdatering…',
|
||||
preparingBody: 'Ser på biblioteket og analysebufferen…',
|
||||
migrating: 'Migrerer data',
|
||||
working: 'arbeider…',
|
||||
skippedRows: 'Rader for fjernede servere ble hoppet over; gammel sikkerhetskopi fjernes etter vellykket bytte.',
|
||||
failed: 'Migrering mislyktes',
|
||||
retry: 'Prøv igjen',
|
||||
copyDetails: 'Kopier detaljer',
|
||||
complete: 'Oppdatering fullført',
|
||||
completeRows: '{{count}} rader migrert',
|
||||
genreTagsTitle: 'Oppdaterer sjangerindeks…',
|
||||
genreTagsBody: 'Indekserer sjangre for blaing og filtre. Kjøres én gang etter oppgradering.',
|
||||
genreTagsFailed: 'Oppdatering av sjangerindeks mislyktes',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const nlTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const nlTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Gegevensupdate voorbereiden…',
|
||||
preparingBody: 'Bibliotheek en analysecache controleren…',
|
||||
migrating: 'Gegevens migreren',
|
||||
working: 'bezig…',
|
||||
skippedRows: 'Rijen van verwijderde servers zijn overgeslagen; oude back-up wordt na succesvolle switch verwijderd.',
|
||||
failed: 'Migratie mislukt',
|
||||
retry: 'Opnieuw',
|
||||
copyDetails: 'Details kopiëren',
|
||||
complete: 'Update voltooid',
|
||||
completeRows: '{{count}} rijen gemigreerd',
|
||||
genreTagsTitle: 'Genre-index bijwerken…',
|
||||
genreTagsBody: 'Genres indexeren voor bladeren en filters. Eenmalig na de update.',
|
||||
genreTagsFailed: 'Genre-index bijwerken mislukt',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const roTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const roTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Se pregătește actualizarea datelor…',
|
||||
preparingBody: 'Se verifică biblioteca locală și cache-ul de analiză…',
|
||||
migrating: 'Migrare date',
|
||||
working: 'în curs…',
|
||||
skippedRows: 'Rândurile pentru serverele eliminate au fost omise; backup-ul vechi va fi șters după comutare.',
|
||||
failed: 'Migrarea a eșuat',
|
||||
retry: 'Reîncearcă',
|
||||
copyDetails: 'Copiază detaliile',
|
||||
complete: 'Actualizare finalizată',
|
||||
completeRows: '{{count}} rânduri migrate',
|
||||
genreTagsTitle: 'Se actualizează indexul de genuri…',
|
||||
genreTagsBody: 'Se indexează genurile pentru navigare și filtre. Rulează o dată după actualizare.',
|
||||
genreTagsFailed: 'Actualizarea indexului de genuri a eșuat',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const ruTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const ruTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: 'Подготовка обновления данных…',
|
||||
preparingBody: 'Проверяем локальную библиотеку и кэш анализа…',
|
||||
migrating: 'Миграция данных',
|
||||
working: 'выполняется…',
|
||||
skippedRows: 'Записи удалённых серверов пропущены; резервная БД будет удалена после успешного переключения.',
|
||||
failed: 'Миграция не удалась',
|
||||
retry: 'Повторить',
|
||||
copyDetails: 'Копировать детали',
|
||||
complete: 'Обновление завершено',
|
||||
completeRows: 'Перенесено строк: {{count}}',
|
||||
genreTagsTitle: 'Обновление индекса жанров…',
|
||||
genreTagsBody: 'Индексируем жанры для просмотра и фильтров. Выполняется один раз после обновления.',
|
||||
genreTagsFailed: 'Не удалось обновить индекс жанров',
|
||||
};
|
||||
@@ -42,6 +42,7 @@ import { deviceSync } from './deviceSync';
|
||||
import { orbit } from './orbit';
|
||||
import { tray } from './tray';
|
||||
import { licenses } from './licenses';
|
||||
import { migration } from './migration';
|
||||
|
||||
export const zhTranslation = {
|
||||
sidebar,
|
||||
@@ -88,4 +89,5 @@ export const zhTranslation = {
|
||||
orbit,
|
||||
tray,
|
||||
licenses,
|
||||
migration,
|
||||
};
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
export const migration = {
|
||||
preparing: '正在准备数据更新…',
|
||||
preparingBody: '正在检查本地曲库和分析缓存…',
|
||||
migrating: '正在迁移数据',
|
||||
working: '处理中…',
|
||||
skippedRows: '已跳过已移除服务器的记录;切换成功后将删除旧备份数据库。',
|
||||
failed: '迁移失败',
|
||||
retry: '重试',
|
||||
copyDetails: '复制详情',
|
||||
complete: '更新完成',
|
||||
completeRows: '已迁移 {{count}} 行',
|
||||
genreTagsTitle: '正在更新流派索引…',
|
||||
genreTagsBody: '正在为浏览和筛选建立流派索引。升级后仅运行一次。',
|
||||
genreTagsFailed: '流派索引更新失败',
|
||||
};
|
||||
Reference in New Issue
Block a user