This commit is contained in:
Dante 2025-11-21 17:59:03 +00:00 committed by GitHub
commit cc1b8c859d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 132 additions and 63 deletions

View file

@ -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

View file

@ -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})]";
}
}
}

View file

@ -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)
{

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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)

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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());