Skip to content

Commit 149b6d2

Browse files
authored
Merge pull request #242 from adamint/dev
Fix API not being instantiated, introduce new way of defining what objects need API field
2 parents 01f8805 + e04ba85 commit 149b6d2

31 files changed

+433
-371
lines changed

build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88
id("io.codearte.nexus-staging") version "0.22.0"
99
id("com.android.library")
1010
kotlin("multiplatform") version "1.4.21"
11-
kotlin("plugin.serialization") version "1.4.21"
11+
kotlin("plugin.serialization") version "1.4.20"
1212
id("com.diffplug.gradle.spotless") version "4.4.0"
1313
id("com.moowork.node") version "1.3.1"
1414
id("org.jetbrains.dokka") version "1.4.20"
@@ -213,7 +213,7 @@ kotlin {
213213
sourceSets {
214214
val coroutineVersion = "1.4.2-native-mt"
215215
val serializationVersion = "1.0.1"
216-
val ktorVersion = "1.4.1"
216+
val ktorVersion = "1.5.0"
217217
val kotlinxDatetimeVersion = "0.1.1"
218218

219219
val commonMain by getting {

src/commonMain/kotlin/com.adamratzman.spotify/Builder.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.adamratzman.spotify.http.HttpRequestMethod
77
import com.adamratzman.spotify.models.Token
88
import com.adamratzman.spotify.models.serialization.nonstrictJson
99
import com.adamratzman.spotify.models.serialization.toObject
10+
import io.ktor.client.features.ServerResponseException
1011
import kotlinx.coroutines.CancellationException
1112
import kotlinx.serialization.json.Json
1213

@@ -639,7 +640,10 @@ public class SpotifyClientApiBuilder(
639640
} catch (e: CancellationException) {
640641
throw e
641642
} catch (e: Exception) {
642-
throw SpotifyException.AuthenticationException(
643+
// BadRequestException -> ServerResponseException
644+
if ((e.cause as? ServerResponseException)?.response?.status?.value in 500..599) {
645+
throw SpotifyException.BadRequestException("Spotify internal server error", e)
646+
} else throw SpotifyException.AuthenticationException(
643647
"Invalid credentials provided in the login process (clientId=$clientId, clientSecret=$clientSecret, authCode=${authorization.authorizationCode})",
644648
e
645649
)
@@ -675,7 +679,9 @@ public class SpotifyClientApiBuilder(
675679
} catch (e: CancellationException) {
676680
throw e
677681
} catch (e: Exception) {
678-
throw SpotifyException.AuthenticationException(
682+
if ((e.cause as? ServerResponseException)?.response?.status?.value in 500..599) {
683+
throw SpotifyException.BadRequestException("Spotify internal server error", e)
684+
} else throw SpotifyException.AuthenticationException(
679685
"Invalid credentials provided in the login process (clientId=$clientId, clientSecret=$clientSecret, authCode=${authorization.authorizationCode})",
680686
e
681687
)
@@ -783,7 +789,9 @@ public class SpotifyAppApiBuilder(
783789
} catch (e: CancellationException) {
784790
throw e
785791
} catch (e: Exception) {
786-
throw SpotifyException.AuthenticationException(
792+
if ((e.cause as? ServerResponseException)?.response?.status?.value in 500..599) {
793+
throw SpotifyException.BadRequestException("Spotify internal server error", e)
794+
} else throw SpotifyException.AuthenticationException(
787795
"Invalid credentials provided in the login process (clientId=$clientId, clientSecret=$clientSecret)",
788796
e
789797
)

src/commonMain/kotlin/com.adamratzman.spotify/SpotifyApi.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ public sealed class SpotifyApi<T : SpotifyApi<T, B>, B : ISpotifyApiBuilder<T, B
8484
*/
8585
internal val spotifyApiBase = "https://api.spotify.com/v1"
8686

87+
internal val defaultEndpoint get() = tracks
88+
8789
init {
8890
spotifyApiOptions.requiredScopes?.let { requiredScopes ->
8991
val tokenScopes = token.scopes ?: listOf()

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/client/ClientFollowingApi.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ public class ClientFollowingApi(api: GenericSpotifyApi) : FollowingApi(api) {
137137
"after",
138138
after
139139
).toString()
140-
).toCursorBasedPagingObject(Artist.serializer(), "artists", this, json)
140+
).toCursorBasedPagingObject(Artist::class, Artist.serializer(), "artists", api, json)
141141

142142
/**
143143
* Add the current user as a follower of another user

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/client/ClientLibraryApi.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import com.adamratzman.spotify.models.PlayableUri
1212
import com.adamratzman.spotify.models.SavedAlbum
1313
import com.adamratzman.spotify.models.SavedTrack
1414
import com.adamratzman.spotify.models.serialization.toList
15-
import com.adamratzman.spotify.models.serialization.toPagingObject
15+
import com.adamratzman.spotify.models.serialization.toNonNullablePagingObject
1616
import com.adamratzman.spotify.utils.Market
1717
import kotlinx.serialization.builtins.ListSerializer
1818
import kotlinx.serialization.builtins.serializer
@@ -44,7 +44,7 @@ public class ClientLibraryApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
4444
): PagingObject<SavedTrack> = get(
4545
endpointBuilder("/me/tracks").with("limit", limit).with("offset", offset).with("market", market?.name)
4646
.toString()
47-
).toPagingObject(SavedTrack.serializer(), endpoint = this, json = json)
47+
).toNonNullablePagingObject(SavedTrack.serializer(), api = api, json = json)
4848

4949
/**
5050
* Get a list of the albums saved in the current Spotify user’s ‘Your Music’ library.
@@ -67,7 +67,7 @@ public class ClientLibraryApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
6767
): PagingObject<SavedAlbum> = get(
6868
endpointBuilder("/me/albums").with("limit", limit).with("offset", offset).with("market", market?.name)
6969
.toString()
70-
).toPagingObject(SavedAlbum.serializer(), endpoint = this, json = json)
70+
).toNonNullablePagingObject(SavedAlbum.serializer(), api = api, json = json)
7171

7272
/**
7373
* Check if the [LibraryType] with id [id] is already saved in the current Spotify user’s ‘Your Music’ library.

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/client/ClientPersonalizationApi.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.adamratzman.spotify.http.SpotifyEndpoint
77
import com.adamratzman.spotify.models.Artist
88
import com.adamratzman.spotify.models.PagingObject
99
import com.adamratzman.spotify.models.Track
10-
import com.adamratzman.spotify.models.serialization.toPagingObject
10+
import com.adamratzman.spotify.models.serialization.toNonNullablePagingObject
1111

1212
/**
1313
* Endpoints for retrieving information about the user’s listening habits.
@@ -69,7 +69,7 @@ public class ClientPersonalizationApi(api: GenericSpotifyApi) : SpotifyEndpoint(
6969
): PagingObject<Artist> = get(
7070
endpointBuilder("/me/top/artists").with("limit", limit).with("offset", offset)
7171
.with("time_range", timeRange).toString()
72-
).toPagingObject(Artist.serializer(), endpoint = this, json = json)
72+
).toNonNullablePagingObject(Artist.serializer(), api = api, json = json)
7373

7474
/**
7575
* Get the current user’s top tracks based on calculated affinity.
@@ -99,5 +99,5 @@ public class ClientPersonalizationApi(api: GenericSpotifyApi) : SpotifyEndpoint(
9999
): PagingObject<Track> = get(
100100
endpointBuilder("/me/top/tracks").with("limit", limit).with("offset", offset)
101101
.with("time_range", timeRange).toString()
102-
).toPagingObject(Track.serializer(), endpoint = this, json = json)
102+
).toNonNullablePagingObject(Track.serializer(), api = api, json = json)
103103
}

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/client/ClientPlayerApi.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import com.adamratzman.spotify.models.CursorBasedPagingObject
1313
import com.adamratzman.spotify.models.Device
1414
import com.adamratzman.spotify.models.PlayHistory
1515
import com.adamratzman.spotify.models.PlayableUri
16+
import com.adamratzman.spotify.models.serialization.mapToJsonString
1617
import com.adamratzman.spotify.models.serialization.toCursorBasedPagingObject
1718
import com.adamratzman.spotify.models.serialization.toInnerObject
18-
import com.adamratzman.spotify.models.serialization.toJson
1919
import com.adamratzman.spotify.models.serialization.toObject
2020
import com.adamratzman.spotify.utils.catch
2121
import com.adamratzman.spotify.utils.jsonMap
@@ -79,7 +79,7 @@ public class ClientPlayerApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
7979
): CursorBasedPagingObject<PlayHistory> = get(
8080
endpointBuilder("/me/player/recently-played")
8181
.with("limit", limit).with("before", before).with("after", after).toString()
82-
).toCursorBasedPagingObject(PlayHistory.serializer(), endpoint = this, json = json)
82+
).toCursorBasedPagingObject(PlayHistory::class, PlayHistory.serializer(), api = api, json = json)
8383

8484
/**
8585
* Get the object currently being played on the user’s Spotify account.
@@ -242,7 +242,7 @@ public class ClientPlayerApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
242242
else if (offsetPlayableUri != null) body += buildJsonObject {
243243
put("offset", buildJsonObject { put("uri", offsetPlayableUri.uri) })
244244
}
245-
put(url, body.toJson())
245+
put(url, body.mapToJsonString())
246246
} else put(url)
247247
}
248248

@@ -286,7 +286,7 @@ public class ClientPlayerApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
286286
val json = jsonMap()
287287
play?.let { json += buildJsonObject { put("play", it) } }
288288
json += buildJsonObject { put("device_ids", JsonArray(listOf(deviceId).map(::JsonPrimitive))) }
289-
put(endpointBuilder("/me/player").toString(), json.toJson())
289+
put(endpointBuilder("/me/player").toString(), json.mapToJsonString())
290290
}
291291

292292
/**

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/client/ClientPlaylistApi.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ import com.adamratzman.spotify.models.Playlist
1414
import com.adamratzman.spotify.models.PlaylistUri
1515
import com.adamratzman.spotify.models.SimplePlaylist
1616
import com.adamratzman.spotify.models.UserUri
17-
import com.adamratzman.spotify.models.serialization.toJson
17+
import com.adamratzman.spotify.models.serialization.mapToJsonString
18+
import com.adamratzman.spotify.models.serialization.toNonNullablePagingObject
1819
import com.adamratzman.spotify.models.serialization.toObject
19-
import com.adamratzman.spotify.models.serialization.toPagingObject
2020
import com.adamratzman.spotify.utils.BufferedImage
2121
import com.adamratzman.spotify.utils.File
2222
import com.adamratzman.spotify.utils.convertFileToBufferedImage
@@ -74,7 +74,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
7474

7575
return post(
7676
endpointBuilder("/users/${UserUri(user ?: (api as SpotifyClientApi).getUserId()).id.encodeUrl()}/playlists").toString(),
77-
body.toJson()
77+
body.mapToJsonString()
7878
).toObject(Playlist.serializer(), api, json)
7979
}
8080

@@ -128,7 +128,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
128128
if (position != null) body += buildJsonObject { put("position", position) }
129129
post(
130130
endpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}/tracks").toString(),
131-
body.toJson()
131+
body.mapToJsonString()
132132
)
133133
}
134134
}
@@ -162,7 +162,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
162162
if (collaborative != null) body += buildJsonObject { put("collaborative", collaborative) }
163163
if (description != null) body += buildJsonObject { put("description", description) }
164164
require(body.isNotEmpty()) { "At least one option must not be null" }
165-
put(endpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}").toString(), body.toJson())
165+
put(endpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}").toString(), body.mapToJsonString())
166166
}
167167

168168
/**
@@ -188,7 +188,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
188188
require(!(limit != null && limit !in 1..50)) { "Limit must be between 1 and 50. Provided $limit" }
189189
require(!(offset != null && offset !in 0..100000)) { "Offset must be between 0 and 100,000. Provided $limit" }
190190
return get(endpointBuilder("/me/playlists").with("limit", limit).with("offset", offset).toString())
191-
.toPagingObject(SimplePlaylist.serializer(), endpoint = this, json = json)
191+
.toNonNullablePagingObject(SimplePlaylist.serializer(), api = api, json = json)
192192
}
193193

194194
/**
@@ -258,7 +258,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
258258

259259
return put(
260260
endpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}/tracks").toString(),
261-
body.toJson()
261+
body.mapToJsonString()
262262
).toObject(PlaylistSnapshot.serializer(), api, json)
263263
}
264264

@@ -286,7 +286,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
286286
}
287287
put(
288288
endpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}/tracks").toString(),
289-
body.toJson()
289+
body.mapToJsonString()
290290
)
291291
}
292292

@@ -464,7 +464,7 @@ public class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
464464
)
465465
}
466466
delete(
467-
endpointBuilder("/playlists/${PlaylistUri(playlist).id}/tracks").toString(), body = body.toJson()
467+
endpointBuilder("/playlists/${PlaylistUri(playlist).id}/tracks").toString(), body = body.mapToJsonString()
468468
).toObject(PlaylistSnapshot.serializer(), api, json)
469469
}.last()
470470
}

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/client/ClientSearchApi.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.adamratzman.spotify.endpoints.public.SearchApi
77
import com.adamratzman.spotify.models.PagingObject
88
import com.adamratzman.spotify.models.SimpleEpisode
99
import com.adamratzman.spotify.models.SimpleShow
10-
import com.adamratzman.spotify.models.serialization.toPagingObject
10+
import com.adamratzman.spotify.models.serialization.toNonNullablePagingObject
1111
import com.adamratzman.spotify.utils.Market
1212

1313
/**
@@ -39,7 +39,7 @@ public class ClientSearchApi(api: GenericSpotifyApi) : SearchApi(api) {
3939
offset: Int? = null,
4040
market: Market? = null
4141
): PagingObject<SimpleShow> = get(build(query, market, limit, offset, SearchType.SHOW))
42-
.toPagingObject(SimpleShow.serializer(), "shows", this, json)
42+
.toNonNullablePagingObject(SimpleShow.serializer(), "shows", api, json)
4343

4444
/**
4545
* Get Spotify Catalog information about episodes that match the keyword string. See [SearchApi.search] for more information
@@ -63,5 +63,5 @@ public class ClientSearchApi(api: GenericSpotifyApi) : SearchApi(api) {
6363
offset: Int? = null,
6464
market: Market? = null
6565
): PagingObject<SimpleEpisode> = get(build(query, market, limit, offset, SearchType.EPISODE))
66-
.toPagingObject(SimpleEpisode.serializer(), "episodes", this, json)
66+
.toNonNullablePagingObject(SimpleEpisode.serializer(), "episodes", api, json)
6767
}

src/commonMain/kotlin/com.adamratzman.spotify/endpoints/public/AlbumApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import com.adamratzman.spotify.models.AlbumUri
1010
import com.adamratzman.spotify.models.AlbumsResponse
1111
import com.adamratzman.spotify.models.PagingObject
1212
import com.adamratzman.spotify.models.SimpleTrack
13+
import com.adamratzman.spotify.models.serialization.toNonNullablePagingObject
1314
import com.adamratzman.spotify.models.serialization.toObject
14-
import com.adamratzman.spotify.models.serialization.toPagingObject
1515
import com.adamratzman.spotify.utils.Market
1616
import com.adamratzman.spotify.utils.catch
1717

@@ -85,5 +85,5 @@ public class AlbumApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
8585
offset
8686
).with("market", market?.name)
8787
.toString()
88-
).toPagingObject(SimpleTrack.serializer(), endpoint = this, json = json)
88+
).toNonNullablePagingObject(SimpleTrack.serializer(), api = api, json = json)
8989
}

0 commit comments

Comments
 (0)