diff --git a/lib/src/endpoints/artists.dart b/lib/src/endpoints/artists.dart index 2e69c1e2..c9e24887 100644 --- a/lib/src/endpoints/artists.dart +++ b/lib/src/endpoints/artists.dart @@ -31,7 +31,8 @@ class Artists extends EndpointPaging { /// Returns related artists based on the artist with its [artistId] @Deprecated('Use relatedArtists instead') - Future> getRelatedArtists(String artistId) async => relatedArtists(artistId); + Future> getRelatedArtists(String artistId) async => + relatedArtists(artistId); /// Retrieves multiple artists with [artistIds] Future> list(Iterable artistIds) async { @@ -63,13 +64,14 @@ class Artists extends EndpointPaging { /// the album is available! Pages albums( String artistId, { - String? country, + Market? country, List? includeGroups, }) { - final _includeGroups = - includeGroups == null ? null : includeGroups.join(','); - final query = - _buildQuery({'include_groups': _includeGroups, 'country': country}); + final _includeGroups = includeGroups?.join(','); + final query = _buildQuery({ + 'include_groups': _includeGroups, + 'country': country?.name, + }); return _getPages( '$_path/$artistId/albums?$query', (json) => Album.fromJson(json)); } diff --git a/lib/src/endpoints/episodes.dart b/lib/src/endpoints/episodes.dart index ae1e0012..7e4ab72e 100644 --- a/lib/src/endpoints/episodes.dart +++ b/lib/src/endpoints/episodes.dart @@ -10,18 +10,20 @@ class Episodes extends EndpointBase { Episodes(SpotifyApiBase api) : super(api); - Future get(String id, [String? market]) async { + Future get(String id, [Market? market]) async { assert(id.isNotEmpty, 'No episode id was provided'); - var jsonString = - await _api._get('$_path/$id?' + _buildQuery({'market': market})); + var jsonString = await _api + ._get('$_path/$id?' + _buildQuery({'market': market?.name})); return EpisodeFull.fromJson(jsonDecode(jsonString)); } - Future> list(List ids, - [String? market]) async { + Future> list(List ids, [Market? market]) async { assert(ids.isNotEmpty, 'No episode id\'s were provided'); - var jsonString = await _api._get( - '$_path?' + _buildQuery({'ids': ids.join(','), 'market': market})); + var jsonString = await _api._get('$_path?' + + _buildQuery({ + 'ids': ids.join(','), + 'market': market?.name, + })); var episodesJson = jsonDecode(jsonString)['episodes'] as Iterable; return episodesJson.map((json) => EpisodeFull.fromJson(json)); } diff --git a/lib/src/endpoints/me.dart b/lib/src/endpoints/me.dart index 05d3a165..8199a7c6 100644 --- a/lib/src/endpoints/me.dart +++ b/lib/src/endpoints/me.dart @@ -117,14 +117,14 @@ class Me extends _MeEndpointBase { /// Use [state] to toggle the shuffle. `true` to turn shuffle on and `false` /// to turn it off respectively. /// Returns the current player state by making another request. - /// See [player(String market)]; + /// See [player]; @Deprecated('Use [spotify.player.shuffle()]') Future shuffle(bool state, [String? deviceId]) async => _player.shuffle(state, deviceId: deviceId); @Deprecated('Use [spotify.player.playbackState()]') Future player([String? market]) async => - _player.playbackState(market); + _player.playbackState(Market.values.asNameMap()[market]); /// Get the current user's top tracks, spanning over a [timeRange]. /// The [timeRange]'s default is [TimeRange.mediumTerm]. @@ -167,10 +167,13 @@ class Me extends _MeEndpointBase { /// [ids] - the ids of the shows to remove /// [market] - An ISO 3166-1 alpha-2 country code. If a country code is /// specified, only content that is available in that market will be returned. - Future removeShows(List ids, [String market = '']) async { + Future removeShows(List ids, [Market? market]) async { assert(ids.isNotEmpty, 'No show ids were provided for removing'); - var query = _buildQuery({'ids': ids.join(','), 'market': market}); - await _api._delete('$_path/shows?' + query); + var queryMap = { + 'ids': ids.join(','), + 'market': market?.name, + }; + await _api._delete('$_path/shows?' + _buildQuery(queryMap)); } /// Check if passed albums (ids) are saved by current user. diff --git a/lib/src/endpoints/player.dart b/lib/src/endpoints/player.dart index 2e3abb5d..df4faf88 100644 --- a/lib/src/endpoints/player.dart +++ b/lib/src/endpoints/player.dart @@ -28,14 +28,14 @@ class PlayerEndpoint extends _MeEndpointBase { /// and active device. @Deprecated('Use [playbackState] instead') Future player([String? market]) async { - return playbackState(market); + return playbackState(Market.values.asNameMap()[market]); } /// Returns the current playback state, including progress, track /// and active device. - Future playbackState([String? market]) async { - var jsonString = - await _api._get('$_path?' + _buildQuery({'market': market})); + Future playbackState([Market? market]) async { + var jsonString = await _api + ._get('$_path?' + _buildQuery({'market': market?.name})); final map = json.decode(jsonString); return PlaybackState.fromJson(map); } diff --git a/lib/src/endpoints/recommendations.dart b/lib/src/endpoints/recommendations.dart index 875a0b11..20d8e167 100644 --- a/lib/src/endpoints/recommendations.dart +++ b/lib/src/endpoints/recommendations.dart @@ -15,7 +15,7 @@ class RecommendationsEndpoint extends EndpointBase { Iterable? seedGenres, Iterable? seedTracks, int limit = 20, - String? market, + Market? market, Map? max, Map? min, Map? target}) async { @@ -33,7 +33,7 @@ class RecommendationsEndpoint extends EndpointBase { 'seed_genres': seedGenres, 'seed_tracks': seedTracks }.forEach((key, list) => _addList(parameters, key, list!)); - if (market != null) parameters['market'] = market; + if (market != null) parameters['market'] = market.name; [min, max, target].forEach((map) => _addTunableTrackMap(parameters, map)); final pathQuery = Uri(path: _path, queryParameters: parameters) .toString() diff --git a/lib/src/endpoints/search.dart b/lib/src/endpoints/search.dart index 5e42c194..9ebdf2fb 100644 --- a/lib/src/endpoints/search.dart +++ b/lib/src/endpoints/search.dart @@ -22,16 +22,15 @@ class Search extends EndpointPaging { BundledPages get( String searchQuery, { Iterable types = SearchType.all, - String market = '', + Market? market, }) { var type = types.map((type) => type._key).join(','); - var queryMap = {'q': searchQuery, 'type': type}; - if (market.isNotEmpty) { - queryMap.addAll({'market': market}); - } - - var query = _buildQuery(queryMap); + var query = _buildQuery({ + 'q': searchQuery, + 'type': type, + 'market': market?.name, + }); return _getBundledPages('$_path?$query', { 'playlists': (json) => PlaylistSimple.fromJson(json), diff --git a/lib/src/endpoints/shows.dart b/lib/src/endpoints/shows.dart index 9938f64d..1ffa0b97 100644 --- a/lib/src/endpoints/shows.dart +++ b/lib/src/endpoints/shows.dart @@ -15,10 +15,10 @@ class Shows extends EndpointPaging { /// [market]: An ISO 3166-1 alpha-2 country code or the string 'from_token'. /// If a country code is specified, only artists, albums, and tracks with /// content that is playable in that market is returned. - Future get(String showId, {String market = ''}) async { + Future get(String showId, {Market? market}) async { var jsonString; - if (market.isNotEmpty) { - var queryMap = {'market': market}; + if (market != null) { + var queryMap = {'market': market.name}; var query = _buildQuery(queryMap); jsonString = await _get('$_path/$showId?$query'); } else { @@ -44,8 +44,10 @@ class Shows extends EndpointPaging { /// [market]: An ISO 3166-1 alpha-2 country code or the string 'from_token'. /// If a country code is specified, only artists, albums, and tracks with /// content that is playable in that market is returned. - Pages episodes(String showId, {String? market}) { - var query = _buildQuery({'market': market}); + Pages episodes(String showId, [Market? market]) { + var query = _buildQuery({ + 'market': market?.name, + }); var queryString = query.isNotEmpty ? '?$query' : ''; return _getPages('$_path/$showId/episodes$queryString', diff --git a/lib/src/models/market.dart b/lib/src/models/market.dart index 83c2c08b..7b210681 100644 --- a/lib/src/models/market.dart +++ b/lib/src/models/market.dart @@ -246,6 +246,7 @@ enum Market { VU, WF, WS, + XK, YE, YT, ZA, diff --git a/test/data/v1/episodes/5Xt5DXGzch68nYYamXrNxZ.json b/test/data/v1/episodes/5Xt5DXGzch68nYYamXrNxZ.json index acef9283..1f1c5bb0 100644 --- a/test/data/v1/episodes/5Xt5DXGzch68nYYamXrNxZ.json +++ b/test/data/v1/episodes/5Xt5DXGzch68nYYamXrNxZ.json @@ -37,7 +37,7 @@ }, "show": { "available_markets": [ - "string" + "US" ], "copyrights": [ { diff --git a/test/data/v1/markets.json b/test/data/v1/markets.json index 931d431c..a6f910bc 100644 --- a/test/data/v1/markets.json +++ b/test/data/v1/markets.json @@ -1,7 +1,188 @@ { "markets": [ - "CA", + "AD", + "AE", + "AG", + "AL", + "AM", + "AO", + "AR", + "AT", + "AU", + "AZ", + "BA", + "BB", + "BD", + "BE", + "BF", + "BG", + "BH", + "BI", + "BJ", + "BN", + "BO", "BR", - "IT" + "BS", + "BT", + "BW", + "BY", + "BZ", + "CA", + "CD", + "CG", + "CH", + "CI", + "CL", + "CM", + "CO", + "CR", + "CV", + "CW", + "CY", + "CZ", + "DE", + "DJ", + "DK", + "DM", + "DO", + "DZ", + "EC", + "EE", + "EG", + "ES", + "ET", + "FI", + "FJ", + "FM", + "FR", + "GA", + "GB", + "GD", + "GE", + "GH", + "GM", + "GN", + "GQ", + "GR", + "GT", + "GW", + "GY", + "HK", + "HN", + "HR", + "HT", + "HU", + "ID", + "IE", + "IL", + "IN", + "IQ", + "IS", + "IT", + "JM", + "JO", + "JP", + "KE", + "KG", + "KH", + "KI", + "KM", + "KN", + "KR", + "KW", + "KZ", + "LA", + "LB", + "LC", + "LI", + "LK", + "LR", + "LS", + "LT", + "LU", + "LV", + "LY", + "MA", + "MC", + "MD", + "ME", + "MG", + "MH", + "MK", + "ML", + "MN", + "MO", + "MR", + "MT", + "MU", + "MV", + "MW", + "MX", + "MY", + "MZ", + "NA", + "NE", + "NG", + "NI", + "NL", + "NO", + "NP", + "NR", + "NZ", + "OM", + "PA", + "PE", + "PG", + "PH", + "PK", + "PL", + "PS", + "PT", + "PW", + "PY", + "QA", + "RO", + "RS", + "RW", + "SA", + "SB", + "SC", + "SE", + "SG", + "SI", + "SK", + "SL", + "SM", + "SN", + "SR", + "ST", + "SV", + "SZ", + "TD", + "TG", + "TH", + "TJ", + "TL", + "TN", + "TO", + "TR", + "TT", + "TV", + "TW", + "TZ", + "UA", + "UG", + "US", + "UY", + "UZ", + "VC", + "VE", + "VN", + "VU", + "WS", + "XK", + "ZA", + "ZM", + "ZW" ] } \ No newline at end of file diff --git a/test/data/v1/me/episodes.json b/test/data/v1/me/episodes.json index 56640856..c046331c 100644 --- a/test/data/v1/me/episodes.json +++ b/test/data/v1/me/episodes.json @@ -47,7 +47,7 @@ }, "show": { "available_markets": [ - "string" + "US" ], "copyrights": [ { diff --git a/test/data/v1/me/player/currently-playing.json b/test/data/v1/me/player/currently-playing.json index 5101c88a..fb114eac 100644 --- a/test/data/v1/me/player/currently-playing.json +++ b/test/data/v1/me/player/currently-playing.json @@ -110,7 +110,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 1, "duration_ms": 0, diff --git a/test/data/v1/me/player/queue.json b/test/data/v1/me/player/queue.json index 6a75801c..6bd25d43 100644 --- a/test/data/v1/me/player/queue.json +++ b/test/data/v1/me/player/queue.json @@ -71,7 +71,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -159,7 +159,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -247,7 +247,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -335,7 +335,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -423,7 +423,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -511,7 +511,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -599,7 +599,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -687,7 +687,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -775,7 +775,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -857,7 +857,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -923,7 +923,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -972,7 +972,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1226,7 +1226,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1314,7 +1314,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1402,7 +1402,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1490,7 +1490,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1578,7 +1578,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1666,7 +1666,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1754,7 +1754,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -1842,7 +1842,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, @@ -2039,7 +2039,7 @@ } ], "available_markets": [ - "string" + "US" ], "disc_number": 0, "duration_ms": 0, diff --git a/test/spotify_test.dart b/test/spotify_test.dart index afe7a93f..cebb0f25 100644 --- a/test/spotify_test.dart +++ b/test/spotify_test.dart @@ -294,8 +294,8 @@ Future main() async { final currentlyPlaying = result.currentlyPlaying; final queue = result.queue; - expect(currentlyPlaying != null, true); - expect(queue != null, true); + expect(currentlyPlaying, isNotNull); + expect(queue, isNotNull); // Checking the currentlyPlaying data @@ -405,8 +405,9 @@ Future main() async { var firstEpisode = result.items!.first; expect(firstEpisode.type, 'episode'); - expect(firstEpisode.name != null, true); + expect(firstEpisode.name, isNotNull); expect(firstEpisode.id, '5Xt5DXGzch68nYYamXrNxZ'); + expect(firstEpisode.show, isNotNull); }); test('containsSavedEpisodes', () async { @@ -495,9 +496,9 @@ Future main() async { test('getAvailableMarkets', () async { var result = await spotify.markets.availableMarkets; expect(result.isEmpty, false); - expect(result.first, Market.CA); - expect(result.elementAt(1), Market.BR); - expect(result.last, Market.IT); + expect(result.first, Market.AD); + expect(result.elementAt(1), Market.AE); + expect(result.last, Market.ZW); }); });