From 8fb0ba7974d93be284b95c3d69114d5d93176d54 Mon Sep 17 00:00:00 2001 From: Jonas Dellinger Date: Fri, 8 May 2020 12:09:59 +0200 Subject: [PATCH] Added Personalization Client #451 --- .../Interfaces/IPersonalizationClient.cs | 13 +++++++ .../Clients/Interfaces/ISpotifyClient.cs | 2 ++ .../Clients/PersonalizationClient.cs | 35 +++++++++++++++++++ SpotifyAPI.Web/Clients/SpotifyClient.cs | 3 ++ .../Request/PersonalizationTopRequest.cs | 26 ++++++++++++++ SpotifyAPI.Web/SpotifyUrls.cs | 2 ++ 6 files changed, 81 insertions(+) create mode 100644 SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs create mode 100644 SpotifyAPI.Web/Clients/PersonalizationClient.cs create mode 100644 SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs diff --git a/SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs b/SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs new file mode 100644 index 00000000..c2445bc1 --- /dev/null +++ b/SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs @@ -0,0 +1,13 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + public interface IPersonalizationClient + { + Task> GetTopTracks(); + Task> GetTopTracks(PersonalizationTopRequest request); + + Task> GetTopArtists(); + Task> GetTopArtists(PersonalizationTopRequest request); + } +} diff --git a/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs b/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs index 2f04367d..0c5a24ad 100644 --- a/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs +++ b/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs @@ -28,6 +28,8 @@ namespace SpotifyAPI.Web IArtistsClient Artists { get; } + IPersonalizationClient Personalization { get; } + Task> Paginate(Paging firstPage); Task> Paginate(Paging firstPage, Func> mapper); Task> Paginate(Func>> getFirstPage); diff --git a/SpotifyAPI.Web/Clients/PersonalizationClient.cs b/SpotifyAPI.Web/Clients/PersonalizationClient.cs new file mode 100644 index 00000000..e9af2c63 --- /dev/null +++ b/SpotifyAPI.Web/Clients/PersonalizationClient.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class PersonalizationClient : APIClient, IPersonalizationClient + { + public PersonalizationClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task> GetTopArtists() + { + return API.Get>(URLs.PersonalizationTop("artists")); + } + + public Task> GetTopArtists(PersonalizationTopRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.PersonalizationTop("artists"), request.BuildQueryParams()); + } + + public Task> GetTopTracks() + { + return API.Get>(URLs.PersonalizationTop("tracks")); + } + + public Task> GetTopTracks(PersonalizationTopRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.PersonalizationTop("tracks"), request.BuildQueryParams()); + } + } +} diff --git a/SpotifyAPI.Web/Clients/SpotifyClient.cs b/SpotifyAPI.Web/Clients/SpotifyClient.cs index 20e287e0..0324148c 100644 --- a/SpotifyAPI.Web/Clients/SpotifyClient.cs +++ b/SpotifyAPI.Web/Clients/SpotifyClient.cs @@ -29,6 +29,7 @@ namespace SpotifyAPI.Web Player = new PlayerClient(_apiConnector); Albums = new AlbumsClient(_apiConnector); Artists = new ArtistsClient(_apiConnector); + Personalization = new PersonalizationClient(_apiConnector); } public IPaginator DefaultPaginator { get; } @@ -53,6 +54,8 @@ namespace SpotifyAPI.Web public IArtistsClient Artists { get; } + public IPersonalizationClient Personalization { get; } + public Task> Paginate(Paging firstPage) { return DefaultPaginator.Paginate(firstPage, _apiConnector); diff --git a/SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs b/SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs new file mode 100644 index 00000000..b08987ca --- /dev/null +++ b/SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs @@ -0,0 +1,26 @@ +namespace SpotifyAPI.Web +{ + public class PersonalizationTopRequest : RequestParams + { + [QueryParam("limit")] + public int? Limit { get; set; } + + [QueryParam("offset")] + public int? Offset { get; set; } + + [QueryParam("time_range")] + public TimeRange? TimeRangeParam { get; set; } + + public enum TimeRange + { + [String("long_term")] + LongTerm, + + [String("medium_term")] + MediumTerm, + + [String("short_term")] + ShortTerm + } + } +} diff --git a/SpotifyAPI.Web/SpotifyUrls.cs b/SpotifyAPI.Web/SpotifyUrls.cs index b79bad06..c27598ab 100644 --- a/SpotifyAPI.Web/SpotifyUrls.cs +++ b/SpotifyAPI.Web/SpotifyUrls.cs @@ -103,6 +103,8 @@ namespace SpotifyAPI.Web public static Uri ArtistRelatedArtists(string artistId) => EUri($"artists/{artistId}/related-artists"); + public static Uri PersonalizationTop(string type) => EUri($"me/top/{type}"); + private static Uri EUri(FormattableString path) => new Uri(path.ToString(_provider), UriKind.Relative); } }