New: Author folder hint when selecting a root folder while adding a new author

(cherry picked from commit dd09f31abb4dd3f699bcff0a47577075300c70ee)

Fix AuthorFolderAsRootFolderValidator

(cherry picked from commit 0ce81e1ab69d43fde382cc4ae22cd46fe626dea7)
This commit is contained in:
Mark McDowall
2019-08-03 18:55:31 -07:00
committed by Bogdan
parent 0972d41bf8
commit f819e582cf
26 changed files with 225 additions and 29 deletions
@@ -59,7 +59,8 @@ namespace Readarr.Api.V1.Author
AuthorAncestorValidator authorAncestorValidator,
SystemFolderValidator systemFolderValidator,
QualityProfileExistsValidator qualityProfileExistsValidator,
MetadataProfileExistsValidator metadataProfileExistsValidator)
MetadataProfileExistsValidator metadataProfileExistsValidator,
AuthorFolderAsRootFolderValidator authorFolderAsRootFolderValidator)
: base(signalRBroadcaster)
{
_authorService = authorService;
@@ -89,7 +90,10 @@ namespace Readarr.Api.V1.Author
SharedValidator.RuleFor(s => s.MetadataProfileId).SetValidator(metadataProfileExistsValidator);
PostValidator.RuleFor(s => s.Path).IsValidPath().When(s => s.RootFolderPath.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.RootFolderPath).IsValidPath().When(s => s.Path.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.RootFolderPath)
.IsValidPath()
.SetValidator(authorFolderAsRootFolderValidator)
.When(s => s.Path.IsNullOrWhiteSpace());
PostValidator.RuleFor(s => s.AuthorName).NotEmpty();
PostValidator.RuleFor(s => s.ForeignAuthorId).NotEmpty().SetValidator(authorExistsValidator);
@@ -0,0 +1,49 @@
using System;
using System.IO;
using FluentValidation.Validators;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Organizer;
namespace Readarr.Api.V1.Author
{
public class AuthorFolderAsRootFolderValidator : PropertyValidator
{
private readonly IBuildFileNames _fileNameBuilder;
public AuthorFolderAsRootFolderValidator(IBuildFileNames fileNameBuilder)
{
_fileNameBuilder = fileNameBuilder;
}
protected override string GetDefaultMessageTemplate() => "Root folder path contains author folder";
protected override bool IsValid(PropertyValidatorContext context)
{
if (context.PropertyValue == null)
{
return true;
}
var authorResource = context.ParentContext.InstanceToValidate as AuthorResource;
if (authorResource == null)
{
return true;
}
var rootFolderPath = context.PropertyValue.ToString();
var rootFolder = new DirectoryInfo(rootFolderPath).Name;
var author = authorResource.ToModel();
var authorFolder = _fileNameBuilder.GetAuthorFolder(author);
if (authorFolder == rootFolder)
{
return false;
}
var distance = authorFolder.LevenshteinDistance(rootFolder);
return distance >= Math.Max(1, authorFolder.Length * 0.2);
}
}
}
@@ -3,6 +3,7 @@ using System.Linq;
using Microsoft.AspNetCore.Mvc;
using NzbDrone.Core.MediaCover;
using NzbDrone.Core.MetadataSource;
using NzbDrone.Core.Organizer;
using Readarr.Http;
namespace Readarr.Api.V1.Author
@@ -11,11 +12,13 @@ namespace Readarr.Api.V1.Author
public class AuthorLookupController : Controller
{
private readonly ISearchForNewAuthor _searchProxy;
private readonly IBuildFileNames _fileNameBuilder;
private readonly IMapCoversToLocal _coverMapper;
public AuthorLookupController(ISearchForNewAuthor searchProxy, IMapCoversToLocal coverMapper)
public AuthorLookupController(ISearchForNewAuthor searchProxy, IBuildFileNames fileNameBuilder, IMapCoversToLocal coverMapper)
{
_searchProxy = searchProxy;
_fileNameBuilder = fileNameBuilder;
_coverMapper = coverMapper;
}
@@ -41,6 +44,8 @@ namespace Readarr.Api.V1.Author
resource.RemotePoster = poster.Url;
}
resource.Folder = _fileNameBuilder.GetAuthorFolder(currentAuthor);
yield return resource;
}
}
@@ -45,6 +45,7 @@ namespace Readarr.Api.V1.Author
public NewItemMonitorTypes MonitorNewItems { get; set; }
public string RootFolderPath { get; set; }
public string Folder { get; set; }
public List<string> Genres { get; set; }
public string CleanName { get; set; }
public string SortName { get; set; }