mirror of https://github.com/lidarr/Lidarr
Added searchEngine support in Newznab/Torznab caps
Co-Authored-By: Taloth <Taloth@users.noreply.github.com> (cherry picked from commit eb76dd5248988c8101d9414aef0215f01f81cf00)
This commit is contained in:
parent
24c2b1519f
commit
dc7b5b52dc
|
@ -13,7 +13,7 @@ namespace NzbDrone.Core.Test.IndexerSearchTests
|
|||
public void should_replace_some_special_characters_artist(string artist, string expected)
|
||||
{
|
||||
Subject.Artist = new Artist { Name = artist };
|
||||
Subject.ArtistQuery.Should().Be(expected);
|
||||
Subject.CleanArtistQuery.Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("…and Justice for All", "and+Justice+for+All")]
|
||||
|
@ -25,14 +25,14 @@ namespace NzbDrone.Core.Test.IndexerSearchTests
|
|||
public void should_replace_some_special_characters(string album, string expected)
|
||||
{
|
||||
Subject.AlbumTitle = album;
|
||||
Subject.AlbumQuery.Should().Be(expected);
|
||||
Subject.CleanAlbumQuery.Should().Be(expected);
|
||||
}
|
||||
|
||||
[TestCase("+", "+")]
|
||||
public void should_not_replace_some_special_characters_if_result_empty_string(string album, string expected)
|
||||
{
|
||||
Subject.AlbumTitle = album;
|
||||
Subject.AlbumQuery.Should().Be(expected);
|
||||
Subject.CleanAlbumQuery.Should().Be(expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Xml;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
|
@ -97,5 +97,28 @@ namespace NzbDrone.Core.Test.IndexerTests.NewznabTests
|
|||
|
||||
ExceptionVerification.ExpectedErrors(1);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_use_default_searchengine_if_missing()
|
||||
{
|
||||
GivenCapsResponse(_caps);
|
||||
|
||||
var caps = Subject.GetCapabilities(_settings);
|
||||
|
||||
caps.TextSearchEngine.Should().Be("sphinx");
|
||||
caps.AudioTextSearchEngine.Should().Be("sphinx");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void should_use_specified_searchengine()
|
||||
{
|
||||
GivenCapsResponse(_caps.Replace("<search ", "<search searchEngine=\"raw\" ")
|
||||
.Replace("<audio-search ", "<audio-search searchEngine=\"raw2\" "));
|
||||
|
||||
var caps = Subject.GetCapabilities(_settings);
|
||||
|
||||
caps.TextSearchEngine.Should().Be("raw");
|
||||
caps.AudioTextSearchEngine.Should().Be("raw2");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,8 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
|
|||
public int AlbumYear { get; set; }
|
||||
public string Disambiguation { get; set; }
|
||||
|
||||
public string AlbumQuery => GetQueryTitle($"{AlbumTitle}{(Disambiguation.IsNullOrWhiteSpace() ? string.Empty : $"+{Disambiguation}")}");
|
||||
public string AlbumQuery => $"{AlbumTitle}{(Disambiguation.IsNullOrWhiteSpace() ? string.Empty : $"+{Disambiguation}")}";
|
||||
public string CleanAlbumQuery => GetQueryTitle(AlbumQuery);
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
|
|
|
@ -20,7 +20,8 @@ namespace NzbDrone.Core.IndexerSearch.Definitions
|
|||
public List<Album> Albums { get; set; }
|
||||
public List<Track> Tracks { get; set; }
|
||||
|
||||
public string ArtistQuery => GetQueryTitle(Artist.Name);
|
||||
public string ArtistQuery => Artist.Name;
|
||||
public string CleanArtistQuery => GetQueryTitle(ArtistQuery);
|
||||
|
||||
public static string GetQueryTitle(string title)
|
||||
{
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace NzbDrone.Core.Indexers.FileList
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}+{1}", Uri.EscapeDataString(searchCriteria.ArtistQuery.Trim()), Uri.EscapeDataString(searchCriteria.AlbumQuery.Trim()))));
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}+{1}", Uri.EscapeDataString(searchCriteria.CleanArtistQuery.Trim()), Uri.EscapeDataString(searchCriteria.CleanAlbumQuery.Trim()))));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ namespace NzbDrone.Core.Indexers.FileList
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}", Uri.EscapeDataString(searchCriteria.ArtistQuery.Trim()))));
|
||||
pageableRequests.Add(GetRequest("search-torrents", Settings.Categories, string.Format("&type=name&query={0}", Uri.EscapeDataString(searchCriteria.CleanArtistQuery.Trim()))));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
|
@ -30,14 +30,14 @@ namespace NzbDrone.Core.Indexers.Gazelle
|
|||
public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", searchCriteria.ArtistQuery, searchCriteria.AlbumQuery)));
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", searchCriteria.CleanArtistQuery, searchCriteria.CleanAlbumQuery)));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}", searchCriteria.ArtistQuery)));
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}", searchCriteria.CleanArtistQuery)));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ namespace NzbDrone.Core.Indexers.Headphones
|
|||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
NewsnabifyTitle($"&q={searchCriteria.ArtistQuery}+{searchCriteria.AlbumQuery}")));
|
||||
NewsnabifyTitle($"&q={searchCriteria.CleanArtistQuery}+{searchCriteria.CleanAlbumQuery}")));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ namespace NzbDrone.Core.Indexers.Headphones
|
|||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
NewsnabifyTitle($"&q={searchCriteria.ArtistQuery}")));
|
||||
NewsnabifyTitle($"&q={searchCriteria.CleanArtistQuery}")));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
|
@ -10,6 +10,8 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||
public string[] SupportedTvSearchParameters { get; set; }
|
||||
public string[] SupportedAudioSearchParameters { get; set; }
|
||||
public bool SupportsAggregateIdSearch { get; set; }
|
||||
public string TextSearchEngine { get; set; }
|
||||
public string AudioTextSearchEngine { get; set; }
|
||||
public List<NewznabCategory> Categories { get; set; }
|
||||
|
||||
public NewznabCapabilities()
|
||||
|
@ -20,6 +22,8 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||
SupportedTvSearchParameters = new[] { "q", "rid", "season", "ep" }; // This should remain 'rid' for older newznab installs.
|
||||
SupportedAudioSearchParameters = new[] { "q", "artist", "album" };
|
||||
SupportsAggregateIdSearch = false;
|
||||
TextSearchEngine = "sphinx"; // This should remain 'sphinx' for older newznab installs
|
||||
AudioTextSearchEngine = "sphinx"; // This should remain 'sphinx' for older newznab installs
|
||||
Categories = new List<NewznabCategory>();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -118,9 +118,14 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||
{
|
||||
capabilities.SupportedSearchParameters = null;
|
||||
}
|
||||
else if (xmlBasicSearch.Attribute("supportedParams") != null)
|
||||
else
|
||||
{
|
||||
capabilities.SupportedSearchParameters = xmlBasicSearch.Attribute("supportedParams").Value.Split(',');
|
||||
if (xmlBasicSearch.Attribute("supportedParams") != null)
|
||||
{
|
||||
capabilities.SupportedSearchParameters = xmlBasicSearch.Attribute("supportedParams").Value.Split(',');
|
||||
}
|
||||
|
||||
capabilities.TextSearchEngine = xmlBasicSearch.Attribute("searchEngine")?.Value ?? capabilities.TextSearchEngine;
|
||||
}
|
||||
|
||||
var xmlTvSearch = xmlSearching.Element("tv-search");
|
||||
|
@ -139,9 +144,15 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||
{
|
||||
capabilities.SupportedAudioSearchParameters = null;
|
||||
}
|
||||
else if (xmlAudioSearch.Attribute("supportedParams") != null)
|
||||
else
|
||||
{
|
||||
capabilities.SupportedAudioSearchParameters = xmlAudioSearch.Attribute("supportedParams").Value.Split(',');
|
||||
if (xmlAudioSearch.Attribute("supportedParams") != null)
|
||||
{
|
||||
capabilities.SupportedAudioSearchParameters = xmlAudioSearch.Attribute("supportedParams").Value.Split(',');
|
||||
capabilities.SupportsAggregateIdSearch = true;
|
||||
}
|
||||
|
||||
capabilities.AudioTextSearchEngine = xmlAudioSearch.Attribute("searchEngine")?.Value ?? capabilities.AudioTextSearchEngine;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,26 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||
}
|
||||
}
|
||||
|
||||
private string TextSearchEngine
|
||||
{
|
||||
get
|
||||
{
|
||||
var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
|
||||
|
||||
return capabilities.TextSearchEngine;
|
||||
}
|
||||
}
|
||||
|
||||
private string AudioTextSearchEngine
|
||||
{
|
||||
get
|
||||
{
|
||||
var capabilities = _capabilitiesProvider.GetCapabilities(Settings);
|
||||
|
||||
return capabilities.AudioTextSearchEngine;
|
||||
}
|
||||
}
|
||||
|
||||
public virtual IndexerPageableRequestChain GetRecentRequests()
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
@ -69,19 +89,25 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||
|
||||
if (SupportsAudioSearch)
|
||||
{
|
||||
var artistQuery = AudioTextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
var albumQuery = AudioTextSearchEngine == "raw" ? searchCriteria.AlbumQuery : searchCriteria.CleanAlbumQuery;
|
||||
|
||||
AddAudioPageableRequests(pageableRequests,
|
||||
searchCriteria,
|
||||
NewsnabifyTitle($"&artist={searchCriteria.ArtistQuery}&album={searchCriteria.AlbumQuery}"));
|
||||
NewsnabifyTitle($"&artist={artistQuery}&album={albumQuery}"));
|
||||
}
|
||||
|
||||
if (SupportsSearch)
|
||||
{
|
||||
pageableRequests.AddTier();
|
||||
|
||||
var artistQuery = TextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
var albumQuery = TextSearchEngine == "raw" ? searchCriteria.AlbumQuery : searchCriteria.CleanAlbumQuery;
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
NewsnabifyTitle($"&q={searchCriteria.ArtistQuery}+{searchCriteria.AlbumQuery}")));
|
||||
NewsnabifyTitle($"&q={artistQuery}+{albumQuery}")));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
|
@ -93,19 +119,22 @@ namespace NzbDrone.Core.Indexers.Newznab
|
|||
|
||||
if (SupportsAudioSearch)
|
||||
{
|
||||
var queryTitle = AudioTextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
|
||||
AddAudioPageableRequests(pageableRequests,
|
||||
searchCriteria,
|
||||
NewsnabifyTitle($"&artist={searchCriteria.ArtistQuery}"));
|
||||
NewsnabifyTitle($"&artist={queryTitle}"));
|
||||
}
|
||||
|
||||
if (SupportsSearch)
|
||||
{
|
||||
pageableRequests.AddTier();
|
||||
var queryTitle = TextSearchEngine == "raw" ? searchCriteria.ArtistQuery : searchCriteria.CleanArtistQuery;
|
||||
|
||||
pageableRequests.Add(GetPagedRequests(MaxPages,
|
||||
Settings.Categories,
|
||||
"search",
|
||||
NewsnabifyTitle($"&q={searchCriteria.ArtistQuery}")));
|
||||
Settings.Categories,
|
||||
"search",
|
||||
NewsnabifyTitle($"&q={queryTitle}")));
|
||||
}
|
||||
|
||||
return pageableRequests;
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace NzbDrone.Core.Indexers.Rarbg
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests("search", null, "{0}+{1}", searchCriteria.ArtistQuery, searchCriteria.AlbumQuery));
|
||||
pageableRequests.Add(GetPagedRequests("search", null, "{0}+{1}", searchCriteria.CleanArtistQuery, searchCriteria.CleanAlbumQuery));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
@ -39,7 +39,7 @@ namespace NzbDrone.Core.Indexers.Rarbg
|
|||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(GetPagedRequests("search", null, "{0}", searchCriteria.ArtistQuery));
|
||||
pageableRequests.Add(GetPagedRequests("search", null, "{0}", searchCriteria.CleanArtistQuery));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
|
|
@ -28,14 +28,14 @@ namespace NzbDrone.Core.Indexers.Redacted
|
|||
public IndexerPageableRequestChain GetSearchRequests(AlbumSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", searchCriteria.ArtistQuery, searchCriteria.AlbumQuery)));
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}&groupname={1}", searchCriteria.CleanArtistQuery, searchCriteria.CleanAlbumQuery)));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(ArtistSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}", searchCriteria.ArtistQuery)));
|
||||
pageableRequests.Add(GetRequest(string.Format("&artistname={0}", searchCriteria.CleanArtistQuery)));
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue