mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 16:05:18 +00:00
110 lines
3.3 KiB
Dart
110 lines
3.3 KiB
Dart
part of 'metadata.dart';
|
|
|
|
@freezed
|
|
class SpotubeTrackObject with _$SpotubeTrackObject {
|
|
factory SpotubeTrackObject.local({
|
|
required String id,
|
|
required String name,
|
|
required String externalUri,
|
|
@Default([]) List<SpotubeSimpleArtistObject> artists,
|
|
required SpotubeSimpleAlbumObject album,
|
|
required int durationMs,
|
|
required String path,
|
|
}) = SpotubeLocalTrackObject;
|
|
|
|
factory SpotubeTrackObject.full({
|
|
required String id,
|
|
required String name,
|
|
required String externalUri,
|
|
@Default([]) List<SpotubeSimpleArtistObject> artists,
|
|
required SpotubeSimpleAlbumObject album,
|
|
required int durationMs,
|
|
required String isrc,
|
|
required bool explicit,
|
|
}) = SpotubeFullTrackObject;
|
|
|
|
factory SpotubeTrackObject.localTrackFromFile(
|
|
File file, {
|
|
Metadata? metadata,
|
|
String? art,
|
|
}) {
|
|
return SpotubeLocalTrackObject(
|
|
id: file.absolute.path,
|
|
name: metadata?.title ?? basenameWithoutExtension(file.path),
|
|
externalUri: "file://${file.absolute.path}",
|
|
artists: metadata?.artist?.split(",").map((a) {
|
|
return SpotubeSimpleArtistObject(
|
|
id: a.trim(),
|
|
name: a.trim(),
|
|
externalUri: "file://${file.absolute.path}",
|
|
);
|
|
}).toList() ??
|
|
[
|
|
SpotubeSimpleArtistObject(
|
|
id: "unknown",
|
|
name: "Unknown Artist",
|
|
externalUri: "file://${file.absolute.path}",
|
|
),
|
|
],
|
|
album: SpotubeSimpleAlbumObject(
|
|
albumType: SpotubeAlbumType.album,
|
|
id: metadata?.album ?? "unknown",
|
|
name: metadata?.album ?? "Unknown Album",
|
|
externalUri: "file://${file.absolute.path}",
|
|
artists: [
|
|
SpotubeSimpleArtistObject(
|
|
id: metadata?.albumArtist ?? "unknown",
|
|
name: metadata?.albumArtist ?? "Unknown Artist",
|
|
externalUri: "file://${file.absolute.path}",
|
|
),
|
|
],
|
|
releaseDate:
|
|
metadata?.year != null ? "${metadata!.year}-01-01" : "1970-01-01",
|
|
),
|
|
durationMs: metadata?.durationMs?.toInt() ?? 0,
|
|
path: file.path,
|
|
);
|
|
}
|
|
|
|
factory SpotubeTrackObject.fromJson(Map<String, dynamic> json) =>
|
|
_$SpotubeTrackObjectFromJson(
|
|
json.containsKey("path")
|
|
? {...json, "runtimeType": "local"}
|
|
: {...json, "runtimeType": "full"},
|
|
);
|
|
}
|
|
|
|
extension AsMediaListSpotubeTrackObject on Iterable<SpotubeTrackObject> {
|
|
List<SpotubeMedia> asMediaList() {
|
|
return map((track) => SpotubeMedia(track)).toList();
|
|
}
|
|
}
|
|
|
|
extension ToMetadataSpotubeFullTrackObject on SpotubeFullTrackObject {
|
|
Metadata toMetadata({
|
|
required int fileLength,
|
|
Uint8List? imageBytes,
|
|
String? mimeType,
|
|
}) {
|
|
return Metadata(
|
|
title: name,
|
|
artist: artists.map((a) => a.name).join(", "),
|
|
album: album.name,
|
|
albumArtist: artists.map((a) => a.name).join(", "),
|
|
year: album.releaseDate == null
|
|
? 1970
|
|
: DateTime.parse(album.releaseDate!).year,
|
|
durationMs: durationMs.toDouble(),
|
|
fileSize: BigInt.from(fileLength),
|
|
picture: imageBytes != null
|
|
? Picture(
|
|
data: imageBytes,
|
|
mimeType: mimeType ??
|
|
lookupMimeType("", headerBytes: imageBytes) ??
|
|
"image/jpeg",
|
|
)
|
|
: null,
|
|
);
|
|
}
|
|
}
|