Skip to content

Commit 04f29fe

Browse files
committed
implement the new parser
Signed-off-by: Adam Ratzman <adam@adamratzman.com>
1 parent 511b8ba commit 04f29fe

19 files changed

+207
-98
lines changed

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientFollowingAPI.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class ClientFollowingAPI(api: SpotifyAPI) : FollowingAPI(api) {
6969
get(
7070
EndpointBuilder("/me/following/contains").with("type", "user")
7171
.with("ids", users.joinToString(",") { UserURI(it).id.encode() }).toString()
72-
).toObject<List<Boolean>>(api, ArrayListSerializer(BooleanSerializer)).toList()
72+
).toObject(api, ArrayListSerializer(BooleanSerializer)).toList()
7373
})
7474
}
7575

@@ -98,7 +98,7 @@ class ClientFollowingAPI(api: SpotifyAPI) : FollowingAPI(api) {
9898
get(
9999
EndpointBuilder("/me/following/contains").with("type", "artist")
100100
.with("ids", artists.joinToString(",") { ArtistURI(it).id.encode() }).toString()
101-
).toObject<List<Boolean>>(api, ArrayListSerializer(BooleanSerializer)).toList()
101+
).toObject(api, ArrayListSerializer(BooleanSerializer)).toList()
102102
})
103103
}
104104

@@ -118,8 +118,7 @@ class ClientFollowingAPI(api: SpotifyAPI) : FollowingAPI(api) {
118118
"after",
119119
after
120120
).toString()
121-
)
122-
.toCursorBasedPagingObject("artists", this, Artist::class.java)
121+
).toCursorBasedPagingObject("artists", this, Artist.serializer())
123122
})
124123
}
125124

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientLibraryAPI.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import com.adamratzman.spotify.utils.TrackURI
1515
import com.adamratzman.spotify.utils.encode
1616
import com.adamratzman.spotify.utils.toObject
1717
import com.adamratzman.spotify.utils.toPagingObject
18+
import kotlinx.serialization.internal.ArrayListSerializer
19+
import kotlinx.serialization.internal.BooleanSerializer
1820
import java.util.function.Supplier
1921

