Added searchEngine support in Newznab/Torznab caps

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
(cherry picked from commit eb76dd5248988c8101d9414aef0215f01f81cf00)
pull/3017/head
Qstick 3 years ago
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…
Cancel
Save