Automatische Erkennung: neue Dateien auf dem Geraet und neue Alben am Server
- 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
This commit is contained in:
co-authored by
Claude Opus 5
parent
6200c77614
commit
15e3d44453
@@ -0,0 +1,55 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user