- AutoScan: beim Zurueckkehren in die App wird die Zahl der Musikdateien mit der Bibliothek verglichen; nur bei Abweichung laeuft ein Scan, und hoechstens alle 5 Minuten. Gleich viele Loeschungen wie Neuzugaenge bleiben unbemerkt - dafuer gibt es den Scan von Hand. - ServerNeuheiten: meldet neu auf Navidrome aufgetauchte Alben im Online-Tab. Der erste Abruf meldet bewusst nichts, sonst waere die ganze Sammlung "neu"; er nutzt die ohnehin geladenen Alben statt eines zweiten Serveraufrufs. - Neu: MeloDb.countSongs(), countAndroidMediaStoreSongs(). 189 Tests gruen, flutter analyze ohne Befund. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018NLW1q1hzEC9goDQ1dJ98d
56 lines
1.8 KiB
Dart
56 lines
1.8 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
import 'navidrome_service.dart';
|
|
|
|
/// Merkt sich, welche Alben auf dem Musikserver schon bekannt waren, und
|
|
/// meldet, was seitdem dazugekommen ist.
|
|
class ServerNeuheiten extends ChangeNotifier {
|
|
ServerNeuheiten({required this.holeAlben});
|
|
|
|
static const _key = 'server_bekannte_alben';
|
|
|
|
/// Holt die neuesten Alben vom Server.
|
|
final Future<List<SubsonicAlbum>> Function() holeAlben;
|
|
|
|
List<SubsonicAlbum> _neue = const [];
|
|
|
|
/// Alben, die seit dem letzten Nachsehen dazugekommen sind.
|
|
List<SubsonicAlbum> get neue => _neue;
|
|
|
|
Future<void> pruefe() async {
|
|
final List<SubsonicAlbum> alben;
|
|
try {
|
|
alben = await holeAlben();
|
|
} catch (e) {
|
|
debugPrint('Server-Neuheiten konnten nicht geladen werden: $e');
|
|
return;
|
|
}
|
|
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final bekannt = prefs.getStringList(_key);
|
|
|
|
// Beim allerersten Mal ist noch nichts bekannt. Alles als neu zu melden
|
|
// wäre unbrauchbar — also erst einmal nur den Stand festhalten.
|
|
if (bekannt == null) {
|
|
await prefs.setStringList(_key, alben.map((a) => a.id).toList());
|
|
return;
|
|
}
|
|
|
|
final gesehen = bekannt.toSet();
|
|
_neue = alben.where((a) => !gesehen.contains(a.id)).toList();
|
|
notifyListeners();
|
|
}
|
|
|
|
/// Nimmt die gemeldeten Alben zur Kenntnis — sie tauchen nicht wieder auf.
|
|
Future<void> alsGesehenMarkieren() async {
|
|
if (_neue.isEmpty) return;
|
|
final prefs = await SharedPreferences.getInstance();
|
|
final bekannt = (prefs.getStringList(_key) ?? const <String>[]).toSet()
|
|
..addAll(_neue.map((a) => a.id));
|
|
await prefs.setStringList(_key, bekannt.toList());
|
|
_neue = const [];
|
|
notifyListeners();
|
|
}
|
|
}
|