Skip to content

Commit 813bba8

Browse files
committed
And some more playlists endpoints!
1 parent 5d071de commit 813bba8

10 files changed

Lines changed: 164 additions & 9 deletions

‎SpotifyAPI.Web/Clients/Interfaces/IPlaylistsClient.cs‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@ public interface IPlaylistsClient
1515
Task<FullPlaylist> Create(string userId, PlaylistCreateRequest request);
1616

1717
Task<bool> UploadCover(string playlistId, string base64JpgData);
18-
1918
Task<List<Image>> GetCovers(string playlistId);
19+
20+
Task<Paging<SimplePlaylist>> GetUsers(string userId);
21+
Task<Paging<SimplePlaylist>> GetUsers(string userId, PlaylistGetUsersRequest request);
22+
23+
Task<FullPlaylist> Get(string playlistId);
24+
Task<FullPlaylist> Get(string playlistId, PlaylistGetRequest request);
25+
26+
Task<bool> ReplaceItems(string playlistId, PlaylistReplaceItemsRequest request);
27+
28+
Task<Paging<SimplePlaylist>> CurrentUsers();
29+
Task<Paging<SimplePlaylist>> CurrentUsers(PlaylistCurrentUsersRequest request);
2030
}
2131
}

‎SpotifyAPI.Web/Clients/PlaylistsClient.cs‎

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ public Task<SnapshotResponse> AddItems(string playlistId, PlaylistAddItemsReques
2929
public Task<Paging<PlaylistTrack<IPlaylistItem>>> GetItems(string playlistId)
3030
{
3131
Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId));
32+
var request = new PlaylistGetItemsRequest();
3233

33-
return API.Get<Paging<PlaylistTrack<IPlaylistItem>>>(URLs.PlaylistTracks(playlistId));
34+
return API.Get<Paging<PlaylistTrack<IPlaylistItem>>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams());
3435
}
3536

3637
public Task<Paging<PlaylistTrack<IPlaylistItem>>> GetItems(string playlistId, PlaylistGetItemsRequest request)
@@ -54,8 +55,8 @@ public async Task<bool> UploadCover(string playlistId, string base64Jpg)
5455
Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId));
5556
Ensure.ArgumentNotNullOrEmptyString(base64Jpg, nameof(base64Jpg));
5657

57-
var response = await API.PutRaw(URLs.PlaylistImages(playlistId), null, base64Jpg);
58-
return response == HttpStatusCode.Accepted;
58+
var statusCode = await API.PutRaw(URLs.PlaylistImages(playlistId), null, base64Jpg);
59+
return statusCode == HttpStatusCode.Accepted;
5960
}
6061

6162
public Task<List<Image>> GetCovers(string playlistId)
@@ -64,5 +65,57 @@ public Task<List<Image>> GetCovers(string playlistId)
6465

