Files
Melo/lib/services/server_neuheiten.dart
T
Hermes (Server)andClaude Opus 5 15e3d44453 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
2026-08-20 19:19:04 +02:00

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();
}
}