From 60a68427f284f77ebc1c75b6544b24dcc338fa9b Mon Sep 17 00:00:00 2001 From: Ruben Quadros Date: Sat, 27 Apr 2024 00:32:26 +0530 Subject: [PATCH] Adding the albums api. (#11) --- .../rubenquadros/kovibes/api/KoVibesApi.kt | 4 +- .../kovibes/api/SpotifyService.kt | 60 + .../kovibes/api/SpotifyServiceImpl.kt | 48 +- .../kovibes/api/album/AlbumApi.kt | 52 + .../kovibes/api/album/AlbumApiImpl.kt | 85 + .../kovibes/api/album/AlbumApiMapper.kt | 42 + .../album/models/GetAlbumTracksResponse.kt | 59 + .../models/GetNewAlbumReleasesResponse.kt | 32 + .../kovibes/api/artist/ArtistApi.kt | 2 +- .../kovibes/api/models/AlbumInfo.kt | 6 +- .../kovibes/api/response/AlbumTracks.kt | 14 + .../kovibes/api/response/NewAlbumReleases.kt | 6 + .../rubenquadros/kovibes/api/test/TestUtil.kt | 5 +- .../api/test/album/AlbumApiMapperTest.kt | 39 + .../kovibes/api/test/album/AlbumApiTest.kt | 92 + .../api/test/artist/ArtistApiMapperTest.kt | 6 +- .../api/test/browse/BrowseApiMapperTest.kt | 6 +- .../kovibes/api/test/browse/BrowseApiTest.kt | 2 +- .../kovibes/api/test/error/ErrorTest.kt | 2 +- .../kovibes/api/test/ktor/KtorServiceTest.kt | 2 +- .../test/playlist/PlaylistApiMapperTest.kt | 6 +- .../api/test/playlist/PlaylistApiTest.kt | 2 +- .../RecommendationsApiMapperTest.kt | 6 +- .../recommendations/RecommendationsApiTest.kt | 2 +- .../api/test/search/SearchApiMapperTest.kt | 10 +- .../kovibes/api/test/search/SearchApiTest.kt | 2 +- .../kovibes/api/test/service/FakeAlbumApi.kt | 44 + .../kovibes/api/test/service/FakeArtistApi.kt | 11 +- .../kovibes/api/test/service/FakeBrowseApi.kt | 6 +- .../api/test/service/FakePlaylistApi.kt | 6 +- .../test/service/FakeRecommendationsApi.kt | 4 +- .../kovibes/api/test/service/FakeSearchApi.kt | 10 +- .../api/test/service/SpotifyServiceTest.kt | 71 +- .../api/test/spotify/KoVibesApiTest.kt | 2 +- .../src/commonTest/resources/album/album.json | 4147 +++++++++++++++ .../resources/album/new_releases.json | 4631 +++++++++++++++++ .../commonTest/resources/album/tracks.json | 3895 ++++++++++++++ 37 files changed, 13362 insertions(+), 57 deletions(-) create mode 100644 kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApi.kt create mode 100644 kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiImpl.kt create mode 100644 kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiMapper.kt create mode 100644 kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetAlbumTracksResponse.kt create mode 100644 kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetNewAlbumReleasesResponse.kt create mode 100644 kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/AlbumTracks.kt create mode 100644 kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/NewAlbumReleases.kt create mode 100644 kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiMapperTest.kt create mode 100644 kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiTest.kt create mode 100644 kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeAlbumApi.kt create mode 100644 kovibes/src/commonTest/resources/album/album.json create mode 100644 kovibes/src/commonTest/resources/album/new_releases.json create mode 100644 kovibes/src/commonTest/resources/album/tracks.json diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/KoVibesApi.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/KoVibesApi.kt index d31275b..9317446 100644 --- a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/KoVibesApi.kt +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/KoVibesApi.kt @@ -1,5 +1,6 @@ package io.github.rubenquadros.kovibes.api +import io.github.rubenquadros.kovibes.api.album.AlbumApiImpl import io.github.rubenquadros.kovibes.api.artist.ArtistApiImpl import io.github.rubenquadros.kovibes.api.browse.BrowseApiImpl import io.github.rubenquadros.kovibes.api.config.Config @@ -31,7 +32,8 @@ object KoVibesApi { browseApi = BrowseApiImpl(ktorService), searchApi = SearchApiImpl(ktorService), recommendationsApi = RecommendationsApiImpl(ktorService), - artistApi = ArtistApiImpl(ktorService) + artistApi = ArtistApiImpl(ktorService), + albumApi = AlbumApiImpl(ktorService) ) } diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyService.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyService.kt index bbb4f2b..474a604 100644 --- a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyService.kt +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyService.kt @@ -1,6 +1,8 @@ package io.github.rubenquadros.kovibes.api import io.github.rubenquadros.kovibes.api.request.GetRecommendationsRequest +import io.github.rubenquadros.kovibes.api.response.Album +import io.github.rubenquadros.kovibes.api.response.AlbumTracks import io.github.rubenquadros.kovibes.api.response.Albums import io.github.rubenquadros.kovibes.api.response.Artist import io.github.rubenquadros.kovibes.api.response.ArtistTopTracks @@ -8,6 +10,7 @@ import io.github.rubenquadros.kovibes.api.response.Artists import io.github.rubenquadros.kovibes.api.response.Categories import io.github.rubenquadros.kovibes.api.response.ErrorBody import io.github.rubenquadros.kovibes.api.response.Genres +import io.github.rubenquadros.kovibes.api.response.NewAlbumReleases import io.github.rubenquadros.kovibes.api.response.PlaylistTracks import io.github.rubenquadros.kovibes.api.response.Playlists import io.github.rubenquadros.kovibes.api.response.Recommendations @@ -278,4 +281,61 @@ interface SpotifyService { * @return [RelatedArtists] when success and [ErrorBody] when error. */ suspend fun getRelatedArtists(id: String): SpotifyApiResponse + + /** + * Get album API returns the details about an album. + * + * See [Spotify doc](https://developer.spotify.com/documentation/web-api/reference/get-an-album). + * + * @param id + * @param market + * @return [Album] when success and [ErrorBody] when error. + */ + suspend fun getAlbum(id: String, market: String? = null): SpotifyApiResponse + + /** + * Get album tracks API returns all the tracks in an album. + * This is a paginated API. + * + * `offset` is the page you are requesting for. Initially it will be 0. + * + * You will have to increment it for subsequent pages. + * + * You can know if there are more pages from [Tracks.isNext]. + * + * See [Spotify doc](https://developer.spotify.com/documentation/web-api/reference/get-an-albums-tracks). + * + * @param id + * @param market + * @param limit + * @param offset + * @return [AlbumTracks] when success and [ErrorBody] when error. + */ + suspend fun getAlbumTracks( + id: String, + market: String? = null, + limit: Int = 20, + offset: Int = 0 + ): SpotifyApiResponse + + /** + * Get new album releases API returns all the new album releases. + * This is a paginated API. + * + * `offset` is the page you are requesting for. Initially it will be 0. + * + * You will have to increment it for subsequent pages. + * + * You can know if there are more pages from [NewAlbumReleases.isNext]. + * + * See [Spotify doc](https://developer.spotify.com/documentation/web-api/reference/get-new-releases). + * + * @param limit + * @param offset + * @return [NewAlbumReleases] when success and [ErrorBody] when error. + */ + suspend fun getNewAlbumReleases( + limit: Int = 20, + offset: Int = 0 + ): SpotifyApiResponse } \ No newline at end of file diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyServiceImpl.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyServiceImpl.kt index d88cd0a..f36f13d 100644 --- a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyServiceImpl.kt +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/SpotifyServiceImpl.kt @@ -1,20 +1,24 @@ package io.github.rubenquadros.kovibes.api +import io.github.rubenquadros.kovibes.api.album.AlbumApi +import io.github.rubenquadros.kovibes.api.album.toAlbumTracks +import io.github.rubenquadros.kovibes.api.album.toNewAlbumReleases import io.github.rubenquadros.kovibes.api.artist.ArtistApi import io.github.rubenquadros.kovibes.api.artist.toArtistTopTracks import io.github.rubenquadros.kovibes.api.artist.toRelatedArtists import io.github.rubenquadros.kovibes.api.browse.BrowseApi import io.github.rubenquadros.kovibes.api.browse.toCategories +import io.github.rubenquadros.kovibes.api.mapper.toAlbum import io.github.rubenquadros.kovibes.api.mapper.toAlbums import io.github.rubenquadros.kovibes.api.mapper.toArtist import io.github.rubenquadros.kovibes.api.playlist.PlaylistApi -import io.github.rubenquadros.kovibes.api.playlist.models.FeaturedPlaylistsResponse -import io.github.rubenquadros.kovibes.api.playlist.models.PlaylistTracksResponse import io.github.rubenquadros.kovibes.api.playlist.toFeaturedPlayLists import io.github.rubenquadros.kovibes.api.playlist.toPlaylistTracks import io.github.rubenquadros.kovibes.api.recommendations.RecommendationsApi import io.github.rubenquadros.kovibes.api.recommendations.toRecommendations import io.github.rubenquadros.kovibes.api.request.GetRecommendationsRequest +import io.github.rubenquadros.kovibes.api.response.Album +import io.github.rubenquadros.kovibes.api.response.AlbumTracks import io.github.rubenquadros.kovibes.api.response.Albums import io.github.rubenquadros.kovibes.api.response.Artist import io.github.rubenquadros.kovibes.api.response.ArtistTopTracks @@ -22,6 +26,7 @@ import io.github.rubenquadros.kovibes.api.response.Artists import io.github.rubenquadros.kovibes.api.response.Categories import io.github.rubenquadros.kovibes.api.response.ErrorBody import io.github.rubenquadros.kovibes.api.response.Genres +import io.github.rubenquadros.kovibes.api.response.NewAlbumReleases import io.github.rubenquadros.kovibes.api.response.PlaylistTracks import io.github.rubenquadros.kovibes.api.response.Playlists import io.github.rubenquadros.kovibes.api.response.Recommendations @@ -42,21 +47,22 @@ import io.github.rubenquadros.kovibes.api.search.toSearchTrack * @property searchApi * @property recommendationsApi * @property artistApi + * @property albumApi */ internal class SpotifyServiceImpl( private val playlistApi: PlaylistApi, private val browseApi: BrowseApi, private val searchApi: SearchApi, private val recommendationsApi: RecommendationsApi, - private val artistApi: ArtistApi + private val artistApi: ArtistApi, + private val albumApi: AlbumApi ) : SpotifyService { override suspend fun getFeaturedPlaylists( locale: String, limit: Int, offset: Int ): SpotifyApiResponse { - val response: ApiResponse = - playlistApi.getFeaturedPlaylists(locale, limit, offset) + val response = playlistApi.getFeaturedPlaylists(locale, limit, offset) return response.getParsedApiResponse { it.toFeaturedPlayLists() } } @@ -68,8 +74,7 @@ internal class SpotifyServiceImpl( limit: Int, offset: Int ): SpotifyApiResponse { - val response: ApiResponse = - playlistApi.getPlaylistTracks(id, market, fields, limit, offset) + val response = playlistApi.getPlaylistTracks(id, market, fields, limit, offset) return response.getParsedApiResponse { it.toPlaylistTracks() } } @@ -172,4 +177,33 @@ internal class SpotifyServiceImpl( return response.getParsedApiResponse { it.toRelatedArtists() } } + + override suspend fun getAlbum( + id: String, + market: String? + ): SpotifyApiResponse { + val response = albumApi.getAlbum(id, market) + + return response.getParsedApiResponse { it.toAlbum() } + } + + override suspend fun getAlbumTracks( + id: String, + market: String?, + limit: Int, + offset: Int + ): SpotifyApiResponse { + val response = albumApi.getAlbumTracks(id, market, limit, offset) + + return response.getParsedApiResponse { it.toAlbumTracks() } + } + + override suspend fun getNewAlbumReleases( + limit: Int, + offset: Int + ): SpotifyApiResponse { + val response = albumApi.getNewAlbumReleases(limit, offset) + + return response.getParsedApiResponse { it.toNewAlbumReleases() } + } } \ No newline at end of file diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApi.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApi.kt new file mode 100644 index 0000000..31d4afb --- /dev/null +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApi.kt @@ -0,0 +1,52 @@ +package io.github.rubenquadros.kovibes.api.album + +import io.github.rubenquadros.kovibes.api.ApiResponse +import io.github.rubenquadros.kovibes.api.album.models.GetAlbumTracksResponse +import io.github.rubenquadros.kovibes.api.album.models.GetNewAlbumReleasesResponse +import io.github.rubenquadros.kovibes.api.models.AlbumInfo +import io.github.rubenquadros.kovibes.api.response.ErrorBody + +/** + * Album API interface provides methods using which one can get all the information about an album. + * + * Each API returns [ApiResponse] + */ +internal interface AlbumApi { + + /** + * Get album API returns the information about an album. + * + * @param id + * @param market + * @return [AlbumInfo] when success and [ErrorBody] when error. + */ + suspend fun getAlbum(id: String, market: String?): ApiResponse + + /** + * Get album tracks API returns all the tracks in an album. + * + * @param id + * @param market + * @param limit + * @param offset + * @return [GetAlbumTracksResponse] when success and [ErrorBody] when error. + */ + suspend fun getAlbumTracks( + id: String, + market: String?, + limit: Int, + offset: Int + ): ApiResponse + + /** + * Get new album releases API returns all the albums that have newly released. + * + * @param limit + * @param offset + * @return [GetNewAlbumReleasesResponse] when success and [ErrorBody] when error. + */ + suspend fun getNewAlbumReleases( + limit: Int, + offset: Int + ): ApiResponse +} \ No newline at end of file diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiImpl.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiImpl.kt new file mode 100644 index 0000000..b2b1beb --- /dev/null +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiImpl.kt @@ -0,0 +1,85 @@ +package io.github.rubenquadros.kovibes.api.album + +import io.github.rubenquadros.kovibes.api.ApiResponse +import io.github.rubenquadros.kovibes.api.KtorService +import io.github.rubenquadros.kovibes.api.album.models.GetNewAlbumReleasesResponse +import io.github.rubenquadros.kovibes.api.album.models.GetAlbumTracksResponse +import io.github.rubenquadros.kovibes.api.getParsedHttpResponse +import io.github.rubenquadros.kovibes.api.models.AlbumInfo +import io.github.rubenquadros.kovibes.api.response.ErrorBody +import io.ktor.client.request.get +import io.ktor.http.path +import io.ktor.util.StringValues +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +internal class AlbumApiImpl( + private val ktorService: KtorService, + private val dispatcher: CoroutineDispatcher = Dispatchers.IO +) : AlbumApi { + override suspend fun getAlbum(id: String, market: String?): ApiResponse { + val response = withContext(dispatcher) { + ktorService.client.get { + url { + path("v1/albums/${id}") + + parameters.appendAll( + StringValues.build { + market?.let { this["market"] = market } + } + ) + } + } + } + + return response.getParsedHttpResponse() + } + + override suspend fun getAlbumTracks( + id: String, + market: String?, + limit: Int, + offset: Int + ): ApiResponse { + val response = withContext(dispatcher) { + ktorService.client.get { + url { + path("v1/albums/$id/tracks") + + parameters.appendAll( + StringValues.build { + market?.let { this["market"] = market } + this["limit"] = limit.toString() + this["offset"] = offset.toString() + } + ) + } + } + } + + return response.getParsedHttpResponse() + } + + override suspend fun getNewAlbumReleases( + limit: Int, + offset: Int + ): ApiResponse { + val response = withContext(dispatcher) { + ktorService.client.get { + url { + path("v1/browse/new-releases") + + parameters.appendAll( + StringValues.build { + this["limit"] = limit.toString() + this["offset"] = offset.toString() + } + ) + } + } + } + + return response.getParsedHttpResponse() + } +} \ No newline at end of file diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiMapper.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiMapper.kt new file mode 100644 index 0000000..2b8f74f --- /dev/null +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/AlbumApiMapper.kt @@ -0,0 +1,42 @@ +package io.github.rubenquadros.kovibes.api.album + +import io.github.rubenquadros.kovibes.api.album.models.GetAlbumTracksResponse +import io.github.rubenquadros.kovibes.api.album.models.GetNewAlbumReleasesResponse +import io.github.rubenquadros.kovibes.api.album.models.SimplifiedTrackInfo +import io.github.rubenquadros.kovibes.api.mapper.toAlbum +import io.github.rubenquadros.kovibes.api.mapper.toArtist +import io.github.rubenquadros.kovibes.api.response.AlbumTrack +import io.github.rubenquadros.kovibes.api.response.AlbumTracks +import io.github.rubenquadros.kovibes.api.response.NewAlbumReleases + +/** + * @suppress + * Map [GetAlbumTracksResponse] to [AlbumTracks]. + */ +internal fun GetAlbumTracksResponse.toAlbumTracks(): AlbumTracks { + return AlbumTracks( + isNext = next != null, + items = items.map { it.toAlbumTrack() } + ) +} + +/** + * @suppress + * Map [GetNewAlbumReleasesResponse] to [NewAlbumReleases]. + */ +internal fun GetNewAlbumReleasesResponse.toNewAlbumReleases(): NewAlbumReleases { + return NewAlbumReleases( + isNext = albums.next != null, + items = albums.items.map { it.toAlbum() } + ) +} + +private fun SimplifiedTrackInfo.toAlbumTrack(): AlbumTrack { + return AlbumTrack( + id = id, + name = name, + previewUrl = previewUrl, + duration = duration, + artists = artists.map { it.toArtist() } + ) +} \ No newline at end of file diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetAlbumTracksResponse.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetAlbumTracksResponse.kt new file mode 100644 index 0000000..565c28b --- /dev/null +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetAlbumTracksResponse.kt @@ -0,0 +1,59 @@ +package io.github.rubenquadros.kovibes.api.album.models + +import io.github.rubenquadros.kovibes.api.ExcludeFromCoverage +import io.github.rubenquadros.kovibes.api.models.ArtistInfo +import io.github.rubenquadros.kovibes.api.models.ExternalUrls +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@ExcludeFromCoverage +@Serializable +internal data class GetAlbumTracksResponse( + @SerialName("href") + val href: String, + @SerialName("limit") + val limit: Int, + @SerialName("next") + val next: String?, + @SerialName("offset") + val offset: Int, + @SerialName("total") + val total: Int, + @SerialName("previous") + val previous: String?, + @SerialName("items") + val items: List +) + +@ExcludeFromCoverage +@Serializable +internal data class SimplifiedTrackInfo( + @SerialName("artists") + val artists: List, + @SerialName("available_markets") + val availableMarkets: List, + @SerialName("disc_number") + val discNumber: Int, + @SerialName("duration_ms") + val duration: Long, + @SerialName("explicit") + val explicit: Boolean, + @SerialName("external_urls") + val externalUrls: ExternalUrls, + @SerialName("href") + val href: String, + @SerialName("id") + val id: String, + @SerialName("name") + val name: String, + @SerialName("preview_url") + val previewUrl: String? = null, + @SerialName("track_number") + val trackNumber: Int, + @SerialName("type") + val type: String, + @SerialName("uri") + val uri: String +) + + diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetNewAlbumReleasesResponse.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetNewAlbumReleasesResponse.kt new file mode 100644 index 0000000..220501c --- /dev/null +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/album/models/GetNewAlbumReleasesResponse.kt @@ -0,0 +1,32 @@ +package io.github.rubenquadros.kovibes.api.album.models + +import io.github.rubenquadros.kovibes.api.ExcludeFromCoverage +import io.github.rubenquadros.kovibes.api.models.AlbumInfo +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@ExcludeFromCoverage +@Serializable +internal data class GetNewAlbumReleasesResponse( + @SerialName("albums") + val albums: NewAlbumsInfo +) + +@ExcludeFromCoverage +@Serializable +internal data class NewAlbumsInfo( + @SerialName("href") + val href: String, + @SerialName("limit") + val limit: Int, + @SerialName("next") + val next: String?, + @SerialName("offset") + val offset: Int, + @SerialName("total") + val total: Int, + @SerialName("previous") + val previous: String?, + @SerialName("items") + val items: List +) diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/artist/ArtistApi.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/artist/ArtistApi.kt index ba79a47..709237a 100644 --- a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/artist/ArtistApi.kt +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/artist/ArtistApi.kt @@ -9,7 +9,7 @@ import io.github.rubenquadros.kovibes.api.response.ErrorBody /** * Artist API interface provides methods using which one can get information about the artist. - * You can get artists' top tracks, albums and also other related artists. + * You can get an artists top tracks, albums and also other related artists. * * Each API returns [ApiResponse]. */ diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/models/AlbumInfo.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/models/AlbumInfo.kt index a931d1a..07ebb20 100644 --- a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/models/AlbumInfo.kt +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/models/AlbumInfo.kt @@ -56,5 +56,9 @@ internal data class AlbumInfo( @SerialName("type") val type: String, @SerialName("uri") - val uri: String + val uri: String, + @SerialName("genres") + val genres: List? = null, + @SerialName("label") + val label: String? = null ) diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/AlbumTracks.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/AlbumTracks.kt new file mode 100644 index 0000000..8381e6b --- /dev/null +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/AlbumTracks.kt @@ -0,0 +1,14 @@ +package io.github.rubenquadros.kovibes.api.response + +data class AlbumTracks( + val isNext: Boolean, + val items: List +) + +data class AlbumTrack( + val id: String, + val name: String, + val duration: Long, + val artists: List, + val previewUrl: String? +) \ No newline at end of file diff --git a/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/NewAlbumReleases.kt b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/NewAlbumReleases.kt new file mode 100644 index 0000000..abae742 --- /dev/null +++ b/kovibes/src/commonMain/kotlin/io/github/rubenquadros/kovibes/api/response/NewAlbumReleases.kt @@ -0,0 +1,6 @@ +package io.github.rubenquadros.kovibes.api.response + +data class NewAlbumReleases( + val isNext: Boolean, + val items: List +) diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/TestUtil.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/TestUtil.kt index d8fde53..86f9846 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/TestUtil.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/TestUtil.kt @@ -3,6 +3,7 @@ package io.github.rubenquadros.kovibes.api.test import io.github.rubenquadros.kovibes.api.ApiResponse import io.github.rubenquadros.kovibes.api.response.Error import io.github.rubenquadros.kovibes.api.response.ErrorBody +import kotlinx.serialization.json.Json fun getExpectedResponse(responsePath: String): String { return readResource(responsePath) @@ -28,4 +29,6 @@ internal fun getApiResponse( ) ) } -} \ No newline at end of file +} + +val json: Json by lazy { Json { ignoreUnknownKeys = true } } \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiMapperTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiMapperTest.kt new file mode 100644 index 0000000..0828e0d --- /dev/null +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiMapperTest.kt @@ -0,0 +1,39 @@ +package io.github.rubenquadros.kovibes.api.test.album + +import io.github.rubenquadros.kovibes.api.album.models.GetAlbumTracksResponse +import io.github.rubenquadros.kovibes.api.album.models.GetNewAlbumReleasesResponse +import io.github.rubenquadros.kovibes.api.album.toAlbumTracks +import io.github.rubenquadros.kovibes.api.album.toNewAlbumReleases +import io.github.rubenquadros.kovibes.api.test.getExpectedResponse +import io.github.rubenquadros.kovibes.api.test.json +import kotlin.test.Test +import kotlin.test.assertTrue + +class AlbumApiMapperTest { + + @Test + fun `get album tracks response is mapped to album tracks`() { + val albumTracksResponse = json.decodeFromString( + getExpectedResponse("album/tracks.json") + ) + + val albumTracks = albumTracksResponse.toAlbumTracks() + + assertTrue { + albumTracksResponse.items.size == albumTracks.items.size + } + } + + @Test + fun `new album releases response is mapped to new album releases`() { + val newAlbumReleasesResponse = json.decodeFromString( + getExpectedResponse("album/new_releases.json") + ) + + val newAlbumReleases = newAlbumReleasesResponse.toNewAlbumReleases() + + assertTrue { + newAlbumReleasesResponse.albums.items.size == newAlbumReleases.items.size + } + } +} \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiTest.kt new file mode 100644 index 0000000..e8d0850 --- /dev/null +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/album/AlbumApiTest.kt @@ -0,0 +1,92 @@ +package io.github.rubenquadros.kovibes.api.test.album + +import io.github.rubenquadros.kovibes.api.album.AlbumApiImpl +import io.github.rubenquadros.kovibes.api.test.MockKtorService +import io.github.rubenquadros.kovibes.api.test.MockResponse +import io.github.rubenquadros.kovibes.api.test.assertApiResponseFailure +import io.github.rubenquadros.kovibes.api.test.assertApiResponseSuccess +import io.github.rubenquadros.kovibes.api.test.errorResponsePath +import kotlinx.coroutines.test.runTest +import kotlin.test.Test + +class AlbumApiTest { + + private val albumApi = AlbumApiImpl( + ktorService = MockKtorService.createMockKtorService(createMockAlbumConfig()) + ) + + @Test + fun `when album spotify api responds success then result is received`() = runTest { + MockKtorService.isSuccess = true + + val response = albumApi.getAlbum(id = "123", market = null) + + response.assertApiResponseSuccess( + { it.artists.isNotEmpty() } + ) + } + + @Test + fun `when album spotify api responds error then failure is received`() = runTest { + MockKtorService.isSuccess = false + + val response = albumApi.getAlbum(id = "123", market = null) + + response.assertApiResponseFailure() + } + + @Test + fun `when album tracks spotify api responds success then result is received`() = runTest { + MockKtorService.isSuccess = true + + val response = albumApi.getAlbumTracks(id = "456", offset = 0, limit = 20, market = null) + + response.assertApiResponseSuccess( + { it.items.isNotEmpty() } + ) + } + + @Test + fun `when album tracks spotify api responds error then failure is received`() = runTest { + MockKtorService.isSuccess = false + + val response = albumApi.getAlbumTracks(id = "456", offset = 0, limit = 20, market = null) + + response.assertApiResponseFailure() + } + + @Test + fun `when new album releases spotify api responds success then result is received`() = runTest { + MockKtorService.isSuccess = true + + val response = albumApi.getNewAlbumReleases(limit = 20, offset = 0) + + response.assertApiResponseSuccess( + { it.albums.items.isNotEmpty() } + ) + } + + @Test + fun `when new album releases spotify api responds error then failure is received`() = runTest { + MockKtorService.isSuccess = false + + val response = albumApi.getNewAlbumReleases(limit = 20, offset = 0) + + response.assertApiResponseFailure() + } + + private fun createMockAlbumConfig() = mapOf( + "albums/123" to MockResponse( + expectedSuccessResponsePath = "album/album.json", + expectedErrorResponsePath = errorResponsePath + ), + "albums/456/tracks" to MockResponse( + expectedSuccessResponsePath = "album/tracks.json", + expectedErrorResponsePath = errorResponsePath + ), + "new-releases" to MockResponse( + expectedSuccessResponsePath = "album/new_releases.json", + expectedErrorResponsePath = errorResponsePath + ) + ) +} \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/artist/ArtistApiMapperTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/artist/ArtistApiMapperTest.kt index c39480c..5e12e35 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/artist/ArtistApiMapperTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/artist/ArtistApiMapperTest.kt @@ -5,7 +5,7 @@ import io.github.rubenquadros.kovibes.api.artist.models.GetRelatedArtistsRespons import io.github.rubenquadros.kovibes.api.artist.toArtistTopTracks import io.github.rubenquadros.kovibes.api.artist.toRelatedArtists import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json +import io.github.rubenquadros.kovibes.api.test.json import kotlin.test.Test import kotlin.test.assertTrue @@ -13,7 +13,7 @@ class ArtistApiMapperTest { @Test fun `artist top tracks response is mapped to artist top tracks`() { - val artistTopTracksResponse = Json.decodeFromString( + val artistTopTracksResponse = json.decodeFromString( getExpectedResponse("artist/top_tracks.json") ) @@ -26,7 +26,7 @@ class ArtistApiMapperTest { @Test fun `related artists response is mapped to related artists`() { - val relatedArtistsResponse = Json.decodeFromString( + val relatedArtistsResponse = json.decodeFromString( getExpectedResponse("artist/related_artists.json") ) diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiMapperTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiMapperTest.kt index 2d02baa..7e68f2b 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiMapperTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiMapperTest.kt @@ -3,15 +3,15 @@ package io.github.rubenquadros.kovibes.api.test.browse import io.github.rubenquadros.kovibes.api.browse.models.CategoriesResponse import io.github.rubenquadros.kovibes.api.browse.toCategories import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json -import org.junit.Test +import io.github.rubenquadros.kovibes.api.test.json +import kotlin.test.Test import kotlin.test.assertTrue class BrowseApiMapperTest { @Test fun `categories response is mapped to categories`() { - val categoriesResponseJson = Json.decodeFromString( + val categoriesResponseJson = json.decodeFromString( getExpectedResponse("browse/categories.json") ) diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiTest.kt index 25cf5d0..860c3a7 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/browse/BrowseApiTest.kt @@ -7,7 +7,7 @@ import io.github.rubenquadros.kovibes.api.test.assertApiResponseFailure import io.github.rubenquadros.kovibes.api.test.assertApiResponseSuccess import io.github.rubenquadros.kovibes.api.test.errorResponsePath import kotlinx.coroutines.test.runTest -import org.junit.Test +import kotlin.test.Test class BrowseApiTest { diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/error/ErrorTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/error/ErrorTest.kt index adf0a0c..c958187 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/error/ErrorTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/error/ErrorTest.kt @@ -6,7 +6,7 @@ import io.github.rubenquadros.kovibes.api.test.MockResponse import io.github.rubenquadros.kovibes.api.test.assertApiResponseFailure import io.github.rubenquadros.kovibes.api.test.errorResponsePath import kotlinx.coroutines.test.runTest -import org.junit.Test +import kotlin.test.Test class ErrorTest { diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/ktor/KtorServiceTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/ktor/KtorServiceTest.kt index b869190..063dd9d 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/ktor/KtorServiceTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/ktor/KtorServiceTest.kt @@ -18,7 +18,7 @@ import io.ktor.http.HttpStatusCode import io.ktor.http.path import io.ktor.utils.io.ByteReadChannel import kotlinx.coroutines.test.runTest -import org.junit.Test +import kotlin.test.Test import kotlin.test.assertTrue class KtorServiceTest { diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiMapperTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiMapperTest.kt index ab86496..50ac9ce 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiMapperTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiMapperTest.kt @@ -3,15 +3,15 @@ package io.github.rubenquadros.kovibes.api.test.playlist import io.github.rubenquadros.kovibes.api.playlist.models.FeaturedPlaylistsResponse import io.github.rubenquadros.kovibes.api.playlist.toFeaturedPlayLists import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json -import org.junit.Test +import io.github.rubenquadros.kovibes.api.test.json +import kotlin.test.Test import kotlin.test.assertTrue class PlaylistApiMapperTest { @Test fun `featured playlist response is mapped to featured playlists`() { - val featuredPlaylistResponseJson = Json.decodeFromString( + val featuredPlaylistResponseJson = json.decodeFromString( getExpectedResponse("playlist/featured_playlists.json") ) diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiTest.kt index 41d0154..86b6a65 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/playlist/PlaylistApiTest.kt @@ -7,7 +7,7 @@ import io.github.rubenquadros.kovibes.api.test.assertApiResponseFailure import io.github.rubenquadros.kovibes.api.test.assertApiResponseSuccess import io.github.rubenquadros.kovibes.api.test.errorResponsePath import kotlinx.coroutines.test.runTest -import org.junit.Test +import kotlin.test.Test class PlaylistApiTest { diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiMapperTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiMapperTest.kt index f1fa4cc..9d7ef43 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiMapperTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiMapperTest.kt @@ -3,15 +3,15 @@ package io.github.rubenquadros.kovibes.api.test.recommendations import io.github.rubenquadros.kovibes.api.recommendations.models.RecommendationsResponse import io.github.rubenquadros.kovibes.api.recommendations.toRecommendations import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json -import org.junit.Test +import io.github.rubenquadros.kovibes.api.test.json +import kotlin.test.Test import kotlin.test.assertTrue class RecommendationsApiMapperTest { @Test fun `recommendations response is mapped to recommendations`() { - val recommendationsResponseJson = Json.decodeFromString( + val recommendationsResponseJson = json.decodeFromString( getExpectedResponse("recommendations/recommendations.json") ) diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiTest.kt index 33f1a32..171f3e5 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/recommendations/RecommendationsApiTest.kt @@ -11,7 +11,7 @@ import io.github.rubenquadros.kovibes.api.test.assertApiResponseFailure import io.github.rubenquadros.kovibes.api.test.assertApiResponseSuccess import io.github.rubenquadros.kovibes.api.test.errorResponsePath import kotlinx.coroutines.test.runTest -import org.junit.Test +import kotlin.test.Test class RecommendationsApiTest { diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiMapperTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiMapperTest.kt index 489774f..ae8ffdd 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiMapperTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiMapperTest.kt @@ -7,15 +7,15 @@ import io.github.rubenquadros.kovibes.api.search.toSearchArtist import io.github.rubenquadros.kovibes.api.search.toSearchPlaylist import io.github.rubenquadros.kovibes.api.search.toSearchTrack import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json -import org.junit.Test +import io.github.rubenquadros.kovibes.api.test.json +import kotlin.test.Test import kotlin.test.assertTrue class SearchApiMapperTest { @Test fun `search tracks response is mapped to tracks`() { - val searchTracksResponseJson = Json.decodeFromString( + val searchTracksResponseJson = json.decodeFromString( getExpectedResponse("search/tracks.json") ) @@ -28,7 +28,7 @@ class SearchApiMapperTest { @Test fun `search artists response is mapped to artists`() { - val searchArtistsResponseJson = Json.decodeFromString( + val searchArtistsResponseJson = json.decodeFromString( getExpectedResponse("search/artists.json") ) @@ -41,7 +41,7 @@ class SearchApiMapperTest { @Test fun `search playlists response is mapped to playlists`() { - val searchPlaylistsResponseJson = Json.decodeFromString( + val searchPlaylistsResponseJson = json.decodeFromString( getExpectedResponse("search/playlists.json") ) diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiTest.kt index aa9e7df..016ae3b 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/search/SearchApiTest.kt @@ -7,7 +7,7 @@ import io.github.rubenquadros.kovibes.api.test.assertApiResponseFailure import io.github.rubenquadros.kovibes.api.test.assertApiResponseSuccess import io.github.rubenquadros.kovibes.api.test.errorResponsePath import kotlinx.coroutines.test.runTest -import org.junit.Test +import kotlin.test.Test class SearchApiTest { diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeAlbumApi.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeAlbumApi.kt new file mode 100644 index 0000000..fbdc6b7 --- /dev/null +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeAlbumApi.kt @@ -0,0 +1,44 @@ +package io.github.rubenquadros.kovibes.api.test.service + +import io.github.rubenquadros.kovibes.api.ApiResponse +import io.github.rubenquadros.kovibes.api.album.AlbumApi +import io.github.rubenquadros.kovibes.api.album.models.GetAlbumTracksResponse +import io.github.rubenquadros.kovibes.api.album.models.GetNewAlbumReleasesResponse +import io.github.rubenquadros.kovibes.api.models.AlbumInfo +import io.github.rubenquadros.kovibes.api.response.ErrorBody +import io.github.rubenquadros.kovibes.api.test.getApiResponse +import io.github.rubenquadros.kovibes.api.test.getExpectedResponse +import io.github.rubenquadros.kovibes.api.test.json + +internal class FakeAlbumApi : AlbumApi { + + companion object { + var isSuccess: Boolean = true + } + + override suspend fun getAlbum(id: String, market: String?): ApiResponse { + return getApiResponse(isSuccess) { + json.decodeFromString(getExpectedResponse("album/album.json")) + } + } + + override suspend fun getAlbumTracks( + id: String, + market: String?, + limit: Int, + offset: Int + ): ApiResponse { + return getApiResponse(isSuccess) { + json.decodeFromString(getExpectedResponse("album/tracks.json")) + } + } + + override suspend fun getNewAlbumReleases( + limit: Int, + offset: Int + ): ApiResponse { + return getApiResponse(isSuccess) { + json.decodeFromString(getExpectedResponse("album/new_releases.json")) + } + } +} \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeArtistApi.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeArtistApi.kt index e78c1bd..9888967 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeArtistApi.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeArtistApi.kt @@ -9,16 +9,17 @@ import io.github.rubenquadros.kovibes.api.models.ArtistInfo import io.github.rubenquadros.kovibes.api.response.ErrorBody import io.github.rubenquadros.kovibes.api.test.getApiResponse import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json +import io.github.rubenquadros.kovibes.api.test.json internal class FakeArtistApi : ArtistApi { companion object { var isSuccess: Boolean = true } + override suspend fun getArtist(id: String): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("artist/artist.json")) + json.decodeFromString(getExpectedResponse("artist/artist.json")) } } @@ -30,7 +31,7 @@ internal class FakeArtistApi : ArtistApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("artist/albums.json")) + json.decodeFromString(getExpectedResponse("artist/albums.json")) } } @@ -39,13 +40,13 @@ internal class FakeArtistApi : ArtistApi { market: String? ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("artist/top_tracks.json")) + json.decodeFromString(getExpectedResponse("artist/top_tracks.json")) } } override suspend fun getRelatedArtists(id: String): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("artist/related_artists.json")) + json.decodeFromString(getExpectedResponse("artist/related_artists.json")) } } } \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeBrowseApi.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeBrowseApi.kt index c93d296..e863531 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeBrowseApi.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeBrowseApi.kt @@ -7,7 +7,7 @@ import io.github.rubenquadros.kovibes.api.response.ErrorBody import io.github.rubenquadros.kovibes.api.response.Genres import io.github.rubenquadros.kovibes.api.test.getApiResponse import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json +import io.github.rubenquadros.kovibes.api.test.json internal class FakeBrowseApi : BrowseApi { @@ -17,7 +17,7 @@ internal class FakeBrowseApi : BrowseApi { override suspend fun getGenres(): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("browse/genres.json")) + json.decodeFromString(getExpectedResponse("browse/genres.json")) } } @@ -27,7 +27,7 @@ internal class FakeBrowseApi : BrowseApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("browse/categories.json")) + json.decodeFromString(getExpectedResponse("browse/categories.json")) } } } \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakePlaylistApi.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakePlaylistApi.kt index a9258ca..7924019 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakePlaylistApi.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakePlaylistApi.kt @@ -7,7 +7,7 @@ import io.github.rubenquadros.kovibes.api.playlist.models.PlaylistTracksResponse import io.github.rubenquadros.kovibes.api.response.ErrorBody import io.github.rubenquadros.kovibes.api.test.getApiResponse import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json +import io.github.rubenquadros.kovibes.api.test.json internal class FakePlaylistApi : PlaylistApi { @@ -21,7 +21,7 @@ internal class FakePlaylistApi : PlaylistApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("playlist/featured_playlists.json")) + json.decodeFromString(getExpectedResponse("playlist/featured_playlists.json")) } } @@ -33,7 +33,7 @@ internal class FakePlaylistApi : PlaylistApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("playlist/playlist_tracks.json")) + json.decodeFromString(getExpectedResponse("playlist/playlist_tracks.json")) } } } \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeRecommendationsApi.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeRecommendationsApi.kt index a17121b..84036a6 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeRecommendationsApi.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeRecommendationsApi.kt @@ -7,7 +7,7 @@ import io.github.rubenquadros.kovibes.api.request.GetRecommendationsRequest import io.github.rubenquadros.kovibes.api.response.ErrorBody import io.github.rubenquadros.kovibes.api.test.getApiResponse import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json +import io.github.rubenquadros.kovibes.api.test.json internal class FakeRecommendationsApi : RecommendationsApi { @@ -19,7 +19,7 @@ internal class FakeRecommendationsApi : RecommendationsApi { getRecommendationsRequest: GetRecommendationsRequest ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("recommendations/recommendations.json")) + json.decodeFromString(getExpectedResponse("recommendations/recommendations.json")) } } } \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeSearchApi.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeSearchApi.kt index 5992c38..366cde2 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeSearchApi.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/FakeSearchApi.kt @@ -9,7 +9,7 @@ import io.github.rubenquadros.kovibes.api.search.models.SearchPlaylistResponse import io.github.rubenquadros.kovibes.api.search.models.SearchTrackResponse import io.github.rubenquadros.kovibes.api.test.getApiResponse import io.github.rubenquadros.kovibes.api.test.getExpectedResponse -import kotlinx.serialization.json.Json +import io.github.rubenquadros.kovibes.api.test.json internal class FakeSearchApi: SearchApi { @@ -24,7 +24,7 @@ internal class FakeSearchApi: SearchApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("search/tracks.json")) + json.decodeFromString(getExpectedResponse("search/tracks.json")) } } @@ -35,7 +35,7 @@ internal class FakeSearchApi: SearchApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("search/albums.json")) + json.decodeFromString(getExpectedResponse("search/albums.json")) } } @@ -46,7 +46,7 @@ internal class FakeSearchApi: SearchApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("search/artists.json")) + json.decodeFromString(getExpectedResponse("search/artists.json")) } } @@ -57,7 +57,7 @@ internal class FakeSearchApi: SearchApi { offset: Int ): ApiResponse { return getApiResponse(isSuccess) { - Json.decodeFromString(getExpectedResponse("search/playlists.json")) + json.decodeFromString(getExpectedResponse("search/playlists.json")) } } } \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/SpotifyServiceTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/SpotifyServiceTest.kt index 4f8bc49..14adda5 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/SpotifyServiceTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/service/SpotifyServiceTest.kt @@ -5,7 +5,7 @@ import io.github.rubenquadros.kovibes.api.request.GetRecommendationsRequest import io.github.rubenquadros.kovibes.api.test.assertSpotifyApiError import io.github.rubenquadros.kovibes.api.test.assertSpotifyApiSuccess import kotlinx.coroutines.test.runTest -import org.junit.Test +import kotlin.test.Test class SpotifyServiceTest { @@ -14,7 +14,8 @@ class SpotifyServiceTest { FakeBrowseApi(), FakeSearchApi(), FakeRecommendationsApi(), - FakeArtistApi() + FakeArtistApi(), + FakeAlbumApi() ) @Test @@ -188,7 +189,8 @@ class SpotifyServiceTest { fun `when get recommendations responds success then response is received`() = runTest { FakeRecommendationsApi.isSuccess = true - val response = spotifyService.getRecommendations(GetRecommendationsRequest(seedArtists = listOf("1234"))) + val response = + spotifyService.getRecommendations(GetRecommendationsRequest(seedArtists = listOf("1234"))) response.assertSpotifyApiSuccess( { it.tracks.isNotEmpty() } @@ -199,7 +201,8 @@ class SpotifyServiceTest { fun `when get recommendations responds error then error is received`() = runTest { FakeRecommendationsApi.isSuccess = false - val response = spotifyService.getRecommendations(GetRecommendationsRequest(seedTracks = listOf("1234"))) + val response = + spotifyService.getRecommendations(GetRecommendationsRequest(seedTracks = listOf("1234"))) response.assertSpotifyApiError() } @@ -284,4 +287,64 @@ class SpotifyServiceTest { response.assertSpotifyApiError() } + + @Test + fun `when get album responds success then response is received`() = runTest { + FakeAlbumApi.isSuccess = true + + val response = spotifyService.getAlbum(id = "123") + + response.assertSpotifyApiSuccess( + { it.artists.isNotEmpty() } + ) + } + + @Test + fun `when get album responds error then error is received`() = runTest { + FakeAlbumApi.isSuccess = false + + val response = spotifyService.getAlbum(id = "123") + + response.assertSpotifyApiError() + } + + @Test + fun `when get album tracks responds success then response is received`() = runTest { + FakeAlbumApi.isSuccess = true + + val response = spotifyService.getAlbumTracks(id = "123") + + response.assertSpotifyApiSuccess( + { it.items.isNotEmpty() } + ) + } + + @Test + fun `when get album tracks responds error then error is received`() = runTest { + FakeAlbumApi.isSuccess = false + + val response = spotifyService.getAlbumTracks(id = "123") + + response.assertSpotifyApiError() + } + + @Test + fun `when get new album releases responds success ten response is received`() = runTest { + FakeAlbumApi.isSuccess = true + + val response = spotifyService.getNewAlbumReleases() + + response.assertSpotifyApiSuccess( + { it.items.isNotEmpty() } + ) + } + + @Test + fun `when get new album releases responds error then error is received`() = runTest { + FakeAlbumApi.isSuccess = false + + val response = spotifyService.getNewAlbumReleases() + + response.assertSpotifyApiError() + } } \ No newline at end of file diff --git a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/spotify/KoVibesApiTest.kt b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/spotify/KoVibesApiTest.kt index 191b935..69cf043 100644 --- a/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/spotify/KoVibesApiTest.kt +++ b/kovibes/src/commonTest/kotlin/io/github/rubenquadros/kovibes/api/test/spotify/KoVibesApiTest.kt @@ -2,7 +2,7 @@ package io.github.rubenquadros.kovibes.api.test.spotify import io.github.rubenquadros.kovibes.api.KoVibesApi import org.junit.Assert.assertThrows -import org.junit.Test +import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertNotNull diff --git a/kovibes/src/commonTest/resources/album/album.json b/kovibes/src/commonTest/resources/album/album.json new file mode 100644 index 0000000..0328c7d --- /dev/null +++ b/kovibes/src/commonTest/resources/album/album.json @@ -0,0 +1,4147 @@ +{ + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "copyrights": [ + { + "text": "(P) 2024 Wilburn Holding Co. and Boominati Worldwide, under exclusive license to Epic Records, a division of Sony Music Entertainment. With Republic Records, a division of UMG Recordings, Inc.", + "type": "P" + } + ], + "external_ids": { + "upc": "196871937382" + }, + "external_urls": { + "spotify": "https://open.spotify.com/album/4iqbFIdGOTzXeDtt9owjQn" + }, + "genres": [], + "href": "https://api.spotify.com/v1/albums/4iqbFIdGOTzXeDtt9owjQn", + "id": "4iqbFIdGOTzXeDtt9owjQn", + "images": [ + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273a46b07c291e6dfdee13b3ee8", + "width": 640 + }, + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02a46b07c291e6dfdee13b3ee8", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851a46b07c291e6dfdee13b3ee8", + "width": 64 + } + ], + "label": "Wilburn Holding Co./Boominati/Epic/Republic", + "name": "WE DON'T TRUST YOU", + "popularity": 93, + "release_date": "2024-03-22", + "release_date_precision": "day", + "total_tracks": 17, + "tracks": { + "href": "https://api.spotify.com/v1/albums/4iqbFIdGOTzXeDtt9owjQn/tracks?offset=0&limit=50", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 226213, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/1pnDvUuAEd6z8bKEsbAjk1" + }, + "href": "https://api.spotify.com/v1/tracks/1pnDvUuAEd6z8bKEsbAjk1", + "id": "1pnDvUuAEd6z8bKEsbAjk1", + "is_local": false, + "name": "We Don't Trust You", + "preview_url": "https://p.scdn.co/mp3-preview/6727812413b8ff64261c4c08c5eccee46382e88a?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1pnDvUuAEd6z8bKEsbAjk1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ" + }, + "href": "https://api.spotify.com/v1/artists/1Xyo4u8uXC1ZmMpatF05PJ", + "id": "1Xyo4u8uXC1ZmMpatF05PJ", + "name": "The Weeknd", + "type": "artist", + "uri": "spotify:artist:1Xyo4u8uXC1ZmMpatF05PJ" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 205346, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3OxL6MuctgZp1e0zxoAZhH" + }, + "href": "https://api.spotify.com/v1/tracks/3OxL6MuctgZp1e0zxoAZhH", + "id": "3OxL6MuctgZp1e0zxoAZhH", + "is_local": false, + "name": "Young Metro", + "preview_url": "https://p.scdn.co/mp3-preview/591763f6156d5803592af94aec6622aafae2e72a?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 2, + "type": "track", + "uri": "spotify:track:3OxL6MuctgZp1e0zxoAZhH" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 199253, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/70ToiXlzl8N1EgfC07ZcZE" + }, + "href": "https://api.spotify.com/v1/tracks/70ToiXlzl8N1EgfC07ZcZE", + "id": "70ToiXlzl8N1EgfC07ZcZE", + "is_local": false, + "name": "Ice Attack", + "preview_url": "https://p.scdn.co/mp3-preview/3d856ca8e25293a71ecd57e728fdce1e37bdc0cb?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 3, + "type": "track", + "uri": "spotify:track:70ToiXlzl8N1EgfC07ZcZE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0Y5tJX1MQlPlqiwlOH1tJY" + }, + "href": "https://api.spotify.com/v1/artists/0Y5tJX1MQlPlqiwlOH1tJY", + "id": "0Y5tJX1MQlPlqiwlOH1tJY", + "name": "Travis Scott", + "type": "artist", + "uri": "spotify:artist:0Y5tJX1MQlPlqiwlOH1tJY" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/699OTQXzgjhIYAHMy9RyPD" + }, + "href": "https://api.spotify.com/v1/artists/699OTQXzgjhIYAHMy9RyPD", + "id": "699OTQXzgjhIYAHMy9RyPD", + "name": "Playboi Carti", + "type": "artist", + "uri": "spotify:artist:699OTQXzgjhIYAHMy9RyPD" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 228266, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/28drn6tQo95MRvO0jQEo5C" + }, + "href": "https://api.spotify.com/v1/tracks/28drn6tQo95MRvO0jQEo5C", + "id": "28drn6tQo95MRvO0jQEo5C", + "is_local": false, + "name": "Type Shit", + "preview_url": "https://p.scdn.co/mp3-preview/4743d8302c54f95d6f79858b7c67764b1d45e9a3?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 4, + "type": "track", + "uri": "spotify:track:28drn6tQo95MRvO0jQEo5C" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 222053, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/57ELn9TPDIhrpl0dasS465" + }, + "href": "https://api.spotify.com/v1/tracks/57ELn9TPDIhrpl0dasS465", + "id": "57ELn9TPDIhrpl0dasS465", + "is_local": false, + "name": "Claustrophobic", + "preview_url": "https://p.scdn.co/mp3-preview/f70ac5294ba2744bf9b2988b9adb6f7777473210?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 5, + "type": "track", + "uri": "spotify:track:57ELn9TPDIhrpl0dasS465" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2YZyLoL8N0Wb9xBt1NhZWg" + }, + "href": "https://api.spotify.com/v1/artists/2YZyLoL8N0Wb9xBt1NhZWg", + "id": "2YZyLoL8N0Wb9xBt1NhZWg", + "name": "Kendrick Lamar", + "type": "artist", + "uri": "spotify:artist:2YZyLoL8N0Wb9xBt1NhZWg" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 267706, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2tudvzsrR56uom6smgOcSf" + }, + "href": "https://api.spotify.com/v1/tracks/2tudvzsrR56uom6smgOcSf", + "id": "2tudvzsrR56uom6smgOcSf", + "is_local": false, + "name": "Like That", + "preview_url": "https://p.scdn.co/mp3-preview/793f43da71fe668c35b72a38ae7f93e783823e17?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2tudvzsrR56uom6smgOcSf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 194906, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2GLWhy9iiO1wrLUF5l4FtJ" + }, + "href": "https://api.spotify.com/v1/tracks/2GLWhy9iiO1wrLUF5l4FtJ", + "id": "2GLWhy9iiO1wrLUF5l4FtJ", + "is_local": false, + "name": "Slimed In", + "preview_url": "https://p.scdn.co/mp3-preview/bfb1fffb9f3fef6869539732d7a3dce118c73d10?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 7, + "type": "track", + "uri": "spotify:track:2GLWhy9iiO1wrLUF5l4FtJ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 220733, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/7pBcryEKcUEaWHwAu1wUyP" + }, + "href": "https://api.spotify.com/v1/tracks/7pBcryEKcUEaWHwAu1wUyP", + "id": "7pBcryEKcUEaWHwAu1wUyP", + "is_local": false, + "name": "Magic Don Juan (Princess Diana)", + "preview_url": "https://p.scdn.co/mp3-preview/a941e20078bb0a99e5fe86300329360b781674ff?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 8, + "type": "track", + "uri": "spotify:track:7pBcryEKcUEaWHwAu1wUyP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0Y5tJX1MQlPlqiwlOH1tJY" + }, + "href": "https://api.spotify.com/v1/artists/0Y5tJX1MQlPlqiwlOH1tJY", + "id": "0Y5tJX1MQlPlqiwlOH1tJY", + "name": "Travis Scott", + "type": "artist", + "uri": "spotify:artist:0Y5tJX1MQlPlqiwlOH1tJY" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 169840, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/0hKtu53OlIFXVuYkZwcn3o" + }, + "href": "https://api.spotify.com/v1/tracks/0hKtu53OlIFXVuYkZwcn3o", + "id": "0hKtu53OlIFXVuYkZwcn3o", + "is_local": false, + "name": "Cinderella", + "preview_url": "https://p.scdn.co/mp3-preview/3e0191b92876c0c2a9dc601b68da8c591501ba07?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 9, + "type": "track", + "uri": "spotify:track:0hKtu53OlIFXVuYkZwcn3o" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 205480, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4q7y1JFDBJSBSLqXVgcI51" + }, + "href": "https://api.spotify.com/v1/tracks/4q7y1JFDBJSBSLqXVgcI51", + "id": "4q7y1JFDBJSBSLqXVgcI51", + "is_local": false, + "name": "Runnin Outta Time", + "preview_url": "https://p.scdn.co/mp3-preview/0d21e4021dd766cdb2322198e59499193bfaca5c?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 10, + "type": "track", + "uri": "spotify:track:4q7y1JFDBJSBSLqXVgcI51" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 210173, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/28xOPIPw0joNPwYd0asIT5" + }, + "href": "https://api.spotify.com/v1/tracks/28xOPIPw0joNPwYd0asIT5", + "id": "28xOPIPw0joNPwYd0asIT5", + "is_local": false, + "name": "Fried (She a Vibe)", + "preview_url": "https://p.scdn.co/mp3-preview/e558ff6e37ee8e7d0662dce931f5810169ca093d?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 11, + "type": "track", + "uri": "spotify:track:28xOPIPw0joNPwYd0asIT5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 182840, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/72qABvaqn3TP6drO2tByA6" + }, + "href": "https://api.spotify.com/v1/tracks/72qABvaqn3TP6drO2tByA6", + "id": "72qABvaqn3TP6drO2tByA6", + "is_local": false, + "name": "Ain't No Love", + "preview_url": "https://p.scdn.co/mp3-preview/d5b2f54b5c791ec0794c234cb782058f2985f125?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 12, + "type": "track", + "uri": "spotify:track:72qABvaqn3TP6drO2tByA6" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1sBkRIssrMs1AbVkOJbc7a" + }, + "href": "https://api.spotify.com/v1/artists/1sBkRIssrMs1AbVkOJbc7a", + "id": "1sBkRIssrMs1AbVkOJbc7a", + "name": "Rick Ross", + "type": "artist", + "uri": "spotify:artist:1sBkRIssrMs1AbVkOJbc7a" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 226946, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3Vg7nPYlOrCkcV1abKbRQ1" + }, + "href": "https://api.spotify.com/v1/tracks/3Vg7nPYlOrCkcV1abKbRQ1", + "id": "3Vg7nPYlOrCkcV1abKbRQ1", + "is_local": false, + "name": "Everyday Hustle", + "preview_url": "https://p.scdn.co/mp3-preview/a9efc05f4f7b8b1e95c8a717511e024e794bc7bf?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 13, + "type": "track", + "uri": "spotify:track:3Vg7nPYlOrCkcV1abKbRQ1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 233026, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4XF9fk0STp9hx8xn5Suwpz" + }, + "href": "https://api.spotify.com/v1/tracks/4XF9fk0STp9hx8xn5Suwpz", + "id": "4XF9fk0STp9hx8xn5Suwpz", + "is_local": false, + "name": "GTA", + "preview_url": "https://p.scdn.co/mp3-preview/5b7dc48ae4494ddc72d6fbcf8f57f5e1bbf4a7f6?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 14, + "type": "track", + "uri": "spotify:track:4XF9fk0STp9hx8xn5Suwpz" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 179440, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/5imsnhkfPCm3wajS9ksb21" + }, + "href": "https://api.spotify.com/v1/tracks/5imsnhkfPCm3wajS9ksb21", + "id": "5imsnhkfPCm3wajS9ksb21", + "is_local": false, + "name": "Seen it All", + "preview_url": "https://p.scdn.co/mp3-preview/d2e806d37967ab45dcfbbcb69b0795b74f252aee?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 15, + "type": "track", + "uri": "spotify:track:5imsnhkfPCm3wajS9ksb21" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 292600, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/1xwvjqcwflD2NEqRCNcCo2" + }, + "href": "https://api.spotify.com/v1/tracks/1xwvjqcwflD2NEqRCNcCo2", + "id": "1xwvjqcwflD2NEqRCNcCo2", + "is_local": false, + "name": "WTFYM", + "preview_url": "https://p.scdn.co/mp3-preview/863b8ca1f9f17607b3cc9651950156d44c619457?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 16, + "type": "track", + "uri": "spotify:track:1xwvjqcwflD2NEqRCNcCo2" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 122786, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/30TcFxtFyju8isK6Hjo9KY" + }, + "href": "https://api.spotify.com/v1/tracks/30TcFxtFyju8isK6Hjo9KY", + "id": "30TcFxtFyju8isK6Hjo9KY", + "is_local": false, + "name": "Where My Twin @ - Bonus", + "preview_url": "https://p.scdn.co/mp3-preview/be9b1f1c9751f642c9e066f597828aafd85529cb?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 17, + "type": "track", + "uri": "spotify:track:30TcFxtFyju8isK6Hjo9KY" + } + ], + "limit": 50, + "next": null, + "offset": 0, + "previous": null, + "total": 17 + }, + "type": "album", + "uri": "spotify:album:4iqbFIdGOTzXeDtt9owjQn" +} \ No newline at end of file diff --git a/kovibes/src/commonTest/resources/album/new_releases.json b/kovibes/src/commonTest/resources/album/new_releases.json new file mode 100644 index 0000000..8e11725 --- /dev/null +++ b/kovibes/src/commonTest/resources/album/new_releases.json @@ -0,0 +1,4631 @@ +{ + "albums": { + "href": "https://api.spotify.com/v1/browse/new-releases?offset=0&limit=20", + "items": [ + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4f7KfxeHq9BiylGmyXepGt" + }, + "href": "https://api.spotify.com/v1/artists/4f7KfxeHq9BiylGmyXepGt", + "id": "4f7KfxeHq9BiylGmyXepGt", + "name": "Tanishk Bagchi", + "type": "artist", + "uri": "spotify:artist:4f7KfxeHq9BiylGmyXepGt" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1tqysapcCh1lWEAc9dIFpa" + }, + "href": "https://api.spotify.com/v1/artists/1tqysapcCh1lWEAc9dIFpa", + "id": "1tqysapcCh1lWEAc9dIFpa", + "name": "Jubin Nautiyal", + "type": "artist", + "uri": "spotify:artist:1tqysapcCh1lWEAc9dIFpa" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0T1CMVkqffHlqEk4BcAph1" + }, + "href": "https://api.spotify.com/v1/artists/0T1CMVkqffHlqEk4BcAph1", + "id": "0T1CMVkqffHlqEk4BcAph1", + "name": "Tulsi Kumar", + "type": "artist", + "uri": "spotify:artist:0T1CMVkqffHlqEk4BcAph1" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/4nDcMc3usFZB4gTBQR7mE1" + }, + "href": "https://api.spotify.com/v1/albums/4nDcMc3usFZB4gTBQR7mE1", + "id": "4nDcMc3usFZB4gTBQR7mE1", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02bcc77c2135dd78f8953d7b25", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851bcc77c2135dd78f8953d7b25", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273bcc77c2135dd78f8953d7b25", + "width": 640 + } + ], + "name": "Tu Mil Gaya (From \"Srikanth\")", + "release_date": "2024-04-15", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:4nDcMc3usFZB4gTBQR7mE1" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2owjgBZQ70LoCNHIgW3gSk" + }, + "href": "https://api.spotify.com/v1/artists/2owjgBZQ70LoCNHIgW3gSk", + "id": "2owjgBZQ70LoCNHIgW3gSk", + "name": "Anand-Milind", + "type": "artist", + "uri": "spotify:artist:2owjgBZQ70LoCNHIgW3gSk" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/70B80Lwx2sxti0M1Ng9e8K" + }, + "href": "https://api.spotify.com/v1/artists/70B80Lwx2sxti0M1Ng9e8K", + "id": "70B80Lwx2sxti0M1Ng9e8K", + "name": "Udit Narayan", + "type": "artist", + "uri": "spotify:artist:70B80Lwx2sxti0M1Ng9e8K" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2IX6xq1cVcBoD4obUsT5xs" + }, + "href": "https://api.spotify.com/v1/artists/2IX6xq1cVcBoD4obUsT5xs", + "id": "2IX6xq1cVcBoD4obUsT5xs", + "name": "Aditya Dev", + "type": "artist", + "uri": "spotify:artist:2IX6xq1cVcBoD4obUsT5xs" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/1DoM6rYl4oyNaW7sLr8FTP" + }, + "href": "https://api.spotify.com/v1/albums/1DoM6rYl4oyNaW7sLr8FTP", + "id": "1DoM6rYl4oyNaW7sLr8FTP", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e026d04b2817ced74a95f2c30e7", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048516d04b2817ced74a95f2c30e7", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2736d04b2817ced74a95f2c30e7", + "width": 640 + } + ], + "name": "Papa Kehte Hain (From \"Srikanth\")", + "release_date": "2024-04-22", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:1DoM6rYl4oyNaW7sLr8FTP" + }, + { + "album_type": "ep", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1SyKki7JI1AZNKwgNMkn25" + }, + "href": "https://api.spotify.com/v1/artists/1SyKki7JI1AZNKwgNMkn25", + "id": "1SyKki7JI1AZNKwgNMkn25", + "name": "Sachet-Parampara", + "type": "artist", + "uri": "spotify:artist:1SyKki7JI1AZNKwgNMkn25" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/5rSSwWHFO7BDclf2ktbsML" + }, + "href": "https://api.spotify.com/v1/albums/5rSSwWHFO7BDclf2ktbsML", + "id": "5rSSwWHFO7BDclf2ktbsML", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e024386faab4ecaa2cc0311c663", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048514386faab4ecaa2cc0311c663", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2734386faab4ecaa2cc0311c663", + "width": 640 + } + ], + "name": "Achha Lag Raha Hai", + "release_date": "2024-04-26", + "release_date_precision": "day", + "total_tracks": 6, + "type": "album", + "uri": "spotify:album:5rSSwWHFO7BDclf2ktbsML" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/77AiFEVeAVj2ORpC85QVJs" + }, + "href": "https://api.spotify.com/v1/artists/77AiFEVeAVj2ORpC85QVJs", + "id": "77AiFEVeAVj2ORpC85QVJs", + "name": "Steve Aoki", + "type": "artist", + "uri": "spotify:artist:77AiFEVeAVj2ORpC85QVJs" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5pXe6yFchq1oyYK3rq2A8i" + }, + "href": "https://api.spotify.com/v1/artists/5pXe6yFchq1oyYK3rq2A8i", + "id": "5pXe6yFchq1oyYK3rq2A8i", + "name": "KIDDO", + "type": "artist", + "uri": "spotify:artist:5pXe6yFchq1oyYK3rq2A8i" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/10qvBn2MB8C4qGdj2aSymU" + }, + "href": "https://api.spotify.com/v1/albums/10qvBn2MB8C4qGdj2aSymU", + "id": "10qvBn2MB8C4qGdj2aSymU", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02fd020e06c84159fa67cb0d86", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851fd020e06c84159fa67cb0d86", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273fd020e06c84159fa67cb0d86", + "width": 640 + } + ], + "name": "Drive ft. KIDDO", + "release_date": "2024-04-05", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:10qvBn2MB8C4qGdj2aSymU" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3t5xRXzsuZmMDkQzgOX35S" + }, + "href": "https://api.spotify.com/v1/artists/3t5xRXzsuZmMDkQzgOX35S", + "id": "3t5xRXzsuZmMDkQzgOX35S", + "name": "Robin Schulz", + "type": "artist", + "uri": "spotify:artist:3t5xRXzsuZmMDkQzgOX35S" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0CbeG1224FS58EUx4tPevZ" + }, + "href": "https://api.spotify.com/v1/artists/0CbeG1224FS58EUx4tPevZ", + "id": "0CbeG1224FS58EUx4tPevZ", + "name": "Timmy Trumpet", + "type": "artist", + "uri": "spotify:artist:0CbeG1224FS58EUx4tPevZ" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5SfqIMwBJ7wD419vvb33mO" + }, + "href": "https://api.spotify.com/v1/artists/5SfqIMwBJ7wD419vvb33mO", + "id": "5SfqIMwBJ7wD419vvb33mO", + "name": "KOPPY", + "type": "artist", + "uri": "spotify:artist:5SfqIMwBJ7wD419vvb33mO" + } + ], + "available_markets": [ + "AT", + "CH", + "DE" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/1FbCsMN3QbJzyChn0JpPf7" + }, + "href": "https://api.spotify.com/v1/albums/1FbCsMN3QbJzyChn0JpPf7", + "id": "1FbCsMN3QbJzyChn0JpPf7", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02792e59c7e91924640b9cf6bb", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851792e59c7e91924640b9cf6bb", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273792e59c7e91924640b9cf6bb", + "width": 640 + } + ], + "name": "All the Things She Said", + "release_date": "2024-04-05", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:1FbCsMN3QbJzyChn0JpPf7" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6B9YF4eOv99klogeZUzkYM" + }, + "href": "https://api.spotify.com/v1/artists/6B9YF4eOv99klogeZUzkYM", + "id": "6B9YF4eOv99klogeZUzkYM", + "name": "Mirror", + "type": "artist", + "uri": "spotify:artist:6B9YF4eOv99klogeZUzkYM" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6H6svVOQLsIH1uK7KedZoQ" + }, + "href": "https://api.spotify.com/v1/artists/6H6svVOQLsIH1uK7KedZoQ", + "id": "6H6svVOQLsIH1uK7KedZoQ", + "name": "Dame D.O.L.L.A", + "type": "artist", + "uri": "spotify:artist:6H6svVOQLsIH1uK7KedZoQ" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/7mUp7FJyc0IS2eqfhsYvVz" + }, + "href": "https://api.spotify.com/v1/albums/7mUp7FJyc0IS2eqfhsYvVz", + "id": "7mUp7FJyc0IS2eqfhsYvVz", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0268841f9d5082b27de5c7beda", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485168841f9d5082b27de5c7beda", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27368841f9d5082b27de5c7beda", + "width": 640 + } + ], + "name": "Day 0 (feat. Dame D.O.L.L.A.)", + "release_date": "2024-04-05", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:7mUp7FJyc0IS2eqfhsYvVz" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2wX6xSig4Rig5kZU6ePlWe" + }, + "href": "https://api.spotify.com/v1/artists/2wX6xSig4Rig5kZU6ePlWe", + "id": "2wX6xSig4Rig5kZU6ePlWe", + "name": "KSHMR", + "type": "artist", + "uri": "spotify:artist:2wX6xSig4Rig5kZU6ePlWe" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/18006kpQI473m1ICcpimQ9" + }, + "href": "https://api.spotify.com/v1/artists/18006kpQI473m1ICcpimQ9", + "id": "18006kpQI473m1ICcpimQ9", + "name": "22Bullets", + "type": "artist", + "uri": "spotify:artist:18006kpQI473m1ICcpimQ9" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/19JTuhercisDkcrejs4eFu" + }, + "href": "https://api.spotify.com/v1/albums/19JTuhercisDkcrejs4eFu", + "id": "19JTuhercisDkcrejs4eFu", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02a8475efbdfef991a2d04177e", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851a8475efbdfef991a2d04177e", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273a8475efbdfef991a2d04177e", + "width": 640 + } + ], + "name": "Devotion", + "release_date": "2024-04-05", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:19JTuhercisDkcrejs4eFu" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/53QFkgzvHiqxjEdY0alTcr" + }, + "href": "https://api.spotify.com/v1/artists/53QFkgzvHiqxjEdY0alTcr", + "id": "53QFkgzvHiqxjEdY0alTcr", + "name": "Jasmine Kelly", + "type": "artist", + "uri": "spotify:artist:53QFkgzvHiqxjEdY0alTcr" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/148CIiPmaCUhmHddOFWzSu" + }, + "href": "https://api.spotify.com/v1/artists/148CIiPmaCUhmHddOFWzSu", + "id": "148CIiPmaCUhmHddOFWzSu", + "name": "Lushroom", + "type": "artist", + "uri": "spotify:artist:148CIiPmaCUhmHddOFWzSu" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3gWt5GuzFWCmAHwWVvs4rw" + }, + "href": "https://api.spotify.com/v1/artists/3gWt5GuzFWCmAHwWVvs4rw", + "id": "3gWt5GuzFWCmAHwWVvs4rw", + "name": "sanjay.", + "type": "artist", + "uri": "spotify:artist:3gWt5GuzFWCmAHwWVvs4rw" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/3zCjzqYdYy9gjZRZ6JiLQQ" + }, + "href": "https://api.spotify.com/v1/albums/3zCjzqYdYy9gjZRZ6JiLQQ", + "id": "3zCjzqYdYy9gjZRZ6JiLQQ", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02bee21763dbeea09f5c41d2f2", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851bee21763dbeea09f5c41d2f2", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273bee21763dbeea09f5c41d2f2", + "width": 640 + } + ], + "name": "waiting for you", + "release_date": "2024-04-04", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:3zCjzqYdYy9gjZRZ6JiLQQ" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/58oPVy7oihAEXE0Ott6JOf" + }, + "href": "https://api.spotify.com/v1/artists/58oPVy7oihAEXE0Ott6JOf", + "id": "58oPVy7oihAEXE0Ott6JOf", + "name": "Eve", + "type": "artist", + "uri": "spotify:artist:58oPVy7oihAEXE0Ott6JOf" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/51QJlvJclfVB6jNNXlDatS" + }, + "href": "https://api.spotify.com/v1/albums/51QJlvJclfVB6jNNXlDatS", + "id": "51QJlvJclfVB6jNNXlDatS", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02b54686226853e372258044ac", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851b54686226853e372258044ac", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273b54686226853e372258044ac", + "width": 640 + } + ], + "name": "Insomnia", + "release_date": "2024-03-01", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:51QJlvJclfVB6jNNXlDatS" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0y59o4v8uw5crbN9M3JiL1" + }, + "href": "https://api.spotify.com/v1/artists/0y59o4v8uw5crbN9M3JiL1", + "id": "0y59o4v8uw5crbN9M3JiL1", + "name": "Badshah", + "type": "artist", + "uri": "spotify:artist:0y59o4v8uw5crbN9M3JiL1" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/30DC0uyycct5LGcqhzE6a3" + }, + "href": "https://api.spotify.com/v1/artists/30DC0uyycct5LGcqhzE6a3", + "id": "30DC0uyycct5LGcqhzE6a3", + "name": "Sharvi Yadav", + "type": "artist", + "uri": "spotify:artist:30DC0uyycct5LGcqhzE6a3" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/597A6e3D22Vq4gxyh4mUjh" + }, + "href": "https://api.spotify.com/v1/artists/597A6e3D22Vq4gxyh4mUjh", + "id": "597A6e3D22Vq4gxyh4mUjh", + "name": "Hiten", + "type": "artist", + "uri": "spotify:artist:597A6e3D22Vq4gxyh4mUjh" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/2tpXdOI6g9KNdQIXFWB1kW" + }, + "href": "https://api.spotify.com/v1/albums/2tpXdOI6g9KNdQIXFWB1kW", + "id": "2tpXdOI6g9KNdQIXFWB1kW", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02ac144fcdade3e1a420901705", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851ac144fcdade3e1a420901705", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273ac144fcdade3e1a420901705", + "width": 640 + } + ], + "name": "Daaku", + "release_date": "2024-02-22", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:2tpXdOI6g9KNdQIXFWB1kW" + }, + { + "album_type": "ep", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6Mv8GjQa7LKUGCAqa9qqdb" + }, + "href": "https://api.spotify.com/v1/artists/6Mv8GjQa7LKUGCAqa9qqdb", + "id": "6Mv8GjQa7LKUGCAqa9qqdb", + "name": "Vishal-Shekhar", + "type": "artist", + "uri": "spotify:artist:6Mv8GjQa7LKUGCAqa9qqdb" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/5p1147cCqxrWBDZAtaDR54" + }, + "href": "https://api.spotify.com/v1/albums/5p1147cCqxrWBDZAtaDR54", + "id": "5p1147cCqxrWBDZAtaDR54", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0242c087c654e6c83eba52e7a3", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485142c087c654e6c83eba52e7a3", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27342c087c654e6c83eba52e7a3", + "width": 640 + } + ], + "name": "Fighter", + "release_date": "2024-01-23", + "release_date_precision": "day", + "total_tracks": 6, + "type": "album", + "uri": "spotify:album:5p1147cCqxrWBDZAtaDR54" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/5wJ1H6ud777odtZl5gG507" + }, + "href": "https://api.spotify.com/v1/artists/5wJ1H6ud777odtZl5gG507", + "id": "5wJ1H6ud777odtZl5gG507", + "name": "Vishal Mishra", + "type": "artist", + "uri": "spotify:artist:5wJ1H6ud777odtZl5gG507" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4zCH9qm4R2DADamUHMCa6O" + }, + "href": "https://api.spotify.com/v1/artists/4zCH9qm4R2DADamUHMCa6O", + "id": "4zCH9qm4R2DADamUHMCa6O", + "name": "Anirudh Ravichander", + "type": "artist", + "uri": "spotify:artist:4zCH9qm4R2DADamUHMCa6O" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/3GdSQUH1BRtl9UrrtuwJlP" + }, + "href": "https://api.spotify.com/v1/artists/3GdSQUH1BRtl9UrrtuwJlP", + "id": "3GdSQUH1BRtl9UrrtuwJlP", + "name": "Irshad Kamil", + "type": "artist", + "uri": "spotify:artist:3GdSQUH1BRtl9UrrtuwJlP" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/51UyD6TwRxLU6kVJJmzDPw" + }, + "href": "https://api.spotify.com/v1/albums/51UyD6TwRxLU6kVJJmzDPw", + "id": "51UyD6TwRxLU6kVJJmzDPw", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02be582ec98904df3d73cbbb0f", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851be582ec98904df3d73cbbb0f", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273be582ec98904df3d73cbbb0f", + "width": 640 + } + ], + "name": "Bade Miyan Chote Miyan (Title Track) [From \"Bade Miyan Chote Miyan\"]", + "release_date": "2024-02-19", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:51UyD6TwRxLU6kVJJmzDPw" + }, + { + "album_type": "ep", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0LyfQWJT6nXafLPZqxe9Of" + }, + "href": "https://api.spotify.com/v1/artists/0LyfQWJT6nXafLPZqxe9Of", + "id": "0LyfQWJT6nXafLPZqxe9Of", + "name": "Various Artists", + "type": "artist", + "uri": "spotify:artist:0LyfQWJT6nXafLPZqxe9Of" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/0KvWbswDD0ksvFayBl6gUz" + }, + "href": "https://api.spotify.com/v1/albums/0KvWbswDD0ksvFayBl6gUz", + "id": "0KvWbswDD0ksvFayBl6gUz", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02dfa8e0dab093f6a7c638c7fc", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851dfa8e0dab093f6a7c638c7fc", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273dfa8e0dab093f6a7c638c7fc", + "width": 640 + } + ], + "name": "Teri Baaton Mein Aisa Uljha Jiya", + "release_date": "2024-02-05", + "release_date_precision": "day", + "total_tracks": 4, + "type": "album", + "uri": "spotify:album:0KvWbswDD0ksvFayBl6gUz" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/77AiFEVeAVj2ORpC85QVJs" + }, + "href": "https://api.spotify.com/v1/artists/77AiFEVeAVj2ORpC85QVJs", + "id": "77AiFEVeAVj2ORpC85QVJs", + "name": "Steve Aoki", + "type": "artist", + "uri": "spotify:artist:77AiFEVeAVj2ORpC85QVJs" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7sfl4Xt5KmfyDs2T3SVSMK" + }, + "href": "https://api.spotify.com/v1/artists/7sfl4Xt5KmfyDs2T3SVSMK", + "id": "7sfl4Xt5KmfyDs2T3SVSMK", + "name": "Lil Jon", + "type": "artist", + "uri": "spotify:artist:7sfl4Xt5KmfyDs2T3SVSMK" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/6L3OPsn0P4F6PNUDFGxDVV" + }, + "href": "https://api.spotify.com/v1/albums/6L3OPsn0P4F6PNUDFGxDVV", + "id": "6L3OPsn0P4F6PNUDFGxDVV", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0283c6d28a8bf5400e4db97bca", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485183c6d28a8bf5400e4db97bca", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27383c6d28a8bf5400e4db97bca", + "width": 640 + } + ], + "name": "Get Lower", + "release_date": "2024-02-09", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:6L3OPsn0P4F6PNUDFGxDVV" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4Q6nIcaBED8qUel8bBx6Cr" + }, + "href": "https://api.spotify.com/v1/artists/4Q6nIcaBED8qUel8bBx6Cr", + "id": "4Q6nIcaBED8qUel8bBx6Cr", + "name": "Jax Jones", + "type": "artist", + "uri": "spotify:artist:4Q6nIcaBED8qUel8bBx6Cr" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/03d2mJXSMtuPI0nIvLnhoS" + }, + "href": "https://api.spotify.com/v1/artists/03d2mJXSMtuPI0nIvLnhoS", + "id": "03d2mJXSMtuPI0nIvLnhoS", + "name": "Zoe Wees", + "type": "artist", + "uri": "spotify:artist:03d2mJXSMtuPI0nIvLnhoS" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/1DCiXnF1Z9XX4zxYCFytSX" + }, + "href": "https://api.spotify.com/v1/albums/1DCiXnF1Z9XX4zxYCFytSX", + "id": "1DCiXnF1Z9XX4zxYCFytSX", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02a1d3ca82b712927a48774655", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851a1d3ca82b712927a48774655", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273a1d3ca82b712927a48774655", + "width": 640 + } + ], + "name": "Never Be Lonely", + "release_date": "2024-02-09", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:1DCiXnF1Z9XX4zxYCFytSX" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/4D75GcNG95ebPtNvoNVXhz" + }, + "href": "https://api.spotify.com/v1/artists/4D75GcNG95ebPtNvoNVXhz", + "id": "4D75GcNG95ebPtNvoNVXhz", + "name": "AFROJACK", + "type": "artist", + "uri": "spotify:artist:4D75GcNG95ebPtNvoNVXhz" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0CbeG1224FS58EUx4tPevZ" + }, + "href": "https://api.spotify.com/v1/artists/0CbeG1224FS58EUx4tPevZ", + "id": "0CbeG1224FS58EUx4tPevZ", + "name": "Timmy Trumpet", + "type": "artist", + "uri": "spotify:artist:0CbeG1224FS58EUx4tPevZ" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7sfl4Xt5KmfyDs2T3SVSMK" + }, + "href": "https://api.spotify.com/v1/artists/7sfl4Xt5KmfyDs2T3SVSMK", + "id": "7sfl4Xt5KmfyDs2T3SVSMK", + "name": "Lil Jon", + "type": "artist", + "uri": "spotify:artist:7sfl4Xt5KmfyDs2T3SVSMK" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/27LVMe5wMsHddairHoCux2" + }, + "href": "https://api.spotify.com/v1/albums/27LVMe5wMsHddairHoCux2", + "id": "27LVMe5wMsHddairHoCux2", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02567c92f98c7d65c012428c49", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851567c92f98c7d65c012428c49", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273567c92f98c7d65c012428c49", + "width": 640 + } + ], + "name": "We Can't Stop", + "release_date": "2024-02-09", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:27LVMe5wMsHddairHoCux2" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0duLKMlcwhyZgqu8zSSjBp" + }, + "href": "https://api.spotify.com/v1/artists/0duLKMlcwhyZgqu8zSSjBp", + "id": "0duLKMlcwhyZgqu8zSSjBp", + "name": "Alaina Castillo", + "type": "artist", + "uri": "spotify:artist:0duLKMlcwhyZgqu8zSSjBp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/0Tqz0PyiUMHr2HIwvXmyKP" + }, + "href": "https://api.spotify.com/v1/albums/0Tqz0PyiUMHr2HIwvXmyKP", + "id": "0Tqz0PyiUMHr2HIwvXmyKP", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e028b591303ce1691ceb8194368", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048518b591303ce1691ceb8194368", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2738b591303ce1691ceb8194368", + "width": 640 + } + ], + "name": "crush", + "release_date": "2024-02-09", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:0Tqz0PyiUMHr2HIwvXmyKP" + }, + { + "album_type": "album", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/6eXZu6O7nAUA5z6vLV8NKI" + }, + "href": "https://api.spotify.com/v1/artists/6eXZu6O7nAUA5z6vLV8NKI", + "id": "6eXZu6O7nAUA5z6vLV8NKI", + "name": "Little Simz", + "type": "artist", + "uri": "spotify:artist:6eXZu6O7nAUA5z6vLV8NKI" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/2jK2rbbnrzsId5WWSc67HP" + }, + "href": "https://api.spotify.com/v1/albums/2jK2rbbnrzsId5WWSc67HP", + "id": "2jK2rbbnrzsId5WWSc67HP", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e024de8d5c48a2f7ab893e25e1f", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d000048514de8d5c48a2f7ab893e25e1f", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b2734de8d5c48a2f7ab893e25e1f", + "width": 640 + } + ], + "name": "Drop 7", + "release_date": "2024-02-09", + "release_date_precision": "day", + "total_tracks": 7, + "type": "album", + "uri": "spotify:album:2jK2rbbnrzsId5WWSc67HP" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1Cs0zKBU1kc0i8ypK3B9ai" + }, + "href": "https://api.spotify.com/v1/artists/1Cs0zKBU1kc0i8ypK3B9ai", + "id": "1Cs0zKBU1kc0i8ypK3B9ai", + "name": "David Guetta", + "type": "artist", + "uri": "spotify:artist:1Cs0zKBU1kc0i8ypK3B9ai" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/307erl4VjT1dZDMYpneZqd" + }, + "href": "https://api.spotify.com/v1/artists/307erl4VjT1dZDMYpneZqd", + "id": "307erl4VjT1dZDMYpneZqd", + "name": "Mason", + "type": "artist", + "uri": "spotify:artist:307erl4VjT1dZDMYpneZqd" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/7JQn9DfFTtsFTg2dFc75jM" + }, + "href": "https://api.spotify.com/v1/artists/7JQn9DfFTtsFTg2dFc75jM", + "id": "7JQn9DfFTtsFTg2dFc75jM", + "name": "Princess Superstar", + "type": "artist", + "uri": "spotify:artist:7JQn9DfFTtsFTg2dFc75jM" + } + ], + "available_markets": [ + "AR", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "EC", + "EE", + "SV", + "FI", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/2eScJnMQTMY0WYPz2MXWsp" + }, + "href": "https://api.spotify.com/v1/albums/2eScJnMQTMY0WYPz2MXWsp", + "id": "2eScJnMQTMY0WYPz2MXWsp", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e02c64353d0554d362dbc9dddcf", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d00004851c64353d0554d362dbc9dddcf", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b273c64353d0554d362dbc9dddcf", + "width": 640 + } + ], + "name": "Perfect (Exceeder)", + "release_date": "2024-02-09", + "release_date_precision": "day", + "total_tracks": 2, + "type": "album", + "uri": "spotify:album:2eScJnMQTMY0WYPz2MXWsp" + }, + { + "album_type": "single", + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/28j8lBWDdDSHSSt5oPlsX2" + }, + "href": "https://api.spotify.com/v1/artists/28j8lBWDdDSHSSt5oPlsX2", + "id": "28j8lBWDdDSHSSt5oPlsX2", + "name": "ZHU", + "type": "artist", + "uri": "spotify:artist:28j8lBWDdDSHSSt5oPlsX2" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1294QqYm1VuxxjRiL9M0h9" + }, + "href": "https://api.spotify.com/v1/artists/1294QqYm1VuxxjRiL9M0h9", + "id": "1294QqYm1VuxxjRiL9M0h9", + "name": "UPSAHL", + "type": "artist", + "uri": "spotify:artist:1294QqYm1VuxxjRiL9M0h9" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "external_urls": { + "spotify": "https://open.spotify.com/album/1pXm1JY9f142BiqV3bNRjd" + }, + "href": "https://api.spotify.com/v1/albums/1pXm1JY9f142BiqV3bNRjd", + "id": "1pXm1JY9f142BiqV3bNRjd", + "images": [ + { + "height": 300, + "url": "https://i.scdn.co/image/ab67616d00001e0260a8190fa9118dae7bf344ba", + "width": 300 + }, + { + "height": 64, + "url": "https://i.scdn.co/image/ab67616d0000485160a8190fa9118dae7bf344ba", + "width": 64 + }, + { + "height": 640, + "url": "https://i.scdn.co/image/ab67616d0000b27360a8190fa9118dae7bf344ba", + "width": 640 + } + ], + "name": "Thrill Again", + "release_date": "2024-02-09", + "release_date_precision": "day", + "total_tracks": 1, + "type": "album", + "uri": "spotify:album:1pXm1JY9f142BiqV3bNRjd" + } + ], + "limit": 20, + "next": "https://api.spotify.com/v1/browse/new-releases?offset=20&limit=20", + "offset": 0, + "previous": null, + "total": 100 + } +} \ No newline at end of file diff --git a/kovibes/src/commonTest/resources/album/tracks.json b/kovibes/src/commonTest/resources/album/tracks.json new file mode 100644 index 0000000..9c84768 --- /dev/null +++ b/kovibes/src/commonTest/resources/album/tracks.json @@ -0,0 +1,3895 @@ +{ + "href": "https://api.spotify.com/v1/albums/4iqbFIdGOTzXeDtt9owjQn/tracks?offset=0&limit=20", + "items": [ + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 226213, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/1pnDvUuAEd6z8bKEsbAjk1" + }, + "href": "https://api.spotify.com/v1/tracks/1pnDvUuAEd6z8bKEsbAjk1", + "id": "1pnDvUuAEd6z8bKEsbAjk1", + "is_local": false, + "name": "We Don't Trust You", + "preview_url": "https://p.scdn.co/mp3-preview/6727812413b8ff64261c4c08c5eccee46382e88a?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 1, + "type": "track", + "uri": "spotify:track:1pnDvUuAEd6z8bKEsbAjk1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1Xyo4u8uXC1ZmMpatF05PJ" + }, + "href": "https://api.spotify.com/v1/artists/1Xyo4u8uXC1ZmMpatF05PJ", + "id": "1Xyo4u8uXC1ZmMpatF05PJ", + "name": "The Weeknd", + "type": "artist", + "uri": "spotify:artist:1Xyo4u8uXC1ZmMpatF05PJ" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 205346, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3OxL6MuctgZp1e0zxoAZhH" + }, + "href": "https://api.spotify.com/v1/tracks/3OxL6MuctgZp1e0zxoAZhH", + "id": "3OxL6MuctgZp1e0zxoAZhH", + "is_local": false, + "name": "Young Metro", + "preview_url": "https://p.scdn.co/mp3-preview/591763f6156d5803592af94aec6622aafae2e72a?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 2, + "type": "track", + "uri": "spotify:track:3OxL6MuctgZp1e0zxoAZhH" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 199253, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/70ToiXlzl8N1EgfC07ZcZE" + }, + "href": "https://api.spotify.com/v1/tracks/70ToiXlzl8N1EgfC07ZcZE", + "id": "70ToiXlzl8N1EgfC07ZcZE", + "is_local": false, + "name": "Ice Attack", + "preview_url": "https://p.scdn.co/mp3-preview/3d856ca8e25293a71ecd57e728fdce1e37bdc0cb?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 3, + "type": "track", + "uri": "spotify:track:70ToiXlzl8N1EgfC07ZcZE" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0Y5tJX1MQlPlqiwlOH1tJY" + }, + "href": "https://api.spotify.com/v1/artists/0Y5tJX1MQlPlqiwlOH1tJY", + "id": "0Y5tJX1MQlPlqiwlOH1tJY", + "name": "Travis Scott", + "type": "artist", + "uri": "spotify:artist:0Y5tJX1MQlPlqiwlOH1tJY" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/699OTQXzgjhIYAHMy9RyPD" + }, + "href": "https://api.spotify.com/v1/artists/699OTQXzgjhIYAHMy9RyPD", + "id": "699OTQXzgjhIYAHMy9RyPD", + "name": "Playboi Carti", + "type": "artist", + "uri": "spotify:artist:699OTQXzgjhIYAHMy9RyPD" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 228266, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/28drn6tQo95MRvO0jQEo5C" + }, + "href": "https://api.spotify.com/v1/tracks/28drn6tQo95MRvO0jQEo5C", + "id": "28drn6tQo95MRvO0jQEo5C", + "is_local": false, + "name": "Type Shit", + "preview_url": "https://p.scdn.co/mp3-preview/4743d8302c54f95d6f79858b7c67764b1d45e9a3?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 4, + "type": "track", + "uri": "spotify:track:28drn6tQo95MRvO0jQEo5C" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 222053, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/57ELn9TPDIhrpl0dasS465" + }, + "href": "https://api.spotify.com/v1/tracks/57ELn9TPDIhrpl0dasS465", + "id": "57ELn9TPDIhrpl0dasS465", + "is_local": false, + "name": "Claustrophobic", + "preview_url": "https://p.scdn.co/mp3-preview/f70ac5294ba2744bf9b2988b9adb6f7777473210?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 5, + "type": "track", + "uri": "spotify:track:57ELn9TPDIhrpl0dasS465" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/2YZyLoL8N0Wb9xBt1NhZWg" + }, + "href": "https://api.spotify.com/v1/artists/2YZyLoL8N0Wb9xBt1NhZWg", + "id": "2YZyLoL8N0Wb9xBt1NhZWg", + "name": "Kendrick Lamar", + "type": "artist", + "uri": "spotify:artist:2YZyLoL8N0Wb9xBt1NhZWg" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 267706, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2tudvzsrR56uom6smgOcSf" + }, + "href": "https://api.spotify.com/v1/tracks/2tudvzsrR56uom6smgOcSf", + "id": "2tudvzsrR56uom6smgOcSf", + "is_local": false, + "name": "Like That", + "preview_url": "https://p.scdn.co/mp3-preview/793f43da71fe668c35b72a38ae7f93e783823e17?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 6, + "type": "track", + "uri": "spotify:track:2tudvzsrR56uom6smgOcSf" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 194906, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/2GLWhy9iiO1wrLUF5l4FtJ" + }, + "href": "https://api.spotify.com/v1/tracks/2GLWhy9iiO1wrLUF5l4FtJ", + "id": "2GLWhy9iiO1wrLUF5l4FtJ", + "is_local": false, + "name": "Slimed In", + "preview_url": "https://p.scdn.co/mp3-preview/bfb1fffb9f3fef6869539732d7a3dce118c73d10?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 7, + "type": "track", + "uri": "spotify:track:2GLWhy9iiO1wrLUF5l4FtJ" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 220733, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/7pBcryEKcUEaWHwAu1wUyP" + }, + "href": "https://api.spotify.com/v1/tracks/7pBcryEKcUEaWHwAu1wUyP", + "id": "7pBcryEKcUEaWHwAu1wUyP", + "is_local": false, + "name": "Magic Don Juan (Princess Diana)", + "preview_url": "https://p.scdn.co/mp3-preview/a941e20078bb0a99e5fe86300329360b781674ff?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 8, + "type": "track", + "uri": "spotify:track:7pBcryEKcUEaWHwAu1wUyP" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0Y5tJX1MQlPlqiwlOH1tJY" + }, + "href": "https://api.spotify.com/v1/artists/0Y5tJX1MQlPlqiwlOH1tJY", + "id": "0Y5tJX1MQlPlqiwlOH1tJY", + "name": "Travis Scott", + "type": "artist", + "uri": "spotify:artist:0Y5tJX1MQlPlqiwlOH1tJY" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 169840, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/0hKtu53OlIFXVuYkZwcn3o" + }, + "href": "https://api.spotify.com/v1/tracks/0hKtu53OlIFXVuYkZwcn3o", + "id": "0hKtu53OlIFXVuYkZwcn3o", + "is_local": false, + "name": "Cinderella", + "preview_url": "https://p.scdn.co/mp3-preview/3e0191b92876c0c2a9dc601b68da8c591501ba07?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 9, + "type": "track", + "uri": "spotify:track:0hKtu53OlIFXVuYkZwcn3o" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 205480, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4q7y1JFDBJSBSLqXVgcI51" + }, + "href": "https://api.spotify.com/v1/tracks/4q7y1JFDBJSBSLqXVgcI51", + "id": "4q7y1JFDBJSBSLqXVgcI51", + "is_local": false, + "name": "Runnin Outta Time", + "preview_url": "https://p.scdn.co/mp3-preview/0d21e4021dd766cdb2322198e59499193bfaca5c?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 10, + "type": "track", + "uri": "spotify:track:4q7y1JFDBJSBSLqXVgcI51" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 210173, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/28xOPIPw0joNPwYd0asIT5" + }, + "href": "https://api.spotify.com/v1/tracks/28xOPIPw0joNPwYd0asIT5", + "id": "28xOPIPw0joNPwYd0asIT5", + "is_local": false, + "name": "Fried (She a Vibe)", + "preview_url": "https://p.scdn.co/mp3-preview/e558ff6e37ee8e7d0662dce931f5810169ca093d?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 11, + "type": "track", + "uri": "spotify:track:28xOPIPw0joNPwYd0asIT5" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 182840, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/72qABvaqn3TP6drO2tByA6" + }, + "href": "https://api.spotify.com/v1/tracks/72qABvaqn3TP6drO2tByA6", + "id": "72qABvaqn3TP6drO2tByA6", + "is_local": false, + "name": "Ain't No Love", + "preview_url": "https://p.scdn.co/mp3-preview/d5b2f54b5c791ec0794c234cb782058f2985f125?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 12, + "type": "track", + "uri": "spotify:track:72qABvaqn3TP6drO2tByA6" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1sBkRIssrMs1AbVkOJbc7a" + }, + "href": "https://api.spotify.com/v1/artists/1sBkRIssrMs1AbVkOJbc7a", + "id": "1sBkRIssrMs1AbVkOJbc7a", + "name": "Rick Ross", + "type": "artist", + "uri": "spotify:artist:1sBkRIssrMs1AbVkOJbc7a" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 226946, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/3Vg7nPYlOrCkcV1abKbRQ1" + }, + "href": "https://api.spotify.com/v1/tracks/3Vg7nPYlOrCkcV1abKbRQ1", + "id": "3Vg7nPYlOrCkcV1abKbRQ1", + "is_local": false, + "name": "Everyday Hustle", + "preview_url": "https://p.scdn.co/mp3-preview/a9efc05f4f7b8b1e95c8a717511e024e794bc7bf?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 13, + "type": "track", + "uri": "spotify:track:3Vg7nPYlOrCkcV1abKbRQ1" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 233026, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/4XF9fk0STp9hx8xn5Suwpz" + }, + "href": "https://api.spotify.com/v1/tracks/4XF9fk0STp9hx8xn5Suwpz", + "id": "4XF9fk0STp9hx8xn5Suwpz", + "is_local": false, + "name": "GTA", + "preview_url": "https://p.scdn.co/mp3-preview/5b7dc48ae4494ddc72d6fbcf8f57f5e1bbf4a7f6?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 14, + "type": "track", + "uri": "spotify:track:4XF9fk0STp9hx8xn5Suwpz" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 179440, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/5imsnhkfPCm3wajS9ksb21" + }, + "href": "https://api.spotify.com/v1/tracks/5imsnhkfPCm3wajS9ksb21", + "id": "5imsnhkfPCm3wajS9ksb21", + "is_local": false, + "name": "Seen it All", + "preview_url": "https://p.scdn.co/mp3-preview/d2e806d37967ab45dcfbbcb69b0795b74f252aee?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 15, + "type": "track", + "uri": "spotify:track:5imsnhkfPCm3wajS9ksb21" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 292600, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/1xwvjqcwflD2NEqRCNcCo2" + }, + "href": "https://api.spotify.com/v1/tracks/1xwvjqcwflD2NEqRCNcCo2", + "id": "1xwvjqcwflD2NEqRCNcCo2", + "is_local": false, + "name": "WTFYM", + "preview_url": "https://p.scdn.co/mp3-preview/863b8ca1f9f17607b3cc9651950156d44c619457?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 16, + "type": "track", + "uri": "spotify:track:1xwvjqcwflD2NEqRCNcCo2" + }, + { + "artists": [ + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/1RyvyyTE3xzB2ZywiAwp0i" + }, + "href": "https://api.spotify.com/v1/artists/1RyvyyTE3xzB2ZywiAwp0i", + "id": "1RyvyyTE3xzB2ZywiAwp0i", + "name": "Future", + "type": "artist", + "uri": "spotify:artist:1RyvyyTE3xzB2ZywiAwp0i" + }, + { + "external_urls": { + "spotify": "https://open.spotify.com/artist/0iEtIxbK0KxaSlF7G42ZOp" + }, + "href": "https://api.spotify.com/v1/artists/0iEtIxbK0KxaSlF7G42ZOp", + "id": "0iEtIxbK0KxaSlF7G42ZOp", + "name": "Metro Boomin", + "type": "artist", + "uri": "spotify:artist:0iEtIxbK0KxaSlF7G42ZOp" + } + ], + "available_markets": [ + "AR", + "AU", + "AT", + "BE", + "BO", + "BR", + "BG", + "CA", + "CL", + "CO", + "CR", + "CY", + "CZ", + "DK", + "DO", + "DE", + "EC", + "EE", + "SV", + "FI", + "FR", + "GR", + "GT", + "HN", + "HK", + "HU", + "IS", + "IE", + "IT", + "LV", + "LT", + "LU", + "MY", + "MT", + "MX", + "NL", + "NZ", + "NI", + "NO", + "PA", + "PY", + "PE", + "PH", + "PL", + "PT", + "SG", + "SK", + "ES", + "SE", + "CH", + "TW", + "TR", + "UY", + "US", + "GB", + "AD", + "LI", + "MC", + "ID", + "JP", + "TH", + "VN", + "RO", + "IL", + "ZA", + "SA", + "AE", + "BH", + "QA", + "OM", + "KW", + "EG", + "MA", + "DZ", + "TN", + "LB", + "JO", + "PS", + "IN", + "BY", + "KZ", + "MD", + "UA", + "AL", + "BA", + "HR", + "ME", + "MK", + "RS", + "SI", + "KR", + "BD", + "PK", + "LK", + "GH", + "KE", + "NG", + "TZ", + "UG", + "AG", + "AM", + "BS", + "BB", + "BZ", + "BT", + "BW", + "BF", + "CV", + "CW", + "DM", + "FJ", + "GM", + "GE", + "GD", + "GW", + "GY", + "HT", + "JM", + "KI", + "LS", + "LR", + "MW", + "MV", + "ML", + "MH", + "FM", + "NA", + "NR", + "NE", + "PW", + "PG", + "PR", + "WS", + "SM", + "ST", + "SN", + "SC", + "SL", + "SB", + "KN", + "LC", + "VC", + "SR", + "TL", + "TO", + "TT", + "TV", + "VU", + "AZ", + "BN", + "BI", + "KH", + "CM", + "TD", + "KM", + "GQ", + "SZ", + "GA", + "GN", + "KG", + "LA", + "MO", + "MR", + "MN", + "NP", + "RW", + "TG", + "UZ", + "ZW", + "BJ", + "MG", + "MU", + "MZ", + "AO", + "CI", + "DJ", + "ZM", + "CD", + "CG", + "IQ", + "LY", + "TJ", + "VE", + "ET", + "XK" + ], + "disc_number": 1, + "duration_ms": 122786, + "explicit": true, + "external_urls": { + "spotify": "https://open.spotify.com/track/30TcFxtFyju8isK6Hjo9KY" + }, + "href": "https://api.spotify.com/v1/tracks/30TcFxtFyju8isK6Hjo9KY", + "id": "30TcFxtFyju8isK6Hjo9KY", + "is_local": false, + "name": "Where My Twin @ - Bonus", + "preview_url": "https://p.scdn.co/mp3-preview/be9b1f1c9751f642c9e066f597828aafd85529cb?cid=173791e72eeb42cfb4ed1fd14aebcdcb", + "track_number": 17, + "type": "track", + "uri": "spotify:track:30TcFxtFyju8isK6Hjo9KY" + } + ], + "limit": 20, + "next": null, + "offset": 0, + "previous": null, + "total": 17 +} \ No newline at end of file