import 'package:spotify/spotify.dart'; import 'package:spotube/models/SpotubeTrack.dart'; extension AlbumJson on AlbumSimple { Map toJson() { return { "albumType": albumType, "id": id, "name": name, "images": images ?.map((image) => { "height": image.height, "url": image.url, "width": image.width, }) .toList(), }; } } extension ArtistJson on ArtistSimple { Map toJson() { return { "href": href, "id": id, "name": name, "type": type, "uri": uri, }; } } extension TrackJson on Track { Map toJson() { return { "album": album?.toJson(), "artists": artists?.map((artist) => artist.toJson()).toList(), "availableMarkets": availableMarkets, "discNumber": discNumber, "duration": duration.toString(), "durationMs": durationMs, "explicit": explicit, // "externalIds": externalIds, // "externalUrls": externalUrls, "href": href, "id": id, "isPlayable": isPlayable, // "linkedFrom": linkedFrom, "name": name, "popularity": popularity, "previewUrl": previewUrl, "trackNumber": trackNumber, "type": type, "uri": uri, }; } } class CurrentPlaylist { List? _tempTrack; List tracks; String id; String name; String thumbnail; bool isLocal; CurrentPlaylist({ required this.tracks, required this.id, required this.name, required this.thumbnail, this.isLocal = false, }); static CurrentPlaylist fromJson(Map map) { return CurrentPlaylist( id: map["id"], tracks: List.castFrom(map["tracks"] .map( (track) => map["isLocal"] == true ? SpotubeTrack.fromJson(track) : Track.fromJson(track), ) .toList()), name: map["name"], thumbnail: map["thumbnail"], isLocal: map["isLocal"], ); } List get trackIds => tracks.map((e) => e.id!).toList(); bool shuffle() { // won't shuffle if already shuffled if (_tempTrack == null) { _tempTrack = [...tracks]; tracks.shuffle(); return true; } return false; } bool unshuffle() { // without _tempTracks unshuffling can't be done if (_tempTrack != null) { tracks = [..._tempTrack!]; _tempTrack = null; return true; } return false; } Map toJson() { return { "id": id, "name": name, "tracks": tracks .map((track) => track is SpotubeTrack ? track.toJson() : track.toJson()) .toList(), "thumbnail": thumbnail, "isLocal": isLocal, }; } }