Skip to content

Commit 249a535

Browse files
committed
Added Player Client #451
1 parent 2f09ba2 commit 249a535

39 files changed

Lines changed: 602 additions & 15 deletions

‎.editorconfig‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ indent_size = 2
1616
# Does not seem to work...
1717
dotnet_diagnostic.CA1303.severity = none
1818
dotnet_diagnostic.CA1056.severity = none
19+
dotnet_diagnostic.CA1034.severity = none
20+
dotnet_diagnostic.CA1054.severity = none
1921
# Sort using and Import directives with System.* appearing first
2022
dotnet_sort_system_directives_first = true
2123
dotnet_style_require_accessibility_modifiers = always:warning
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System.Net;
2+
using System.Threading.Tasks;
3+
4+
namespace SpotifyAPI.Web
5+
{
6+
public interface IPlayerClient
7+
{
8+
Task<bool> SkipNext();
9+
Task<bool> SkipNext(PlayerSkipNextRequest request);
10+
11+
Task<bool> SetRepeat(PlayerSetRepeatRequest request);
12+
13+
Task<bool> TransferPlayback(PlayerTransferPlaybackRequest request);
14+
15+
Task<CurrentlyPlaying> GetCurrentlyPlaying(PlayerCurrentlyPlayingRequest request);
16+
17+
Task<CurrentlyPlayingContext> GetCurrentPlayback();
18+
Task<CurrentlyPlayingContext> GetCurrentPlayback(PlayerCurrentPlaybackRequest request);
19+
20+
Task<bool> SeekTo(PlayerSeekToRequest request);
21+
22+
Task<bool> SkipPrevious();
23+
Task<bool> SkipPrevious(PlayerSkipPreviousRequest request);
24+
25+
Task<bool> ResumePlayback();
26+
Task<bool> ResumePlayback(PlayerResumePlaybackRequest request);
27+
28+
Task<bool> PausePlayback();
29+
Task<bool> PausePlayback(PlayerPausePlaybackRequest request);
30+
31+
Task<bool> SetVolume(PlayerVolumeRequest request);
32+
33+
Task<CursorPaging<PlayHistoryItem>> GetRecentlyPlayed();
34+
Task<CursorPaging<PlayHistoryItem>> GetRecentlyPlayed(PlayerRecentlyPlayedRequest request);
35+
36+
Task<DeviceResponse> GetAvailableDevices();
37+
38+
Task<bool> SetShuffle(PlayerShuffleRequest request);
39+
40+
Task<bool> AddToQueue(PlayerAddToQueueRequest request);
41+
}
42+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ public interface IPlaylistsClient
99

1010
Task<SnapshotResponse> AddItems(string playlistId, PlaylistAddItemsRequest request);
1111

12-
Task<Paging<PlaylistTrack<IPlaylistItem>>> GetItems(string playlistId);
13-
Task<Paging<PlaylistTrack<IPlaylistItem>>> GetItems(string playlistId, PlaylistGetItemsRequest request);
12+
Task<Paging<PlaylistTrack<IPlayableItem>>> GetItems(string playlistId);
13+
Task<Paging<PlaylistTrack<IPlayableItem>>> GetItems(string playlistId, PlaylistGetItemsRequest request);
1414

1515
Task<FullPlaylist> Create(string userId, PlaylistCreateRequest request);
1616

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ public interface ISpotifyClient
2222

2323
ITracksClient Tracks { get; }
2424

25+
IPlayerClient Player { get; }
26+
2527
Task<List<T>> Paginate<T>(Paging<T> firstPage);
2628
Task<List<T>> Paginate<T, TNext>(Paging<T, TNext> firstPage, Func<TNext, Paging<T, TNext>> mapper);
2729
Task<List<T>> Paginate<T>(Func<Task<Paging<T>>> getFirstPage);
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
using System.Net;
2+
using System.Threading.Tasks;
3+
using SpotifyAPI.Web.Http;
4+
using URLs = SpotifyAPI.Web.SpotifyUrls;
5+
6+
namespace SpotifyAPI.Web
7+
{
8+
public class PlayerClient : APIClient, IPlayerClient
9+
{
10+
public PlayerClient(IAPIConnector apiConnector) : base(apiConnector) { }
11+
12+
public async Task<bool> AddToQueue(PlayerAddToQueueRequest request)
13+
{
14+
Ensure.ArgumentNotNull(request, nameof(request));
15+
16+
var statusCode = await API.Post(URLs.PlayerQueue(), request.BuildQueryParams(), null).ConfigureAwait(false);
17+
return statusCode == HttpStatusCode.NoContent;
18+
}
19+
20+
public Task<DeviceResponse> GetAvailableDevices()
21+
{
22+
return API.Get<DeviceResponse>(URLs.PlayerDevices());
23+
}
24+
25+
public Task<CurrentlyPlaying> GetCurrentlyPlaying(PlayerCurrentlyPlayingRequest request)
26+
{
27+
Ensure.ArgumentNotNull(request, nameof(request));
28+
29+
return API.Get<CurrentlyPlaying>(URLs.PlayerCurrentlyPlaying(), request.BuildQueryParams());
30+
}
31+
32+
public Task<CurrentlyPlayingContext> GetCurrentPlayback()
33+
{
34+
return API.Get<CurrentlyPlayingContext>(URLs.Player());
35+
}
36+
37+
public Task<CurrentlyPlayingContext> GetCurrentPlayback(PlayerCurrentPlaybackRequest request)
38+
{
39+
Ensure.ArgumentNotNull(request, nameof(request));
40+
41+
return API.Get<CurrentlyPlayingContext>(URLs.Player(), request.BuildQueryParams());
42+
}
43+
44+
public Task<CursorPaging<PlayHistoryItem>> GetRecentlyPlayed()
45+
{
46+
return API.Get<CursorPaging<PlayHistoryItem>>(URLs.PlayerRecentlyPlayed());
47+
}
48+
49+
public Task<CursorPaging<PlayHistoryItem>> GetRecentlyPlayed(PlayerRecentlyPlayedRequest request)
50+
{
51+
Ensure.ArgumentNotNull(request, nameof(request));
52+
53+
return API.Get<CursorPaging<PlayHistoryItem>>(URLs.PlayerRecentlyPlayed(), request.BuildQueryParams());
54+
}
55+
56+
public async Task<bool> PausePlayback()
57+
{
58+
var statusCode = await API.Put(URLs.PlayerPause(), null, null).ConfigureAwait(false);
59+
return statusCode == HttpStatusCode.NoContent;
60+
}
61+
62+
public async Task<bool> PausePlayback(PlayerPausePlaybackRequest request)
63+
{
64+
Ensure.ArgumentNotNull(request, nameof(request));
65+
66+
var statusCode = await API.Put(URLs.PlayerPause(), request.BuildQueryParams(), null).ConfigureAwait(false);
67+
return statusCode == HttpStatusCode.NoContent;
68+
}
69+
70+
public async Task<bool> ResumePlayback()
71+
{
72+
var statusCode = await API.Put(URLs.PlayerResume(), null, null).ConfigureAwait(false);
73+
return statusCode == HttpStatusCode.NoContent;
74+
}
75+
76+
public async Task<bool> ResumePlayback(PlayerResumePlaybackRequest request)
77+
{
78+
Ensure.ArgumentNotNull(request, nameof(request));
79+
80+
var statusCode = await API
81+
.Put(URLs.PlayerResume(), request.BuildQueryParams(), request.BuildBodyParams())
82+
.ConfigureAwait(false);
83+
return statusCode == HttpStatusCode.NoContent;
84+
}
85+
86+
public async Task<bool> SeekTo(PlayerSeekToRequest request)
87+
{
88+
Ensure.ArgumentNotNull(request, nameof(request));
89+
90+
var statusCode = await API.Put(URLs.PlayerSeek(), request.BuildQueryParams(), null).ConfigureAwait(false);
91+
return statusCode == HttpStatusCode.NoContent;
92+
}
93+
94+
public async Task<bool> SetRepeat(PlayerSetRepeatRequest request)
95+
{
96+
Ensure.ArgumentNotNull(request, nameof(request));
97+
98+
var statusCode = await API.Put(URLs.PlayerRepeat(), request.BuildQueryParams(), null).ConfigureAwait(false);
99+
return statusCode == HttpStatusCode.NoContent;
100+
}
101+
102+
public async Task<bool> SetShuffle(PlayerShuffleRequest request)
103+
{
104+
Ensure.ArgumentNotNull(request, nameof(request));
105+
106+
var statusCode = await API.Put(URLs.PlayerShuffle(), request.BuildQueryParams(), null).ConfigureAwait(false);
107+
return statusCode == HttpStatusCode.NoContent;
108+
}
109+
110+
public async Task<bool> SetVolume(PlayerVolumeRequest request)
111+
{
112+
Ensure.ArgumentNotNull(request, nameof(request));
113+
114+
var statusCode = await API.Put(URLs.PlayerVolume(), request.BuildQueryParams(), null).ConfigureAwait(false);
115+
return statusCode == HttpStatusCode.NoContent;
116+
}
117+
118+
public async Task<bool> SkipNext()
119+
{
120+
var statusCode = await API.Post(URLs.PlayerNext(), null, null).ConfigureAwait(false);
121+
return statusCode == HttpStatusCode.NoContent;
122+
}
123+
124+
public async Task<bool> SkipNext(PlayerSkipNextRequest request)
125+
{
126+
Ensure.ArgumentNotNull(request, nameof(request));
127+
128+
var statusCode = await API.Post(URLs.PlayerNext(), request.BuildQueryParams(), null).ConfigureAwait(false);
129+
return statusCode == HttpStatusCode.NoContent;
130+
}
131+
132+
public async Task<bool> SkipPrevious()
133+
{
134+
var statusCode = await API.Post(URLs.PlayerPrevious(), null, null).ConfigureAwait(false);
135+
return statusCode == HttpStatusCode.NoContent;
136+
}
137+
138+
public async Task<bool> SkipPrevious(PlayerSkipPreviousRequest request)
139+
{
140+
Ensure.ArgumentNotNull(request, nameof(request));
141+
142+
var statusCode = await API.Post(URLs.PlayerPrevious(), request.BuildQueryParams(), null).ConfigureAwait(false);
143+
return statusCode == HttpStatusCode.NoContent;
144+
}
145+
146+
public async Task<bool> TransferPlayback(PlayerTransferPlaybackRequest request)
147+
{
148+
Ensure.ArgumentNotNull(request, nameof(request));
149+
150+
var statusCode = await API.Put(URLs.Player(), null, request.BuildBodyParams()).ConfigureAwait(false);
151+
return statusCode == HttpStatusCode.NoContent;
152+
}
153+
}
154+
}

‎SpotifyAPI.Web/Clients/PlaylistsClient.cs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@ public Task<SnapshotResponse> AddItems(string playlistId, PlaylistAddItemsReques
2626
return API.Post<SnapshotResponse>(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams());
2727
}
2828

29-
public Task<Paging<PlaylistTrack<IPlaylistItem>>> GetItems(string playlistId)
29+
public Task<Paging<PlaylistTrack<IPlayableItem>>> GetItems(string playlistId)
3030
{
3131
Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId));
3232
var request = new PlaylistGetItemsRequest();
3333

