mirror of
https://github.com/Psychotoxical/psysonic.git
synced 2026-07-21 23:05:46 +00:00
fix(analysis): persist failed tracks and reconcile progress counts (#867)
* fix(analysis): persist failed-track suppression and reduce aggressive polling Persist unsupported/broken analysis tracks as failed entries and expose them in Settings with track metadata, export, and targeted rescan actions. Also make aggressive-mode completion checks cheap by gating re-entry on live track-count changes with a startup seed and 5-minute recheck cadence. * fix(analysis): mark unsupported decode tracks as failed in cpu-seed When full-seed falls back to waveform-only (no EBU loudness) or enrichment decode fails, persist analysis_track status as failed so aggressive backfill does not requeue the same unsupported tracks indefinitely. * fix(analysis): reconcile legacy ready tracks without loudness Auto-mark legacy ready tracks that only miss loudness as failed during needs-work checks so analysis progress converges instead of staying permanently pending. * docs(changelog): add failed-analysis recovery notes for PR 867 Document persistent failed-track handling, analytics strategy controls, and low-cost aggressive-mode recheck behavior in the 1.47.0 changelog. * fix(i18n): align settings locale coverage across all languages Sync missing Settings keys for all shipped locales and replace recent English fallbacks with localized strings so analytics and backup UI text stays consistent outside en/ru.
This commit is contained in:
@@ -520,4 +520,71 @@ export const settings = {
|
||||
floatingPlayerBarSub: 'Player-Leiste über dem Inhalt schweben lassen',
|
||||
uiScaleTitle: 'Interface-Skalierung',
|
||||
uiScaleLabel: 'Zoom',
|
||||
waveformCacheClearBtn: 'Waveform-Cache leeren',
|
||||
waveformCacheCleared: 'Waveform-Cache geleert ({{count}} Zeilen).',
|
||||
waveformCacheClearFailed: 'Waveform-Cache konnte nicht geleert werden.',
|
||||
analyticsStrategyTitle: 'Analysestrategien',
|
||||
analyticsStrategyDesc: 'Wähle den Analysemodus für die Bibliothek.',
|
||||
analyticsStrategyLabel: 'Strategie',
|
||||
analyticsStrategyLazy: 'Lazy',
|
||||
analyticsStrategyLazyDesc: 'Analysiert nur, wenn Tracks abgespielt werden oder in den Hot-/Offline-Cache kommen — minimale CPU- und Netzlast.',
|
||||
analyticsStrategyAdvanced: 'Aggressiv',
|
||||
analyticsStrategyAdvancedDesc: 'Aggressiver Hintergrundscan. Nach Abschluss erhältst du BPM für alle Tracks sowie sofort verfügbare Loudness- und Waveform-Daten.',
|
||||
analyticsStrategyPriorityTitle: 'Analyse-Priorität (immer aktiv)',
|
||||
analyticsStrategyPriorityHigh: '1 — Aktuell laufender Track: zuerst herunterladen und analysieren (Playback-Bytes, Loudness-Backfill oder HTTP falls nötig).',
|
||||
analyticsStrategyPriorityMiddle: '2 — Als Nächstes: die nächsten ~5 Queue-Tracks, Preload-next und Hot-Cache-Nachbarn — Analyse bevorzugt aus Cache/Downloads; HTTP-Backfill nur bei Miss.',
|
||||
analyticsStrategyPriorityLow: '3 — Bibliotheks-Batch (nur Aggressiv): automatische Hintergrund-Queue am Ende; wird per Watermark (~3× Worker) nachgefüllt, ohne auf eine leere Queue zu warten.',
|
||||
analyticsStrategyServerLabel: 'Server',
|
||||
analyticsStrategyProgressLabel: 'Analysefortschritt:',
|
||||
analyticsStrategyProgressValue: '{{percent}}% ({{done}}/{{total}})',
|
||||
analyticsStrategyActionsLabel: 'Aktionen',
|
||||
analyticsStrategyParallelismLabel: 'Parallele Worker',
|
||||
analyticsStrategyParallelismValue: '{{n}} Threads',
|
||||
analyticsStrategyParallelismDesc: 'Wie viele Tracks gleichzeitig heruntergeladen und analysiert werden (HTTP + CPU). Höhere Werte beschleunigen das Aufholen der Bibliothek, nutzen aber mehr Netz und CPU.',
|
||||
analyticsStrategyAdvancedWarning: 'Aggressiv nutzt mehr CPU und Netzwerkbandbreite, während der Bibliotheks-Batch im Hintergrund läuft.',
|
||||
analyticsStrategyServerRemoved: 'Entfernter Server',
|
||||
analyticsStrategyClearAction: 'Analyse löschen',
|
||||
analyticsStrategyClearTitle: 'Analyse löschen?',
|
||||
analyticsStrategyClearDesc: 'Das Löschen der Analyse für {{server}} entfernt zwischengespeicherte Waveforms und Loudness-Daten. Beim späteren erneuten Hinzufügen kann eine lange Neuindizierung nötig sein.',
|
||||
analyticsStrategyClearCancel: 'Abbrechen',
|
||||
analyticsStrategyClearConfirm: 'Analyse löschen',
|
||||
analyticsStrategyClearSuccess: 'Analyse für den entfernten Server wurde gelöscht.',
|
||||
analyticsStrategyClearError: 'Analyse für den entfernten Server konnte nicht gelöscht werden.',
|
||||
analyticsStrategyProgressEmptyAfterFailed: '100% (0/0, durch fehlgeschlagene Tracks blockiert)',
|
||||
analyticsFailedTracksOpenTitle: 'Fehlgeschlagene Tracks: {{count}}',
|
||||
analyticsFailedTracksTitle: 'Fehlgeschlagene Analyse-Tracks — {{server}}',
|
||||
analyticsFailedTracksDesc: 'Diese Tracks sind bei Decode/Enrichment wiederholt fehlgeschlagen und vom automatischen Hintergrund-Analyseprozess ausgeschlossen.',
|
||||
analyticsFailedTracksLoading: 'Liste fehlgeschlagener Tracks wird geladen…',
|
||||
analyticsFailedTracksEmpty: 'Für diesen Server gibt es keine fehlgeschlagenen Tracks.',
|
||||
analyticsFailedTracksClose: 'Schließen',
|
||||
analyticsFailedTracksExport: 'Liste exportieren',
|
||||
analyticsFailedTracksExportSuccess: 'Liste fehlgeschlagener Tracks exportiert ({{count}}).',
|
||||
analyticsFailedTracksExportError: 'Liste fehlgeschlagener Tracks konnte nicht exportiert werden.',
|
||||
analyticsFailedTracksRescan: 'Fehlgeschlagene Tracks neu scannen',
|
||||
analyticsFailedTracksRescanSuccess: 'Neu-Scan für {{count}} fehlgeschlagene Tracks eingeplant.',
|
||||
analyticsFailedTracksRescanError: 'Neu-Scan fehlgeschlagener Tracks konnte nicht gestartet werden.',
|
||||
analyticsFailedTracksLoadError: 'Fehlgeschlagene Tracks konnten nicht geladen werden.',
|
||||
backupImportAny: 'Backup importieren',
|
||||
backupImportAnyConfirm: 'Ausgewählte Backup-Datei importieren und Inhalt anwenden (Einstellungen, Bibliotheksdatenbanken oder vollständig). Fortfahren?',
|
||||
backupModeFull: 'Vollständig',
|
||||
backupModeLibrary: 'Bibliotheksdatenbanken',
|
||||
backupModeConfig: 'Konfiguration',
|
||||
backupFullDesc: 'Archiviert Einstellungen und Bibliotheksdatenbanken in einer Backup-Datei.',
|
||||
backupFullExport: 'Vollständiges Backup exportieren',
|
||||
backupFullImport: 'Vollständiges Backup importieren',
|
||||
backupFullImportConfirm: 'Dadurch werden Einstellungen überschrieben, aktuelle Bibliotheksdatenbanken ersetzt und nach .bak verschoben. Fortfahren?',
|
||||
backupFullExportSuccess: 'Vollständiges Backup exportiert.',
|
||||
backupFullImportSuccess: 'Vollständiges Backup importiert — lade neu…',
|
||||
backupFullImportError: 'Vollständiges Backup konnte nicht importiert werden.',
|
||||
backupLibraryExport: 'Datenbanken exportieren',
|
||||
backupLibraryExportDesc: 'Erstellt ein komprimiertes Archiv mit sauberen SQLite-Snapshots der Bibliotheksdatenbanken.',
|
||||
backupLibraryImport: 'Datenbanken importieren',
|
||||
backupLibraryImportDesc: 'Stellt Bibliotheksdatenbanken aus einer Archivdatei wieder her. Aktuelle Datenbanken werden vor dem Wechsel nach .bak verschoben.',
|
||||
backupLibraryImportConfirm: 'Dadurch werden aktuelle Bibliotheksdatenbanken ersetzt und nach .bak verschoben. Fortfahren?',
|
||||
backupLibraryExportSuccess: 'Datenbank-Backup exportiert.',
|
||||
backupLibraryImportSuccess: 'Datenbank-Backup importiert.',
|
||||
backupLibraryImportError: 'Datenbank-Backup konnte nicht importiert werden.',
|
||||
backupOverlayExportTitle: 'Backup wird erstellt…',
|
||||
backupOverlayImportTitle: 'Backup wird wiederhergestellt…',
|
||||
backupOverlayHint: 'Das Fenster kann geöffnet bleiben, während wir Dateien verarbeiten. Eingaben sind vorübergehend gesperrt.',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user