2022
/**
@@ -35,7 +37,7 @@ class ClientLibraryAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
3537
get(
3638
EndpointBuilder("/me/tracks").with("limit", limit).with("offset", offset).with("market", market?.code)
3739
.toString()
38-
).toPagingObject(endpoint = this, tClazz = SavedTrack::class.java)
40+
).toPagingObject(endpoint = this, serializer = SavedTrack.serializer())
3941
})
4042
}
4143

@@ -53,7 +55,7 @@ class ClientLibraryAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5355
get(
5456
EndpointBuilder("/me/albums").with("limit", limit).with("offset", offset).with("market", market?.code)
5557
.toString()
56-
).toPagingObject(endpoint = this, tClazz = SavedAlbum::class.java)
58+
).toPagingObject(endpoint = this, serializer = SavedAlbum.serializer())
5759
})
5860
}
5961

@@ -78,7 +80,7 @@ class ClientLibraryAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
7880
get(
7981
EndpointBuilder("/me/$type/contains").with("ids", ids.joinToString(",") { type.id(it).encode() })
8082
.toString()
81-
).toObject(api, mutableListOf<Boolean>().javaClass).toList()
83+
).toObject(api, ArrayListSerializer(BooleanSerializer)).toList()
8284
})
8385
}
8486

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientPersonalizationAPI.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class ClientPersonalizationAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
3636
fun getTopArtists(limit: Int? = null, offset: Int? = null, timeRange: TimeRange? = null): SpotifyRestPagingAction<Artist, PagingObject<Artist>> {
3737
return toPagingObjectAction(Supplier {
3838
get(EndpointBuilder("/me/top/artists").with("limit", limit).with("offset", offset)
39-
.with("time_range", timeRange).toString()).toPagingObject(endpoint = this, tClazz = Artist::class.java)
39+
.with("time_range", timeRange).toString())
40+
.toPagingObject(endpoint = this, serializer = Artist.serializer())
4041
})
4142
}
4243

@@ -55,7 +56,8 @@ class ClientPersonalizationAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5556
fun getTopTracks(limit: Int? = null, offset: Int? = null, timeRange: TimeRange? = null): SpotifyRestPagingAction<Track, PagingObject<Track>> {
5657
return toPagingObjectAction(Supplier {
5758
get(EndpointBuilder("/me/top/tracks").with("limit", limit).with("offset", offset)
58-
.with("time_range", timeRange).toString()).toPagingObject(endpoint = this, tClazz = Track::class.java)
59+
.with("time_range", timeRange).toString())
60+
.toPagingObject(endpoint = this, serializer = Track.serializer())
5961
})
6062
}
6163
}

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientPlayerAPI.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.adamratzman.spotify.utils.encode
2020
import com.adamratzman.spotify.utils.toCursorBasedPagingObject
2121
import com.adamratzman.spotify.utils.toInnerObject
2222
import com.adamratzman.spotify.utils.toObject
23+
import kotlinx.serialization.list
2324
import org.json.JSONObject
2425
import java.util.function.Supplier
2526

@@ -33,15 +34,16 @@ class ClientPlayerAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
3334
get(EndpointBuilder("/me/player/devices").toString()).toInnerObject(
3435
"devices",
3536
api,
36-
mutableListOf<Device>().javaClass
37+
Device.serializer().list
3738
).toList()
3839
})
3940
}
4041

4142
fun getCurrentContext(): SpotifyRestAction<CurrentlyPlayingContext?> {
4243
return toAction(Supplier {
4344
val obj: CurrentlyPlayingContext? =
44-
get(EndpointBuilder("/me/player").toString()).toObject(api, CurrentlyPlayingContext::class.java)
45+
get(EndpointBuilder("/me/player").toString())
46+
.toObject(api, CurrentlyPlayingContext.serializer())
4547
if (obj?.timestamp == null) null else obj
4648
})
4749
}
@@ -50,7 +52,7 @@ class ClientPlayerAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5052
return toPagingObjectAction(Supplier {
5153
get(EndpointBuilder("/me/player/recently-played").toString()).toCursorBasedPagingObject(
5254
endpoint = this,
53-
tClazz = PlayHistory::class.java
55+
serializer = PlayHistory.serializer()
5456
)
5557
})
5658
}
@@ -59,7 +61,7 @@ class ClientPlayerAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5961
return toAction(Supplier {
6062
val obj: CurrentlyPlayingObject? = get(EndpointBuilder("/me/player/currently-playing").toString()).toObject(
6163
api,
62-
CurrentlyPlayingObject::class.java
64+
CurrentlyPlayingObject.serializer()
6365
)
6466
if (obj?.timestamp == null) null else obj
6567
})

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientPlaylistAPI.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import com.adamratzman.spotify.utils.UserURI
1818
import com.adamratzman.spotify.utils.encode
1919
import com.adamratzman.spotify.utils.toObject
2020
import com.adamratzman.spotify.utils.toPagingObject
21+
import kotlinx.serialization.Serializable
2122
import org.json.JSONArray
2223
import org.json.JSONObject
2324
import java.awt.image.BufferedImage
@@ -62,10 +63,8 @@ class ClientPlaylistAPI(api: SpotifyAPI) : PlaylistsAPI(api) {
6263
if (description != null) json.put("description", description)
6364
if (public != null) json.put("public", public)
6465
if (collaborative != null) json.put("collaborative", collaborative)
65-
post(EndpointBuilder("/users/${UserURI(user).id.encode()}/playlists").toString(), json.toString()).toObject(
66-
api,
67-
Playlist::class.java
68-
)
66+
post(EndpointBuilder("/users/${UserURI(user).id.encode()}/playlists").toString(),
67+
json.toString()).toObject(api, Playlist.serializer())
6968
})
7069
}
7170

@@ -135,7 +134,7 @@ class ClientPlaylistAPI(api: SpotifyAPI) : PlaylistsAPI(api) {
135134
if (offset != null && offset !in 0..100000) throw IllegalArgumentException("Offset must be between 0 and 100,000. Provided $limit")
136135
return toPagingObjectAction(Supplier {
137136
get(EndpointBuilder("/me/playlists").with("limit", limit).with("offset", offset).toString())
138-
.toPagingObject(endpoint = this, tClazz = SimplePlaylist::class.java)
137+
.toPagingObject(endpoint = this, serializer = SimplePlaylist.serializer())
139138
})
140139
}
141140

@@ -196,7 +195,7 @@ class ClientPlaylistAPI(api: SpotifyAPI) : PlaylistsAPI(api) {
196195
if (reorderRangeLength != null) json.put("range_length", reorderRangeLength)
197196
if (snapshotId != null) json.put("snapshot_id", snapshotId)
198197
put(EndpointBuilder("/playlists/${PlaylistURI(playlist).id.encode()}/tracks").toString(), json.toString())
199-
.toObject(api, Snapshot::class.java)
198+
.toObject(api, Snapshot.serializer())
200199
})
201200
}
202201

@@ -331,6 +330,7 @@ class ClientPlaylistAPI(api: SpotifyAPI) : PlaylistsAPI(api) {
331330
return DatatypeConverter.printBase64Binary(bos.toByteArray())
332331
}
333332

333+
@Serializable
334334
data class Snapshot(val snapshot_id: String)
335335
}
336336

src/main/kotlin/com/adamratzman/spotify/endpoints/client/ClientUserAPI.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class ClientUserAPI(api: SpotifyAPI) : UserAPI(api) {
2424
*/
2525
fun getUserProfile(): SpotifyRestAction<SpotifyUserInformation> {
2626
return toAction(Supplier {
27-
get(EndpointBuilder("/me").toString()).toObject(api, SpotifyUserInformation::class.java)
27+
get(EndpointBuilder("/me").toString()).toObject(api, SpotifyUserInformation.serializer())
2828
})
2929
}
3030
}