34-
return API.Get<Paging<PlaylistTrack<IPlaylistItem>>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams());
34+
return API.Get<Paging<PlaylistTrack<IPlayableItem>>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams());
3535
}
3636

37-
public Task<Paging<PlaylistTrack<IPlaylistItem>>> GetItems(string playlistId, PlaylistGetItemsRequest request)
37+
public Task<Paging<PlaylistTrack<IPlayableItem>>> GetItems(string playlistId, PlaylistGetItemsRequest request)
3838
{
3939
Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId));
4040
Ensure.ArgumentNotNull(request, nameof(request));
4141

42-
return API.Get<Paging<PlaylistTrack<IPlaylistItem>>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams());
42+
return API.Get<Paging<PlaylistTrack<IPlayableItem>>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams());
4343
}
4444

4545
public Task<FullPlaylist> Create(string userId, PlaylistCreateRequest request)

‎SpotifyAPI.Web/Clients/SpotifyClient.cs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public SpotifyClient(SpotifyClientConfig config)
2626
Search = new SearchClient(_apiConnector);
2727
Follow = new FollowClient(_apiConnector);
2828
Tracks = new TracksClient(_apiConnector);
29+
Player = new PlayerClient(_apiConnector);
2930
}
3031

3132
public IPaginator DefaultPaginator { get; }
@@ -44,6 +45,8 @@ public SpotifyClient(SpotifyClientConfig config)
4445

