fix: honor local library auto-scan cooldown

This commit is contained in:
zarzet
2026-03-16 22:35:17 +07:00
parent 6ecb69feae
commit 9bebed506b
3 changed files with 37 additions and 13 deletions

View File

@@ -14,6 +14,7 @@ import 'package:spotiflac_android/providers/settings_provider.dart';
import 'package:spotiflac_android/services/notification_service.dart';
import 'package:spotiflac_android/services/share_intent_service.dart';
import 'package:spotiflac_android/services/cover_cache_manager.dart';
import 'package:spotiflac_android/utils/local_library_scan_prefs.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
@@ -100,8 +101,6 @@ class _EagerInitializationState extends ConsumerState<_EagerInitialization>
bool _localLibraryWarmupScheduled = false;
bool _autoScanTriggeredOnLaunch = false;
static const _lastScannedAtKey = 'local_library_last_scanned_at';
@override
void initState() {
super.initState();
@@ -200,10 +199,9 @@ class _EagerInitializationState extends ConsumerState<_EagerInitialization>
// Determine cooldown based on auto-scan mode.
final now = DateTime.now();
final prefs = await SharedPreferences.getInstance();
final lastScannedMs = prefs.getInt(_lastScannedAtKey);
final lastScanned = readLocalLibraryLastScannedAt(prefs);
if (lastScannedMs != null) {
final lastScanned = DateTime.fromMillisecondsSinceEpoch(lastScannedMs);
if (lastScanned != null) {
final elapsed = now.difference(lastScanned);
switch (settings.localLibraryAutoScan) {

View File

@@ -9,11 +9,11 @@ import 'package:spotiflac_android/services/library_database.dart';
import 'package:spotiflac_android/services/notification_service.dart';
import 'package:spotiflac_android/services/platform_bridge.dart';
import 'package:spotiflac_android/utils/logger.dart';
import 'package:spotiflac_android/utils/local_library_scan_prefs.dart';
import 'package:spotiflac_android/utils/path_match_keys.dart';
final _log = AppLogger('LocalLibrary');
const _lastScannedAtKey = 'local_library_last_scanned_at';
const _excludedDownloadedCountKey = 'local_library_excluded_downloaded_count';
final _prefs = SharedPreferences.getInstance();
@@ -165,10 +165,7 @@ class LocalLibraryNotifier extends Notifier<LocalLibraryState> {
var excludedDownloadedCount = 0;
try {
final prefs = await prefsFuture;
final lastScannedAtStr = prefs.getString(_lastScannedAtKey);
if (lastScannedAtStr != null && lastScannedAtStr.isNotEmpty) {
lastScannedAt = DateTime.tryParse(lastScannedAtStr);
}
lastScannedAt = readLocalLibraryLastScannedAt(prefs);
excludedDownloadedCount =
prefs.getInt(_excludedDownloadedCountKey) ?? 0;
} catch (e) {
@@ -336,7 +333,7 @@ class LocalLibraryNotifier extends Notifier<LocalLibraryState> {
final now = DateTime.now();
try {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_lastScannedAtKey, now.toIso8601String());
await writeLocalLibraryLastScannedAt(prefs, now);
await prefs.setInt(_excludedDownloadedCountKey, skippedDownloads);
_log.d('Saved lastScannedAt: $now');
} catch (e) {
@@ -500,7 +497,7 @@ class LocalLibraryNotifier extends Notifier<LocalLibraryState> {
final now = DateTime.now();
try {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_lastScannedAtKey, now.toIso8601String());
await writeLocalLibraryLastScannedAt(prefs, now);
await prefs.setInt(_excludedDownloadedCountKey, skippedDownloads);
_log.d('Saved lastScannedAt: $now');
} catch (e) {
@@ -818,7 +815,7 @@ class LocalLibraryNotifier extends Notifier<LocalLibraryState> {
try {
final prefs = await SharedPreferences.getInstance();
await prefs.remove(_lastScannedAtKey);
await clearLocalLibraryLastScannedAt(prefs);
await prefs.remove(_excludedDownloadedCountKey);
} catch (e) {
_log.w('Failed to clear lastScannedAt: $e');

View File

@@ -0,0 +1,29 @@
import 'package:shared_preferences/shared_preferences.dart';
const localLibraryLastScannedAtKey = 'local_library_last_scanned_at';
DateTime? readLocalLibraryLastScannedAt(SharedPreferences prefs) {
final lastScannedAtStr = prefs.getString(localLibraryLastScannedAtKey);
if (lastScannedAtStr != null && lastScannedAtStr.isNotEmpty) {
return DateTime.tryParse(lastScannedAtStr);
}
// Backward compatibility for older builds that may have stored epoch millis.
final lastScannedAtMs = prefs.getInt(localLibraryLastScannedAtKey);
if (lastScannedAtMs != null) {
return DateTime.fromMillisecondsSinceEpoch(lastScannedAtMs);
}
return null;
}
Future<void> writeLocalLibraryLastScannedAt(
SharedPreferences prefs,
DateTime value,
) {
return prefs.setString(localLibraryLastScannedAtKey, value.toIso8601String());
}
Future<void> clearLocalLibraryLastScannedAt(SharedPreferences prefs) {
return prefs.remove(localLibraryLastScannedAtKey);
}