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:
Hermes (Server)
2026-08-23 21:31:53 +02:00
co-authored by Claude Opus 5
parent 80948f1ad5
commit b42e045e67
15 changed files with 1784 additions and 32 deletions
+39 -1
View File
@@ -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))
+657
View File
@@ -2767,6 +2767,440 @@ class SongCategoriesCompanion extends UpdateCompanion<SongCategory> {
}
}
class $DownloadsTable extends Downloads
with TableInfo<$DownloadsTable, Download> {
@override
final GeneratedDatabase attachedDatabase;
final String? _alias;
$DownloadsTable(this.attachedDatabase, [this._alias]);
static const VerificationMeta _navidromeIdMeta = const VerificationMeta(
'navidromeId',
);
@override
late final GeneratedColumn<String> navidromeId = GeneratedColumn<String>(
'navidrome_id',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
);
static const VerificationMeta _titelMeta = const VerificationMeta('titel');
@override
late final GeneratedColumn<String> titel = GeneratedColumn<String>(
'titel',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
);
static const VerificationMeta _kuenstlerMeta = const VerificationMeta(
'kuenstler',
);
@override
late final GeneratedColumn<String> kuenstler = GeneratedColumn<String>(
'kuenstler',
aliasedName,
true,
type: DriftSqlType.string,
requiredDuringInsert: false,
);
static const VerificationMeta _albumMeta = const VerificationMeta('album');
@override
late final GeneratedColumn<String> album = GeneratedColumn<String>(
'album',
aliasedName,
true,
type: DriftSqlType.string,
requiredDuringInsert: false,
);
static const VerificationMeta _groesseBytesMeta = const VerificationMeta(
'groesseBytes',
);
@override
late final GeneratedColumn<int> groesseBytes = GeneratedColumn<int>(
'groesse_bytes',
aliasedName,
false,
type: DriftSqlType.int,
requiredDuringInsert: true,
);
static const VerificationMeta _geladenAmMsMeta = const VerificationMeta(
'geladenAmMs',
);
@override
late final GeneratedColumn<int> geladenAmMs = GeneratedColumn<int>(
'geladen_am_ms',
aliasedName,
false,
type: DriftSqlType.int,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [
navidromeId,
titel,
kuenstler,
album,
groesseBytes,
geladenAmMs,
];
@override
String get aliasedName => _alias ?? actualTableName;
@override
String get actualTableName => $name;
static const String $name = 'downloads';
@override
VerificationContext validateIntegrity(
Insertable<Download> instance, {
bool isInserting = false,
}) {
final context = VerificationContext();
final data = instance.toColumns(true);
if (data.containsKey('navidrome_id')) {
context.handle(
_navidromeIdMeta,
navidromeId.isAcceptableOrUnknown(
data['navidrome_id']!,
_navidromeIdMeta,
),
);
} else if (isInserting) {
context.missing(_navidromeIdMeta);
}
if (data.containsKey('titel')) {
context.handle(
_titelMeta,
titel.isAcceptableOrUnknown(data['titel']!, _titelMeta),
);
} else if (isInserting) {
context.missing(_titelMeta);
}
if (data.containsKey('kuenstler')) {
context.handle(
_kuenstlerMeta,
kuenstler.isAcceptableOrUnknown(data['kuenstler']!, _kuenstlerMeta),
);
}
if (data.containsKey('album')) {
context.handle(
_albumMeta,
album.isAcceptableOrUnknown(data['album']!, _albumMeta),
);
}
if (data.containsKey('groesse_bytes')) {
context.handle(
_groesseBytesMeta,
groesseBytes.isAcceptableOrUnknown(
data['groesse_bytes']!,
_groesseBytesMeta,
),
);
} else if (isInserting) {
context.missing(_groesseBytesMeta);
}
if (data.containsKey('geladen_am_ms')) {
context.handle(
_geladenAmMsMeta,
geladenAmMs.isAcceptableOrUnknown(
data['geladen_am_ms']!,
_geladenAmMsMeta,
),
);
} else if (isInserting) {
context.missing(_geladenAmMsMeta);
}
return context;
}
@override
Set<GeneratedColumn> get $primaryKey => {navidromeId};
@override
Download map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
return Download(
navidromeId: attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}navidrome_id'],
)!,
titel: attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}titel'],
)!,
kuenstler: attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}kuenstler'],
),
album: attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}album'],
),
groesseBytes: attachedDatabase.typeMapping.read(
DriftSqlType.int,
data['${effectivePrefix}groesse_bytes'],
)!,
geladenAmMs: attachedDatabase.typeMapping.read(
DriftSqlType.int,
data['${effectivePrefix}geladen_am_ms'],
)!,
);
}
@override
$DownloadsTable createAlias(String alias) {
return $DownloadsTable(attachedDatabase, alias);
}
}
class Download extends DataClass implements Insertable<Download> {
final String navidromeId;
final String titel;
final String? kuenstler;
final String? album;
final int groesseBytes;
final int geladenAmMs;
const Download({
required this.navidromeId,
required this.titel,
this.kuenstler,
this.album,
required this.groesseBytes,
required this.geladenAmMs,
});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
map['navidrome_id'] = Variable<String>(navidromeId);
map['titel'] = Variable<String>(titel);
if (!nullToAbsent || kuenstler != null) {
map['kuenstler'] = Variable<String>(kuenstler);
}
if (!nullToAbsent || album != null) {
map['album'] = Variable<String>(album);
}
map['groesse_bytes'] = Variable<int>(groesseBytes);
map['geladen_am_ms'] = Variable<int>(geladenAmMs);
return map;
}
DownloadsCompanion toCompanion(bool nullToAbsent) {
return DownloadsCompanion(
navidromeId: Value(navidromeId),
titel: Value(titel),
kuenstler: kuenstler == null && nullToAbsent
? const Value.absent()
: Value(kuenstler),
album: album == null && nullToAbsent
? const Value.absent()
: Value(album),
groesseBytes: Value(groesseBytes),
geladenAmMs: Value(geladenAmMs),
);
}
factory Download.fromJson(
Map<String, dynamic> json, {
ValueSerializer? serializer,
}) {
serializer ??= driftRuntimeOptions.defaultSerializer;
return Download(
navidromeId: serializer.fromJson<String>(json['navidromeId']),
titel: serializer.fromJson<String>(json['titel']),
kuenstler: serializer.fromJson<String?>(json['kuenstler']),
album: serializer.fromJson<String?>(json['album']),
groesseBytes: serializer.fromJson<int>(json['groesseBytes']),
geladenAmMs: serializer.fromJson<int>(json['geladenAmMs']),
);
}
@override
Map<String, dynamic> toJson({ValueSerializer? serializer}) {
serializer ??= driftRuntimeOptions.defaultSerializer;
return <String, dynamic>{
'navidromeId': serializer.toJson<String>(navidromeId),
'titel': serializer.toJson<String>(titel),
'kuenstler': serializer.toJson<String?>(kuenstler),
'album': serializer.toJson<String?>(album),
'groesseBytes': serializer.toJson<int>(groesseBytes),
'geladenAmMs': serializer.toJson<int>(geladenAmMs),
};
}
Download copyWith({
String? navidromeId,
String? titel,
Value<String?> kuenstler = const Value.absent(),
Value<String?> album = const Value.absent(),
int? groesseBytes,
int? geladenAmMs,
}) => Download(
navidromeId: navidromeId ?? this.navidromeId,
titel: titel ?? this.titel,
kuenstler: kuenstler.present ? kuenstler.value : this.kuenstler,
album: album.present ? album.value : this.album,
groesseBytes: groesseBytes ?? this.groesseBytes,
geladenAmMs: geladenAmMs ?? this.geladenAmMs,
);
Download copyWithCompanion(DownloadsCompanion data) {
return Download(
navidromeId: data.navidromeId.present
? data.navidromeId.value
: this.navidromeId,
titel: data.titel.present ? data.titel.value : this.titel,
kuenstler: data.kuenstler.present ? data.kuenstler.value : this.kuenstler,
album: data.album.present ? data.album.value : this.album,
groesseBytes: data.groesseBytes.present
? data.groesseBytes.value
: this.groesseBytes,
geladenAmMs: data.geladenAmMs.present
? data.geladenAmMs.value
: this.geladenAmMs,
);
}
@override
String toString() {
return (StringBuffer('Download(')
..write('navidromeId: $navidromeId, ')
..write('titel: $titel, ')
..write('kuenstler: $kuenstler, ')
..write('album: $album, ')
..write('groesseBytes: $groesseBytes, ')
..write('geladenAmMs: $geladenAmMs')
..write(')'))
.toString();
}
@override
int get hashCode => Object.hash(
navidromeId,
titel,
kuenstler,
album,
groesseBytes,
geladenAmMs,
);
@override
bool operator ==(Object other) =>
identical(this, other) ||
(other is Download &&
other.navidromeId == this.navidromeId &&
other.titel == this.titel &&
other.kuenstler == this.kuenstler &&
other.album == this.album &&
other.groesseBytes == this.groesseBytes &&
other.geladenAmMs == this.geladenAmMs);
}
class DownloadsCompanion extends UpdateCompanion<Download> {
final Value<String> navidromeId;
final Value<String> titel;
final Value<String?> kuenstler;
final Value<String?> album;
final Value<int> groesseBytes;
final Value<int> geladenAmMs;
final Value<int> rowid;
const DownloadsCompanion({
this.navidromeId = const Value.absent(),
this.titel = const Value.absent(),
this.kuenstler = const Value.absent(),
this.album = const Value.absent(),
this.groesseBytes = const Value.absent(),
this.geladenAmMs = const Value.absent(),
this.rowid = const Value.absent(),
});
DownloadsCompanion.insert({
required String navidromeId,
required String titel,
this.kuenstler = const Value.absent(),
this.album = const Value.absent(),
required int groesseBytes,
required int geladenAmMs,
this.rowid = const Value.absent(),
}) : navidromeId = Value(navidromeId),
titel = Value(titel),
groesseBytes = Value(groesseBytes),
geladenAmMs = Value(geladenAmMs);
static Insertable<Download> custom({
Expression<String>? navidromeId,
Expression<String>? titel,
Expression<String>? kuenstler,
Expression<String>? album,
Expression<int>? groesseBytes,
Expression<int>? geladenAmMs,
Expression<int>? rowid,
}) {
return RawValuesInsertable({
if (navidromeId != null) 'navidrome_id': navidromeId,
if (titel != null) 'titel': titel,
if (kuenstler != null) 'kuenstler': kuenstler,
if (album != null) 'album': album,
if (groesseBytes != null) 'groesse_bytes': groesseBytes,
if (geladenAmMs != null) 'geladen_am_ms': geladenAmMs,
if (rowid != null) 'rowid': rowid,
});
}
DownloadsCompanion copyWith({
Value<String>? navidromeId,
Value<String>? titel,
Value<String?>? kuenstler,
Value<String?>? album,
Value<int>? groesseBytes,
Value<int>? geladenAmMs,
Value<int>? rowid,
}) {
return DownloadsCompanion(
navidromeId: navidromeId ?? this.navidromeId,
titel: titel ?? this.titel,
kuenstler: kuenstler ?? this.kuenstler,
album: album ?? this.album,
groesseBytes: groesseBytes ?? this.groesseBytes,
geladenAmMs: geladenAmMs ?? this.geladenAmMs,
rowid: rowid ?? this.rowid,
);
}
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
if (navidromeId.present) {
map['navidrome_id'] = Variable<String>(navidromeId.value);
}
if (titel.present) {
map['titel'] = Variable<String>(titel.value);
}
if (kuenstler.present) {
map['kuenstler'] = Variable<String>(kuenstler.value);
}
if (album.present) {
map['album'] = Variable<String>(album.value);
}
if (groesseBytes.present) {
map['groesse_bytes'] = Variable<int>(groesseBytes.value);
}
if (geladenAmMs.present) {
map['geladen_am_ms'] = Variable<int>(geladenAmMs.value);
}
if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value);
}
return map;
}
@override
String toString() {
return (StringBuffer('DownloadsCompanion(')
..write('navidromeId: $navidromeId, ')
..write('titel: $titel, ')
..write('kuenstler: $kuenstler, ')
..write('album: $album, ')
..write('groesseBytes: $groesseBytes, ')
..write('geladenAmMs: $geladenAmMs, ')
..write('rowid: $rowid')
..write(')'))
.toString();
}
}
abstract class _$MeloDb extends GeneratedDatabase {
_$MeloDb(QueryExecutor e) : super(e);
$MeloDbManager get managers => $MeloDbManager(this);
@@ -2779,6 +3213,7 @@ abstract class _$MeloDb extends GeneratedDatabase {
this,
);
late final $SongCategoriesTable songCategories = $SongCategoriesTable(this);
late final $DownloadsTable downloads = $DownloadsTable(this);
@override
Iterable<TableInfo<Table, Object?>> get allTables =>
allSchemaEntities.whereType<TableInfo<Table, Object?>>();
@@ -2791,6 +3226,7 @@ abstract class _$MeloDb extends GeneratedDatabase {
favorites,
playbackHistory,
songCategories,
downloads,
];
}
@@ -5324,6 +5760,225 @@ typedef $$SongCategoriesTableProcessedTableManager =
SongCategory,
PrefetchHooks Function({bool songId})
>;
typedef $$DownloadsTableCreateCompanionBuilder =
DownloadsCompanion Function({
required String navidromeId,
required String titel,
Value<String?> kuenstler,
Value<String?> album,
required int groesseBytes,
required int geladenAmMs,
Value<int> rowid,
});
typedef $$DownloadsTableUpdateCompanionBuilder =
DownloadsCompanion Function({
Value<String> navidromeId,
Value<String> titel,
Value<String?> kuenstler,
Value<String?> album,
Value<int> groesseBytes,
Value<int> geladenAmMs,
Value<int> rowid,
});
class $$DownloadsTableFilterComposer
extends Composer<_$MeloDb, $DownloadsTable> {
$$DownloadsTableFilterComposer({
required super.$db,
required super.$table,
super.joinBuilder,
super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer,
});
ColumnFilters<String> get navidromeId => $composableBuilder(
column: $table.navidromeId,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get titel => $composableBuilder(
column: $table.titel,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get kuenstler => $composableBuilder(
column: $table.kuenstler,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get album => $composableBuilder(
column: $table.album,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<int> get groesseBytes => $composableBuilder(
column: $table.groesseBytes,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<int> get geladenAmMs => $composableBuilder(
column: $table.geladenAmMs,
builder: (column) => ColumnFilters(column),
);
}
class $$DownloadsTableOrderingComposer
extends Composer<_$MeloDb, $DownloadsTable> {
$$DownloadsTableOrderingComposer({
required super.$db,
required super.$table,
super.joinBuilder,
super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer,
});
ColumnOrderings<String> get navidromeId => $composableBuilder(
column: $table.navidromeId,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get titel => $composableBuilder(
column: $table.titel,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get kuenstler => $composableBuilder(
column: $table.kuenstler,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get album => $composableBuilder(
column: $table.album,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<int> get groesseBytes => $composableBuilder(
column: $table.groesseBytes,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<int> get geladenAmMs => $composableBuilder(
column: $table.geladenAmMs,
builder: (column) => ColumnOrderings(column),
);
}
class $$DownloadsTableAnnotationComposer
extends Composer<_$MeloDb, $DownloadsTable> {
$$DownloadsTableAnnotationComposer({
required super.$db,
required super.$table,
super.joinBuilder,
super.$addJoinBuilderToRootComposer,
super.$removeJoinBuilderFromRootComposer,
});
GeneratedColumn<String> get navidromeId => $composableBuilder(
column: $table.navidromeId,
builder: (column) => column,
);
GeneratedColumn<String> get titel =>
$composableBuilder(column: $table.titel, builder: (column) => column);
GeneratedColumn<String> get kuenstler =>
$composableBuilder(column: $table.kuenstler, builder: (column) => column);
GeneratedColumn<String> get album =>
$composableBuilder(column: $table.album, builder: (column) => column);
GeneratedColumn<int> get groesseBytes => $composableBuilder(
column: $table.groesseBytes,
builder: (column) => column,
);
GeneratedColumn<int> get geladenAmMs => $composableBuilder(
column: $table.geladenAmMs,
builder: (column) => column,
);
}
class $$DownloadsTableTableManager
extends
RootTableManager<
_$MeloDb,
$DownloadsTable,
Download,
$$DownloadsTableFilterComposer,
$$DownloadsTableOrderingComposer,
$$DownloadsTableAnnotationComposer,
$$DownloadsTableCreateCompanionBuilder,
$$DownloadsTableUpdateCompanionBuilder,
(Download, BaseReferences<_$MeloDb, $DownloadsTable, Download>),
Download,
PrefetchHooks Function()
> {
$$DownloadsTableTableManager(_$MeloDb db, $DownloadsTable table)
: super(
TableManagerState(
db: db,
table: table,
createFilteringComposer: () =>
$$DownloadsTableFilterComposer($db: db, $table: table),
createOrderingComposer: () =>
$$DownloadsTableOrderingComposer($db: db, $table: table),
createComputedFieldComposer: () =>
$$DownloadsTableAnnotationComposer($db: db, $table: table),
updateCompanionCallback:
({
Value<String> navidromeId = const Value.absent(),
Value<String> titel = const Value.absent(),
Value<String?> kuenstler = const Value.absent(),
Value<String?> album = const Value.absent(),
Value<int> groesseBytes = const Value.absent(),
Value<int> geladenAmMs = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => DownloadsCompanion(
navidromeId: navidromeId,
titel: titel,
kuenstler: kuenstler,
album: album,
groesseBytes: groesseBytes,
geladenAmMs: geladenAmMs,
rowid: rowid,
),
createCompanionCallback:
({
required String navidromeId,
required String titel,
Value<String?> kuenstler = const Value.absent(),
Value<String?> album = const Value.absent(),
required int groesseBytes,
required int geladenAmMs,
Value<int> rowid = const Value.absent(),
}) => DownloadsCompanion.insert(
navidromeId: navidromeId,
titel: titel,
kuenstler: kuenstler,
album: album,
groesseBytes: groesseBytes,
geladenAmMs: geladenAmMs,
rowid: rowid,
),
withReferenceMapper: (p0) => p0
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
.toList(),
prefetchHooksCallback: null,
),
);
}
typedef $$DownloadsTableProcessedTableManager =
ProcessedTableManager<
_$MeloDb,
$DownloadsTable,
Download,
$$DownloadsTableFilterComposer,
$$DownloadsTableOrderingComposer,
$$DownloadsTableAnnotationComposer,
$$DownloadsTableCreateCompanionBuilder,
$$DownloadsTableUpdateCompanionBuilder,
(Download, BaseReferences<_$MeloDb, $DownloadsTable, Download>),
Download,
PrefetchHooks Function()
>;
class $MeloDbManager {
final _$MeloDb _db;
@@ -5342,4 +5997,6 @@ class $MeloDbManager {
$$PlaybackHistoryTableTableManager(_db, _db.playbackHistory);
$$SongCategoriesTableTableManager get songCategories =>
$$SongCategoriesTableTableManager(_db, _db.songCategories);
$$DownloadsTableTableManager get downloads =>
$$DownloadsTableTableManager(_db, _db.downloads);
}