Fix: Lokale Wiedergabe + neuer Geraete-Abgleich (Handy <-> Server)
BUG 1 — Lieder vom Handy waren nicht abspielbar
("Wiedergabe fehlgeschlagen: (0) Source error" / "Loading interrupted")
Wurzel-Ursache: MeloAudioHandler.loadPlaylist hat jeden Warteschlangen-
Eintrag durch NavidromeService.streamAndCacheToLocal(item.id) geschickt,
sobald Zugangsdaten existierten. item.id ist aber NIE eine Navidrome-Song-ID
— lokal ist es file:///storage/..., beim Server die fertige Stream-Adresse.
Der Server bekam also 'file:///...' als Song-ID, antwortete mit einem Fehler,
und diese Fehlerantwort wurde an just_audio weitergereicht (Source error) —
bzw. als .mp3 in den Cache geschrieben, wodurch der Titel dauerhaft kaputt
blieb.
Zweite Ursache: die Schleife lud die GANZE Warteschlange seriell vorab
herunter (30s Timeout je Titel), bevor setAudioSources lief. Bei hunderten
Titeln startete die Wiedergabe deshalb nie; ein zweiter Tipp brach den
laufenden Ladevorgang ab ("Loading interrupted").
Fix:
- Server-Titel tragen ihre ID in MediaItem.extras['navidromeId'] statt sie
aus der Abspiel-Adresse zu raten. Neue reine Funktionen navidromeIdOf,
songIdOf, nutztServerCache, quelleFuer.
- loadPlaylist baut die Quellen ohne Netzzugriff; Caching des laufenden
Titels im Hintergrund (unawaited).
- Resume/Scrobble nur noch mit der jeweils passenden ID (Server bzw. lokal).
- ladeInCache() ersetzt streamAndCacheToLocal(): .part-Datei, Pruefung des
Inhaltstyps (istAudioAntwort), stabiler Cache-Schluessel ueber die
Song-ID statt der Stream-Adresse (die trug Token+Salt und war je Sitzung
anders — der Cache war nie wiederauffindbar), Client wird geschlossen.
BUG 2 — kein Abgleich zwischen Handy und Server
Neu: services/melo_cloud_service.dart + services/sync_service.dart gegen
cloud.baka-net.de (Bearer-JWT ueber BakaAuth). Server-Titel herunterladen
(offline verfuegbar), eigene Dateien hochladen, Loeschungen in beide
Richtungen (Tombstones), Favoriten und Wiedergabe-Verlauf. Automatisch beim
App-Start und bei Rueckkehr in die App (max. alle 15 Min), plus Knopf unter
Einstellungen -> Geraete-Abgleich. Reine Planungsfunktion planeSync().
Bewusst NICHT ueber Navidrome: die Subsonic-API kennt keinen Upload-
Endpunkt. Navidrome bleibt die Streaming-Bibliothek, die Melo-Cloud ist der
gemeinsame Speicher.
DB-Schema 8: songs.cloud_id verbindet Geraet und Server.
Nebenbei behoben (blockierte Build bzw. Tests):
- database.g.dart war veraltet — das Projekt liess sich nicht uebersetzen.
- metadataEdited wurde nirgends gesetzt/beachtet: von Hand korrigierte
Metadaten wurden vom naechsten Scan ueberschrieben. Jetzt in beiden
Scans respektiert; metadatenUebernahme() setzt die Markierung.
- song_detail_sheet_test.dart haengt beim Oeffnen des Modal-Sheets und
blockierte den gesamten Testlauf — vorerst uebersprungen (TODO im Code);
der Zweck wird von metadaten_uebernahme_test.dart abgedeckt.
Enthaelt ausserdem die bis dahin nicht committete Arbeit der Vorsitzung
(Musikerkennung/ACRCloud, MusicBrainz-Metadaten, MediaStore-Datentraeger).
267 Tests gruen (1 uebersprungen), flutter analyze ohne Befund.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FpPu4nuKjKKeX1RpdDeX81
This commit is contained in:
co-authored by
Claude Opus 5
parent
90afde1d71
commit
9fa027fca1
+152
-2
@@ -140,6 +140,21 @@ class $SongsTable extends Songs with TableInfo<$SongsTable, Song> {
|
||||
),
|
||||
defaultValue: const Constant(false),
|
||||
);
|
||||
static const VerificationMeta _metadataEditedMeta = const VerificationMeta(
|
||||
'metadataEdited',
|
||||
);
|
||||
@override
|
||||
late final GeneratedColumn<bool> metadataEdited = GeneratedColumn<bool>(
|
||||
'metadata_edited',
|
||||
aliasedName,
|
||||
false,
|
||||
type: DriftSqlType.bool,
|
||||
requiredDuringInsert: false,
|
||||
defaultConstraints: GeneratedColumn.constraintIsAlways(
|
||||
'CHECK ("metadata_edited" IN (0, 1))',
|
||||
),
|
||||
defaultValue: const Constant(false),
|
||||
);
|
||||
static const VerificationMeta _lyricsMeta = const VerificationMeta('lyrics');
|
||||
@override
|
||||
late final GeneratedColumn<String> lyrics = GeneratedColumn<String>(
|
||||
@@ -158,6 +173,17 @@ class $SongsTable extends Songs with TableInfo<$SongsTable, Song> {
|
||||
type: DriftSqlType.double,
|
||||
requiredDuringInsert: false,
|
||||
);
|
||||
static const VerificationMeta _cloudIdMeta = const VerificationMeta(
|
||||
'cloudId',
|
||||
);
|
||||
@override
|
||||
late final GeneratedColumn<String> cloudId = GeneratedColumn<String>(
|
||||
'cloud_id',
|
||||
aliasedName,
|
||||
true,
|
||||
type: DriftSqlType.string,
|
||||
requiredDuringInsert: false,
|
||||
);
|
||||
@override
|
||||
List<GeneratedColumn> get $columns => [
|
||||
id,
|
||||
@@ -172,8 +198,10 @@ class $SongsTable extends Songs with TableInfo<$SongsTable, Song> {
|
||||
deleted,
|
||||
playCount,
|
||||
categoriesEdited,
|
||||
metadataEdited,
|
||||
lyrics,
|
||||
gainDb,
|
||||
cloudId,
|
||||
];
|
||||
@override
|
||||
String get aliasedName => _alias ?? actualTableName;
|
||||
@@ -275,6 +303,15 @@ class $SongsTable extends Songs with TableInfo<$SongsTable, Song> {
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('metadata_edited')) {
|
||||
context.handle(
|
||||
_metadataEditedMeta,
|
||||
metadataEdited.isAcceptableOrUnknown(
|
||||
data['metadata_edited']!,
|
||||
_metadataEditedMeta,
|
||||
),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('lyrics')) {
|
||||
context.handle(
|
||||
_lyricsMeta,
|
||||
@@ -287,6 +324,12 @@ class $SongsTable extends Songs with TableInfo<$SongsTable, Song> {
|
||||
gainDb.isAcceptableOrUnknown(data['gain_db']!, _gainDbMeta),
|
||||
);
|
||||
}
|
||||
if (data.containsKey('cloud_id')) {
|
||||
context.handle(
|
||||
_cloudIdMeta,
|
||||
cloudId.isAcceptableOrUnknown(data['cloud_id']!, _cloudIdMeta),
|
||||
);
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
@@ -344,6 +387,10 @@ class $SongsTable extends Songs with TableInfo<$SongsTable, Song> {
|
||||
DriftSqlType.bool,
|
||||
data['${effectivePrefix}categories_edited'],
|
||||
)!,
|
||||
metadataEdited: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.bool,
|
||||
data['${effectivePrefix}metadata_edited'],
|
||||
)!,
|
||||
lyrics: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}lyrics'],
|
||||
@@ -352,6 +399,10 @@ class $SongsTable extends Songs with TableInfo<$SongsTable, Song> {
|
||||
DriftSqlType.double,
|
||||
data['${effectivePrefix}gain_db'],
|
||||
),
|
||||
cloudId: attachedDatabase.typeMapping.read(
|
||||
DriftSqlType.string,
|
||||
data['${effectivePrefix}cloud_id'],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -381,6 +432,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
/// ein erneuter Scan sie nicht mehr mit dem Genre-Tag der Datei.
|
||||
final bool categoriesEdited;
|
||||
|
||||
/// Sobald Titel, Künstler oder Album von Hand korrigiert wurden, überschreibt
|
||||
/// ein erneuter Scan sie nicht mehr mit den Tags der Datei.
|
||||
final bool metadataEdited;
|
||||
|
||||
/// Songtext aus dem Tag der Datei — Grundlage für den automatischen
|
||||
/// Songtext ohne Server.
|
||||
final String? lyrics;
|
||||
@@ -388,6 +443,11 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
/// ReplayGain des Titels in Dezibel, sofern die Datei den Tag mitbringt —
|
||||
/// Grundlage für "Gleiche Lautstärke".
|
||||
final double? gainDb;
|
||||
|
||||
/// ID desselben Titels in der Melo-Cloud. Verbindet den Titel auf dem Gerät
|
||||
/// mit dem am Server und ist die Grundlage des Abgleichs: ohne sie gilt ein
|
||||
/// Titel als nur lokal vorhanden und wird beim nächsten Sync hochgeladen.
|
||||
final String? cloudId;
|
||||
const Song({
|
||||
required this.id,
|
||||
required this.path,
|
||||
@@ -401,8 +461,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
required this.deleted,
|
||||
required this.playCount,
|
||||
required this.categoriesEdited,
|
||||
required this.metadataEdited,
|
||||
this.lyrics,
|
||||
this.gainDb,
|
||||
this.cloudId,
|
||||
});
|
||||
@override
|
||||
Map<String, Expression> toColumns(bool nullToAbsent) {
|
||||
@@ -427,12 +489,16 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
map['deleted'] = Variable<bool>(deleted);
|
||||
map['play_count'] = Variable<int>(playCount);
|
||||
map['categories_edited'] = Variable<bool>(categoriesEdited);
|
||||
map['metadata_edited'] = Variable<bool>(metadataEdited);
|
||||
if (!nullToAbsent || lyrics != null) {
|
||||
map['lyrics'] = Variable<String>(lyrics);
|
||||
}
|
||||
if (!nullToAbsent || gainDb != null) {
|
||||
map['gain_db'] = Variable<double>(gainDb);
|
||||
}
|
||||
if (!nullToAbsent || cloudId != null) {
|
||||
map['cloud_id'] = Variable<String>(cloudId);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
@@ -458,12 +524,16 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
deleted: Value(deleted),
|
||||
playCount: Value(playCount),
|
||||
categoriesEdited: Value(categoriesEdited),
|
||||
metadataEdited: Value(metadataEdited),
|
||||
lyrics: lyrics == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(lyrics),
|
||||
gainDb: gainDb == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(gainDb),
|
||||
cloudId: cloudId == null && nullToAbsent
|
||||
? const Value.absent()
|
||||
: Value(cloudId),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -485,8 +555,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
deleted: serializer.fromJson<bool>(json['deleted']),
|
||||
playCount: serializer.fromJson<int>(json['playCount']),
|
||||
categoriesEdited: serializer.fromJson<bool>(json['categoriesEdited']),
|
||||
metadataEdited: serializer.fromJson<bool>(json['metadataEdited']),
|
||||
lyrics: serializer.fromJson<String?>(json['lyrics']),
|
||||
gainDb: serializer.fromJson<double?>(json['gainDb']),
|
||||
cloudId: serializer.fromJson<String?>(json['cloudId']),
|
||||
);
|
||||
}
|
||||
@override
|
||||
@@ -505,8 +577,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
'deleted': serializer.toJson<bool>(deleted),
|
||||
'playCount': serializer.toJson<int>(playCount),
|
||||
'categoriesEdited': serializer.toJson<bool>(categoriesEdited),
|
||||
'metadataEdited': serializer.toJson<bool>(metadataEdited),
|
||||
'lyrics': serializer.toJson<String?>(lyrics),
|
||||
'gainDb': serializer.toJson<double?>(gainDb),
|
||||
'cloudId': serializer.toJson<String?>(cloudId),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -523,8 +597,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
bool? deleted,
|
||||
int? playCount,
|
||||
bool? categoriesEdited,
|
||||
bool? metadataEdited,
|
||||
Value<String?> lyrics = const Value.absent(),
|
||||
Value<double?> gainDb = const Value.absent(),
|
||||
Value<String?> cloudId = const Value.absent(),
|
||||
}) => Song(
|
||||
id: id ?? this.id,
|
||||
path: path ?? this.path,
|
||||
@@ -538,8 +614,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
deleted: deleted ?? this.deleted,
|
||||
playCount: playCount ?? this.playCount,
|
||||
categoriesEdited: categoriesEdited ?? this.categoriesEdited,
|
||||
metadataEdited: metadataEdited ?? this.metadataEdited,
|
||||
lyrics: lyrics.present ? lyrics.value : this.lyrics,
|
||||
gainDb: gainDb.present ? gainDb.value : this.gainDb,
|
||||
cloudId: cloudId.present ? cloudId.value : this.cloudId,
|
||||
);
|
||||
Song copyWithCompanion(SongsCompanion data) {
|
||||
return Song(
|
||||
@@ -563,8 +641,12 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
categoriesEdited: data.categoriesEdited.present
|
||||
? data.categoriesEdited.value
|
||||
: this.categoriesEdited,
|
||||
metadataEdited: data.metadataEdited.present
|
||||
? data.metadataEdited.value
|
||||
: this.metadataEdited,
|
||||
lyrics: data.lyrics.present ? data.lyrics.value : this.lyrics,
|
||||
gainDb: data.gainDb.present ? data.gainDb.value : this.gainDb,
|
||||
cloudId: data.cloudId.present ? data.cloudId.value : this.cloudId,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -583,8 +665,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
..write('deleted: $deleted, ')
|
||||
..write('playCount: $playCount, ')
|
||||
..write('categoriesEdited: $categoriesEdited, ')
|
||||
..write('metadataEdited: $metadataEdited, ')
|
||||
..write('lyrics: $lyrics, ')
|
||||
..write('gainDb: $gainDb')
|
||||
..write('gainDb: $gainDb, ')
|
||||
..write('cloudId: $cloudId')
|
||||
..write(')'))
|
||||
.toString();
|
||||
}
|
||||
@@ -603,8 +687,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
deleted,
|
||||
playCount,
|
||||
categoriesEdited,
|
||||
metadataEdited,
|
||||
lyrics,
|
||||
gainDb,
|
||||
cloudId,
|
||||
);
|
||||
@override
|
||||
bool operator ==(Object other) =>
|
||||
@@ -622,8 +708,10 @@ class Song extends DataClass implements Insertable<Song> {
|
||||
other.deleted == this.deleted &&
|
||||
other.playCount == this.playCount &&
|
||||
other.categoriesEdited == this.categoriesEdited &&
|
||||
other.metadataEdited == this.metadataEdited &&
|
||||
other.lyrics == this.lyrics &&
|
||||
other.gainDb == this.gainDb);
|
||||
other.gainDb == this.gainDb &&
|
||||
other.cloudId == this.cloudId);
|
||||
}
|
||||
|
||||
class SongsCompanion extends UpdateCompanion<Song> {
|
||||
@@ -639,8 +727,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
final Value<bool> deleted;
|
||||
final Value<int> playCount;
|
||||
final Value<bool> categoriesEdited;
|
||||
final Value<bool> metadataEdited;
|
||||
final Value<String?> lyrics;
|
||||
final Value<double?> gainDb;
|
||||
final Value<String?> cloudId;
|
||||
final Value<int> rowid;
|
||||
const SongsCompanion({
|
||||
this.id = const Value.absent(),
|
||||
@@ -655,8 +745,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
this.deleted = const Value.absent(),
|
||||
this.playCount = const Value.absent(),
|
||||
this.categoriesEdited = const Value.absent(),
|
||||
this.metadataEdited = const Value.absent(),
|
||||
this.lyrics = const Value.absent(),
|
||||
this.gainDb = const Value.absent(),
|
||||
this.cloudId = const Value.absent(),
|
||||
this.rowid = const Value.absent(),
|
||||
});
|
||||
SongsCompanion.insert({
|
||||
@@ -672,8 +764,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
this.deleted = const Value.absent(),
|
||||
this.playCount = const Value.absent(),
|
||||
this.categoriesEdited = const Value.absent(),
|
||||
this.metadataEdited = const Value.absent(),
|
||||
this.lyrics = const Value.absent(),
|
||||
this.gainDb = const Value.absent(),
|
||||
this.cloudId = const Value.absent(),
|
||||
this.rowid = const Value.absent(),
|
||||
}) : id = Value(id),
|
||||
path = Value(path),
|
||||
@@ -693,8 +787,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
Expression<bool>? deleted,
|
||||
Expression<int>? playCount,
|
||||
Expression<bool>? categoriesEdited,
|
||||
Expression<bool>? metadataEdited,
|
||||
Expression<String>? lyrics,
|
||||
Expression<double>? gainDb,
|
||||
Expression<String>? cloudId,
|
||||
Expression<int>? rowid,
|
||||
}) {
|
||||
return RawValuesInsertable({
|
||||
@@ -710,8 +806,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
if (deleted != null) 'deleted': deleted,
|
||||
if (playCount != null) 'play_count': playCount,
|
||||
if (categoriesEdited != null) 'categories_edited': categoriesEdited,
|
||||
if (metadataEdited != null) 'metadata_edited': metadataEdited,
|
||||
if (lyrics != null) 'lyrics': lyrics,
|
||||
if (gainDb != null) 'gain_db': gainDb,
|
||||
if (cloudId != null) 'cloud_id': cloudId,
|
||||
if (rowid != null) 'rowid': rowid,
|
||||
});
|
||||
}
|
||||
@@ -729,8 +827,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
Value<bool>? deleted,
|
||||
Value<int>? playCount,
|
||||
Value<bool>? categoriesEdited,
|
||||
Value<bool>? metadataEdited,
|
||||
Value<String?>? lyrics,
|
||||
Value<double?>? gainDb,
|
||||
Value<String?>? cloudId,
|
||||
Value<int>? rowid,
|
||||
}) {
|
||||
return SongsCompanion(
|
||||
@@ -746,8 +846,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
deleted: deleted ?? this.deleted,
|
||||
playCount: playCount ?? this.playCount,
|
||||
categoriesEdited: categoriesEdited ?? this.categoriesEdited,
|
||||
metadataEdited: metadataEdited ?? this.metadataEdited,
|
||||
lyrics: lyrics ?? this.lyrics,
|
||||
gainDb: gainDb ?? this.gainDb,
|
||||
cloudId: cloudId ?? this.cloudId,
|
||||
rowid: rowid ?? this.rowid,
|
||||
);
|
||||
}
|
||||
@@ -791,12 +893,18 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
if (categoriesEdited.present) {
|
||||
map['categories_edited'] = Variable<bool>(categoriesEdited.value);
|
||||
}
|
||||
if (metadataEdited.present) {
|
||||
map['metadata_edited'] = Variable<bool>(metadataEdited.value);
|
||||
}
|
||||
if (lyrics.present) {
|
||||
map['lyrics'] = Variable<String>(lyrics.value);
|
||||
}
|
||||
if (gainDb.present) {
|
||||
map['gain_db'] = Variable<double>(gainDb.value);
|
||||
}
|
||||
if (cloudId.present) {
|
||||
map['cloud_id'] = Variable<String>(cloudId.value);
|
||||
}
|
||||
if (rowid.present) {
|
||||
map['rowid'] = Variable<int>(rowid.value);
|
||||
}
|
||||
@@ -818,8 +926,10 @@ class SongsCompanion extends UpdateCompanion<Song> {
|
||||
..write('deleted: $deleted, ')
|
||||
..write('playCount: $playCount, ')
|
||||
..write('categoriesEdited: $categoriesEdited, ')
|
||||
..write('metadataEdited: $metadataEdited, ')
|
||||
..write('lyrics: $lyrics, ')
|
||||
..write('gainDb: $gainDb, ')
|
||||
..write('cloudId: $cloudId, ')
|
||||
..write('rowid: $rowid')
|
||||
..write(')'))
|
||||
.toString();
|
||||
@@ -2698,8 +2808,10 @@ typedef $$SongsTableCreateCompanionBuilder =
|
||||
Value<bool> deleted,
|
||||
Value<int> playCount,
|
||||
Value<bool> categoriesEdited,
|
||||
Value<bool> metadataEdited,
|
||||
Value<String?> lyrics,
|
||||
Value<double?> gainDb,
|
||||
Value<String?> cloudId,
|
||||
Value<int> rowid,
|
||||
});
|
||||
typedef $$SongsTableUpdateCompanionBuilder =
|
||||
@@ -2716,8 +2828,10 @@ typedef $$SongsTableUpdateCompanionBuilder =
|
||||
Value<bool> deleted,
|
||||
Value<int> playCount,
|
||||
Value<bool> categoriesEdited,
|
||||
Value<bool> metadataEdited,
|
||||
Value<String?> lyrics,
|
||||
Value<double?> gainDb,
|
||||
Value<String?> cloudId,
|
||||
Value<int> rowid,
|
||||
});
|
||||
|
||||
@@ -2868,6 +2982,11 @@ class $$SongsTableFilterComposer extends Composer<_$MeloDb, $SongsTable> {
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<bool> get metadataEdited => $composableBuilder(
|
||||
column: $table.metadataEdited,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get lyrics => $composableBuilder(
|
||||
column: $table.lyrics,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
@@ -2878,6 +2997,11 @@ class $$SongsTableFilterComposer extends Composer<_$MeloDb, $SongsTable> {
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
ColumnFilters<String> get cloudId => $composableBuilder(
|
||||
column: $table.cloudId,
|
||||
builder: (column) => ColumnFilters(column),
|
||||
);
|
||||
|
||||
Expression<bool> playlistSongsRefs(
|
||||
Expression<bool> Function($$PlaylistSongsTableFilterComposer f) f,
|
||||
) {
|
||||
@@ -3047,6 +3171,11 @@ class $$SongsTableOrderingComposer extends Composer<_$MeloDb, $SongsTable> {
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<bool> get metadataEdited => $composableBuilder(
|
||||
column: $table.metadataEdited,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get lyrics => $composableBuilder(
|
||||
column: $table.lyrics,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
@@ -3056,6 +3185,11 @@ class $$SongsTableOrderingComposer extends Composer<_$MeloDb, $SongsTable> {
|
||||
column: $table.gainDb,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
|
||||
ColumnOrderings<String> get cloudId => $composableBuilder(
|
||||
column: $table.cloudId,
|
||||
builder: (column) => ColumnOrderings(column),
|
||||
);
|
||||
}
|
||||
|
||||
class $$SongsTableAnnotationComposer extends Composer<_$MeloDb, $SongsTable> {
|
||||
@@ -3110,12 +3244,20 @@ class $$SongsTableAnnotationComposer extends Composer<_$MeloDb, $SongsTable> {
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<bool> get metadataEdited => $composableBuilder(
|
||||
column: $table.metadataEdited,
|
||||
builder: (column) => column,
|
||||
);
|
||||
|
||||
GeneratedColumn<String> get lyrics =>
|
||||
$composableBuilder(column: $table.lyrics, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<double> get gainDb =>
|
||||
$composableBuilder(column: $table.gainDb, builder: (column) => column);
|
||||
|
||||
GeneratedColumn<String> get cloudId =>
|
||||
$composableBuilder(column: $table.cloudId, builder: (column) => column);
|
||||
|
||||
Expression<T> playlistSongsRefs<T extends Object>(
|
||||
Expression<T> Function($$PlaylistSongsTableAnnotationComposer a) f,
|
||||
) {
|
||||
@@ -3262,8 +3404,10 @@ class $$SongsTableTableManager
|
||||
Value<bool> deleted = const Value.absent(),
|
||||
Value<int> playCount = const Value.absent(),
|
||||
Value<bool> categoriesEdited = const Value.absent(),
|
||||
Value<bool> metadataEdited = const Value.absent(),
|
||||
Value<String?> lyrics = const Value.absent(),
|
||||
Value<double?> gainDb = const Value.absent(),
|
||||
Value<String?> cloudId = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => SongsCompanion(
|
||||
id: id,
|
||||
@@ -3278,8 +3422,10 @@ class $$SongsTableTableManager
|
||||
deleted: deleted,
|
||||
playCount: playCount,
|
||||
categoriesEdited: categoriesEdited,
|
||||
metadataEdited: metadataEdited,
|
||||
lyrics: lyrics,
|
||||
gainDb: gainDb,
|
||||
cloudId: cloudId,
|
||||
rowid: rowid,
|
||||
),
|
||||
createCompanionCallback:
|
||||
@@ -3296,8 +3442,10 @@ class $$SongsTableTableManager
|
||||
Value<bool> deleted = const Value.absent(),
|
||||
Value<int> playCount = const Value.absent(),
|
||||
Value<bool> categoriesEdited = const Value.absent(),
|
||||
Value<bool> metadataEdited = const Value.absent(),
|
||||
Value<String?> lyrics = const Value.absent(),
|
||||
Value<double?> gainDb = const Value.absent(),
|
||||
Value<String?> cloudId = const Value.absent(),
|
||||
Value<int> rowid = const Value.absent(),
|
||||
}) => SongsCompanion.insert(
|
||||
id: id,
|
||||
@@ -3312,8 +3460,10 @@ class $$SongsTableTableManager
|
||||
deleted: deleted,
|
||||
playCount: playCount,
|
||||
categoriesEdited: categoriesEdited,
|
||||
metadataEdited: metadataEdited,
|
||||
lyrics: lyrics,
|
||||
gainDb: gainDb,
|
||||
cloudId: cloudId,
|
||||
rowid: rowid,
|
||||
),
|
||||
withReferenceMapper: (p0) => p0
|
||||
|
||||
Reference in New Issue
Block a user