using System.Net; using System.Threading; using System.Threading.Tasks; using SpotifyAPI.Web.Http; using URLs = SpotifyAPI.Web.SpotifyUrls; namespace SpotifyAPI.Web { public class PlayerClient : APIClient, IPlayerClient { public PlayerClient(IAPIConnector apiConnector) : base(apiConnector) { } public async Task AddToQueue(PlayerAddToQueueRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Post(URLs.PlayerQueue(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public Task GetQueue(CancellationToken cancel = default) { return API.Get(URLs.PlayerQueue(), cancel); } public Task GetAvailableDevices(CancellationToken cancel = default) { return API.Get(URLs.PlayerDevices(), cancel); } public Task GetCurrentlyPlaying(PlayerCurrentlyPlayingRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); return API.Get(URLs.PlayerCurrentlyPlaying(), request.BuildQueryParams(), cancel); } public Task GetCurrentPlayback(CancellationToken cancel = default) { return API.Get(URLs.Player(), cancel); } public Task GetCurrentPlayback(PlayerCurrentPlaybackRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); return API.Get(URLs.Player(), request.BuildQueryParams(), cancel); } public Task> GetRecentlyPlayed(CancellationToken cancel = default) { return API.Get>(URLs.PlayerRecentlyPlayed(), cancel); } public Task> GetRecentlyPlayed(PlayerRecentlyPlayedRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); return API.Get>(URLs.PlayerRecentlyPlayed(), request.BuildQueryParams(), cancel); } public async Task PausePlayback(CancellationToken cancel = default) { HttpStatusCode statusCode = await API.Put(URLs.PlayerPause(), null, null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task PausePlayback(PlayerPausePlaybackRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Put(URLs.PlayerPause(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task ResumePlayback(CancellationToken cancel = default) { HttpStatusCode statusCode = await API.Put(URLs.PlayerResume(), null, null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task ResumePlayback(PlayerResumePlaybackRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API .Put(URLs.PlayerResume(), request.BuildQueryParams(), request.BuildBodyParams(), cancel) .ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SeekTo(PlayerSeekToRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Put(URLs.PlayerSeek(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SetRepeat(PlayerSetRepeatRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Put(URLs.PlayerRepeat(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SetShuffle(PlayerShuffleRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Put(URLs.PlayerShuffle(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SetVolume(PlayerVolumeRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Put(URLs.PlayerVolume(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SkipNext(CancellationToken cancel = default) { HttpStatusCode statusCode = await API.Post(URLs.PlayerNext(), null, null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SkipNext(PlayerSkipNextRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Post(URLs.PlayerNext(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SkipPrevious(CancellationToken cancel = default) { HttpStatusCode statusCode = await API.Post(URLs.PlayerPrevious(), null, null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task SkipPrevious(PlayerSkipPreviousRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Post(URLs.PlayerPrevious(), request.BuildQueryParams(), null, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } public async Task TransferPlayback(PlayerTransferPlaybackRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); HttpStatusCode statusCode = await API.Put(URLs.Player(), null, request.BuildBodyParams(), cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.NoContent; } } }