Skip to content

Commit ad36734

Browse files
committed
kotlin 1.4, ktor, kotlinx.serialization updates
Signed-off-by: Adam Ratzman <[email protected]>
1 parent ce060d9 commit ad36734

File tree

19 files changed

+126
-106
lines changed

19 files changed

+126
-106
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ buildscript {
3131
}
3232

3333
group = "com.adamratzman"
34-
version = "3.2.13"
34+
version = "3.2.14"
3535

3636
tasks.withType<Test> {
3737
this.testLogging {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ sealed class SpotifyException(message: String, cause: Throwable? = null) : Excep
3131
constructor(responseException: ResponseException) :
3232
this(
3333
responseException.message ?: "Bad Request",
34-
responseException.response.status.value,
34+
responseException.response?.status?.value,
3535
null,
3636
responseException
3737
)

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.adamratzman.spotify.models.PlaylistUri
1717
import com.adamratzman.spotify.models.UserUri
1818
import com.adamratzman.spotify.models.serialization.toCursorBasedPagingObject
1919
import com.adamratzman.spotify.models.serialization.toList
20+
import kotlinx.serialization.builtins.ListSerializer
2021
import kotlinx.serialization.builtins.list
2122
import kotlinx.serialization.builtins.serializer
2223

@@ -90,7 +91,7 @@ class ClientFollowingApi(api: GenericSpotifyApi) : FollowingApi(api) {
9091
get(
9192
EndpointBuilder("/me/following/contains").with("type", "user")
9293
.with("ids", chunk.joinToString(",") { UserUri(it).id.encodeUrl() }).toString()
93-
).toList(Boolean.serializer().list, api, json)
94+
).toList(ListSerializer(Boolean.serializer()), api, json)
9495
}.flatten()
9596
}
9697
}
@@ -132,7 +133,7 @@ class ClientFollowingApi(api: GenericSpotifyApi) : FollowingApi(api) {
132133
get(
133134
EndpointBuilder("/me/following/contains").with("type", "artist")
134135
.with("ids", chunk.joinToString(",") { ArtistUri(it).id.encodeUrl() }).toString()
135-
).toList(Boolean.serializer().list, api, json)
136+
).toList(ListSerializer(Boolean.serializer()), api, json)
136137
}.flatten()
137138
}
138139
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.adamratzman.spotify.models.SavedTrack
1717
import com.adamratzman.spotify.models.serialization.toList
1818
import com.adamratzman.spotify.models.serialization.toPagingObject
1919
import com.adamratzman.spotify.utils.Market
20+
import kotlinx.serialization.builtins.ListSerializer
2021
import kotlinx.serialization.builtins.list
2122
import kotlinx.serialization.builtins.serializer
2223

@@ -120,7 +121,7 @@ class ClientLibraryApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
120121
get(
121122
EndpointBuilder("/me/$type/contains").with("ids", list.joinToString(",") { type.id(it).encodeUrl() })
122123
.toString()
123-
).toList(Boolean.serializer().list, api, json)
124+
).toList(ListSerializer(Boolean.serializer()), api, json)
124125
}.flatten()
125126
}
126127
}

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

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@ import com.adamratzman.spotify.models.serialization.toJson
2222
import com.adamratzman.spotify.models.serialization.toObject
2323
import com.adamratzman.spotify.utils.catch
2424
import com.adamratzman.spotify.utils.jsonMap
25+
import kotlinx.serialization.builtins.ListSerializer
2526
import kotlinx.serialization.builtins.list
2627
import kotlinx.serialization.json.JsonArray
2728
import kotlinx.serialization.json.JsonPrimitive
29+
import kotlinx.serialization.json.buildJsonObject
2830
import kotlinx.serialization.json.json
31+
import kotlinx.serialization.json.put
2932

3033
@Deprecated("Endpoint name has been updated for kotlin convention consistency", ReplaceWith("ClientPlayerApi"))
3134
typealias ClientPlayerAPI = ClientPlayerApi
@@ -46,7 +49,7 @@ class ClientPlayerApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
4649
*/
4750
fun getDevices(): SpotifyRestAction<List<Device>> {
4851
return toAction {
49-
get(EndpointBuilder("/me/player/devices").toString()).toInnerObject(Device.serializer().list, "devices", json)
52+
get(EndpointBuilder("/me/player/devices").toString()).toInnerObject(ListSerializer(Device.serializer()), "devices", json)
5053
}
5154
}
5255

