From dc7b5b52dcd782042dac7e402b2ba2a9e334a2f8 Mon Sep 17 00:00:00 2001 From: Qstick Date: Mon, 28 Jun 2021 22:02:09 -0400 Subject: [PATCH] Added searchEngine support in Newznab/Torznab caps Co-Authored-By: Taloth (cherry picked from commit eb76dd5248988c8101d9414aef0215f01f81cf00) --- .../SearchDefinitionFixture.cs | 6 +-- .../NewznabCapabilitiesProviderFixture.cs | 25 ++++++++++- .../Definitions/AlbumSearchCriteria.cs | 3 +- .../Definitions/SearchCriteriaBase.cs | 3 +- .../FileList/FileListRequestGenerator.cs | 4 +- .../Gazelle/GazelleRequestGenerator.cs | 4 +- .../Headphones/HeadphonesRequestGenerator.cs | 4 +- .../Indexers/Newznab/NewznabCapabilities.cs | 4 ++ .../Newznab/NewznabCapabilitiesProvider.cs | 19 +++++++-- .../Newznab/NewznabRequestGenerator.cs | 41 ++++++++++++++++--- .../Indexers/Rarbg/RarbgRequestGenerator.cs | 4 +- .../Redacted/RedactedRequestGenerator.cs | 4 +- 12 files changed, 95 insertions(+), 26 deletions(-) diff --git a/src/NzbDrone.Core.Test/IndexerSearchTests/SearchDefinitionFixture.cs b/src/NzbDrone.Core.Test/IndexerSearchTests/SearchDefinitionFixture.cs index a0a921ce8..4cce55185 100644 --- a/src/NzbDrone.Core.Test/IndexerSearchTests/SearchDefinitionFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerSearchTests/SearchDefinitionFixture.cs @@ -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); } } } diff --git a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabCapabilitiesProviderFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabCapabilitiesProviderFixture.cs index f7afd220d..c36b4dd75 100644 --- a/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabCapabilitiesProviderFixture.cs +++ b/src/NzbDrone.Core.Test/IndexerTests/NewznabTests/NewznabCapabilitiesProviderFixture.cs @@ -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(" 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() { diff --git a/src/NzbDrone.Core/IndexerSearch/Definitions/SearchCriteriaBase.cs b/src/NzbDrone.Core/IndexerSearch/Definitions/SearchCriteriaBase.cs index 8dbbe7b6c..087087658 100644 --- a/src/NzbDrone.Core/IndexerSearch/Definitions/SearchCriteriaBase.cs +++ b/src/NzbDrone.Core/IndexerSearch/Definitions/SearchCriteriaBase.cs @@ -20,7 +20,8 @@ namespace NzbDrone.Core.IndexerSearch.Definitions public List Albums { get; set; } public List 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) { diff --git a/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs b/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs index 42748ff38..df7c47dba 100644 --- a/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/FileList/FileListRequestGenerator.cs @@ -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; } diff --git a/src/NzbDrone.Core/Indexers/Gazelle/GazelleRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Gazelle/GazelleRequestGenerator.cs index 1353fcc5c..a43630fa4 100644 --- a/src/NzbDrone.Core/Indexers/Gazelle/GazelleRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Gazelle/GazelleRequestGenerator.cs @@ -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; } diff --git a/src/NzbDrone.Core/Indexers/Headphones/HeadphonesRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Headphones/HeadphonesRequestGenerator.cs index 882f33e5e..88ae02afb 100644 --- a/src/NzbDrone.Core/Indexers/Headphones/HeadphonesRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Headphones/HeadphonesRequestGenerator.cs @@ -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; } diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilities.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilities.cs index 035915704..2fa6cf0ec 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilities.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilities.cs @@ -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 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(); } } diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilitiesProvider.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilitiesProvider.cs index 46d9b14e4..5de9805b7 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilitiesProvider.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabCapabilitiesProvider.cs @@ -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; } } diff --git a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs index f7f167b34..9b4022a23 100644 --- a/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Newznab/NewznabRequestGenerator.cs @@ -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; diff --git a/src/NzbDrone.Core/Indexers/Rarbg/RarbgRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Rarbg/RarbgRequestGenerator.cs index a1fae523c..d36a5332a 100644 --- a/src/NzbDrone.Core/Indexers/Rarbg/RarbgRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Rarbg/RarbgRequestGenerator.cs @@ -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; } diff --git a/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs b/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs index a20ceaa69..9e5487960 100644 --- a/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs +++ b/src/NzbDrone.Core/Indexers/Redacted/RedactedRequestGenerator.cs @@ -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; }