src/main/kotlin/com/adamratzman/spotify/endpoints/public/AlbumAPI.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ class AlbumAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
3232
fun getAlbum(album: String, market: Market? = null): SpotifyRestAction<Album?> {
3333
return toAction(Supplier {
3434
catch {
35-
get(EndpointBuilder("/albums/${AlbumURI(album).id}").with("market", market?.code).toString()).toObject(
36-
api,
37-
Album::class.java
38-
)
35+
get(EndpointBuilder("/albums/${AlbumURI(album).id}").with("market", market?.code).toString())
36+
.toObject(api, Album.serializer())
3937
}
4038
})
4139
}
@@ -50,7 +48,7 @@ class AlbumAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5048
get(
5149
EndpointBuilder("/albums").with("ids", albums.joinToString(",") { AlbumURI(it).id.encode() })
5250
.with("market", market?.code).toString()
53-
).toObject(api, AlbumsResponse::class.java).albums
51+
).toObject(api, AlbumsResponse.serializer()).albums
5452
})
5553
}
5654

@@ -76,7 +74,7 @@ class AlbumAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
7674
offset
7775
).with("market", market?.code)
7876
.toString()
79-
).toLinkedResult(api, SimpleTrack::class.java)
77+
).toLinkedResult(api, SimpleTrack.serializer())
8078
})
8179
}
8280
}

src/main/kotlin/com/adamratzman/spotify/endpoints/public/ArtistsAPI.kt

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ class ArtistsAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
3333
*/
3434
fun getArtist(artist: String): SpotifyRestAction<Artist?> {
3535
return toAction(Supplier {
36-
catch { get(EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}").toString()).toObject(api, Artist::class.java) }
36+
catch {
37+
get(EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}").toString()).toObject<Artist>(
38+
api,
39+
Artist.serializer()
40+
)
41+
}
3742
})
3843
}
3944

@@ -43,8 +48,11 @@ class ArtistsAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
4348
*/
4449
fun getArtists(vararg artists: String): SpotifyRestAction<List<Artist?>> {
4550
return toAction(Supplier {
46-
get(EndpointBuilder("/artists").with("ids", artists.joinToString(",") { ArtistURI(it).id.encode() }).toString())
47-
.toObject(api, ArtistList::class.java).artists
51+
get(
52+
EndpointBuilder("/artists").with(
53+
"ids",
54+
artists.joinToString(",") { ArtistURI(it).id.encode() }).toString()
55+
).toObject(api, ArtistList.serializer()).artists
4856
})
4957
}
5058

@@ -58,10 +66,21 @@ class ArtistsAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5866
*
5967
* @throws BadRequestException if [artist] is not found, or filter parameters are illegal
6068
*/
61-
fun getArtistAlbums(artist: String, limit: Int? = null, offset: Int? = null, market: Market? = null, include: List<AlbumInclusionStrategy> = listOf()): SpotifyRestAction<LinkedResult<SimpleAlbum>> {
69+
fun getArtistAlbums(
70+
artist: String,
71+
limit: Int? = null,
72+
offset: Int? = null,
73+
market: Market? = null,
74+
include: List<AlbumInclusionStrategy> = listOf()
75+
): SpotifyRestAction<LinkedResult<SimpleAlbum>> {
6276
return toAction(Supplier {
63-
get(EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}/albums").with("limit", limit).with("offset", offset).with("market", market?.code)
64-
.with("include_groups", include.joinToString(",") { it.keyword }).toString()).toLinkedResult(api, SimpleAlbum::class.java)
77+
get(
78+
EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}/albums").with("limit", limit).with(
79+
"offset",
80+
offset
81+
).with("market", market?.code)
82+
.with("include_groups", include.joinToString(",") { it.keyword }).toString()
83+
).toLinkedResult(api, SimpleAlbum.serializer())
6584
})
6685
}
6786

