diff --git a/SpotifyAPI.Web/Clients/AlbumsClient.cs b/SpotifyAPI.Web/Clients/AlbumsClient.cs new file mode 100644 index 00000000..f70c3071 --- /dev/null +++ b/SpotifyAPI.Web/Clients/AlbumsClient.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class AlbumsClient : APIClient, IAlbumsClient + { + public AlbumsClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task Get(string albumId) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + + return API.Get(URLs.Album(albumId)); + } + + public Task Get(string albumId, AlbumRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Album(albumId), request.BuildQueryParams()); + } + + public Task GetSeveral(AlbumsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Albums(), request.BuildQueryParams()); + } + + public Task> GetTracks(string albumId) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + + return API.Get>(URLs.AlbumTracks(albumId)); + } + + public Task> GetTracks(string albumId, AlbumTracksRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.AlbumTracks(albumId), request.BuildQueryParams()); + } + } +} diff --git a/SpotifyAPI.Web/Clients/Interfaces/IAlbumsClient.cs b/SpotifyAPI.Web/Clients/Interfaces/IAlbumsClient.cs new file mode 100644 index 00000000..7946535c --- /dev/null +++ b/SpotifyAPI.Web/Clients/Interfaces/IAlbumsClient.cs @@ -0,0 +1,18 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + public interface IAlbumsClient + { + Task GetSeveral(AlbumsRequest request); + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string albumId); + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string albumId, AlbumRequest request); + + Task> GetTracks(string albumId); + Task> GetTracks(string albumId, AlbumTracksRequest request); + } +} diff --git a/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs b/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs index f999b3cc..511d0782 100644 --- a/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs +++ b/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs @@ -24,6 +24,8 @@ namespace SpotifyAPI.Web IPlayerClient Player { get; } + IAlbumsClient Albums { get; } + Task> Paginate(Paging firstPage); Task> Paginate(Paging firstPage, Func> mapper); Task> Paginate(Func>> getFirstPage); diff --git a/SpotifyAPI.Web/Clients/SpotifyClient.cs b/SpotifyAPI.Web/Clients/SpotifyClient.cs index 43c1d6c9..404279f9 100644 --- a/SpotifyAPI.Web/Clients/SpotifyClient.cs +++ b/SpotifyAPI.Web/Clients/SpotifyClient.cs @@ -27,6 +27,7 @@ namespace SpotifyAPI.Web Follow = new FollowClient(_apiConnector); Tracks = new TracksClient(_apiConnector); Player = new PlayerClient(_apiConnector); + Albums = new AlbumsClient(_apiConnector); } public IPaginator DefaultPaginator { get; } @@ -47,6 +48,8 @@ namespace SpotifyAPI.Web public IPlayerClient Player { get; } + public IAlbumsClient Albums { get; } + public Task> Paginate(Paging firstPage) { return DefaultPaginator.Paginate(firstPage, _apiConnector); diff --git a/SpotifyAPI.Web/Models/Request/AlbumRequest.cs b/SpotifyAPI.Web/Models/Request/AlbumRequest.cs new file mode 100644 index 00000000..8633b9ab --- /dev/null +++ b/SpotifyAPI.Web/Models/Request/AlbumRequest.cs @@ -0,0 +1,8 @@ +namespace SpotifyAPI.Web +{ + public class AlbumRequest : RequestParams + { + [QueryParam("market")] + public string Market { get; set; } + } +} diff --git a/SpotifyAPI.Web/Models/Request/AlbumTracksRequest.cs b/SpotifyAPI.Web/Models/Request/AlbumTracksRequest.cs new file mode 100644 index 00000000..c02119ae --- /dev/null +++ b/SpotifyAPI.Web/Models/Request/AlbumTracksRequest.cs @@ -0,0 +1,14 @@ +namespace SpotifyAPI.Web +{ + public class AlbumTracksRequest : RequestParams + { + [QueryParam("market")] + public string Market { get; set; } + + [QueryParam("limit")] + public int? Limit { get; set; } + + [QueryParam("offset")] + public int? Offset { get; set; } + } +} diff --git a/SpotifyAPI.Web/Models/Request/AlbumsRequest.cs b/SpotifyAPI.Web/Models/Request/AlbumsRequest.cs new file mode 100644 index 00000000..4fb40cb4 --- /dev/null +++ b/SpotifyAPI.Web/Models/Request/AlbumsRequest.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class AlbumsRequest : RequestParams + { + public AlbumsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + [QueryParam("ids")] + public IList Ids { get; } + + [QueryParam("market")] + public string Market { get; set; } + } +} diff --git a/SpotifyAPI.Web/Models/Response/AlbumsResponse.cs b/SpotifyAPI.Web/Models/Response/AlbumsResponse.cs new file mode 100644 index 00000000..498903fd --- /dev/null +++ b/SpotifyAPI.Web/Models/Response/AlbumsResponse.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class AlbumsResponse + { + public List Albums { get; private set; } + } +} diff --git a/SpotifyAPI.Web/Models/Response/FullAlbum.cs b/SpotifyAPI.Web/Models/Response/FullAlbum.cs new file mode 100644 index 00000000..4bade9d5 --- /dev/null +++ b/SpotifyAPI.Web/Models/Response/FullAlbum.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class FullAlbum + { + public string AlbumType { get; private set; } + public List Artists { get; private set; } + public List AvailableMarkets { get; private set; } + public List Copyrights { get; private set; } + public Dictionary ExternalIds { get; private set; } + public Dictionary ExternalUrls { get; private set; } + public List Genres { get; private set; } + public string Href { get; private set; } + public string Id { get; private set; } + public List Images { get; private set; } + public string Label { get; private set; } + public string Name { get; private set; } + public int Popularity { get; private set; } + public string ReleaseDate { get; private set; } + public string ReleaseDatePrecision { get; private set; } + public Dictionary Restrictions { get; private set; } + public Paging Tracks { get; private set; } + public string Type { get; private set; } + public string Uri { get; private set; } + } +} diff --git a/SpotifyAPI.Web/SpotifyUrls.cs b/SpotifyAPI.Web/SpotifyUrls.cs index 3258afcc..6dbcd578 100644 --- a/SpotifyAPI.Web/SpotifyUrls.cs +++ b/SpotifyAPI.Web/SpotifyUrls.cs @@ -87,6 +87,12 @@ namespace SpotifyAPI.Web public static Uri PlayerPrevious() => EUri($"me/player/previous"); + public static Uri Albums() => EUri($"albums"); + + public static Uri Album(string albumId) => EUri($"albums/{albumId}"); + + public static Uri AlbumTracks(string albumId) => EUri($"albums/{albumId}/tracks"); + private static Uri EUri(FormattableString path) => new Uri(path.ToString(_provider), UriKind.Relative); } }