From f2b091dcd236ebb1d4a26f12b2b5ffcb622802b2 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 3 Jul 2011 15:32:36 -0700 Subject: [PATCH] Fixed issue with nzbs.org search where title contained brackets --- NzbDrone.Core.Test/IndexerTests.cs | 31 ++++++++--- .../Providers/Indexer/IndexerBase.cs | 14 +++-- NzbDrone.Web/Views/Settings/Quality.cshtml | 52 ++++++++----------- 3 files changed, 57 insertions(+), 40 deletions(-) diff --git a/NzbDrone.Core.Test/IndexerTests.cs b/NzbDrone.Core.Test/IndexerTests.cs index 69670f5b2..27320ed5e 100644 --- a/NzbDrone.Core.Test/IndexerTests.cs +++ b/NzbDrone.Core.Test/IndexerTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Net; using System.ServiceModel.Syndication; @@ -159,8 +160,9 @@ namespace NzbDrone.Core.Test ExceptionVerification.IgnoreWarns(); } - [Test] - public void nzbsorg_search_returns_valid_results() + [TestCase("simpsons", 21, 23)] + [TestCase("Hawaii Five-0 (2010)", 1, 5)] + public void nzbsorg_search_returns_valid_results(string title, int season, int episode) { var mocker = new AutoMoqer(); @@ -174,16 +176,16 @@ namespace NzbDrone.Core.Test mocker.Resolve(); - var result = mocker.Resolve().FetchEpisode("Simpsons", 21, 23); + var result = mocker.Resolve().FetchEpisode(title, season, episode); result.Should().NotBeEmpty(); - result.Should().OnlyContain(r => r.CleanTitle == "simpsons"); - result.Should().OnlyContain(r => r.SeasonNumber == 21); - result.Should().OnlyContain(r => r.EpisodeNumbers.Contains(23)); + result.Should().OnlyContain(r => r.CleanTitle == Parser.NormalizeTitle(title)); + result.Should().OnlyContain(r => r.SeasonNumber == season); + result.Should().OnlyContain(r => r.EpisodeNumbers.Contains(episode)); } [TestCase("simpsons", 21, 23)] - [TestCase("Hawaii Five-0 2010", 1, 5)] + [TestCase("Hawaii Five-0 (2010)", 1, 5)] public void newzbin_search_returns_valid_results(string title, int season, int episode) { var mocker = new AutoMoqer(); @@ -275,5 +277,20 @@ namespace NzbDrone.Core.Test result.Should().OnlyContain(r => r.SeasonNumber == 1); result.Should().OnlyContain(r => r.EpisodeNumbers.Contains(19)); } + + + [TestCase("hawaii five-0 (2010)", "hawaii+five+0+2010")] + [TestCase("this& that", "this+that")] + [TestCase("this& that", "this+that")] + public void get_query_title(string raw, string clean) + { + var result = IndexerBase.GetQueryTitle(raw); + + result.Should().Be(clean); + } + } + + + } diff --git a/NzbDrone.Core/Providers/Indexer/IndexerBase.cs b/NzbDrone.Core/Providers/Indexer/IndexerBase.cs index 79b07ef11..2f298f49b 100644 --- a/NzbDrone.Core/Providers/Indexer/IndexerBase.cs +++ b/NzbDrone.Core/Providers/Indexer/IndexerBase.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Net; using System.ServiceModel.Syndication; +using System.Text.RegularExpressions; using System.Web; using Ninject; using NLog; @@ -16,6 +17,8 @@ namespace NzbDrone.Core.Providers.Indexer private readonly HttpProvider _httpProvider; protected readonly ConfigProvider _configProvider; + private static readonly Regex TitleSearchRegex = new Regex(@"[\W]", RegexOptions.IgnoreCase | RegexOptions.Compiled); + [Inject] protected IndexerBase(HttpProvider httpProvider, ConfigProvider configProvider) { @@ -58,6 +61,7 @@ namespace NzbDrone.Core.Providers.Indexer /// The episode number. /// protected abstract IList GetSearchUrls(string seriesTitle, int seasonNumber, int episodeNumber); + public abstract IList GetSearchUrls(string seriesTitle, int seasonNumber, int episodeNumber); /// /// This method can be overwritten to provide indexer specific info parsing @@ -102,7 +106,7 @@ namespace NzbDrone.Core.Providers.Indexer var result = new List(); - var searchUrls = GetSearchUrls(HttpUtility.UrlDecode(seriesTitle), seasonNumber, episodeNumber); + var searchUrls = GetSearchUrls(GetQueryTitle(seriesTitle), seasonNumber, episodeNumber); foreach (var url in searchUrls) { @@ -165,9 +169,13 @@ namespace NzbDrone.Core.Providers.Indexer return CustomParser(item, episodeParseResult); } - protected static string GetQueryTitle(string title) + public static string GetQueryTitle(string title) { - return title.Trim().Replace(' ', '+'); + var cleanTitle = TitleSearchRegex.Replace(title, "+").Trim('+', ' '); + + //remove any repeating +s + cleanTitle = Regex.Replace(cleanTitle, @"\+{1,100}", "+"); + return cleanTitle; } } } \ No newline at end of file diff --git a/NzbDrone.Web/Views/Settings/Quality.cshtml b/NzbDrone.Web/Views/Settings/Quality.cshtml index 56422b3bf..c55ee18c3 100644 --- a/NzbDrone.Web/Views/Settings/Quality.cshtml +++ b/NzbDrone.Web/Views/Settings/Quality.cshtml @@ -1,33 +1,26 @@ @using NzbDrone.Web.Helpers; @model NzbDrone.Web.Models.QualityModel - @section HeaderContent{ - - - - - + + } - @section TitleContent{ - Settings +Settings } - @section ActionMenu{ @{Html.RenderPartial("SubMenu");} } - @section MainContent{ -
- @using (Html.BeginForm("SaveQuality", "Settings", FormMethod.Post, new { id = "form", name = "form" })) - { +
+ @using (Html.BeginForm("SaveQuality", "Settings", FormMethod.Post, new { id = "form", name = "form" })) + {
-

Quality

-

+

+ Quality

+

+

@Html.DropDownListFor(m => m.DefaultQualityProfileId, Model.QualityProfileSelectList, new { @class = "inputClass" })
@@ -36,9 +29,9 @@
- Add New Profile Add New Profile + Add New Profile + Add New Profile
-
@foreach (var item in Model.Profiles) { @@ -46,21 +39,20 @@ }
- - Loader + Loader
- } -
- -
+ } + +
+
} - @section Scripts{ - + -