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:
@@ -522,4 +522,69 @@ export const settings = {
|
||||
floatingPlayerBarSub: 'Păstrează bara playerului plutind deasupra conținutului',
|
||||
uiScaleTitle: 'Scara interfaței',
|
||||
uiScaleLabel: 'Zoom',
|
||||
confirmDeleteServerLibrary: 'Ștergi și indexul local al bibliotecii pentru acest server? Apasă Anulează pentru a păstra copia din cache pentru utilizare offline.',
|
||||
analyticsStrategyTitle: 'Strategii de analiză',
|
||||
analyticsStrategyDesc: 'Alege stilul de analiză pentru bibliotecă.',
|
||||
analyticsStrategyLabel: 'Strategie',
|
||||
analyticsStrategyLazy: 'Leneșă',
|
||||
analyticsStrategyLazyDesc: 'Analizează doar când piesele sunt redate sau intră în cache-ul hot/offline — consum minim de CPU și rețea.',
|
||||
analyticsStrategyAdvanced: 'Agresivă',
|
||||
analyticsStrategyAdvancedDesc: 'Scanare de fundal mai agresivă. După finalizare, primești BPM pentru toate piesele și încărcare instantă pentru loudness și waveform.',
|
||||
analyticsStrategyPriorityTitle: 'Prioritate analiză (mereu activă)',
|
||||
analyticsStrategyPriorityHigh: '1 — Redare curentă: descarcă și analizează mai întâi (bytes de playback, loudness backfill sau HTTP când e nevoie).',
|
||||
analyticsStrategyPriorityMiddle: '2 — Urmează: următoarele ~5 piese din coadă, preload pentru următoarea și vecinii din hot-cache — analiză din cache/descărcări când se poate; backfill HTTP doar la miss.',
|
||||
analyticsStrategyPriorityLow: '3 — Lot bibliotecă (doar Agresivă): coadă automată în fundal la final; reumplere pe watermark (~3× workers) fără a aștepta golirea cozii.',
|
||||
analyticsStrategyServerLabel: 'Server',
|
||||
analyticsStrategyProgressLabel: 'Progres analiză:',
|
||||
analyticsStrategyProgressValue: '{{percent}}% ({{done}}/{{total}})',
|
||||
analyticsStrategyActionsLabel: 'Acțiuni',
|
||||
analyticsStrategyParallelismLabel: 'Workeri paraleli',
|
||||
analyticsStrategyParallelismValue: '{{n}} thread-uri',
|
||||
analyticsStrategyParallelismDesc: 'Câte piese se descarcă și se analizează simultan (HTTP + CPU). Valori mai mari accelerează procesarea bibliotecii, dar folosesc mai multă rețea și CPU.',
|
||||
analyticsStrategyAdvancedWarning: 'Modul agresiv folosește mai mult CPU și lățime de bandă cât timp lotul bibliotecii rulează în fundal.',
|
||||
analyticsStrategyServerRemoved: 'Server eliminat',
|
||||
analyticsStrategyClearAction: 'Șterge analiza',
|
||||
analyticsStrategyClearTitle: 'Ștergi analiza?',
|
||||
analyticsStrategyClearDesc: 'Ștergerea analizei pentru {{server}} elimină waveforms și loudness din cache. Dacă readaugi serverul mai târziu, poate necesita reindexare îndelungată.',
|
||||
analyticsStrategyClearCancel: 'Anulează',
|
||||
analyticsStrategyClearConfirm: 'Șterge analiza',
|
||||
analyticsStrategyClearSuccess: 'Analiza a fost ștearsă pentru serverul eliminat.',
|
||||
analyticsStrategyClearError: 'Nu s-a putut șterge analiza pentru serverul eliminat.',
|
||||
analyticsStrategyProgressEmptyAfterFailed: '100% (0/0, blocat de piese eșuate)',
|
||||
analyticsFailedTracksOpenTitle: 'Piese eșuate: {{count}}',
|
||||
analyticsFailedTracksTitle: 'Piese cu analiză eșuată — {{server}}',
|
||||
analyticsFailedTracksDesc: 'Aceste piese au eșuat repetat la decode/enrichment și sunt excluse din analiza automată în fundal.',
|
||||
analyticsFailedTracksLoading: 'Se încarcă lista pieselor eșuate…',
|
||||
analyticsFailedTracksEmpty: 'Nu există piese eșuate pentru acest server.',
|
||||
analyticsFailedTracksClose: 'Închide',
|
||||
analyticsFailedTracksExport: 'Exportă lista',
|
||||
analyticsFailedTracksExportSuccess: 'Lista pieselor eșuate a fost exportată ({{count}}).',
|
||||
analyticsFailedTracksExportError: 'Nu s-a putut exporta lista pieselor eșuate.',
|
||||
analyticsFailedTracksRescan: 'Rescan pentru piese eșuate',
|
||||
analyticsFailedTracksRescanSuccess: 'Rescan programat pentru {{count}} piese eșuate.',
|
||||
analyticsFailedTracksRescanError: 'Nu s-a putut porni rescan-ul pentru piesele eșuate.',
|
||||
analyticsFailedTracksLoadError: 'Nu s-au putut încărca piesele eșuate.',
|
||||
backupImportAny: 'Importă backup',
|
||||
backupImportAnyConfirm: 'Importă fișierul de backup selectat și aplică conținutul (setări, baze de date bibliotecă sau complet). Continui?',
|
||||
backupModeFull: 'Complet',
|
||||
backupModeLibrary: 'Baze de date bibliotecă',
|
||||
backupModeConfig: 'Configurație',
|
||||
backupFullDesc: 'Arhivează setările și bazele de date ale bibliotecii într-un singur fișier backup.',
|
||||
backupFullExport: 'Exportă backup complet',
|
||||
backupFullImport: 'Importă backup complet',
|
||||
backupFullImportConfirm: 'Acest lucru va suprascrie setările, va înlocui bazele de date curente și le va muta în .bak. Continui?',
|
||||
backupFullExportSuccess: 'Backup complet exportat.',
|
||||
backupFullImportSuccess: 'Backup complet importat — reîncărcare…',
|
||||
backupFullImportError: 'Nu s-a putut importa backup-ul complet.',
|
||||
backupLibraryExport: 'Exportă bazele de date',
|
||||
backupLibraryExportDesc: 'Creează o arhivă comprimată cu snapshot-uri SQLite curate ale bazelor de date de bibliotecă.',
|
||||
backupLibraryImport: 'Importă bazele de date',
|
||||
backupLibraryImportDesc: 'Restaurează bazele de date ale bibliotecii dintr-un fișier arhivă. Bazele curente sunt mutate în .bak înainte de comutare.',
|
||||
backupLibraryImportConfirm: 'Acest lucru va înlocui bazele de date curente și le va muta în .bak. Continui?',
|
||||
backupLibraryExportSuccess: 'Backup-ul bazelor de date a fost exportat.',
|
||||
backupLibraryImportSuccess: 'Backup-ul bazelor de date a fost importat.',
|
||||
backupLibraryImportError: 'Nu s-a putut importa backup-ul bazelor de date.',
|
||||
backupOverlayExportTitle: 'Se creează backup-ul…',
|
||||
backupOverlayImportTitle: 'Se restaurează backup-ul…',
|
||||
backupOverlayHint: 'Poți lăsa fereastra deschisă cât timp procesăm fișierele. Introducerea este blocată temporar.',
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user