Skip to content

Commit 95c5ef0

Browse files
committed
Merge pull request #91 from kaaes/jperez/add-get-followed-artists
Add support for Get User's Followed Artists endpoint
2 parents 2ed106e + 9105caf commit 95c5ef0

File tree

6 files changed

+813
-26
lines changed

6 files changed

+813
-26
lines changed

spotify-api/src/main/java/kaaes/spotify/webapi/android/SpotifyService.java

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,7 @@
33
import java.util.Map;
44

55
import kaaes.spotify.webapi.android.annotations.DELETEWITHBODY;
6-
import kaaes.spotify.webapi.android.models.Album;
7-
import kaaes.spotify.webapi.android.models.Albums;
8-
import kaaes.spotify.webapi.android.models.AlbumsPager;
9-
import kaaes.spotify.webapi.android.models.Artist;
10-
import kaaes.spotify.webapi.android.models.Artists;
11-
import kaaes.spotify.webapi.android.models.ArtistsPager;
12-
import kaaes.spotify.webapi.android.models.CategoriesPager;
13-
import kaaes.spotify.webapi.android.models.Category;
14-
import kaaes.spotify.webapi.android.models.FeaturedPlaylists;
15-
import kaaes.spotify.webapi.android.models.NewReleases;
16-
import kaaes.spotify.webapi.android.models.Pager;
17-
import kaaes.spotify.webapi.android.models.Playlist;
18-
import kaaes.spotify.webapi.android.models.PlaylistFollowPrivacy;
19-
import kaaes.spotify.webapi.android.models.PlaylistSimple;
20-
import kaaes.spotify.webapi.android.models.PlaylistTrack;
21-
import kaaes.spotify.webapi.android.models.PlaylistsPager;
22-
import kaaes.spotify.webapi.android.models.Result;
23-
import kaaes.spotify.webapi.android.models.SavedTrack;
24-
import kaaes.spotify.webapi.android.models.SnapshotId;
25-
import kaaes.spotify.webapi.android.models.Track;
26-
import kaaes.spotify.webapi.android.models.Tracks;
27-
import kaaes.spotify.webapi.android.models.TracksPager;
28-
import kaaes.spotify.webapi.android.models.TracksToRemove;
29-
import kaaes.spotify.webapi.android.models.TracksToRemoveWithPosition;
30-
import kaaes.spotify.webapi.android.models.UserPrivate;
31-
import kaaes.spotify.webapi.android.models.UserPublic;
6+
import kaaes.spotify.webapi.android.models.*;
327
import retrofit.Callback;
338
import retrofit.http.Body;
349
import retrofit.http.DELETE;
@@ -1284,6 +1259,45 @@ public interface SpotifyService {
12841259
@GET("/users/{user_id}/playlists/{playlist_id}/followers/contains")
12851260
void areFollowingPlaylist(@Path("user_id") String userId, @Path("playlist_id") String playlistId, @Query("ids") String ids, Callback<boolean[]> callback);
12861261

1262+
/**
1263+
* Get the current user's followed artists.
1264+
*
1265+
* @see <a href="https://developer.spotify.com/web-api/get-followed-artists/">Get User's Followed Artists</a>
1266+
*/
1267+
@GET("/me/following?type=artist")
1268+
public ArtistsCursorPager getFollowedArtists();
1269+
1270+
/**
1271+
* Get the current user's followed artists.
1272+
*
1273+
* @param callback Callback method.
1274+
* @return An empty result
1275+
* @see <a href="https://developer.spotify.com/web-api/get-followed-artists/">Get User's Followed Artists</a>
1276+
*/
1277+
@GET("/me/following?type=artist")
1278+
public Result getFollowedArtists(Callback<ArtistsCursorPager> callback);
1279+
1280+
/**
1281+
* Get the current user's followed artists.
1282+
*
1283+
* @param options Optional parameters. For list of supported parameters see
1284+
* <a href="https://developer.spotify.com/web-api/get-followed-artists/">endpoint documentation</a>
1285+
* @see <a href="https://developer.spotify.com/web-api/get-followed-artists/">Get User's Followed Artists</a>
1286+
*/
1287+
@GET("/me/following?type=artist")
1288+
public ArtistsCursorPager getFollowedArtists(@QueryMap Map<String, Object> options);
1289+
1290+
/**
1291+
* Get the current user's followed artists.
1292+
*
1293+
* @param options Optional parameters. For list of supported parameters see
1294+
* <a href="https://developer.spotify.com/web-api/get-followed-artists/">endpoint documentation</a>
1295+
* @param callback Callback method.
1296+
* @return An empty result
1297+
* @see <a href="https://developer.spotify.com/web-api/get-followed-artists/">Get User's Followed Artists</a>
1298+
*/
1299+
@GET("/me/following?type=artist")
1300+
public Result getFollowedArtists(@QueryMap Map<String, Object> options, Callback<ArtistsCursorPager> callback);
12871301

12881302
/**********
12891303
* Search *
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package kaaes.spotify.webapi.android.models;
2+
3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
6+
public class ArtistsCursorPager implements Parcelable {
7+
public CursorPager<Artist> artists;
8+
9+
10+
@Override
11+
public int describeContents() {
12+
return 0;
13+
}
14+
15+
@Override
16+
public void writeToParcel(Parcel dest, int flags) {
17+
dest.writeParcelable(this.artists, 0);
18+
}
19+
20+
public ArtistsCursorPager() {
21+
}
22+
23+
protected ArtistsCursorPager(Parcel in) {
24+
this.artists = in.readParcelable(Pager.class.getClassLoader());
25+
}
26+
27+
public static final Creator<ArtistsCursorPager> CREATOR = new Creator<ArtistsCursorPager>() {
28+
public ArtistsCursorPager createFromParcel(Parcel source) {
29+
return new ArtistsCursorPager(source);
30+
}
31+
32+
public ArtistsCursorPager[] newArray(int size) {
33+
return new ArtistsCursorPager[size];
34+
}
35+
};
36+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package kaaes.spotify.webapi.android.models;
2+
3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
6+
/**
7+
* <a href="https://developer.spotify.com/web-api/object-model/#cursor-object">Cursor</a>
8+
*/
9+
public class Cursor implements Parcelable {
10+
public String after;
11+
12+
@Override
13+
public int describeContents() {
14+
return 0;
15+
}
16+
17+
@Override
18+
public void writeToParcel(Parcel dest, int flags) {
19+
dest.writeString(this.after);
20+
}
21+
22+
public Cursor() {
23+
}
24+
25+
protected Cursor(Parcel in) {
26+
this.after = in.readString();
27+
}
28+
29+
public static final Creator<Cursor> CREATOR = new Creator<Cursor>() {
30+
public Cursor createFromParcel(Parcel source) {
31+
return new Cursor(source);
32+
}
33+
34+
public Cursor[] newArray(int size) {
35+
return new Cursor[size];
36+
}
37+
};
38+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package kaaes.spotify.webapi.android.models;
2+
3+
import android.os.Parcel;
4+
import android.os.Parcelable;
5+
6+
import java.util.ArrayList;
7+
import java.util.List;
8+
9+
/**
10+
* <a href="https://developer.spotify.com/web-api/object-model/#cursor-based-paging-object">Cursor-based paging object model</a>
11+
*
12+
* @param <T> expected object that is paged
13+
*/
14+
public class CursorPager<T> implements Parcelable {
15+
public String href;
16+
public List<T> items;
17+
public int limit;
18+
public String next;
19+
public Cursor cursors;
20+
public int total;
21+
22+
@Override
23+
public int describeContents() {
24+
return 0;
25+
}
26+
27+
@Override
28+
public void writeToParcel(Parcel dest, int flags) {
29+
dest.writeString(href);
30+
dest.writeList(items);
31+
dest.writeInt(limit);
32+
dest.writeString(next);
33+
dest.writeParcelable(this.cursors, flags);
34+
dest.writeInt(total);
35+
}
36+
37+
public CursorPager() {
38+
}
39+
40+
protected CursorPager(Parcel in) {
41+
this.href = in.readString();
42+
this.items = in.readArrayList(ArrayList.class.getClassLoader());
43+
this.limit = in.readInt();
44+
this.next = in.readString();
45+
this.cursors = in.readParcelable(Cursor.class.getClassLoader());
46+
this.total = in.readInt();
47+
}
48+
49+
public static final Creator<CursorPager> CREATOR = new Creator<CursorPager>() {
50+
public CursorPager createFromParcel(Parcel source) {
51+
return new CursorPager(source);
52+
}
53+
54+
public CursorPager[] newArray(int size) {
55+
return new CursorPager[size];
56+
}
57+
};
58+
59+
}

spotify-api/src/test/java/kaaes/spotify/webapi/android/SpotifyServiceTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@
2929
import kaaes.spotify.webapi.android.models.AlbumsPager;
3030
import kaaes.spotify.webapi.android.models.Artist;
3131
import kaaes.spotify.webapi.android.models.Artists;
32+
import kaaes.spotify.webapi.android.models.ArtistsCursorPager;
3233
import kaaes.spotify.webapi.android.models.ArtistsPager;
3334
import kaaes.spotify.webapi.android.models.CategoriesPager;
3435
import kaaes.spotify.webapi.android.models.Category;
36+
import kaaes.spotify.webapi.android.models.CursorPager;
3537
import kaaes.spotify.webapi.android.models.ErrorResponse;
3638
import kaaes.spotify.webapi.android.models.FeaturedPlaylists;
3739
import kaaes.spotify.webapi.android.models.NewReleases;
@@ -391,6 +393,24 @@ public boolean matches(Object argument) {
391393
this.compareJSONWithoutNulls(body, result);
392394
}
393395

396+
@Test
397+
public void shouldCheckFollowedArtists() throws IOException {
398+
399+
String body = TestUtils.readTestData("followed-artists.json");
400+
ArtistsCursorPager fixture = mGson.fromJson(body, ArtistsCursorPager.class);
401+
402+
Response response = TestUtils.getResponseFromModel(fixture, ArtistsCursorPager.class);
403+
when(mMockClient.execute(argThat(new ArgumentMatcher<Request>() {
404+
@Override
405+
public boolean matches(Object argument) {
406+
return ((Request) argument).getUrl().contains("type=artist");
407+
}
408+
}))).thenReturn(response);
409+
410+
ArtistsCursorPager result = mSpotifyService.getFollowedArtists();
411+
compareJSONWithoutNulls(body, result);
412+
}
413+
394414
@Test
395415
public void shouldGetSearchedTracks() throws IOException {
396416
String body = TestUtils.readTestData("search-track.json");

0 commit comments

Comments
 (0)