Neue Melo-UI Phase 1: 4 Tabs (Meine Musik/Suche/Favoriten/Download) + Sortierung
- Meine Musik als Startbildschirm ohne Topbar: Kopfzeile (Einstellungen, Suche, Musikerkennung), Schnellzugriffe, Shuffle + Sortieren, Liederliste - Sortierung nach Zuletzt hinzugefuegt / Name (A-Z-#) / Wie oft abgespielt, auf- und absteigend, pro Liste gespeichert (SortStore) - Favoriten als eigener Tab mit gleicher Shuffle-/Sortier-Leiste - Download-Tab uebernimmt den Navidrome-Server-Browser - DB-Schema 3: playCount, gezaehlt beim Titelstart - Theme auf #0B0B10 / #c0392b - Scan-Aktionen aus der entfallenen Topbar jetzt in den Einstellungen Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011snPXPafPC5i87o68H14W7
This commit is contained in:
@@ -22,6 +22,10 @@ class Songs extends Table {
|
||||
IntColumn get updatedAtMs => integer()();
|
||||
BoolColumn get deleted => boolean().withDefault(const Constant(false))();
|
||||
|
||||
/// Wie oft der Song vollständig gestartet wurde — Grundlage für die
|
||||
/// Sortierung "Wie oft abgespielt".
|
||||
IntColumn get playCount => integer().withDefault(const Constant(0))();
|
||||
|
||||
@override
|
||||
Set<Column> get primaryKey => {id};
|
||||
}
|
||||
@@ -85,7 +89,7 @@ class MeloDb extends _$MeloDb {
|
||||
MeloDb([QueryExecutor? executor]) : super(executor ?? _open());
|
||||
|
||||
@override
|
||||
int get schemaVersion => 2;
|
||||
int get schemaVersion => 3;
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration => MigrationStrategy(
|
||||
@@ -97,6 +101,9 @@ class MeloDb extends _$MeloDb {
|
||||
await m.createTable(favorites);
|
||||
await m.createTable(playbackHistory);
|
||||
}
|
||||
if (from < 3) {
|
||||
await m.addColumn(songs, songs.playCount);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -291,6 +298,17 @@ class MeloDb extends _$MeloDb {
|
||||
}
|
||||
|
||||
// === Playback History ===
|
||||
/// Zählt eine Wiedergabe. Wird beim Start eines Tracks aufgerufen, nicht beim
|
||||
/// periodischen Speichern der Position — sonst würde der Zähler hochlaufen,
|
||||
/// solange ein Song nur läuft.
|
||||
Future<void> incrementPlayCount(String songId) async {
|
||||
await customUpdate(
|
||||
'UPDATE songs SET play_count = play_count + 1 WHERE id = ?',
|
||||
variables: [Variable<String>(songId)],
|
||||
updates: {songs},
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> recordPlayback(String songId, int positionMs) async {
|
||||
await into(playbackHistory).insert(PlaybackHistoryCompanion.insert(
|
||||
songId: songId,
|
||||
|
||||
Reference in New Issue
Block a user