New: Fetch all albums from metadata and filter client-side (#803)

* Retrieve all albums from metadata and filter client-side

Should significantly increase the proportion of artist requests hitting
cloudflare cache

* Add tests for album filtering
This commit is contained in:
ta264
2019-05-08 15:06:29 +01:00
committed by GitHub
parent 801ece337c
commit d381bab9d9
3 changed files with 119 additions and 22 deletions
@@ -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<string> SecondaryTypes { get; set; }
public string Title { get; set; }
public string Type { get; set; }
public List<string> ReleaseStatuses { get; set; }
}
}
@@ -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<AlbumResource> FilterAlbums(IEnumerable<AlbumResource> albums, int metadataProfileId)
{
var metadataProfile = _metadataProfileService.Exists(metadataProfileId) ? _metadataProfileService.Get(metadataProfileId) : _metadataProfileService.All().First();
var primaryTypes = new HashSet<string>(metadataProfile.PrimaryAlbumTypes.Where(s => s.Allowed).Select(s => s.PrimaryAlbumType.Name));
var secondaryTypes = new HashSet<string>(metadataProfile.SecondaryAlbumTypes.Where(s => s.Allowed).Select(s => s.SecondaryAlbumType.Name));
var releaseStatuses = new HashSet<string>(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<string, Album, List<ArtistMetadata>> 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())
{