import 'package:hetu_script/hetu_script.dart'; import 'package:hetu_script/values.dart'; import 'package:spotube/models/metadata/metadata.dart'; class MetadataPluginSearchEndpoint { final Hetu hetu; MetadataPluginSearchEndpoint(this.hetu); HTInstance get hetuMetadataSearch => (hetu.fetch("metadataPlugin") as HTInstance).memberGet("search") as HTInstance; List get chips { return (hetuMetadataSearch.memberGet("chips") as List).cast(); } Future all(String query) async { if (query.isEmpty) { return SpotubeSearchResponseObject( albums: [], artists: [], playlists: [], tracks: [], ); } final raw = await hetuMetadataSearch.invoke( "all", positionalArgs: [query], ) as Map; return SpotubeSearchResponseObject.fromJson(raw.cast()); } Future> albums( String query, { int? limit, int? offset, }) async { if (query.isEmpty) { return SpotubePaginationResponseObject( items: [], total: 0, limit: limit ?? 20, hasMore: false, nextOffset: null, ); } final raw = await hetuMetadataSearch.invoke( "albums", positionalArgs: [query], namedArgs: { "limit": limit, "offset": offset, }..removeWhere((key, value) => value == null), ) as Map; return SpotubePaginationResponseObject.fromJson( raw.cast(), (json) => SpotubeSimpleAlbumObject.fromJson(json.cast()), ); } Future> artists( String query, { int? limit, int? offset, }) async { if (query.isEmpty) { return SpotubePaginationResponseObject( items: [], total: 0, limit: limit ?? 20, hasMore: false, nextOffset: null, ); } final raw = await hetuMetadataSearch.invoke( "artists", positionalArgs: [query], namedArgs: { "limit": limit, "offset": offset, }..removeWhere((key, value) => value == null), ) as Map; return SpotubePaginationResponseObject.fromJson( raw.cast(), (json) => SpotubeFullArtistObject.fromJson( json.cast(), ), ); } Future> playlists( String query, { int? limit, int? offset, }) async { if (query.isEmpty) { return SpotubePaginationResponseObject( items: [], total: 0, limit: limit ?? 20, hasMore: false, nextOffset: null, ); } final raw = await hetuMetadataSearch.invoke( "playlists", positionalArgs: [query], namedArgs: { "limit": limit, "offset": offset, }..removeWhere((key, value) => value == null), ) as Map; return SpotubePaginationResponseObject< SpotubeSimplePlaylistObject>.fromJson( raw.cast(), (json) => SpotubeSimplePlaylistObject.fromJson( json.cast(), ), ); } Future> tracks( String query, { int? limit, int? offset, }) async { if (query.isEmpty) { return SpotubePaginationResponseObject( items: [], total: 0, limit: limit ?? 20, hasMore: false, nextOffset: null, ); } final raw = await hetuMetadataSearch.invoke( "tracks", positionalArgs: [query], namedArgs: { "limit": limit, "offset": offset, }..removeWhere((key, value) => value == null), ) as Map; return SpotubePaginationResponseObject.fromJson( raw.cast(), (json) => SpotubeFullTrackObject.fromJson(json.cast()), ); } }