Commit Graph
24 Commits
Author SHA1 Message Date
Dustin 4694955f5f v2.51.4 — Review-Fix LOW: Longpress-Aktion „Herunterladen“ → „Neu laden“
## LOW (song_tile.dart)
- Label für gesunden Song mit ytUrl heißt jetzt „Neu laden“ statt
  „Herunterladen“ — die Aktion ist ein destruktiver reDownload
  (löscht DB-Eintrag + lokale Datei), das alte Label war irreführend
2026-08-05 08:12:45 +02:00
Dustin 4b9cfefe00 v2.51.3 — Schnellaktionen per Longpress auf Songs
## Schnellaktionen (song_tile.dart)
- Longpress öffnet Bottom-Sheet mit: ▶️ Abspielen,  Als Nächstes,  Am Ende hinzufügen,  Favorit (hinzufügen/entfernen), ⬇️ Herunterladen/Erneut herunterladen, 🏷 Tags bearbeiten, ✏️ Umbenennen
- Nur verfügbare Aktionen werden gezeigt (Download nur mit ytUrl, Tags/Umbenennen nur mit DB-id)
- Song-Info-Kopfzeile im Sheet (Titel + Künstler)
2026-08-05 07:57:37 +02:00
Dustin fdfc166807 v2.51.2 — 5-Tab-Navigation (Rechtshänder) + Musikserver-Status
## Navigation (home_screen.dart)
- Neue Tab-Struktur: Start / Bibliothek / Jetzt läuft / Cloud / Mehr (NavigationBar, Icons home, library_music, play_circle_fill, cloud, more_horiz)
- ▶️ Jetzt läuft (Daumen-Zone rechts): öffnet Now-Playing-Fullscreen direkt; bei Pause Hinweis-Screen
- Start: Weiterhören (Zuletzt gehört), Recap-Karte, Statistik, Favoriten-Schnellzugriff, neue Downloads
- Bibliothek: Segmente Songs/Alben/Künstler/Jahre/Genres/Tags/Playlists/Favoriten/Downloads + 'Lied +'- und Such-Buttons oben
- Mehr: Einstellungen, Erweitert, Info, Abmelden
- Keine Funktionalität verloren: YT-Download, Scanner, Recap, Lyrics, Queue erreichbar

## Musikserver (Feature 2)
- 'Navidrome verbinden' → '☁️ Musikserver' + Statuspunkt (grün=verbunden, rot=offline, pulsierend=Sync läuft)
- Detail-Dialog: 'Verbunden mit Navidrome · musik.baka-net.de', Verbinden/Trennen/Browser
- Gespeicherte Zugangsdaten werden beim App-Start geladen
2026-08-05 07:57:01 +02:00
Dustin 19b115b000 v2.49.1 — Now-Playing-Fullscreen (Cover, Controls, Like, Queue, Sleep-Timer)
## NowPlayingScreen (neu: lib/screens/now_playing_screen.dart)
- Blur-Hintergrund aus dem Cover (ImageFiltered + ImageFilter.blur, Bordmittel), Abdunklungs-Verlauf
- Großes Cover: Radius 20, Glow-Effekt (BoxShadow rot), Fallback auf Noten-Icon
- Titel (groß) + Künstler, Like-Button (Herz): togglet Favoriten via FavoritenService (lokal) mit SnackBar
- Fortschritt: Slider mit Seek (Drag-State), Position/Dauer-Text
- Controls: Shuffle, Repeat (3 Zustände), Prev, Play/Pause (roter Kreis), Next (Long-Press = Play-Next-Menü), Play-Next-Button
- Play-Next-Menü: kommende Queue-Songs, Tipp = spieleAlsNaechstes + SnackBar
- Sleep-Timer: Button + Restzeit ⏱ in der Kopfzeile, Sheet mit Chips Aus/15/30/45/60
- Queue-Zugriff: Button in der Kopfzeile → WarteschlangeSheet
- Slide-up/Slide-down via PageRouteBuilder (MiniPlayer)