@@ -266,17 +269,17 @@ class ClientPlayerApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
266269
val url = EndpointBuilder("/me/player/play").with("device_id", deviceId).toString()
267270
val body = jsonMap()
268271
when {
269-
collection != null -> body += json { "context_uri" to collection.uri }
270-
tracksToPlay.isNotEmpty() -> body += json {
271-
"uris" to JsonArray(
272+
collection != null -> body += buildJsonObject { put("context_uri", collection.uri) }
273+
tracksToPlay.isNotEmpty() -> body += buildJsonObject {
274+
put("uris", JsonArray(
272275
tracksToPlay.map { it.uri }.map(::JsonPrimitive)
273-
)
276+
))
274277
}
275278
}
276279
if (body.keys.isNotEmpty()) {
277-
if (offsetNum != null) body += json { "offset" to json { "position" to offsetNum } }
278-
else if (offsetPlayable != null) body += json {
279-
"offset" to json { "uri" to offsetPlayable.uri }
280+
if (offsetNum != null) body += buildJsonObject { put("offset", buildJsonObject { put("position", offsetNum) }) }
281+
else if (offsetPlayable != null) body += buildJsonObject {
282+
put("offset", buildJsonObject { put("uri", offsetPlayable.uri) })
280283
}
281284
put(url, body.toJson())
282285
} else put(url)
@@ -327,8 +330,8 @@ class ClientPlayerApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
327330
// require(deviceId.size <= 1) { "Although an array is accepted, only a single device_id is currently supported. Supplying more than one will 400 Bad Request" }
328331
return toAction {
329332
val json = jsonMap()
330-
play?.let { json += json { "play" to it } }
331-
json += json { "device_ids" to JsonArray(listOf(deviceId).map(::JsonPrimitive)) }
333+
play?.let { json += buildJsonObject { put("play", it) } }
334+
json += buildJsonObject { put("device_ids", JsonArray(listOf(deviceId).map(::JsonPrimitive))) }
332335
put(EndpointBuilder("/me/player").toString(), json.toJson())
333336
Unit
334337
}

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

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ import kotlinx.serialization.Serializable
3232
import kotlinx.serialization.json.JsonArray
3333
import kotlinx.serialization.json.JsonObject
3434
import kotlinx.serialization.json.JsonPrimitive
35+
import kotlinx.serialization.json.buildJsonObject
3536
import kotlinx.serialization.json.json
37+
import kotlinx.serialization.json.put
3638

3739
@Deprecated("Endpoint name has been updated for kotlin convention consistency", ReplaceWith("ClientPlaylistApi"))
3840
typealias ClientPlaylistAPI = ClientPlaylistApi
@@ -73,10 +75,10 @@ class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
7375
if (name.isEmpty()) throw BadRequestException(ErrorObject(400, "Name cannot be empty"))
7476
return toAction {
7577
val body = jsonMap()
76-
body += json { "name" to name }
77-
if (description != null) body += json { "description" to description }
78-
if (public != null) body += json { "public" to public }
79-
if (collaborative != null) body += json { "collaborative" to collaborative }
78+
body += buildJsonObject { put("name", name) }
79+
if (description != null) body += buildJsonObject { put("description", description) }
80+
if (public != null) body += buildJsonObject { put("public", public) }
81+
if (collaborative != null) body += buildJsonObject { put("collaborative", collaborative) }
8082
post(
8183
EndpointBuilder("/users/${UserUri(user).id.encodeUrl()}/playlists").toString(),
8284
body.toJson()
@@ -125,8 +127,8 @@ class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
125127
return toAction {
126128
bulkRequest(100, tracks.toList()) { chunk ->
127129
val body = jsonMap()
128-
body += json { "uris" to JsonArray(chunk.map { PlayableUri(PlayableUri(it).id.encodeUrl()).uri }.map(::JsonPrimitive)) }
129-
if (position != null) body += json { "position" to position }
130+
body += buildJsonObject { put("uris", JsonArray(chunk.map { PlayableUri(PlayableUri(it).id.encodeUrl()).uri }.map(::JsonPrimitive))) }
131+
if (position != null) body += buildJsonObject { put("position", position) }
130132
post(
131133
EndpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}/tracks").toString(),
132134
body.toJson()
@@ -161,10 +163,10 @@ class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
161163
description: String? = null
162164
): SpotifyRestAction<Unit> {
163165
val body = jsonMap()
164-
if (name != null) body += json { "name" to name }
165-
if (public != null) body += json { "public" to public }
166-
if (collaborative != null) body += json { "collaborative" to collaborative }
167-
if (description != null) body += json { "description" to description }
166+
if (name != null) body += buildJsonObject { put("name", name) }
167+
if (public != null) body += buildJsonObject { put("public", public) }
168+
if (collaborative != null) body += buildJsonObject { put("collaborative", collaborative) }
169+
if (description != null) body += buildJsonObject { put("description", description) }
168170
require(body.isNotEmpty()) { "At least one option must not be null" }
169171
return toAction {
170172
put(EndpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}").toString(), body.toJson())
@@ -264,10 +266,10 @@ class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
264266
): SpotifyRestAction<PlaylistSnapshot> {
265267
return toAction {
266268
val body = jsonMap()
267-
body += json { "range_start" to reorderRangeStart }
268-
body += json { "insert_before" to insertionPoint }
269-
if (reorderRangeLength != null) body += json { "range_length" to reorderRangeLength }
270-
if (snapshotId != null) body += json { "snapshot_id" to snapshotId }
269+
body += buildJsonObject { put("range_start", reorderRangeStart) }
270+
body += buildJsonObject { put("insert_before", insertionPoint) }
271+
if (reorderRangeLength != null) body += buildJsonObject { put("range_length", reorderRangeLength) }
272+
if (snapshotId != null) body += buildJsonObject { put("snapshot_id", snapshotId) }
271273
put(
272274
EndpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}/tracks").toString(),
273275
body.toJson()
@@ -292,7 +294,7 @@ class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
292294
fun setClientPlaylistTracks(playlist: String, vararg tracks: String): SpotifyRestAction<Unit> {
293295
return toAction {
294296
val body = jsonMap()
295-
body += json { "uris" to JsonArray(tracks.map { PlayableUri(PlayableUri(it).id.encodeUrl()).uri }.map(::JsonPrimitive)) }
297+
body += buildJsonObject { put("uris", JsonArray(tracks.map { PlayableUri(PlayableUri(it).id.encodeUrl()).uri }.map(::JsonPrimitive))) }
296298
put(
297299
EndpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}/tracks").toString(),
298300
body.toJson()
@@ -459,19 +461,19 @@ class ClientPlaylistApi(api: GenericSpotifyApi) : PlaylistApi(api) {
459461
return toAction {
460462
bulkRequest(100, tracks.toList()) { chunk ->
461463
val body = jsonMap()
462-
if (snapshotId != null) body += json { "snapshot_id" to snapshotId }
463-
body += json {
464-
"tracks" to JsonArray(
464+
if (snapshotId != null) body += buildJsonObject { put("snapshot_id", snapshotId) }
465+
body += buildJsonObject {
466+
put("tracks", JsonArray(
465467
chunk.map { (track, positions) ->
466468
val json = jsonMap()
467-
json += json { "uri" to PlayableUri(track).uri }
468-
if (positions?.positions?.isNotEmpty() == true) json += json {
469-
"positions" to JsonArray(
469+
json += buildJsonObject { put("uri", PlayableUri(track).uri) }
470+
if (positions?.positions?.isNotEmpty() == true) json += buildJsonObject {
471+
put("positions", JsonArray(
470472
positions.positions.map(::JsonPrimitive)
471-
)
473+
))
472474
}
473475
JsonObject(json)
474-
})
476+
}))
475477
}
476478
delete(
477479
EndpointBuilder("/playlists/${PlaylistUri(playlist).id}/tracks").toString(), body = body.toJson()

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.adamratzman.spotify.models.serialization.toObject
2020
import com.adamratzman.spotify.models.serialization.toPagingObject
2121
import com.adamratzman.spotify.utils.Market
2222
import com.adamratzman.spotify.utils.catch
23+
import kotlinx.serialization.builtins.ListSerializer
2324
import kotlinx.serialization.builtins.list
2425

2526
@Deprecated("Endpoint name has been updated for kotlin convention consistency", ReplaceWith("ArtistApi"))
@@ -144,7 +145,7 @@ class ArtistApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
144145
"country",
145146
market.name
146147
).toString()
147-
).toInnerArray(Track.serializer().list, "tracks", json)
148+
).toInnerArray(ListSerializer(Track.serializer()), "tracks", json)
148149
}
149150
}
150151

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.adamratzman.spotify.models.serialization.toPagingObject
2525
import com.adamratzman.spotify.utils.Locale
2626
import com.adamratzman.spotify.utils.Market
2727
import com.adamratzman.spotify.utils.formatDate
28+
import kotlinx.serialization.builtins.ListSerializer
2829
import kotlin.reflect.KClass
2930
import kotlinx.serialization.builtins.list
3031
import kotlinx.serialization.builtins.serializer
@@ -48,7 +49,7 @@ class BrowseApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
4849
fun getAvailableGenreSeeds(): SpotifyRestAction<List<String>> {
4950
return toAction {
5051
get(EndpointBuilder("/recommendations/available-genre-seeds").toString()).toInnerArray(
51-
String.serializer().list,
52+
ListSerializer(String.serializer()),
5253
"genres",
5354
json
5455
)

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.adamratzman.spotify.http.encodeUrl
1010
import com.adamratzman.spotify.models.PlaylistUri
1111
import com.adamratzman.spotify.models.UserUri
1212
import com.adamratzman.spotify.models.serialization.toList
13+
import kotlinx.serialization.builtins.ListSerializer
1314
import kotlinx.serialization.builtins.list
1415
import kotlinx.serialization.builtins.serializer
1516

@@ -45,7 +46,7 @@ open class FollowingApi(api: GenericSpotifyApi) : SpotifyEndpoint(api) {
4546
get(
4647
EndpointBuilder("/playlists/${PlaylistUri(playlist).id.encodeUrl()}/followers/contains")
4748
.with("ids", chunk.joinToString(",") { UserUri(it).id.encodeUrl() }).toString()
48-
).toList(Boolean.serializer().list, api, json)
49+
).toList(ListSerializer(Boolean.serializer()), api, json)
4950
}.flatten()
5051
}
5152
}

0 commit comments

Comments
 (0)