6566
return API.Get<List<Image>>(URLs.PlaylistImages(playlistId));
6667
}
68+
69+
public Task<Paging<SimplePlaylist>> GetUsers(string userId)
70+
{
71+
Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId));
72+
73+
return API.Get<Paging<SimplePlaylist>>(URLs.UserPlaylists(userId));
74+
}
75+
76+
public Task<Paging<SimplePlaylist>> GetUsers(string userId, PlaylistGetUsersRequest request)
77+
{
78+
Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId));
79+
Ensure.ArgumentNotNull(request, nameof(request));
80+
81+
return API.Get<Paging<SimplePlaylist>>(URLs.UserPlaylists(userId), request.BuildQueryParams());
82+
}
83+
84+
public Task<FullPlaylist> Get(string playlistId)
85+
{
86+
Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId));
87+
var request = new PlaylistGetRequest(); // We need some defaults
88+
89+
return API.Get<FullPlaylist>(URLs.Playlist(playlistId), request.BuildQueryParams());
90+
}
91+
92+
public Task<FullPlaylist> Get(string playlistId, PlaylistGetRequest request)
93+
{
94+
Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId));
95+
Ensure.ArgumentNotNull(request, nameof(request));
96+
97+
return API.Get<FullPlaylist>(URLs.Playlist(playlistId), request.BuildQueryParams());
98+
}
99+
100+
public async Task<bool> ReplaceItems(string playlistId, PlaylistReplaceItemsRequest request)
101+
{
102+
Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId));
103+
Ensure.ArgumentNotNull(request, nameof(request));
104+
105+
var statusCode = await API.Put(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams());
106+
return statusCode == HttpStatusCode.Created;
107+
}
108+
109+
public Task<Paging<SimplePlaylist>> CurrentUsers()
110+
{
111+
return API.Get<Paging<SimplePlaylist>>(URLs.CurrentUserPlaylists());
112+
}
113+
114+
public Task<Paging<SimplePlaylist>> CurrentUsers(PlaylistCurrentUsersRequest request)
115+
{
116+
Ensure.ArgumentNotNull(request, nameof(request));
117+
118+
return API.Get<Paging<SimplePlaylist>>(URLs.CurrentUserPlaylists(), request.BuildQueryParams());
119+
}
67120
}
68121
}

‎SpotifyAPI.Web/Http/APIConnector.cs‎

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ public Task<T> Put<T>(Uri uri, IDictionary<string, string> parameters, object bo
108108
return SendAPIRequest<T>(uri, HttpMethod.Put, parameters, body);
109109
}
110110

111+
public async Task<HttpStatusCode> Put(Uri uri, IDictionary<string, string> parameters, object body)
112+
{
113+
Ensure.ArgumentNotNull(uri, nameof(uri));
114+
115+
var response = await SendAPIRequestDetailed(uri, HttpMethod.Put, parameters, body);
116+
return response.StatusCode;
117+
}
118+
111119
public async Task<HttpStatusCode> PutRaw(Uri uri, IDictionary<string, string> parameters, object body)
112120
{
113121
Ensure.ArgumentNotNull(uri, nameof(uri));
@@ -141,14 +149,14 @@ object body
141149
};
142150
}
143151

144-
private async Task<IAPIResponse<T>> SendSerializedRequest<T>(IRequest request)
152+
private async Task<IAPIResponse<T>> DoSerializedRequest<T>(IRequest request)
145153
{
146154
_jsonSerializer.SerializeRequest(request);
147-
var response = await SendRequest(request);
155+
var response = await DoRequest(request);
148156
return _jsonSerializer.DeserializeResponse<T>(response);
149157
}
150158