## MiniPlayer
- Tipp öffnet jetzt den Fullscreen-Player (statt direkt der Queue)
- Queue nur noch via Button im Fullscreen
- Keine neuen Packages, flutter analyze 0 Issues, Tests 35/35
2026-08-04 16:37:13 +02:00
Dustin 82003c55d6 v2.48.4 — Als Nächstes abspielen (Play Next)
## SongTile
- Long-Press auf Song-Tile öffnet Kontextmenü (Bottom-Sheet):
  ▶ Als Nächstes abspielen + ⏭ Am Ende hinzufügen

## ViewModel
- spieleAlsNaechstes(Song) / amEndeHinzufuegen(Song) → PlayerService

## HomeScreen
- SongTile-Callbacks verdrahtet, SnackBar-Bestätigung bei beiden Aktionen

Keine neuen Packages, flutter analyze 0 Issues, Tests 4/4
2026-08-04 16:25:53 +02:00
Dustin 34ac791fa6 v2.48.3 — Sleep-Timer
## PlayerService
- setSleepTimer(Duration): nach Ablauf wird pausiert (Timer aus dart:async)
- cancelSleepTimer(), sleepTimerAktiv, sleepRestzeit (live berechnet)
- Timer wird in dispose() aufgeräumt

## WarteschlangeSheet
- Schlaf-Timer-Zeile: Optionen Aus/15/30/45/60 Min als Chips
- Aktiver Timer zeigt Restzeit (⏱ MM:SS), Aktualisierung jede Sekunde
- 'Aus'-Chip rot wenn Timer inaktiv, sonst gewählte Dauer aktiv markiert

Keine neuen Packages, flutter analyze 0 Issues, Tests 4/4
2026-08-04 16:25:30 +02:00
Dustin 5edfae01e5 v2.48.2 — Queue-UI (Warteschlange-Sheet)
## PlayerService
- warteschlange Getter (unveränderliche Kopie) + aktuellerIndex
- spieleAlsNaechstes(Song): fügt nach aktuellem Song ein
- amEndeHinzufuegen(Song): hängt ans Ende an
- verschiebeInWarteschlange(von, nach): Drag-and-Drop mit korrekter Anpassung des aktuellen Index

## WarteschlangeSheet (neu: lib/widgets/warteschlange_sheet.dart)
- Bottom-Sheet: aktuelle Warteschlange, aktueller Song rot markiert (▶)
- Tipp auf Song → sofort abspielen
- ReorderableListView (Bordmittel) zum Umsortieren per Drag
- Leer-Zustand + Titel-Zähler

## MiniPlayer
- Tipp auf den Miniplayer öffnet die Warteschlange (Bottom-Sheet)

Keine neuen Packages, flutter analyze 0 Issues, Tests 4/4
2026-08-04 16:25:04 +02:00
Dustin 42767a5646 v2.48.1 — Repeat-Modus (Aus/Titel/Playlist)
## PlayerService
- Enum Wiederholmodus { aus, titel, playlist } + Getter/Setter
- naechstes(): titel → gleicher Song von vorn (seek 0 + play)
- naechsterIndex(): zentrale Berechnung des nächsten Index
  - playlist: nach letztem Song wieder von vorne (auch bei Shuffle: neu mischen)
  - aus: Ende der Warteschlange stoppt
- Auto-Next (ProcessingState.completed) läuft über naechstes() → Repeat wirkt auch automatisch

## MiniPlayer
- Repeat-Icon mit 3 Zuständen (repeat / repeat_one), rot wenn aktiv, Wechsel bei Tipp

Keine neuen Packages, flutter analyze 0 Issues, Tests 4/4
2026-08-04 16:24:26 +02:00
Dustin bb8ee56894 v2.48 — Shuffle-Modus
## PlayerService
- PlayerService ist jetzt ChangeNotifier (UI hängt per addListener/ListenableBuilder an)
- zufallsmodus Getter + setZufallsmodus(bool)
- Zufallsreihenfolge: alle Queue-Indizes außer dem aktuellen Song, gemischt
- naechstes(): bei Shuffle nächster Song aus Zufallsreihenfolge, ohne Wiederholung bis alle durch
- vorheriges(): geht in der Zufallsreihenfolge zurück
- spiele(): synchronisiert Shuffle-Position (auch bei manueller Auswahl)

