mirror of
https://github.com/Lidarr/Lidarr
synced 2025-12-21 15:53:02 +01:00
Merge f0f02bd924 into d8f79c0189
This commit is contained in:
commit
cc1b8c859d
11 changed files with 132 additions and 63 deletions
|
|
@ -57,6 +57,7 @@ public class ArtistResource : RestResource
|
|||
public List<string> Genres { get; set; }
|
||||
public string CleanName { get; set; }
|
||||
public string SortName { get; set; }
|
||||
public List<string> Aliases { get; set; }
|
||||
public HashSet<int> Tags { get; set; }
|
||||
public DateTime Added { get; set; }
|
||||
public AddArtistOptions AddOptions { get; set; }
|
||||
|
|
@ -101,6 +102,7 @@ public static ArtistResource ToResource(this NzbDrone.Core.Music.Artist model)
|
|||
|
||||
CleanName = model.CleanName,
|
||||
ForeignArtistId = model.Metadata.Value.ForeignArtistId,
|
||||
Aliases = model.Metadata.Value.Aliases,
|
||||
|
||||
// Root folder path is now calculated from the artist path
|
||||
// RootFolderPath = model.RootFolderPath,
|
||||
|
|
@ -133,7 +135,8 @@ public static NzbDrone.Core.Music.Artist ToModel(this ArtistResource resource)
|
|||
Images = resource.Images,
|
||||
Genres = resource.Genres,
|
||||
Ratings = resource.Ratings,
|
||||
Type = resource.ArtistType
|
||||
Type = resource.ArtistType,
|
||||
Aliases = resource.Aliases
|
||||
},
|
||||
|
||||
// AlternateTitles
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ public class AlbumSearchCriteria : SearchCriteriaBase
|
|||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"[{Artist.Name} - {AlbumTitle}{(Disambiguation.IsNullOrWhiteSpace() ? string.Empty : $" ({Disambiguation})")} ({AlbumYear})]";
|
||||
return $"[{Artist.SearchName} - {AlbumTitle}{(Disambiguation.IsNullOrWhiteSpace() ? string.Empty : $" ({Disambiguation})")} ({AlbumYear})]";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using NzbDrone.Common.EnsureThat;
|
||||
using NzbDrone.Common.Extensions;
|
||||
|
|
@ -19,9 +20,11 @@ public abstract class SearchCriteriaBase
|
|||
public Artist Artist { get; set; }
|
||||
public List<Album> Albums { get; set; }
|
||||
public List<Track> Tracks { get; set; }
|
||||
public List<string> ArtistTitles { get; set; }
|
||||
|
||||
public string ArtistQuery => Artist.Name;
|
||||
public string ArtistQuery => Artist.SearchName;
|
||||
public string CleanArtistQuery => GetQueryTitle(ArtistQuery);
|
||||
public List<string> CleanArtistTitles => ArtistTitles?.Select(GetQueryTitle).Distinct().ToList() ?? new List<string> { CleanArtistQuery };
|
||||
|
||||
public static string GetQueryTitle(string title)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -106,6 +106,15 @@ private TSpec Get<TSpec>(Artist artist, List<Album> albums, bool userInvokedSear
|
|||
spec.UserInvokedSearch = userInvokedSearch;
|
||||
spec.InteractiveSearch = interactiveSearch;
|
||||
|
||||
var artistTitles = new List<string> { artist.Name };
|
||||
|
||||
if (artist.Metadata?.Value?.Aliases != null)
|
||||
{
|
||||
artistTitles.AddRange(artist.Metadata.Value.Aliases.Where(a => !string.IsNullOrWhiteSpace(a)));
|
||||
}
|
||||
|
||||
spec.ArtistTitles = artistTitles.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList();
|
||||
|
||||
return spec;
|
||||
}
|
||||
|
||||
|
|
@ -117,6 +126,15 @@ private static TSpec Get<TSpec>(Artist artist, bool userInvokedSearch, bool inte
|
|||
spec.UserInvokedSearch = userInvokedSearch;
|
||||
spec.InteractiveSearch = interactiveSearch;
|
||||
|
||||
var artistTitles = new List<string> { artist.Name };
|
||||
|
||||
if (artist.Metadata?.Value?.Aliases != null)
|
||||
{
|
||||
artistTitles.AddRange(artist.Metadata.Value.Aliases.Where(a => !string.IsNullOrWhiteSpace(a)));
|
||||
}
|
||||
|
||||
spec.ArtistTitles = artistTitles.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList();
|
||||
|
||||
return spec;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,11 +23,13 @@ public virtual IndexerPageableRequestChain GetRecentRequests()
|
|||
public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
var artistQuery = searchCriteria.CleanArtistQuery.Replace("+", " ").Trim();
|
||||
var albumQuery = searchCriteria.CleanAlbumQuery.Replace("+", " ").Trim();
|
||||
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}+{1}", Uri.EscapeDataString(artistQuery), Uri.EscapeDataString(albumQuery))));
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
var artistQuery = artistTitle.Replace("+", " ").Trim();
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}+{1}", Uri.EscapeDataString(artistQuery), Uri.EscapeDataString(albumQuery))));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
@ -36,9 +38,11 @@ public IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteria search
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
var artistQuery = searchCriteria.CleanArtistQuery.Replace("+", " ").Trim();
|
||||
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}", Uri.EscapeDataString(artistQuery))));
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
var artistQuery = artistTitle.Replace("+", " ").Trim();
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}", Uri.EscapeDataString(artistQuery))));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,13 +32,16 @@ public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchC
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
if (searchCriteria.CleanArtistQuery == "VA")
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
pageableRequests.Add(GetRequest(string.Format("&groupname={0}", searchCriteria.CleanAlbumQuery)));
|
||||
}
|
||||
else
|
||||
{
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", searchCriteria.CleanArtistQuery, searchCriteria.CleanAlbumQuery)));
|
||||
if (artistTitle == "VA")
|
||||
{
|
||||
pageableRequests.Add(GetRequest(string.Format("&groupname={0}", searchCriteria.CleanAlbumQuery)));
|
||||
}
|
||||
else
|
||||
{
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", artistTitle, searchCriteria.CleanAlbumQuery)));
|
||||
}
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
|
|
@ -47,7 +50,12 @@ public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchC
|
|||
public IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}", searchCriteria.CleanArtistQuery)));
|
||||
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}", artistTitle)));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,10 +37,13 @@ public virtual IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria
|
|||
|
||||
pageableRequests.AddTier();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
$"&q={NewsnabifyTitle(searchCriteria.CleanArtistQuery)}+{NewsnabifyTitle(searchCriteria.CleanAlbumQuery)}"));
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
$"&q={NewsnabifyTitle(artistTitle)}+{NewsnabifyTitle(searchCriteria.CleanAlbumQuery)}"));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
@ -51,10 +54,13 @@ public virtual IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteri
|
|||
|
||||
pageableRequests.AddTier();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
$"&q={NewsnabifyTitle(searchCriteria.CleanArtistQuery)}"));
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
$"&q={NewsnabifyTitle(artistTitle)}"));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -90,39 +90,45 @@ public virtual IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria
|
|||
|
||||
if (SupportsAudioSearch)
|
||||
{
|
||||
var artistQuery = AudioTextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
var artistTitles = AudioTextSearchEngine == "raw" ? new List<string> { searchCriteria.ArtistQuery } : searchCriteria.CleanArtistTitles;
|
||||
var albumQuery = AudioTextSearchEngine == "raw" ? searchCriteria.AlbumQuery : searchCriteria.CleanAlbumQuery;
|
||||
|
||||
var searchQuery = $"&artist={NewsnabifyTitle(artistQuery)}&album={NewsnabifyTitle(albumQuery)}";
|
||||
|
||||
if (artistQuery == albumQuery && searchCriteria.AlbumYear > 0)
|
||||
foreach (var artistTitle in artistTitles)
|
||||
{
|
||||
searchQuery = $"&artist={NewsnabifyTitle(artistQuery)}&album={NewsnabifyTitle(albumQuery)}&year={searchCriteria.AlbumYear}";
|
||||
}
|
||||
var searchQuery = $"&artist={NewsnabifyTitle(artistTitle)}&album={NewsnabifyTitle(albumQuery)}";
|
||||
|
||||
AddAudioPageableRequests(pageableRequests,
|
||||
searchCriteria,
|
||||
searchQuery);
|
||||
if (artistTitle == albumQuery && searchCriteria.AlbumYear > 0)
|
||||
{
|
||||
searchQuery = $"&artist={NewsnabifyTitle(artistTitle)}&album={NewsnabifyTitle(albumQuery)}&year={searchCriteria.AlbumYear}";
|
||||
}
|
||||
|
||||
AddAudioPageableRequests(pageableRequests,
|
||||
searchCriteria,
|
||||
searchQuery);
|
||||
}
|
||||
}
|
||||
|
||||
if (SupportsSearch)
|
||||
{
|
||||
pageableRequests.AddTier();
|
||||
|
||||
var artistQuery = TextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
var artistTitles = TextSearchEngine == "raw" ? new List<string> { searchCriteria.ArtistQuery } : searchCriteria.CleanArtistTitles;
|
||||
var albumQuery = TextSearchEngine == "raw" ? searchCriteria.AlbumQuery : searchCriteria.CleanAlbumQuery;
|
||||
|
||||
var searchQuery = $"{artistQuery}+{albumQuery}";
|
||||
|
||||
if (artistQuery == albumQuery)
|
||||
foreach (var artistTitle in artistTitles)
|
||||
{
|
||||
searchQuery = $"{artistQuery}+{albumQuery}+{searchCriteria.AlbumYear}";
|
||||
}
|
||||
var searchQuery = $"{artistTitle}+{albumQuery}";
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
$"&q={NewsnabifyTitle(searchQuery)}"));
|
||||
if (artistTitle == albumQuery)
|
||||
{
|
||||
searchQuery = $"{artistTitle}+{albumQuery}+{searchCriteria.AlbumYear}";
|
||||
}
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
$"&q={NewsnabifyTitle(searchQuery)}"));
|
||||
}
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
|
|
@ -134,22 +140,28 @@ public virtual IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteri
|
|||
|
||||
if (SupportsAudioSearch)
|
||||
{
|
||||
var queryTitle = AudioTextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
var queryTitles = AudioTextSearchEngine == "raw" ? new List<string> { searchCriteria.ArtistQuery } : searchCriteria.CleanArtistTitles;
|
||||
|
||||
AddAudioPageableRequests(pageableRequests,
|
||||
searchCriteria,
|
||||
$"&artist={NewsnabifyTitle(queryTitle)}");
|
||||
foreach (var queryTitle in queryTitles)
|
||||
{
|
||||
AddAudioPageableRequests(pageableRequests,
|
||||
searchCriteria,
|
||||
$"&artist={NewsnabifyTitle(queryTitle)}");
|
||||
}
|
||||
}
|
||||
|
||||
if (SupportsSearch)
|
||||
{
|
||||
pageableRequests.AddTier();
|
||||
var queryTitle = TextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
var queryTitles = TextSearchEngine == "raw" ? new List<string> { searchCriteria.ArtistQuery } : searchCriteria.CleanArtistTitles;
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
foreach (var queryTitle in queryTitles)
|
||||
{
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
$"&q={NewsnabifyTitle(queryTitle)}"));
|
||||
}
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
|
|
@ -159,7 +171,7 @@ private void AddAudioPageableRequests(IndexerPageableRequestChain chain, SearchC
|
|||
{
|
||||
chain.AddTier();
|
||||
|
||||
chain.Add(GetPagedRequests(MaxPages, Settings.Categories, "music", $"&q={parameters}"));
|
||||
chain.Add(GetPagedRequests(MaxPages, Settings.Categories, "music", parameters));
|
||||
}
|
||||
|
||||
private IEnumerable<IndexerRequest> GetPagedRequests(int maxPages, IEnumerable<int> categories, string searchType, string parameters)
|
||||
|
|
|
|||
|
|
@ -21,11 +21,13 @@ public virtual IndexerPageableRequestChain GetRecentRequests()
|
|||
public virtual IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
var artistQuery = searchCriteria.CleanArtistQuery.Replace("+", " ").Trim();
|
||||
var albumQuery = searchCriteria.CleanAlbumQuery.Replace("+", " ").Trim();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(PrepareQuery($"{artistQuery} {albumQuery}")));
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
var artistQuery = artistTitle.Replace("+", " ").Trim();
|
||||
pageableRequests.Add(GetPagedRequests(PrepareQuery($"{artistQuery} {albumQuery}")));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
@ -34,9 +36,11 @@ public virtual IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteri
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
var artistQuery = searchCriteria.CleanArtistQuery.Replace("+", " ").Trim();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(PrepareQuery(artistQuery)));
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
var artistQuery = artistTitle.Replace("+", " ").Trim();
|
||||
pageableRequests.Add(GetPagedRequests(PrepareQuery(artistQuery)));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,13 +27,16 @@ public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchC
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
if (searchCriteria.CleanArtistQuery == "VA")
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
pageableRequests.Add(GetRequest($"groupname={searchCriteria.CleanAlbumQuery}"));
|
||||
}
|
||||
else
|
||||
{
|
||||
pageableRequests.Add(GetRequest($"artistname={searchCriteria.CleanArtistQuery}&groupname={searchCriteria.CleanAlbumQuery}"));
|
||||
if (artistTitle == "VA")
|
||||
{
|
||||
pageableRequests.Add(GetRequest($"groupname={searchCriteria.CleanAlbumQuery}"));
|
||||
}
|
||||
else
|
||||
{
|
||||
pageableRequests.Add(GetRequest($"artistname={artistTitle}&groupname={searchCriteria.CleanAlbumQuery}"));
|
||||
}
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
|
|
@ -42,7 +45,12 @@ public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchC
|
|||
public IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest($"artistname={searchCriteria.CleanArtistQuery}"));
|
||||
|
||||
foreach (var artistTitle in searchCriteria.CleanArtistTitles)
|
||||
{
|
||||
pageableRequests.Add(GetRequest($"artistname={artistTitle}"));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -55,6 +55,9 @@ public string ForeignArtistId
|
|||
get { return Metadata.Value.ForeignArtistId; } set { Metadata.Value.ForeignArtistId = value; }
|
||||
}
|
||||
|
||||
[MemberwiseEqualityIgnore]
|
||||
public string SearchName => Name;
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format("[{0}][{1}]", Metadata.Value.ForeignArtistId.NullSafe(), Metadata.Value.Name.NullSafe());
|
||||
|
|
|
|||
Loading…
Reference in a new issue