Tiefe Debug-Runde bewiesen: Server, DB-Passwort und App-Token-Logik sind korrekt (8/8-Repro gegen Live-Server) — abgelehnt wird ein falscher Passwort-Wert vom Gerät. Damit das künftig sofort sichtbar ist: - NavidromeService.letzterLoginFehler hält die Server-Meldung fest - Login-Dialog zeigt sie statt generischem "Login fehlgeschlagen" - Fehler-Log enthält die Passwort-Länge (nie das Passwort selbst) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JRj3pupcigUi683vy2Wwnz
196 lines
12 KiB
Markdown
196 lines
12 KiB
Markdown
# Changelog
|
||
|
||
Alle nennenswerten Änderungen an diesem Projekt werden hier dokumentiert.
|
||
Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.0.0/).
|
||
|
||
## [Unreleased]
|
||
|
||
### 🔎 Login-Dialog zeigt jetzt die echte Server-Fehlermeldung (2026-08-20)
|
||
- ✅ **Was:** Schlägt der Navidrome-Login fehl, zeigt der Dialog jetzt die
|
||
Original-Meldung des Servers (z. B. „Wrong username or password") statt
|
||
nur „Login fehlgeschlagen". So ist sofort klar, ob das Passwort falsch ist
|
||
oder ein Netzwerkproblem vorliegt.
|
||
- 🔧 **Details:**
|
||
- `NavidromeService.letzterLoginFehler` hält die Server-Meldung des letzten
|
||
abgelehnten Logins fest (wird bei jedem Ping zurückgesetzt).
|
||
- Das Fehler-Log enthält jetzt die Passwort-**Länge** (`pwLen=…`, nie das
|
||
Passwort selbst) — ein Tippfehler wird so im Log sofort sichtbar
|
||
(`Melo…!` hat 11 Zeichen).
|
||
- 🐛 **Hintergrund (tiefe Debug-Runde):** Server-seitig ist alles nachweislich
|
||
korrekt — Subsonic-API (`/rest/*`) läuft trotz SSO-Umbau ohne Forward-Auth,
|
||
DB-Passwort für „Baka" stimmt, und die exakte App-Token-Logik (Base64-Salt +
|
||
md5) wurde 8/8-mal erfolgreich gegen den Live-Server reproduziert. Die
|
||
Ablehnungen kommen von einem falschen Passwort-Wert auf dem Gerät; die neue
|
||
Fehlermeldung macht genau das künftig direkt sichtbar.
|
||
|
||
### 🔎 Login-Diagnose: Passwort-Sichtbarkeit + Trim (2026-08-20)
|
||
- 🐛 **„Login fehlgeschlagen" trotz korrekter Zugangsdaten:** Systematische
|
||
Analyse (App-Code, App-Logs, Caddy/Navidrome-Logs, 1:1-Nachbau des
|
||
App-Requests inkl. Salt/Token) hat bewiesen: **App-Code, Server, User „Baka"
|
||
und Passwort sind korrekt** — der Fehler lag im auf dem Gerät verwendeten
|
||
Credential-Wert (der ältere Build mit dem Ping-Fehlalarm persistierte
|
||
ungültige Zugangsdaten; verdeckte Tippfehler im Passwortfeld blieben
|
||
unsichtbar).
|
||
- 🔧 **Passwort-Anzeigen-Umschalter** (Auge-Icon) im Navidrome-Login — Tippfehler
|
||
werden sichtbar.
|
||
- 🔧 **URL + Passwort werden getrimmt** (randständige Leerzeichen aus Autofill /
|
||
Tastatur entfernt).
|
||
- 🔧 **Default-User im Login ist jetzt „Baka"** (vorher „Dustin") — verhindert
|
||
versehentlichen Login mit falschem User.
|
||
- ℹ️ Ein erfolgreicher Login überschreibt die alten (ungültigen) gespeicherten
|
||
Zugangsdaten — der Ping-Fix aus dieser Version stellt sicher, dass künftig
|
||
nur noch gültige Credentials gespeichert werden.
|
||
|
||
### 🔒 Datenschutz: Log-Bereinigung vor Server-Upload (2026-08-20)
|
||
- ✅ **Was:** Diagnose-Logs werden jetzt zentral bereinigt, bevor sie an
|
||
`logs.baka-net.de` gehen. Der lokale `debugPrint` bleibt vollständig.
|
||
- 🔧 **Details:**
|
||
- Freitext-Scrubber für `message` + `stackTrace`: maskiert sensible
|
||
`key=value`-Fragmente (`user=`, `pw=`, `password=`, `token=`, `secret=`,
|
||
`url=`), Datei-Pfade (`<path>`), nackte URLs (`<url>`), `Bearer`-Token,
|
||
JWTs (`<jwt>`) und lange Hex-IDs (`<hex>`).
|
||
- `stackTrace` wird auf max. 8 Zeilen gekürzt.
|
||
- `deviceModel` sendet nur noch die grobe Plattform (`android`/`ios`) statt
|
||
Hersteller+Modell (war ein Geräte-Fingerprint) — `device_info_plus` im
|
||
Logger entfernt.
|
||
- 🐛 **Fix (Quelle):** Der Navidrome-Login in `settings_screen` loggte
|
||
Benutzername + Server-URL im Klartext (`Login: url=… user=…`). Diese
|
||
Aufrufe senden jetzt nur noch den neutralen Status inkl. `pwLeer`-Flag.
|
||
- 🧪 **Tests:** neue Suite `test/logger_service_test.dart` (9 Tests) — 79/79 grün,
|
||
`flutter analyze` ohne Issues.
|
||
- ℹ️ **Offen:** Opt-in/Einwilligung für den Diagnose-Versand bleibt ein
|
||
separater Folgeschritt (braucht UI).
|
||
|
||
### 🐛 Server-Bibliothek lädt + Tab abgeschnitten (2026-08-20)
|
||
- 🐛 **Server-Bibliothek lud nicht ("Erneut versuchen"):** Ursache war, dass
|
||
der Code das Subsonic-`status`-Feld ignorierte. Navidrome liefert auch bei
|
||
falschem Passwort **HTTP 200** mit `status:"failed"` — `ping()` meldete
|
||
dadurch fälschlich „Login ok", und `getAlben`/`getArtists` behandelten die
|
||
Fehlerantwort still als „leer".
|
||
- 🔧 `ping()` prüft jetzt den Body (`status`) — kein Fehlalarm mehr beim Login.
|
||
- 🔧 `getAlben`/`getArtists` werfen bei `status:"failed"` eine
|
||
`NavidromeException` mit Server-Meldung statt still `[]` zurückzugeben.
|
||
- 🔧 Der Server-Tab zeigt die echte Server-Fehlermeldung (z. B. „Wrong
|
||
username or password") statt nur „Keine Alben geladen".
|
||
- 🔧 Album-Abruf nutzt jetzt den ID3-Endpoint `getAlbumList2` (konsistent zu
|
||
`getArtists`) — der alte Folder-Endpoint `getAlbumList` liefert bei
|
||
tag-organisierten Libraries leer.
|
||
- 🐛 **Tab „🌐 Server" war abgeschnitten** (nur „Serve" sichtbar): Die 4 festen
|
||
Tabs waren zu eng. `labelPadding` verkleinert (engere Abstände) —
|
||
Schriftgröße unverändert.
|
||
- 🧪 Neue Tests: `test/navidrome_parse_test.dart` (5). 84/84 grün, analyze sauber.
|
||
|
||
### 🔧 Log-Upload System - Fixes (2026-08-19)
|
||
- ✅ **ERROR-Level Logging**: Fehler werden SOFORT zum Server hochgeladen (async/await Fixed)
|
||
- ✅ **Navidrome-Service Error Logging**: Alle API-Fehler (ping, getAlben, getSongs, getFavorites, getArtists, getArtistSongs, getLyrics, scrobble, getBookmarks, getPlaylists, getPlaylistSongs) werden jetzt mit `logger.error()` zum Server geloggt (statt nur debugPrint)
|
||
- ✅ **Login-Fehler Detail-Logging**: Fehler enthalten URL, User, Exception-Typ und StackTrace
|
||
- ✅ **HTTP-Error bei Stream**: Stream-Fehler mit HTTP-Statuscode werden auch geloggt
|
||
- ✅ **Payload-Format**: Logs senden als `{"logs": [...]}` Array zum Server
|
||
|
||
### 🎉 RELEASE BUILD v3: Phase 2 + Login + Auto-Bugreport System!
|
||
**Build Date:** 2026-08-19 21:30
|
||
**APK (Release/Universal):** `app-release.apk` (22.3 MB) — **Mit Auto-Logger + Login-Improvements!**
|
||
**APK (ARM64-Specific):** `app-arm64-v8a-release.apk` (21 MB) — **Optimal für POCO X7 Pro**
|
||
**Tests:** 70/70 ✅
|
||
**Build Status:** ✅ SUCCESS
|
||
|
||
**Neue Features in dieser Build:**
|
||
- ✨ Login-Verbesserungen: Auto-URL + User-Buttons + Gast-Modus
|
||
- 📊 Auto-Bugreport System: Logger sendet Fehler sofort + andere Logs gesammelt zum Server
|
||
- Device-Info (Model + OS) + Timestamp + Stack-Traces
|
||
- Integration in Navidrome-Service für Login-Fehler-Diagnose
|
||
- 📝 Alle Phase-2-Features (Sync, Caching, Player, Controls)
|
||
- 🔒 Secure Credential-Speicherung
|
||
- 🎵 Enhanced MiniPlayer mit Skip-Buttons
|
||
|
||
### 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)
|