diff --git a/src/NzbDrone.Core/ImportLists/LastFm/LastFmApi.cs b/src/NzbDrone.Core/ImportLists/LastFm/LastFmApi.cs index b52c9f710..ebf25029a 100644 --- a/src/NzbDrone.Core/ImportLists/LastFm/LastFmApi.cs +++ b/src/NzbDrone.Core/ImportLists/LastFm/LastFmApi.cs @@ -10,6 +10,7 @@ namespace NzbDrone.Core.ImportLists.LastFm public class LastFmArtistResponse { public LastFmArtistList TopArtists { get; set; } + public LastFmAlbumList TopAlbums { get; set; } } public class LastFmArtist @@ -17,4 +18,16 @@ namespace NzbDrone.Core.ImportLists.LastFm public string Name { get; set; } public string Mbid { get; set; } } + + public class LastFmAlbumList + { + public List Album { get; set; } + } + + public class LastFmAlbum + { + public LastFmArtist Artist { get; set; } + public string Name { get; set; } + public string Mbid { get; set; } + } } diff --git a/src/NzbDrone.Core/ImportLists/LastFm/LastFmParser.cs b/src/NzbDrone.Core/ImportLists/LastFm/LastFmParser.cs index fa60b0fae..5aacc872b 100644 --- a/src/NzbDrone.Core/ImportLists/LastFm/LastFmParser.cs +++ b/src/NzbDrone.Core/ImportLists/LastFm/LastFmParser.cs @@ -29,13 +29,31 @@ namespace NzbDrone.Core.ImportLists.LastFm return items; } - foreach (var item in jsonResponse.TopArtists.Artist) + if (jsonResponse.TopArtists == null) { - items.AddIfNotNull(new ImportListItemInfo + foreach (var item in jsonResponse.TopAlbums.Album) { - Artist = item.Name, - ArtistMusicBrainzId = item.Mbid - }); + // Last.fm does provide an album MusicBrainzId, but it's + // for a specific release rather than a group like + // Lidarr wants. Matching on the name works well enough. + items.AddIfNotNull(new ImportListItemInfo + { + Artist = item.Artist.Name, + ArtistMusicBrainzId = item.Artist.Mbid, + Album = item.Name + }); + } + } + else + { + foreach (var item in jsonResponse.TopArtists.Artist) + { + items.AddIfNotNull(new ImportListItemInfo + { + Artist = item.Name, + ArtistMusicBrainzId = item.Mbid + }); + } } return items; diff --git a/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserRequestGenerator.cs b/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserRequestGenerator.cs index 5bdfb7a07..3e2204e92 100644 --- a/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserRequestGenerator.cs +++ b/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserRequestGenerator.cs @@ -27,7 +27,33 @@ namespace NzbDrone.Core.ImportLists.LastFm private IEnumerable GetPagedRequests() { - yield return new ImportListRequest(string.Format("{0}&user={1}&limit={2}&api_key={3}&format=json", Settings.BaseUrl.TrimEnd('/'), Settings.UserId, Settings.Count, Settings.ApiKey), HttpAccept.Json); + var method = Settings.Method switch + { + (int)LastFmUserMethodList.TopAlbums => "user.gettopalbums", + _ => "user.gettopartists" + }; + + var period = Settings.Period switch + { + (int)LastFmUserTimePeriod.LastWeek => "7day", + (int)LastFmUserTimePeriod.LastMonth => "1month", + (int)LastFmUserTimePeriod.LastThreeMonths => "3month", + (int)LastFmUserTimePeriod.LastSixMonths => "6month", + (int)LastFmUserTimePeriod.LastTwelveMonths => "12month", + _ => "overall" + }; + + var request = new HttpRequestBuilder(Settings.BaseUrl) + .AddQueryParam("api_key", Settings.ApiKey) + .AddQueryParam("method", method) + .AddQueryParam("user", Settings.UserId) + .AddQueryParam("period", period) + .AddQueryParam("limit", Settings.Count) + .AddQueryParam("format", "json") + .Accept(HttpAccept.Json) + .Build(); + + yield return new ImportListRequest(request); } } } diff --git a/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserSettings.cs b/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserSettings.cs index 836f871c1..555dc301c 100644 --- a/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserSettings.cs +++ b/src/NzbDrone.Core/ImportLists/LastFm/LastFmUserSettings.cs @@ -15,12 +15,14 @@ namespace NzbDrone.Core.ImportLists.LastFm public class LastFmUserSettings : IImportListSettings { - private static readonly LastFmSettingsValidator Validator = new LastFmSettingsValidator(); + private static readonly LastFmSettingsValidator Validator = new (); public LastFmUserSettings() { - BaseUrl = "https://ws.audioscrobbler.com/2.0/?method=user.gettopartists"; + BaseUrl = "https://ws.audioscrobbler.com/2.0/"; ApiKey = "204c76646d6020eee36bbc51a2fcd810"; + Method = (int)LastFmUserMethodList.TopArtists; + Period = (int)LastFmUserTimePeriod.Overall; Count = 25; } @@ -30,7 +32,13 @@ namespace NzbDrone.Core.ImportLists.LastFm [FieldDefinition(0, Label = "Last.fm UserID", HelpText = "Last.fm UserId to pull artists from")] public string UserId { get; set; } - [FieldDefinition(1, Label = "Count", HelpText = "Number of results to pull from list (Max 1000)", Type = FieldType.Number)] + [FieldDefinition(1, Label = "List", Type = FieldType.Select, SelectOptions = typeof(LastFmUserMethodList))] + public int Method { get; set; } + + [FieldDefinition(2, Label = "Period", Type = FieldType.Select, SelectOptions = typeof(LastFmUserTimePeriod), HelpText = "The time period over which to retrieve top artists for")] + public int Period { get; set; } + + [FieldDefinition(3, Label = "Count", HelpText = "Number of results to pull from list (Max 1000)", Type = FieldType.Number)] public int Count { get; set; } public NzbDroneValidationResult Validate() @@ -38,4 +46,28 @@ namespace NzbDrone.Core.ImportLists.LastFm return new NzbDroneValidationResult(Validator.Validate(this)); } } + + public enum LastFmUserMethodList + { + [FieldOption(Label = "Top Artists")] + TopArtists = 0, + [FieldOption(Label = "Top Albums")] + TopAlbums = 1 + } + + public enum LastFmUserTimePeriod + { + [FieldOption(Label = "Overall")] + Overall = 0, + [FieldOption(Label = "Last Week")] + LastWeek = 1, + [FieldOption(Label = "Last Month")] + LastMonth = 2, + [FieldOption(Label = "Last 3 Months")] + LastThreeMonths = 3, + [FieldOption(Label = "Last 6 Months")] + LastSixMonths = 4, + [FieldOption(Label = "Last 12 Months")] + LastTwelveMonths = 5 + } }