# Changelog Alle nennenswerten Änderungen an diesem Projekt werden hier dokumentiert. Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/). ## [Unreleased] ### 🎉 RELEASE BUILD: Phase 2 Complete! **Build Date:** 2026-08-19 **APK (Release/ARM64):** `app-arm64-v8a-release.apk` (21 MB) — **Für POCO X7 Pro!** **APK (Universal):** `app-release.apk` (22 MB) **Tests:** 70/70 ✅ **Build Status:** ✅ SUCCESS ### Phase 2 (Part 1-8 Completed — MILESTONE!) - 🗄️ **Auto-Caching**: Lieder werden automatisch beim Streamen lokal gespeichert! - Cache-First-Logik: Existierende Dateien lokal spielen - Fallback: Vom Server streamen wenn kein Cache - Cache-Speicher-Status in Settings (MB/KB/B) mit Clear-Button - 🗄️ **CacheManager**: MD5-Hash-basierte Cache-Verwaltung (getCacheSize, clearCache) - 📴 **Offline-Mode**: Toggle in Settings aktiviert Offline-Betrieb (nur gecachte Lieder spielen) - 🎤 **Artist-Browse**: Toggle in Navidrome-Tab zwischen Albums ↔ Künstler, Tap lädt alle Songs des Künstlers - 🌟 **Favoriten-Sync**: Button in Settings lädt Server-Favoriten und importiert sie lokal - 📊 **History-Sync**: Wiedergabe-Position vom Server laden + alle 5s zum Server senden (Subsonic-Bookmarks) - 📋 **Playlisten-Sync**: Button in Settings lädt alle Server-Playlisten (mit 🌐 Präfix zur Unterscheidung) - 🔒 **Lock-Screen Controls**: Notification mit Play/Pause/Skip-Buttons auf Android Lock Screen - 🎵 **Enhanced MiniPlayer**: Now-Playing Widget auf allen Tabs mit Skip-Buttons + Progress-Bar - Infrastructure für Multi-Device Sync vorbereitet ### Added - 🌐 **Musikserver-Tab** in Bibliothek: Zeige Alben vom Navidrome-Server, tippe um Album abzuspielen - 📝 **Lyrics-Anzeige**: Lyrics-Button im Now-Playing Screen, Bottom-Sheet mit Song-Lyrics vom Server - 🔀 **Shuffle & Repeat Modi**: Shuffle-Button (aktiv = rot), Repeat-Cycle (Off → All → One), beide im Player - 🌐 Navidrome-Integration (Musikserver-Verbindung): Settings-Tab bietet Login/Logout für Subsonic-API-kompatible Server - Navidrome-Service mit sichere Credential-Speicherung (Secure Storage + SharedPreferences) - Server-Album-Browser: Lädt Alben vom Server, zeigt Songcount, tippe um Album in Queue zu laden - Server-APIs erweitert: getArtists(), getArtistSongs(), setFavorite(), getFavorites(), getLyrics() (Phase 2 vorbereitet) - Dependencies für Navidrome hinzugefügt: http, crypto, shared_preferences, flutter_secure_storage ### Known Limitations (Phase 2) - Server-Favoriten-Sync: APIs vorhanden, UI-Integration in Phase 2 - Artist-Browse: APIs vorhanden, UI in Phase 2 - Server-Caching: Musik wird nicht lokal für Offline gecacht (Phase 2) - Lyrics-Sync: Keine Timed-Synchronisation (Phase 2+) ## [1.0.0-alpha] ### Added - Playlisten-Tab: Favoriten-Kurzeinstieg oben, Liste aller Playlisten mit Songanzahl, Erstellen-Dialog (FAB), Löschen mit Bestätigung - 🎵➕ Songs per Bottom-Sheet zu Playlisten hinzufügen (neuer Button in der Songliste, neben dem Favoriten-Herz) - Playlist-Detailansicht: Songs per Drag & Drop umsortieren, einzeln entfernen, Antippen spielt die Playlist ab dieser Stelle - Datenbank: Playlisten, Favoriten und Wiedergabe-Historie Tabellen (Drift, Schema v2) - PlaylistService für Playlisten- und Favoriten-Verwaltung - ❤️ Favoriten-Herz in der Songliste (ausgefüllt/leer) - ❤️ Favoriten-Herz auch im Now-Playing-Screen (aktueller Song) - Bibliothek: Künstler- und Alben-Tabs neben "Alle" — Songs werden clientseitig aus der bestehenden Songliste gruppiert (alphabetisch sortiert, fehlender Künstler/Album → "Unbekannt" / "Unbekanntes Album"); Antippen öffnet die Songliste des jeweiligen Künstlers/Albums, Alben zeigen zusätzlich das Cover - Warteschlangen-Ansicht (Queue-Button in der Now-Playing-AppBar): zeigt die aktuelle Wiedergabeliste, hebt den laufenden Titel hervor, per Antippen direkt zu einem Titel springen, Titel entfernen oder per Drag & Drop umsortieren — ohne Änderungen am Audio-Handler (Queue wird clientseitig neu berechnet und neu geladen) - Wiedergabeposition wird alle 5 Sekunden gespeichert und beim erneuten Abspielen eines Songs automatisch fortgesetzt (kein Resume bei den letzten 3 Sekunden eines Songs, um ein sofortiges Ende zu vermeiden) - Settings-Tab: Bibliotheks-Statistik (Song-Anzahl + Gesamtspieldauer), Musik-Berechtigung mit Link in die Systemeinstellungen, kurzer "Über Melo"-Abschnitt — bewusst ohne Platzhalter für Profil/Cloud-Sync/ Geräte-Verwaltung, da es dafür noch kein Account-/Cloud-System gibt (Phase 2) **Damit ist das komplette 5-Tab-MVP fertig: Player / Bibliothek / Playlisten / Suche / Settings — inklusive Playlisten, Favoriten, Warteschlangen-Verwaltung, Künstler-/Alben-Browsing und automatischem Fortsetzen der Wiedergabeposition.** ### Changed - Now-Playing-Screen läuft jetzt als eigener Tab statt als gepushter Screen (kein Schließen-Button mehr in der AppBar) - MediaItem trägt jetzt die Song-UUID mit (`extras['songId']`), nicht mehr nur die Datei-URI - Finales 5-Tab-Layout: Player / Bibliothek / Playlisten / Suche / Settings (Playlisten und Settings vorerst als Platzhalter) - "Zuletzt hinzugefügt" aus der alten Startseite ist jetzt Teil der Bibliothek (horizontale Leiste oben) - MiniPlayer wird auf dem Player-Tab ausgeblendet (dort läuft schon die volle Ansicht) ### Fixed - 🐛 Der APK-Build funktioniert jetzt überhaupt. Drei Dinge waren nötig: `compileSdk = 37` und `kotlin.jvm.target.validation.mode=warning` existierten bisher nur lokal auf dem Server und fehlten im Repo — ohne sie bricht der Build ab, weil `permission_handler` SDK 37 verlangt. Zusätzlich hebt ein Gradle- Workaround jetzt Plugin-Module mit zu altem `compileSdk` auf 36 an: `on_audio_query_android` kompiliert gegen SDK 33, seine AndroidX-Abhängigkeiten verlangen aber mindestens 34 (16 Metadaten-Konflikte). ### Removed - Alte Startseite (`home_screen.dart`) entfernt — Funktionalität in die Bibliothek verschoben ### Known Issues - Genre-Browsing fehlt noch: die `Songs`-Tabelle hat keine Genre-Spalte und keiner der Scanner (scan_service.dart, android_scan.dart) liest Genre- Metadaten aus den Dateien aus. Das ursprünglich geplante dritte Bibliotheks- Tab "Genres" ist deshalb nicht umgesetzt — braucht eine Schema-Migration plus Metadaten-Extraktion im Scanner (eigene Aufgabe, außerhalb dieses Tasks)