## MiniPlayer
- Shuffle-Icon (rot wenn aktiv, Tipp schaltet um)

Keine neuen Packages, flutter analyze 0 Issues, Tests 4/4
2026-08-04 16:23:55 +02:00
Dustin 0b8d8ce2f8 fix: MEDIUM+LOW Claude-Audit-Findings (Issues #7-16)
MEDIUM:
- #7 API-Key XOR-obfuskiert in app_config.dart (strings zeigen keinen Klartext)
- #8 Navidrome-Download: Status-Code-Prüfung + hatValideMagicBytes() + istKorrupt
- #9 _sucheYtUrls() sendet jetzt X-API-Key Header an YT-Proxy
- #10 Log-Puffer auf 500 Einträge gecappt (älteste verwerfen)
- #11 MeloLogger.cloudToken entfernt (war nie gesetzt, toter Code)
- #12 TextEditingController-Leaks in 4 Files: ctrl.dispose() nach showDialog
- #13 Cloud-Sync: Last-Write-Wins Konfliktauflösung dokumentiert

LOW:
- #14 API-Versionierung: alle /api/cloud/ → /api/v1/cloud/
- #15 Auto-Scan: nur /Music, /Download, nicht ganz /storage
- #16 2 pre-existing flutter analyze Infos behoben (curly_braces, use_build_context_synchronously)

flutter analyze: No issues found.
2026-08-03 01:50:07 +02:00
Dustin a483436490 v2.42 — Issue #7: ID3-Reader erweitern + Metadaten-Dialog verschönern
## ID3-Reader (lib/services/id3_reader.dart)
- ID3v1: Jahr (Bytes 93-97) + Genre-Index (Byte 127, vollständige Genre-Liste 0-147)
- ID3v2: Text-Frames TIT2 (Titel), TPE1 (Künstler), TALB (Album), TYER (Jahr), TCON (Genre), TRCK (Track)
- ID3v2-Frames haben Vorrang vor ID3v1 (Füll-Logik)
- UTF-16/UTF-8 Encoding-Unterstützung für Text-Frames
- Genre-Bereinigung: Klammer-Präfixe entfernt, Track-Nummer extrahiert

## Song-Model (lib/models/song.dart)
- Neue Felder: jahr, genre, track (nullable, optional)
- Neue getter: dateiFormat (MP3/M4A/FLAC/WAV/OGG aus Dateiendung)
- DB-Migration v5→v6: jahr, genre, track Spalten

## Metadaten-Dialog (lib/widgets/metadaten_dialog.dart)
- Cover-Bild (128×128) mit rotem Glow-Rahmen oben falls vorhanden
- Editable Felder mit Icons: Titel, Künstler, Album, Jahr, Genre
- Read-Only-Info-Card: Dauer, Dateigröße, Format
- Cards mit roten Akzenten + Melo-Design (schwarz/rot/dunkelgrau)
- ID3-Fallback: Jahr/Genre aus Datei nachladen wenn nicht in DB
- Speichern persistiert auch Jahr und Genre in die DB

## Musik-Scanner (lib/services/musik_scanner.dart)
- jahr, genre, track aus ID3-Tags an Song-Model durchgereicht
- _nichtLeer-Helfer für null-sichere String-Extraktion
2026-08-02 16:10:58 +02:00
Dustin a495a183d8 fix: Login-Fehlerhandler — 200 ohne Token abfangen, Server-Nachrichten parsen 2026-08-01 17:44:05 +02:00
Dustin 2d4c7c8b98 v2.32 — Defekte Musik erkennen (Magic Bytes, ffprobe, DB-Flag, UI) 2026-08-01 16:40:42 +02:00
Dustin 669a02304e fix: code-review warnings — deprecated APIs, debugPrint→Logger, unused import 2026-08-01 15:08:05 +02:00
Dustin cdb137f724 fix: stale cloud_einstellungen.dart entfernt (Rebase-Artefakt) 2026-08-01 15:06:26 +02:00
Dustin 36c744d6e3 v2.31 — Login, Einstellungen & Cloud Sync Redesign
- Login-Screen im Melo-Design (Schwarz+Rot) mit Baka-Auth JWT
- AuthService fuer Token-Management ueber baka-net.de/auth
- Registrierungs-Modus + 'Ohne Login fortfahren'
- Navidrome-Credentials optional im Login aufklappbar

- SettingsScreen ersetzt AlertDialog
- BottomNav navigiert statt Dialog zu triggern
- Cloud Sync, Server verbinden, Diagnosedaten, App-Info, Abmelden

- CloudEinstellungen-Dialog entfernt, alles in CloudScreen konsolidiert
- Hardcode login('Baka','') entfernt → AuthService.benutzer
- Gradient-Statuskarte, animierte Segment-Intervall-Auswahl
- JWT Authorization statt Klartext-Passwort

- AppConfig: API-Key defaultValue entfernt (kein Fallback-Leak)
- Build crasht ohne --dart-define MELO_API_KEY

Build: split APK (arm64 19.6M, armeabi 17.1M, x86_64 21.1M)
2026-08-01 15:03:22 +02:00
Hermes (Server) 8b6a04ead8 Fix: Review-Findings korrigiert (Tag-Leiste, Profil, Singleton u.a.)
CRIT:
- Tag-Leiste: Toggle-Kopf 'Tags & Filter' eingebaut (war unerreichbar) + TagStats
- Profil: Cloud-Count vor Dialog aufloesen (kein 'Instance of Future' mehr)
HIGH:
- CloudEinstellungen: toten Sync-Timer entfernt (echter Timer im ViewModel)
- StatistikCard + RecentWidget jetzt eingebaut (gesamtMB/gesamtMin endlich genutzt)
- CloudService als Singleton (konsistenter Token-Zustand in allen Services)
MED/LOW:
- Playlist-Erkennung nur noch via list= Parameter
- Player: fehlende Quelle wird geloggt statt still
- song_tile: null-ID-Guard vor Tag-Dialog
- Scanner-Log mit Exception-Objekt
- FavoritenService: anzahlFavoriten() fuer StatistikCard
2026-07-31 15:42:54 +02:00
Hermes (Server) b3aedc53f9 Feature: Cloud-Daten loeschen in Einstellungen (3s-Halten)
- Einstellungen > Cloud-Daten loeschen: 'Nur Musik' oder 'Komplett vom Server'
- 3-Sekunden-Gedrueckthalten-Button zur Bestaetigung (Fortschrittsbalken)
- Warnhinweis: Wird SOFORT geloescht, nicht rueckgaengig machbar
- Server: delete-music/delete-all Endpunkte mit Dedup-sicherem Registry-Cleanup
- Loeschen nur des eigenen Kontos (User aus Token, kein IDOR)
2026-07-31 15:39:19 +02:00
Hermes (Server) 9a880b0f21 Security: Cloud-Auth auf Bearer-JWT umgestellt (IDOR-Luecke geschlossen)
- cloud_service: echter Login gegen baka-auth, Token statt X-API-Key/X-User
- app_config: hartcodierten API-Key-Default entfernt
- download_service + melo_logger: Bearer-Token statt X-API-Key
- navidrome: Passwort in flutter_secure_storage (Keychain/Keystore)
- song: token-haltige stream_url wird nicht mehr in SQLite persistiert
- cloud_screen: Pfad-Traversal beim Download-Dateinamen gefixt (p.basename)
- home_screen: Login-Dialog mit Passwort-Feld, Auto-Sync nutzt restoreLogin
2026-07-31 14:31:12 +02:00
Hermes (Server) 3e9389ab59 Melo v2.10 - YouTube Proxy, Download-Screen, Logger, iOS 2026-07-26 14:24:10 +02:00
Hermes (Server) a417b191a1 Fix: onAddToPlaylist im SongTile Konstruktor hinzugefügt 2026-07-24 08:57:37 +02:00
Hermes (Server) b43ccd4c0d Code Review Optimierungen: Typsicherheit, Scanner-Performance, DB Upgrade Template, Division Guard 2026-07-24 08:33:30 +02:00
Hermes (Server) c7828b851c Navidrome-Integration, Widgets (Recent + Tag-Statistik) 2026-07-23 22:23:28 +02:00
Dustin-Mike Jens Hähnel 94a4063070 Initial commit 2026-07-23 14:31:28 +02:00