using System.Collections.Generic; using System.Net; 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) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Delete(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()); } public Task AddItems(string playlistId, PlaylistAddItemsRequest request) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Post(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()); } public Task>> GetItems(string playlistId) { var request = new PlaylistGetItemsRequest(); return GetItems(playlistId, request); } public Task>> GetItems(string playlistId, PlaylistGetItemsRequest request) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Get>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams()); } public Task Create(string userId, PlaylistCreateRequest request) { Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Post(URLs.UserPlaylists(userId), null, request.BuildBodyParams()); } public async Task UploadCover(string playlistId, string base64JpgData) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNullOrEmptyString(base64JpgData, nameof(base64JpgData)); var statusCode = await API.PutRaw(URLs.PlaylistImages(playlistId), null, base64JpgData).ConfigureAwait(false); return statusCode == HttpStatusCode.Accepted; } public Task> GetCovers(string playlistId) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); return API.Get>(URLs.PlaylistImages(playlistId)); } public Task> GetUsers(string userId) { Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); return API.Get>(URLs.UserPlaylists(userId)); } public Task> GetUsers(string userId, PlaylistGetUsersRequest request) { Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Get>(URLs.UserPlaylists(userId), request.BuildQueryParams()); } public Task Get(string playlistId) { var request = new PlaylistGetRequest(); // We need some defaults return Get(playlistId, request); } public Task Get(string playlistId, PlaylistGetRequest request) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Get(URLs.Playlist(playlistId), request.BuildQueryParams()); } public async Task ReplaceItems(string playlistId, PlaylistReplaceItemsRequest request) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); var statusCode = await API.Put(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()).ConfigureAwait(false); return statusCode == HttpStatusCode.Created; } public Task> CurrentUsers() { return API.Get>(URLs.CurrentUserPlaylists()); } public Task> CurrentUsers(PlaylistCurrentUsersRequest request) { Ensure.ArgumentNotNull(request, nameof(request)); return API.Get>(URLs.CurrentUserPlaylists(), request.BuildQueryParams()); } public async Task ChangeDetails(string playlistId, PlaylistChangeDetailsRequest request) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); var statusCode = await API.Put(URLs.Playlist(playlistId), null, request.BuildBodyParams()).ConfigureAwait(false); return statusCode == HttpStatusCode.OK; } public Task ReorderItems(string playlistId, PlaylistReorderItemsRequest request) { Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); Ensure.ArgumentNotNull(request, nameof(request)); return API.Put(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()); } } }