diff --git a/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs b/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs index 51c830d5b..50607b816 100644 --- a/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs +++ b/src/NzbDrone.Core.Test/MetadataSource/SkyHook/SkyHookProxyFixture.cs @@ -10,6 +10,7 @@ using NzbDrone.Core.Music; using NzbDrone.Test.Common.Categories; using Moq; using NzbDrone.Core.Profiles.Metadata; +using NzbDrone.Core.MetadataSource.SkyHook.Resource; namespace NzbDrone.Core.Test.MetadataSource.SkyHook { @@ -17,12 +18,14 @@ namespace NzbDrone.Core.Test.MetadataSource.SkyHook [IntegrationTest] public class SkyHookProxyFixture : CoreTest { + private MetadataProfile _metadataProfile; + [SetUp] public void Setup() { UseRealHttp(); - var _metadataProfile = new MetadataProfile + _metadataProfile = new MetadataProfile { PrimaryAlbumTypes = new List { @@ -30,7 +33,6 @@ namespace NzbDrone.Core.Test.MetadataSource.SkyHook { PrimaryAlbumType = PrimaryAlbumType.Album, Allowed = true - } }, SecondaryAlbumTypes = new List @@ -59,6 +61,30 @@ namespace NzbDrone.Core.Test.MetadataSource.SkyHook .Setup(s => s.Exists(It.IsAny())) .Returns(true); } + + public List GivenExampleAlbums() + { + var result = new List(); + + foreach (var primaryType in PrimaryAlbumType.All) + { + foreach (var secondaryType in SecondaryAlbumType.All) + { + var secondaryTypes = secondaryType.Name == "Studio" ? new List() : new List { secondaryType.Name }; + foreach (var releaseStatus in ReleaseStatus.All) + { + var releaseStatuses = new List { releaseStatus.Name }; + result.Add(new AlbumResource { + Type = primaryType.Name, + SecondaryTypes = secondaryTypes, + ReleaseStatuses = releaseStatuses + }); + } + } + } + + return result; + } [TestCase("f59c5520-5f46-4d2c-b2c4-822eabf53419", "Linkin Park")] [TestCase("66c662b6-6e2f-4930-8610-912e24c63ed1", "AC/DC")] @@ -67,10 +93,64 @@ namespace NzbDrone.Core.Test.MetadataSource.SkyHook var details = Subject.GetArtistInfo(mbId, 1); ValidateArtist(details); - ValidateAlbums(details.Albums.Value); + ValidateAlbums(details.Albums.Value, true); details.Name.Should().Be(name); } + + [TestCaseSource(typeof(PrimaryAlbumType), "All")] + public void should_filter_albums_by_primary_release_type(PrimaryAlbumType type) + { + _metadataProfile.PrimaryAlbumTypes = new List { + new ProfilePrimaryAlbumTypeItem + { + PrimaryAlbumType = type, + Allowed = true + } + }; + + + var albums = GivenExampleAlbums(); + Subject.FilterAlbums(albums, 1).Select(x => x.Type).Distinct() + .Should().BeEquivalentTo(new List { type.Name }); + } + + [TestCaseSource(typeof(SecondaryAlbumType), "All")] + public void should_filter_albums_by_secondary_release_type(SecondaryAlbumType type) + { + _metadataProfile.SecondaryAlbumTypes = new List { + new ProfileSecondaryAlbumTypeItem + { + SecondaryAlbumType = type, + Allowed = true + } + }; + + var albums = GivenExampleAlbums(); + var filtered = Subject.FilterAlbums(albums, 1); + TestLogger.Debug(filtered.Count()); + + filtered.SelectMany(x => x.SecondaryTypes.Select(SkyHookProxy.MapSecondaryTypes)) + .Select(x => x.Name) + .Distinct() + .Should().BeEquivalentTo(type.Name == "Studio" ? new List() : new List { type.Name }); + } + + [TestCaseSource(typeof(ReleaseStatus), "All")] + public void should_filter_albums_by_release_status(ReleaseStatus type) + { + _metadataProfile.ReleaseStatuses = new List { + new ProfileReleaseStatusItem + { + ReleaseStatus = type, + Allowed = true + } + }; + + var albums = GivenExampleAlbums(); + Subject.FilterAlbums(albums, 1).SelectMany(x => x.ReleaseStatuses).Distinct() + .Should().BeEquivalentTo(new List { type.Name }); + } [TestCase("12fa3845-7c62-36e5-a8da-8be137155a72", "Hysteria")] public void should_be_able_to_get_album_detail(string mbId, string name) @@ -130,16 +210,24 @@ namespace NzbDrone.Core.Test.MetadataSource.SkyHook artist.ForeignArtistId.Should().NotBeNullOrWhiteSpace(); } - private void ValidateAlbums(List albums) + private void ValidateAlbums(List albums, bool idOnly = false) { albums.Should().NotBeEmpty(); foreach (var album in albums) { - ValidateAlbum(album); + album.ForeignAlbumId.Should().NotBeNullOrWhiteSpace(); + if (!idOnly) + { + ValidateAlbum(album); + } - //if atleast one album has title it means parse it working. - albums.Should().Contain(c => !string.IsNullOrWhiteSpace(c.Title)); + } + + //if atleast one album has title it means parse it working. + if (!idOnly) + { + albums.Should().Contain(c => !string.IsNullOrWhiteSpace(c.Title)); } } diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/AlbumResource.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/AlbumResource.cs index 3c44b3d55..9d7b2031c 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/AlbumResource.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/Resource/AlbumResource.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; namespace NzbDrone.Core.MetadataSource.SkyHook.Resource { @@ -20,5 +18,6 @@ namespace NzbDrone.Core.MetadataSource.SkyHook.Resource public List SecondaryTypes { get; set; } public string Title { get; set; } public string Type { get; set; } + public List ReleaseStatuses { get; set; } } } diff --git a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs index d3cc9f915..a440f8cb4 100644 --- a/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/SkyHook/SkyHookProxy.cs @@ -50,18 +50,9 @@ namespace NzbDrone.Core.MetadataSource.SkyHook _logger.Debug("Getting Artist with LidarrAPI.MetadataID of {0}", foreignArtistId); - var metadataProfile = _metadataProfileService.Exists(metadataProfileId) ? _metadataProfileService.Get(metadataProfileId) : _metadataProfileService.All().First(); - - var primaryTypes = metadataProfile.PrimaryAlbumTypes.Where(s => s.Allowed).Select(s => s.PrimaryAlbumType.Name); - var secondaryTypes = metadataProfile.SecondaryAlbumTypes.Where(s => s.Allowed).Select(s => s.SecondaryAlbumType.Name); - var releaseStatuses = metadataProfile.ReleaseStatuses.Where(s => s.Allowed).Select(s => s.ReleaseStatus.Name); - var httpRequest = _requestBuilder.GetRequestBuilder().Create() - .SetSegment("route", "artist/" + foreignArtistId) - .AddQueryParam("primTypes", string.Join("|", primaryTypes)) - .AddQueryParam("secTypes", string.Join("|", secondaryTypes)) - .AddQueryParam("releaseStatuses", string.Join("|", releaseStatuses)) - .Build(); + .SetSegment("route", "artist/" + foreignArtistId) + .Build(); httpRequest.AllowAutoRedirect = true; httpRequest.SuppressHttpError = true; @@ -89,11 +80,30 @@ namespace NzbDrone.Core.MetadataSource.SkyHook artist.Metadata = MapArtistMetadata(httpResponse.Resource); artist.CleanName = Parser.Parser.CleanArtistName(artist.Metadata.Value.Name); artist.SortName = Parser.Parser.NormalizeTitle(artist.Metadata.Value.Name); - artist.Albums = httpResponse.Resource.Albums.Select(x => MapAlbum(x, null)).ToList(); + + artist.Albums = FilterAlbums(httpResponse.Resource.Albums, metadataProfileId) + .Select(x => new Album { + ForeignAlbumId = x.Id + }) + .ToList(); return artist; } + public IEnumerable FilterAlbums(IEnumerable albums, int metadataProfileId) + { + var metadataProfile = _metadataProfileService.Exists(metadataProfileId) ? _metadataProfileService.Get(metadataProfileId) : _metadataProfileService.All().First(); + var primaryTypes = new HashSet(metadataProfile.PrimaryAlbumTypes.Where(s => s.Allowed).Select(s => s.PrimaryAlbumType.Name)); + var secondaryTypes = new HashSet(metadataProfile.SecondaryAlbumTypes.Where(s => s.Allowed).Select(s => s.SecondaryAlbumType.Name)); + var releaseStatuses = new HashSet(metadataProfile.ReleaseStatuses.Where(s => s.Allowed).Select(s => s.ReleaseStatus.Name)); + + + return albums.Where(album => primaryTypes.Contains(album.Type) && + (!album.SecondaryTypes.Any() && secondaryTypes.Contains("Studio") || + album.SecondaryTypes.Any(x => secondaryTypes.Contains(x))) && + album.ReleaseStatuses.Any(x => releaseStatuses.Contains(x))); + } + public Tuple> GetAlbumInfo(string foreignAlbumId) { _logger.Debug("Getting Album with LidarrAPI.MetadataID of {0}", foreignAlbumId); @@ -470,7 +480,7 @@ namespace NzbDrone.Core.MetadataSource.SkyHook } } - private static SecondaryAlbumType MapSecondaryTypes(string albumType) + public static SecondaryAlbumType MapSecondaryTypes(string albumType) { switch (albumType.ToLowerInvariant()) {