freezer/lib/api/download_manager/database.dart

267 lines
7 KiB
Dart

import 'package:freezer/api/definitions.dart' as d;
import 'package:freezer/api/definitions.dart' show AlbumType;
import 'package:isar/isar.dart';
part 'database.g.dart';
@collection
class Track {
Id get isarId => int.parse(id);
late final String id;
// index title for search
@Index(type: IndexType.value)
late final String title;
late final String albumId;
late final List<String> artistIds;
late final DeezerImageDetails albumArt;
late final int? trackNumber;
late final bool offline;
late final Lyrics? lyrics;
late final bool favorite;
late final int? diskNumber;
late final bool explicit;
late final String localPath;
Track();
factory Track.from(d.Track t) {
return Track()
..id = t.id
..title = t.title!
..albumId = t.album!.id!
..artistIds = t.artists!.map((e) => e.id).toList(growable: false)
..albumArt = DeezerImageDetails.from(t.albumArt!)
..trackNumber = t.trackNumber
..offline = t.offline ?? false
..lyrics = t.lyrics == null ? null : Lyrics.from(t.lyrics!)
..favorite = t.favorite ?? false
..diskNumber = t.diskNumber
..explicit = t.explicit ?? false;
}
d.Track to({d.Album? album, List<d.Artist>? artists}) {
return d.Track(
id: id,
title: title,
album: album ?? d.Album(id: albumId),
artists: artists ??
artistIds.map((id) => d.Artist(id: id)).toList(growable: false),
albumArt: albumArt.to(),
trackNumber: trackNumber,
offline: offline,
lyrics: lyrics?.to(),
favorite: favorite,
diskNumber: diskNumber,
explicit: explicit,
);
}
}
@collection
class Album {
Id get isarId => int.parse(id);
late final String id;
@Index(type: IndexType.value)
late final String title;
late final List<String> artistIds;
late final List<String> trackIds;
late final DeezerImageDetails art;
late final int fansCount;
late final bool offline;
late final bool library;
@enumerated
late final AlbumType type;
late final String releaseDate;
Album();
factory Album.from(d.Album album) {
return Album()
..id = album.id!
..title = album.title!
..artistIds = album.artists!.map((e) => e.id).toList(growable: false)
..trackIds = album.tracks!.map((e) => e.id).toList(growable: false)
..art = DeezerImageDetails.from(album.art!)
..fansCount = album.fans!
..offline = album.offline ?? false
..library = album.library ?? false
..type = album.type!
..releaseDate = album.releaseDate!;
}
d.Album to({List<d.Artist>? artists, List<d.Track>? tracks}) {
return d.Album(
id: id,
title: title,
art: art.to(),
artists: artists ??
artistIds.map((id) => d.Artist(id: id)).toList(growable: false),
tracks: tracks ??
trackIds.map((id) => d.Track(id: id)).toList(growable: false),
fans: fansCount,
offline: offline,
library: library,
type: type,
releaseDate: releaseDate,
);
}
}
@collection
class Artist {
Id get isarId => int.parse(id);
late final String id;
@Index(type: IndexType.value)
late final String name;
late final List<String> albumIds;
late final List<String> topTracksIds;
late final DeezerImageDetails picture;
late final int fansCount;
late final int albumCount;
late final bool offline;
late final bool library;
late final bool radio;
Artist();
factory Artist.from(d.Artist artist) {
return Artist()
..id = artist.id
..name = artist.name!
..albumIds = artist.albums!
.map<String>((d.Album a) => a.id!)
.toList(growable: false)
..topTracksIds = artist.topTracks!
.map<String>((d.Track t) => t.id)
.toList(growable: false)
..picture = DeezerImageDetails.from(artist.picture!)
..fansCount = artist.fans ?? 0
..albumCount = artist.albumCount ?? 0
..offline = artist.offline ?? false
..library = artist.library ?? false
..radio = artist.radio ?? false;
}
}
@collection
class Playlist {
late final String id;
Id get isarId => int.parse(id);
@Index(type: IndexType.value)
late final String title;
late final List<String> trackIds;
late final DeezerImageDetails image;
late final int durationSec;
late final String userId;
late final String userName;
late final int fansCount;
late final String description;
late final bool library;
Playlist();
factory Playlist.from(d.Playlist playlist) {
return Playlist()
..id = playlist.id
..title = playlist.title!
..trackIds = playlist.tracks!
.map<String>((d.Track t) => t.id)
.toList(growable: false)
..image = DeezerImageDetails.from(playlist.image! as d.DeezerImageDetails)
..durationSec = playlist.duration!.inSeconds
..userId = playlist.user!.id!
..userName = playlist.user!.name!
..fansCount = playlist.fans ?? 0
..description = playlist.description ?? ''
..library = playlist.library ?? false;
}
d.Playlist to({List<d.Track>? tracks}) {
return d.Playlist(
id: id,
title: title,
tracks: tracks ??
trackIds.map((id) => d.Track(id: id)).toList(growable: false),
image: image.to(),
trackCount: trackIds.length,
duration: Duration(seconds: durationSec),
user: d.User(id: userId, name: userName),
fans: fansCount,
library: library,
description: description,
);
}
}
@embedded
class DeezerImageDetails {
late String type;
late String md5;
DeezerImageDetails();
factory DeezerImageDetails.from(d.DeezerImageDetails details) {
return DeezerImageDetails()
..type = details.type
..md5 = details.md5;
}
d.DeezerImageDetails to() {
return d.DeezerImageDetails(md5, type: type);
}
}
@embedded
class Lyrics {
late final String lyricsId;
late final String writers;
late final List<Lyric> lyrics;
late final bool sync;
Lyrics();
factory Lyrics.from(d.Lyrics lyrics) {
return Lyrics()
..lyricsId = lyrics.id ?? ''
..writers = lyrics.writers ?? ''
..sync = lyrics.sync
..lyrics = lyrics.lyrics!.map(Lyric.from).toList(growable: false);
}
d.Lyrics to() {
return d.Lyrics(
id: lyricsId,
writers: writers,
sync: sync,
lyrics: lyrics.map((e) => e.to()).toList(growable: false));
}
}
@embedded
class Lyric {
late final String text;
late final int? offsetMs;
late final String? lrcTimestamp;
Lyric();
factory Lyric.from(d.Lyric l) {
return Lyric()
..text = l.text!
..offsetMs = l.offset?.inMilliseconds
..lrcTimestamp = l.lrcTimestamp;
}
d.Lyric to() {
return d.Lyric(
offset: offsetMs == null ? null : Duration(milliseconds: offsetMs!),
text: text,
lrcTimestamp: lrcTimestamp);
}
}