@@ -80,8 +99,12 @@ class ArtistsAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
8099
*/
81100
fun getArtistTopTracks(artist: String, market: Market = Market.US): SpotifyRestAction<List<Track>> {
82101
return toAction(Supplier {
83-
get(EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}/top-tracks").with("country", market.code).toString())
84-
.toObject(api, TrackList::class.java).tracks.map { it!! }
102+
get(
103+
EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}/top-tracks").with(
104+
"country",
105+
market.code
106+
).toString()
107+
).toObject(api, TrackList.serializer()).tracks.map { it!! }
85108
})
86109
}
87110

@@ -96,7 +119,8 @@ class ArtistsAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
96119
*/
97120
fun getRelatedArtists(artist: String): SpotifyRestAction<List<Artist>> {
98121
return toAction(Supplier {
99-
get(EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}/related-artists").toString()).toObject(api, ArtistList::class.java).artists.map { it!! }
122+
get(EndpointBuilder("/artists/${ArtistURI(artist).id.encode()}/related-artists").toString())
123+
.toObject(api, ArtistList.serializer()).artists.map { it!! }
100124
})
101125
}
102126
}

src/main/kotlin/com/adamratzman/spotify/endpoints/public/BrowseAPI.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
5858
fun getNewReleases(limit: Int? = null, offset: Int? = null, market: Market? = null): SpotifyRestPagingAction<Album, PagingObject<Album>> {
5959
return toPagingObjectAction(Supplier {
6060
get(EndpointBuilder("/browse/new-releases").with("limit", limit).with("offset", offset).with("country", market?.code).toString())
61-
.toPagingObject("albums", endpoint = this, tClazz = Album::class.java)
61+
.toPagingObject("albums", endpoint = this, serializer = Album.serializer())
6262
})
6363
}
6464

@@ -84,7 +84,7 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
8484
get(EndpointBuilder("/browse/featured-playlists").with("limit", limit).with("offset", offset).with("market", market?.code)
8585
.with("locale", locale).with("timestamp", timestamp?.let {
8686
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(Date.from(Instant.ofEpochMilli(timestamp)))
87-
}).toString()).toObject(api, FeaturedPlaylists::class.java)
87+
}).toString()).toObject(api, FeaturedPlaylists.serializer())
8888
})
8989
}
9090

@@ -106,7 +106,8 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
106106
fun getCategoryList(limit: Int? = null, offset: Int? = null, locale: String? = null, market: Market? = null): SpotifyRestPagingAction<SpotifyCategory, PagingObject<SpotifyCategory>> {
107107
return toPagingObjectAction(Supplier {
108108
get(EndpointBuilder("/browse/categories").with("limit", limit).with("offset", offset).with("market", market?.code)
109-
.with("locale", locale).toString()).toPagingObject("categories", endpoint = this, tClazz = SpotifyCategory::class.java)
109+
.with("locale", locale).toString())
110+
.toPagingObject("categories", endpoint = this, serializer = SpotifyCategory.serializer())
110111
})
111112
}
112113

@@ -126,7 +127,7 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
126127
fun getCategory(categoryId: String, market: Market? = null, locale: String? = null): SpotifyRestAction<SpotifyCategory> {
127128
return toAction(Supplier {
128129
get(EndpointBuilder("/browse/categories/${categoryId.encode()}").with("market", market?.code)
129-
.with("locale", locale).toString()).toObject(api, SpotifyCategory::class.java)
130+
.with("locale", locale).toString()).toObject(api, SpotifyCategory.serializer())
130131
})
131132
}
132133

@@ -143,7 +144,8 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
143144
fun getPlaylistsForCategory(categoryId: String, limit: Int? = null, offset: Int? = null, market: Market? = null): SpotifyRestPagingAction<SimplePlaylist, PagingObject<SimplePlaylist>> {
144145
return toPagingObjectAction(Supplier {
145146
get(EndpointBuilder("/browse/categories/${categoryId.encode()}/playlists").with("limit", limit).with("offset", offset)
146-
.with("market", market?.code).toString()).toPagingObject("playlists", endpoint = this, tClazz = SimplePlaylist::class.java)
147+
.with("market", market?.code).toString())
148+
.toPagingObject("playlists", endpoint = this, serializer = SimplePlaylist.serializer())
147149
})
148150
}
149151

@@ -198,7 +200,7 @@ class BrowseAPI(api: SpotifyAPI) : SpotifyEndpoint(api) {
198200
targetAttributes.forEach { attribute, value -> builder.with("target_$attribute", value) }
199201
minAttributes.forEach { attribute, value -> builder.with("min_$attribute", value) }
200202
maxAttributes.forEach { attribute, value -> builder.with("max_$attribute", value) }
201-
get(builder.toString()).toObject(api, RecommendationResponse::class.java)
203+
get(builder.toString()).toObject(api, RecommendationResponse.serializer())
202204
})
203205
}
204206
}

0 commit comments

Comments
 (0)