diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 7a87881a..e1ce3b4d 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -3914,6 +3914,18 @@ abstract class AppLocalizations { /// **'Cover art extracted from local music files. Will re-extract on next scan.'** String get cacheLibraryCoverDesc; + /// Cache item title for saved audio analysis results + /// + /// In en, this message translates to: + /// **'Audio analysis cache'** + String get cacheAudioAnalysis; + + /// Description of what audio analysis cache contains + /// + /// In en, this message translates to: + /// **'Saved spectrograms and analysis results. Will re-analyze on next open.'** + String get cacheAudioAnalysisDesc; + /// Cache item title for explore home feed cache /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_ar.dart b/lib/l10n/app_localizations_ar.dart index 6f2c0d5a..0563aec4 100644 --- a/lib/l10n/app_localizations_ar.dart +++ b/lib/l10n/app_localizations_ar.dart @@ -2185,6 +2185,13 @@ class AppLocalizationsAr extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 259b6e5c..9585a914 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -2213,6 +2213,13 @@ class AppLocalizationsDe extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover aus lokalen Musikdateien extrahiert. Wird beim nächsten Scannen neu extrahiert.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Feed-Cache entdecken'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 2f11ded2..bfed6eae 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -2185,6 +2185,13 @@ class AppLocalizationsEn extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 5de1d0c1..ffaf5fb7 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -2185,6 +2185,13 @@ class AppLocalizationsEs extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index f6f5b843..ded7268a 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -2243,6 +2243,13 @@ class AppLocalizationsFr extends AppLocalizations { String get cacheLibraryCoverDesc => 'Pochettes extraites des fichiers musicaux locaux. Elles seront extraites à nouveau lors de la prochaine analyse.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explorer le cache des flux'; diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 9b7c42d4..d46c9632 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -2185,6 +2185,13 @@ class AppLocalizationsHi extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index fe785eb8..5412f2c5 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -2194,6 +2194,13 @@ class AppLocalizationsId extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 3ca1d790..bc44df1b 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -2174,6 +2174,13 @@ class AppLocalizationsJa extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 1af73c71..59991ea9 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -2123,6 +2123,13 @@ class AppLocalizationsKo extends AppLocalizations { String get cacheLibraryCoverDesc => '로컬 음악 파일에서 표지 이미지를 추출하였습니다. 다음 스캔 시 다시 추출합니다'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => '탐색 피드 캐시'; diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 3b88b7e2..461222f2 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -2185,6 +2185,13 @@ class AppLocalizationsNl extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 3ab24ed0..30605216 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -2185,6 +2185,13 @@ class AppLocalizationsPt extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index b64635a8..dd0820b6 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -2214,6 +2214,13 @@ class AppLocalizationsRu extends AppLocalizations { String get cacheLibraryCoverDesc => 'Обложка извлечена из локальных музыкальных файлов. Будет повторно извлечено при следующем сканировании.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Просмотреть кэш ленты'; diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index f60e1494..d85c998b 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -2211,6 +2211,13 @@ class AppLocalizationsTr extends AppLocalizations { String get cacheLibraryCoverDesc => 'Kapak resmi yerel müzik dosyalarından çıkarıldı. Bir sonraki taramada yeniden çıkarılacaktır.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Besleme önbelleğini keşfedin'; diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index f3ee35b3..3ee3b343 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -2218,6 +2218,13 @@ class AppLocalizationsUk extends AppLocalizations { String get cacheLibraryCoverDesc => 'Обкладинку витягнуто з локальних музичних файлів. Буде повторно витягнуто під час наступного сканування.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Огляд кешу стрічки'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 68ed192f..4c7d8418 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -2185,6 +2185,13 @@ class AppLocalizationsZh extends AppLocalizations { String get cacheLibraryCoverDesc => 'Cover art extracted from local music files. Will re-extract on next scan.'; + @override + String get cacheAudioAnalysis => 'Audio analysis cache'; + + @override + String get cacheAudioAnalysisDesc => + 'Saved spectrograms and analysis results. Will re-analyze on next open.'; + @override String get cacheExploreFeed => 'Explore feed cache'; diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index b9525125..6e175a6c 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -2860,6 +2860,14 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" diff --git a/lib/screens/settings/cache_management_page.dart b/lib/screens/settings/cache_management_page.dart index 43196fe3..98a0992b 100644 --- a/lib/screens/settings/cache_management_page.dart +++ b/lib/screens/settings/cache_management_page.dart @@ -84,6 +84,9 @@ class _CacheManagementPageState extends ConsumerState { final libraryCoverStatsFuture = _scanDirectory( Directory('${appSupportDir.path}/library_covers'), ); + final audioAnalysisStatsFuture = _scanDirectory( + Directory('${appSupportDir.path}/audio_analysis_cache'), + ); final prefs = await prefsFuture; final explorePayload = prefs.getString(_exploreCacheKey); @@ -101,6 +104,7 @@ class _CacheManagementPageState extends ConsumerState { final tempStats = await tempStatsFuture; final coverStats = await coverStatsFuture; final libraryCoverStats = await libraryCoverStatsFuture; + final audioAnalysisStats = await audioAnalysisStatsFuture; final trackCacheEntries = await trackCacheEntriesFuture; return _CacheOverview( @@ -111,6 +115,7 @@ class _CacheManagementPageState extends ConsumerState { tempIsSameAsAppCache: tempIsSameAsAppCache, coverStats: coverStats, libraryCoverStats: libraryCoverStats, + audioAnalysisStats: audioAnalysisStats, exploreCacheBytes: exploreBytes, hasExploreCache: hasExploreCache, trackCacheEntries: trackCacheEntries, @@ -199,6 +204,12 @@ class _CacheManagementPageState extends ConsumerState { await _clearDirectoryContents(libraryCoverDir.path); } + Future _clearAudioAnalysisCache() async { + final appSupportDir = await getApplicationSupportDirectory(); + final analysisDir = Directory('${appSupportDir.path}/audio_analysis_cache'); + await _clearDirectoryContents(analysisDir.path); + } + Future _clearExploreCache() async { final prefs = await SharedPreferences.getInstance(); await prefs.remove(_exploreCacheKey); @@ -217,6 +228,7 @@ class _CacheManagementPageState extends ConsumerState { } await _clearCoverCache(); await _clearLibraryCoverCache(); + await _clearAudioAnalysisCache(); await _clearExploreCache(); await _clearTrackCache(); } @@ -547,6 +559,30 @@ class _CacheManagementPageState extends ConsumerState { ), ), ), + SettingsItem( + icon: Icons.graphic_eq_outlined, + title: context.l10n.cacheAudioAnalysis, + subtitle: _buildSubtitle( + context.l10n.cacheAudioAnalysisDesc, + overview.audioAnalysisStats.fileCount > 0 && + overview.audioAnalysisStats.totalSizeBytes > 0 + ? context.l10n.cacheSizeWithFiles( + formatBytes( + overview.audioAnalysisStats.totalSizeBytes, + ), + overview.audioAnalysisStats.fileCount, + ) + : context.l10n.cacheNoData, + ), + trailing: _buildClearTrailing( + 'clear_audio_analysis_cache', + () => _confirmAndRunAction( + actionKey: 'clear_audio_analysis_cache', + targetLabel: context.l10n.cacheAudioAnalysis, + action: _clearAudioAnalysisCache, + ), + ), + ), SettingsItem( icon: Icons.explore_outlined, title: context.l10n.cacheExploreFeed, @@ -631,6 +667,7 @@ class _CacheOverview { final bool tempIsSameAsAppCache; final CacheStats coverStats; final _DirectoryStats libraryCoverStats; + final _DirectoryStats audioAnalysisStats; final int exploreCacheBytes; final bool hasExploreCache; final int trackCacheEntries; @@ -643,6 +680,7 @@ class _CacheOverview { required this.tempIsSameAsAppCache, required this.coverStats, required this.libraryCoverStats, + required this.audioAnalysisStats, required this.exploreCacheBytes, required this.hasExploreCache, required this.trackCacheEntries,