Alben und Kuenstler offline mitnehmen; Zwischenspeicher bekommt eine Grenze
Bisher landete Musik nur zufaellig auf dem Geraet: was man abspielte, blieb nebenbei liegen. Gezielt "dieses Album fuer die Zugfahrt" gab es nicht. Und dieser Zwischenspeicher wuchs unbegrenzt — es gab nur "alles loeschen". Zwei getrennte Ablagen. Bewusste Downloads liegen NICHT im Cache-Ordner: den darf Android bei Speichernot jederzeit selbst leeren, und genau das darf einem mitgenommenen Album nicht passieren. Sie liegen deshalb neben der Datenbank im Support-Ordner. Die Grenze gilt nur fuer den Zufalls-Cache; Downloads sind unbegrenzt und werden nie verdraengt. - Download-Pfeil je Album und Kuenstler, mit Fortschritt und Abbruch - Rueckfrage ab 30 Titeln samt Groessenschaetzung - Obergrenze wahlbar (aus / 512 MB / 1 / 2 / 4 / 8 GB), Standard 2 GB; am laengsten nicht Gehoertes weicht zuerst - Liste "Heruntergeladen" mit Titel, Kuenstler, Groesse, einzeln oder alle entfernbar (Schema 10) - Wiedergabe nimmt erst den Download, dann den Zwischenspeicher Aus dem Code-Review nachgebessert, vier ernste Punkte: "aus" (0 MB) schaltete das Aufraeumen ab statt das Zwischenspeichern und liess den Cache unbegrenzt wachsen; wer sich erst waehrend der Sitzung am Server anmeldete, konnte gar nichts laden; die Verdraengung konnte Dateien loeschen, die die laufende Warteschlange schon als Quelle eingetragen hatte (Abbruch mitten im Album, ohne Rueckfall aufs Streamen); und ein heruntergeladener Titel wurde beim Abspielen ein zweites Mal in den Cache geholt. Dazu sechs kleinere und der "zuletzt gehoert"-Stempel, der beim Aufbau der Warteschlange statt beim Abspielen gesetzt wurde. Nebenbei aufgeraeumt, weil die Dateien ohnehin offen waren: keine Emoji als Knoepfe mehr, kein Colors.redAccent und kein grey.shade mehr im ganzen Projekt, und die Einstellungen heissen nicht mehr "Settings". 433 Tests gruen (vorher 411), flutter analyze ohne Befund, Release-APK gebaut. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013xAHJTJM6UUqmjUgk1PUEd
This commit is contained in:
co-authored by
Claude Opus 5
parent
80948f1ad5
commit
b42e045e67
@@ -117,6 +117,23 @@ class PlaybackHistory extends Table {
|
||||
Set<Column> get primaryKey => {songId, playedAtMs};
|
||||
}
|
||||
|
||||
/// Bewusst heruntergeladene Server-Titel.
|
||||
///
|
||||
/// Die Dateien allein würden nicht reichen: sie heißen nach einem Hash, und
|
||||
/// ohne diese Zeilen könnte die App nur „37 Dateien, 412 MB" zeigen statt
|
||||
/// einer Liste mit Titeln und Künstlern.
|
||||
class Downloads extends Table {
|
||||
TextColumn get navidromeId => text()();
|
||||
TextColumn get titel => text()();
|
||||
TextColumn get kuenstler => text().nullable()();
|
||||
TextColumn get album => text().nullable()();
|
||||
IntColumn get groesseBytes => integer()();
|
||||
IntColumn get geladenAmMs => integer()();
|
||||
|
||||
@override
|
||||
Set<Column> get primaryKey => {navidromeId};
|
||||
}
|
||||
|
||||
@DriftDatabase(tables: [
|
||||
Songs,
|
||||
Folders,
|
||||
@@ -125,12 +142,13 @@ class PlaybackHistory extends Table {
|
||||
Favorites,
|
||||
PlaybackHistory,
|
||||
SongCategories,
|
||||
Downloads,
|
||||
])
|
||||
class MeloDb extends _$MeloDb {
|
||||
MeloDb([QueryExecutor? executor]) : super(executor ?? _open());
|
||||
|
||||
@override
|
||||
int get schemaVersion => 9;
|
||||
int get schemaVersion => 10;
|
||||
|
||||
@override
|
||||
MigrationStrategy get migration => MigrationStrategy(
|
||||
@@ -169,6 +187,9 @@ class MeloDb extends _$MeloDb {
|
||||
// Dateien ändert.
|
||||
await _ergaenzeAlbumKategorien();
|
||||
}
|
||||
if (from < 10) {
|
||||
await m.createTable(downloads);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
@@ -524,6 +545,23 @@ class MeloDb extends _$MeloDb {
|
||||
.get();
|
||||
}
|
||||
|
||||
// === Downloads ===
|
||||
Stream<List<Download>> watchDownloads() => (select(downloads)
|
||||
..orderBy([
|
||||
(d) => OrderingTerm(expression: d.geladenAmMs, mode: OrderingMode.desc)
|
||||
]))
|
||||
.watch();
|
||||
|
||||
Future<void> merkeDownload(DownloadsCompanion eintrag) =>
|
||||
into(downloads).insert(eintrag, mode: InsertMode.insertOrReplace);
|
||||
|
||||
Future<void> vergissDownload(String navidromeId) => (delete(downloads)
|
||||
..where((d) => d.navidromeId.equals(navidromeId)))
|
||||
.go();
|
||||
|
||||
Future<void> vergissAlleDownloads() => delete(downloads).go();
|
||||
|
||||
|
||||
Future<int?> lastPosition(String songId) async {
|
||||
final row = await (select(playbackHistory)
|
||||
..where((h) => h.songId.equals(songId))
|
||||
|
||||
Reference in New Issue
Block a user