4546
public ITracksClient Tracks { get; }
4647

48+
public IPlayerClient Player { get; }
49+
4750
public Task<List<T>> Paginate<T>(Paging<T> firstPage)
4851
{
4952
return DefaultPaginator.Paginate(firstPage, _apiConnector);

‎SpotifyAPI.Web/Http/APIConnector.cs‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ public Task<T> Get<T>(Uri uri, IDictionary<string, string> parameters)
7777
return SendAPIRequest<T>(uri, HttpMethod.Get, parameters);
7878
}
7979

80+
public async Task<HttpStatusCode> Get(Uri uri, IDictionary<string, string> parameters, object body)
81+
{
82+
Ensure.ArgumentNotNull(uri, nameof(uri));
83+
84+
var response = await SendAPIRequestDetailed(uri, HttpMethod.Get, parameters, body).ConfigureAwait(false);
85+
return response.StatusCode;
86+
}
87+
8088
public Task<T> Post<T>(Uri uri)
8189
{
8290
Ensure.ArgumentNotNull(uri, nameof(uri));

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public interface IAPIConnector
1818
Task<T> Get<T>(Uri uri);
1919
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")]
2020
Task<T> Get<T>(Uri uri, IDictionary<string, string> parameters);
21+
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")]
22+
Task<HttpStatusCode> Get(Uri uri, IDictionary<string, string> parameters, object body);
2123

2224
Task<T> Post<T>(Uri uri);
2325
Task<T> Post<T>(Uri uri, IDictionary<string, string> parameters);

‎SpotifyAPI.Web/Models/Converters/PlaylistElementConverter.cs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace SpotifyAPI.Web
66
{
7-
public class PlaylistElementConverter : JsonConverter
7+
public class PlayableItemConverter : JsonConverter
88
{
99
public override bool CanConvert(Type objectType) => true;
1010

0 commit comments

Comments
 (0)