151-
private async Task<IResponse> SendRequest(IRequest request)
159+
private async Task<IResponse> DoRequest(IRequest request)
152160
{
153161
await _authenticator.Apply(request).ConfigureAwait(false);
154162
IResponse response = await _httpClient.DoRequest(request).ConfigureAwait(false);
@@ -172,7 +180,7 @@ public Task<IResponse> SendRawRequest(
172180
)
173181
{
174182
var request = CreateRequest(uri, method, parameters, body);
175-
return SendRequest(request);
183+
return DoRequest(request);
176184
}
177185

178186
public async Task<T> SendAPIRequest<T>(
@@ -183,10 +191,22 @@ public async Task<T> SendAPIRequest<T>(
183191
)
184192
{
185193
var request = CreateRequest(uri, method, parameters, body);
186-
IAPIResponse<T> apiResponse = await SendSerializedRequest<T>(request);
194+
IAPIResponse<T> apiResponse = await DoSerializedRequest<T>(request);
187195
return apiResponse.Body;
188196
}
189197

198+
public async Task<IResponse> SendAPIRequestDetailed(
199+
Uri uri,
200+
HttpMethod method,
201+
IDictionary<string, string> parameters = null,
202+
object body = null
203+
)
204+
{
205+
var request = CreateRequest(uri, method, parameters, body);
206+
var response = await DoSerializedRequest<object>(request);
207+
return response.Response;
208+
}
209+
190210
private void ProcessErrors(IResponse response)
191211
{
192212
Ensure.ArgumentNotNull(response, nameof(response));

‎SpotifyAPI.Web/Http/Interfaces/IAPIConnector.cs‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public interface IAPIConnector
2424
Task<T> Put<T>(Uri uri);
2525
Task<T> Put<T>(Uri uri, IDictionary<string, string> parameters);
2626
Task<T> Put<T>(Uri uri, IDictionary<string, string> parameters, object body);
27+
Task<HttpStatusCode> Put(Uri uri, IDictionary<string, string> parameters, object body);
2728
Task<HttpStatusCode> PutRaw(Uri uri, IDictionary<string, string> parameters, object body);
2829

2930
Task<T> Delete<T>(Uri uri);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
namespace SpotifyAPI.Web
2+
{
3+
public class PlaylistCurrentUsersRequest : RequestParams
4+
{
5+
[QueryParam("limit")]
6+
public int? Limit { get; set; }
7+
8+
[QueryParam("offset")]
9+
public int? Offset { get; set; }
10+
}
11+
}

‎SpotifyAPI.Web/Models/Request/PlaylistGetItemsRequest.cs‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ namespace SpotifyAPI.Web
44
{
55
public class PlaylistGetItemsRequest : RequestParams
66
{
7+
public PlaylistGetItemsRequest()
8+
{
9+
AdditionalTypes = new List<string>() { "track", "episode" };
10+
}
11+
712
[QueryParam("fields")]
813
public List<string> Fields { get; set; }
914

@@ -16,6 +21,10 @@ public class PlaylistGetItemsRequest : RequestParams
1621
[QueryParam("market")]
1722
public string Market { get; set; }
1823

24+
/// <summary>
25+
/// This is set to `"track", "episode"` by default.
26+
/// </summary>
27+
/// <value></value>
1928
[QueryParam("additional_types")]
2029
public List<string> AdditionalTypes { get; set; }
2130
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Collections.Generic;
2+
3+
namespace SpotifyAPI.Web
4+
{
5+
public class PlaylistGetRequest : RequestParams
6+
{
7+
public PlaylistGetRequest()
8+
{
9+
AdditionalTypes = new List<string> { "track", "episode" };
10+
}
11+
12+
/// <summary>
13+
/// This is set to `"track", "episode"` by default.
14+
/// </summary>
15+
/// <value></value>
16+
[QueryParam("additional_types")]
17+
public List<string> AdditionalTypes { get; set; }
18+
}
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace SpotifyAPI.Web
2+
{
3+
public class PlaylistGetUsersRequest : RequestParams
4+
{
5+
[QueryParam("limit")]
6+
public int? Limit { get; set; }
7+
8+
[QueryParam("offset")]
9+
public int? Offset { get; set; }
10+
11+
12+
}
13+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using System.Collections.Generic;
2+
3+
namespace SpotifyAPI.Web
4+
{
5+
public class PlaylistReplaceItemsRequest : RequestParams
6+
{
7+
[BodyParam("uris")]
8+
public List<string> Uris { get; set; }
9+
10+
protected override void CustomEnsure()
11+
{
12+
Ensure.ArgumentNotNullOrEmptyList(Uris, nameof(Uris));
13+
}
14+
}
15+
}

‎SpotifyAPI.Web/SpotifyUrls.cs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public static class SpotifyUrls
3737

3838
public static Uri PlaylistImages(string playlistId) => EUri($"playlists/{playlistId}/images");
3939

40+
public static Uri Playlist(string playlistId) => EUri($"playlists/{playlistId}");
41+
42+
public static Uri CurrentUserPlaylists() => EUri($"me/playlists");
43+
4044
private static Uri EUri(FormattableString path) => new Uri(path.ToString(_provider), UriKind.Relative);
4145
}
4246
}

0 commit comments

Comments
 (0)