5.2 KiB
Melo App – Server-Sync & Widgets Implementation Plan
Für Hermes: Schritt-für-Schritt abarbeiten, keine Tasks springen.
Goal: Melo App um Widgets + Hidden Message "Seit 2008" erweitern, dann Server-Sync auf Aingrad aufsetzen (Musik zentral lagern, von jedem Gerät abrufbar).
Architektur:
- Phase 1+2: Reine App-Erweiterungen (Widgets + Easter Egg)
- Phase 3: Server als Caddy-File-Server + JSON-API, App holt Song-Liste und lädt runter
Tech Stack: Flutter/Dart, Caddy (läuft auf Aingrad), SQLite (bereits vorhanden)
Phase 1: Widgets
Task 1: Home-Widget (Recent Songs)
Objective: Widget zeigt die letzten 5 abgespielten Songs auf dem Home-Screen
Files:
- Create:
lib/widgets/recent_widget.dart - Modify:
lib/screens/home_screen.dart(Widget einbauen) - Modify:
lib/viewmodels/melo_home_viewmodel.dart(letzte Songs laden)
Schritte:
recent_widget.darterstellen – kleiner Container mit den letzten 5 Songs, ähnlich wie StatistikCard aufgebaut (schwarz/rot Design)- ViewModel:
letzteSongsladen auswiedergabe_verlauf-Tabelle viadb.positionAktualisieren– die Tabelle existiert bereits home_screen.dart: Widget unter StatistikCard einbauen- Nur sichtbar wenn
letzteSongs.isNotEmpty
Code-Skizze recent_widget.dart (~40 Zeilen):
class RecentWidget extends StatelessWidget {
final List<Song> songs;
final void Function(Song) onPlay;
// UI: kleiner Container, 5 horizontale Einträge mit Cover + Titel
}
Task 2: Tag-Statistik-Widget
Objective: Widget zeigt wie viele Songs pro Tag existieren (kleine Übersicht)
Files:
- Create:
lib/widgets/tag_stats_widget.dart - Modify:
lib/viewmodels/melo_home_viewmodel.dart(Tag-Counts berechnen) - Modify:
lib/screens/home_screen.dart
Schritte:
- ViewModel:
Map<String, int> tagCounts– zählt Songs pro Tag-Namen tag_stats_widget.dart– horizontale Chips mit Tag-Name + Count- In home_screen unter Tags-Leiste einbauen
Phase 2: Hidden Message "Seit 2008"
Task 3: Easter Egg auf dem Home-Screen
Objective: Versteckte Nachricht "Seit 2008" die nach 10 Song-Playbacks erscheint
Files:
- Modify:
lib/viewmodels/melo_home_viewmodel.dart(Counter + Logik) - Modify:
lib/screens/home_screen.dart(Anzeige)
Schritte:
- ViewModel:
int _playCount = 0; bool get zeigeBotschaft => _playCount >= 10; - Bei jedem
spieleSong()→_playCount++, bei 10 →zeigeBotschaft = true - UI: Wenn
zeigeBotschaft, zeige ein rotes Herz mit "💌 Seit 2008" zwischen Header und StatistikCard - Nach einmaligem Anzeigen →
_playCountzurücksetzen oder ausblendbar
Code (~15 Zeilen ViewModel + ~10 Zeilen UI)
Phase 3: Server-Sync
Task 4: Caddy-Subdomain einrichten
Objective: musik.baka-net.de served Musik-Ordner + JSON-Liste
Files:
- Modify:
/etc/caddy/Caddyfile(auf Aingrad)
Schritte:
- Ordner erstellen:
mkdir -p /home/dustin/musik/songs - Caddyfile-Eintrag:
musik.baka-net.de {
root * /home/dustin/musik
file_server browse
@auth {
path /upload*
}
basicauth @auth {
melo HASH_PASSWORT
}
}
- JSON-API Script:
/home/dustin/musik/api/songs.json– generiert Liste aller.mp3/.m4a/.flacDateien mit Metadaten caddy reload
Task 5: ServerSyncService in der App
Objective: Neuer Service ruft Server-Liste ab und managed Downloads
Files:
- Create:
lib/services/server_sync_service.dart - Create:
lib/models/server_status.dart - Modify:
lib/screens/home_screen.dart(neuer Tab)
Schritte:
-
ServerSyncServicemit Methoden:Future<List<ServerSong>> fetchServerList()– ruftmusik.baka-net.de/api/songs.jsonabFuture<Song?> downloadSong(ServerSong s)– lädt runter, speichert lokal + in DBFuture<bool> istBereitsLokal(ServerSong s)– checkt ob Datei existiert
-
Neuer Screen/Sheet: "📡 Server"-Button im Header öffnet Server-Browser
- Zeigt alle Songs auf dem Server
- Status: "Downloaded ✓" / "Download ⬇"
- Fortschrittsbalken wie beim YouTube-Download
Task 6: Auto-Scan von Server-Songs
Objective: Einmal pro Session prüfen ob Server neue Songs hat
Files:
- Modify:
lib/viewmodels/melo_home_viewmodel.dart - Modify:
lib/services/server_sync_service.dart
Schritte:
ladeSongs()→ zusätzlich Server-Scan starten (im Hintergrund)- Neue Songs automatisch in DB eintragen (ohne Download – nur Metadaten)
- Badge im Server-Button: "3 neue Songs"
Abhängigkeiten
Phase 1 (Widgets) → Phase 2 (Hidden Message) → Phase 3 (Server-Sync)
↓
Alles unabhängig von Server
Validation
- Widgets: Nach App-Neustart sichtbar, reagieren auf Song-Änderungen
- Hidden Message: Nach 10 Playbacks erscheint "Seit 2008"
- Server-Sync:
curl https://musik.baka-net.de/api/songs.jsonliefert JSON - App: Server-Tab zeigt Songs, Download funktioniert, Musik spielt ab
Offene Fragen
- Soll Hidden Message persistiert werden (einmalig, nie wieder)?
- Auth für Download nötig oder öffentlich? (Server intern → öffentlich okay)
- Auto-Upload von lokal gescannten Songs zum Server? (Nur Download, kein Upload)