import 'package:hetu_script/hetu_script.dart'; import 'package:hetu_script/values.dart'; import 'package:spotube/models/metadata/metadata.dart'; class MetadataPluginPlaylistEndpoint { final Hetu hetu; MetadataPluginPlaylistEndpoint(this.hetu); HTInstance get hetuMetadataPlaylist => (hetu.fetch("metadataPlugin") as HTInstance).memberGet("playlist") as HTInstance; Future getPlaylist(String id) async { final raw = await hetuMetadataPlaylist .invoke("getPlaylist", positionalArgs: [id]) as Map; return SpotubeFullPlaylistObject.fromJson( raw.cast(), ); } Future> tracks( String id, { int? offset, int? limit, }) async { final raw = await hetuMetadataPlaylist.invoke( "tracks", positionalArgs: [id], namedArgs: { "offset": offset, "limit": limit, }..removeWhere((key, value) => value == null), ) as Map; return SpotubePaginationResponseObject.fromJson( raw.cast(), (Map json) => SpotubeFullTrackObject.fromJson(json.cast()), ); } Future create( String userId, { required String name, String? description, bool? public, bool? collaborative, }) async { final raw = await hetuMetadataPlaylist.invoke( "create", positionalArgs: [userId], namedArgs: { "name": name, "description": description, "public": public, "collaborative": collaborative, }..removeWhere((key, value) => value == null), ) as Map?; if (raw == null) return null; return SpotubeFullPlaylistObject.fromJson( raw.cast(), ); } Future update( String playlistId, { String? name, String? description, bool? public, bool? collaborative, }) async { await hetuMetadataPlaylist.invoke( "update", positionalArgs: [playlistId], namedArgs: { "name": name, "description": description, "public": public, "collaborative": collaborative, }..removeWhere((key, value) => value == null), ); } Future addTracks( String playlistId, { required List trackIds, int? position, }) async { await hetuMetadataPlaylist.invoke( "addTracks", positionalArgs: [playlistId], namedArgs: { "trackIds": trackIds, "position": position, }..removeWhere((key, value) => value == null), ); } Future removeTracks( String playlistId, { required List trackIds, }) async { await hetuMetadataPlaylist.invoke( "removeTracks", positionalArgs: [playlistId], namedArgs: { "trackIds": trackIds, }..removeWhere((key, value) => value == null), ); } Future save(String playlistId) async { await hetuMetadataPlaylist.invoke( "save", positionalArgs: [playlistId], ); } Future unsave(String playlistId) async { await hetuMetadataPlaylist.invoke( "unsave", positionalArgs: [playlistId], ); } Future deletePlaylist(String playlistId) async { await hetuMetadataPlaylist.invoke( "deletePlaylist", positionalArgs: [playlistId], ); } }