- cloud_screen.dart: Sync-Popup mit Live-Fortschritt („12/325 synchronisiert"),
„Im Hintergrund fortsetzen"-Button, Ergebnis-Snackbar nach Abschluss
- sync_service.dart: Notification-Kanal auf HIGH + Visibility.public,
Foreground-Service starten/stoppen während Sync (Display-aus-Garantie),
statische syncNotificationDetails() für Tests
- main.dart: Sync-Channel-Importance auf HIGH (überschreibt alte low-Einstellung)
- Tests: +7 (syncNotificationDetails HIGH/public, Lifecycle-Unabhängigkeit)
## MED-2 (Review-Fix, KRITISCH)
- sync_service.dart: Nach erfolgreichem cloud.download wird der Song jetzt
MIT cloud_id + Titeldaten (Titel/Künstler/Dauer/Größe/istKorrupt aus der
Server-Liste) in die lokale DB eingefügt — vorher fehlte der Song in der
Bibliothek, songNachCloudId blieb null und jeder Sync lud alle 325 Songs
erneut (≈ GB/Sync) und meldete sie fälschlich als „+neu“
- Neuer statischer Helfer `songAusServerMap` (testbar): baut den Song aus
den handle_list-Feldern; ytUrl wird bewusst NICHT übernommen (v2.52-F2:
Server bleibt YT-Link-Quelle)
- Zielpfad-Kollisionen abgesichert: existiert die Datei bereits (verwaister
Download aus früherem Sync ohne DB-Eintrag), wird „ (2)“, „ (3)“ … an-
gehängt — sonst scheiterte der Insert am UNIQUE-Constraint datei_pfad
## MED-1 (Review-Fix)
- sync_service.dart: letzterSync-Snapshot wird VOR listSongs gelesen und am
Sync-Ende persistiert (Sync-BEGINN statt now-am-Ende) — Löschungen, die
zwischen listSongs und Sync-Ende auf dem Server ankommen, werden im
nächsten Sync korrekt angewendet statt als „bereits gesehen“ übersprungen
- cloud_screen.dart: _download schreibt cloud_last_sync_ts nicht mehr
nachträglich mit now-am-Ende (redundant + Race-Wieder-Einführung);
UI-Anzeige liest den von SyncService persistierten Snapshot
- melo_cloud.py: handle_delete stempelt deleted_at IMMER mit Server-Zeit
(datetime('now')) — Client-Timestamps werden ignoriert (Uhr-Drift würde
Löschungen dauerhaft überspringen lassen; konsistente Uhr für alle Geräte)
## Chip-Puls (home_screen)
- ListenableBuilder hört auf Listenable.merge([_vm, _cloud, SyncService.laeuftNotifier]) — der ☁️-Musikserver-Chip pulsiert jetzt bei laufendem Sync (auch im Hintergrund/Auto-Sync), nicht nur beim Verbinden/Laden
- serverSyncLaeuft = SyncService.laeuftNotifier.value || CloudStatus.verbinde || serverLadt
## Auto-Sync-Timer app-weit (main.dart)
- _starteAutoSyncFallsNoetig() entfernt (F3a: kein Sync beim App-Start); stattdessen SyncService.starteAutoSyncTimer() — Timer tickt erst nach dem Intervall, Fälligkeit via istSyncFaellig
- shared_preferences-Import aus main.dart entfernt (Intervall-Logik lebt in SyncService/CloudScreen)
## Sync-Notification
- Sync-Kanal de.baka.melo.sync wird in main() angelegt (Android 8+: Channel nötig, sonst erscheint die Notification nicht)
- onDidReceiveNotificationResponse: Tipp auf 'sync_fertig'/'sync_fehler' → SyncService.syncBenachrichtigungGetippt++ → MeloHome öffnet den Cloud-Tab
## Version
- Versionsanzeige 2.51 → 2.52.3 (settings/home/erweitert), MeloLogger.init('2.35') → '2.52.3'