using System.Collections.Generic; using System.Net; using System.Threading; using System.Threading.Tasks; using SpotifyAPI.Web.Http; using URLs = SpotifyAPI.Web.SpotifyUrls; namespace SpotifyAPI.Web { public class PlaylistsClient : APIClient, IPlaylistsClient { public PlaylistsClient(IAPIConnector connector) : base(connector) { } public Task RemoveItems(string playlistId, PlaylistRemoveItemsRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Delete(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams(), cancel); } public Task AddItems(string playlistId, PlaylistAddItemsRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Post(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams(), cancel); } public Task>> GetItems(string playlistId, CancellationToken cancel = default) { var request = new PlaylistGetItemsRequest(); return GetItems(playlistId, request, cancel); } public Task>> GetItems(string playlistId, PlaylistGetItemsRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Get>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams(), cancel); } public Task Create(string userId, PlaylistCreateRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Post(URLs.UserPlaylists(userId), null, request.BuildBodyParams(), cancel); } public async Task UploadCover(string playlistId, string base64JpgData, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNullOrEmptyString(base64JpgData, nameof(base64JpgData)); var statusCode = await API.PutRaw(URLs.PlaylistImages(playlistId), null, base64JpgData, cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.Accepted; } public Task> GetCovers(string playlistId, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); return API.Get>(URLs.PlaylistImages(playlistId), cancel); } public Task> GetUsers(string userId, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); return API.Get>(URLs.UserPlaylists(userId), cancel); } public Task> GetUsers(string userId, PlaylistGetUsersRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Get>(URLs.UserPlaylists(userId), request.BuildQueryParams(), cancel); } public Task Get(string playlistId, CancellationToken cancel = default) { var request = new PlaylistGetRequest(); // We need some defaults return Get(playlistId, request, cancel); } public Task Get(string playlistId, PlaylistGetRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Get(URLs.Playlist(playlistId), request.BuildQueryParams(), cancel); } public async Task ReplaceItems(string playlistId, PlaylistReplaceItemsRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); var statusCode = await API.Put(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams(), cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.Created; } public Task> CurrentUsers(CancellationToken cancel = default) { return API.Get>(URLs.CurrentUserPlaylists(), cancel); } public Task> CurrentUsers(PlaylistCurrentUsersRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNull(request, nameof(request)); return API.Get>(URLs.CurrentUserPlaylists(), request.BuildQueryParams(), cancel); } public async Task ChangeDetails(string playlistId, PlaylistChangeDetailsRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); var statusCode = await API.Put(URLs.Playlist(playlistId), null, request.BuildBodyParams(), cancel).ConfigureAwait(false); return statusCode == HttpStatusCode.OK; } public Task ReorderItems(string playlistId, PlaylistReorderItemsRequest request, CancellationToken cancel = default) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Put(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams(), cancel); } } }