From 17535bd8d6bc79590ddbdc68fa299fd0555ca7d7 Mon Sep 17 00:00:00 2001 From: ta264 Date: Wed, 1 Sep 2021 21:04:39 +0100 Subject: [PATCH] Fixed: Better detection of series in search results --- .../Goodreads/GoodreadsProxySearchFixture.cs | 11 ++++++ .../Goodreads/GoodreadsProxy.cs | 38 +++++++++++-------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/NzbDrone.Core.Test/MetadataSource/Goodreads/GoodreadsProxySearchFixture.cs b/src/NzbDrone.Core.Test/MetadataSource/Goodreads/GoodreadsProxySearchFixture.cs index 9e8d11fdb..c2db0c911 100644 --- a/src/NzbDrone.Core.Test/MetadataSource/Goodreads/GoodreadsProxySearchFixture.cs +++ b/src/NzbDrone.Core.Test/MetadataSource/Goodreads/GoodreadsProxySearchFixture.cs @@ -116,5 +116,16 @@ public void should_parse_series_from_title(string query, string series, string p link.Series.Value.Title.Should().Be(series); link.Position.Should().Be(position); } + + [TestCase("Imperium: A Novel of Ancient Rome (Cicero, #1)", "Imperium: A Novel of Ancient Rome", "Cicero", "1")] + [TestCase("Sons of Valor (The Tier One Shared-World Series Book 1)", "Sons of Valor", "Tier One Shared-World", "1")] + public void should_map_series_for_search(string title, string titleWithoutSeries, string series, string position) + { + var result = GoodreadsProxy.MapSearchSeries(title, titleWithoutSeries); + + result.Should().HaveCount(1); + result[0].Series.Value.Title.Should().Be(series); + result[0].Position.Should().Be(position); + } } } diff --git a/src/NzbDrone.Core/MetadataSource/Goodreads/GoodreadsProxy.cs b/src/NzbDrone.Core/MetadataSource/Goodreads/GoodreadsProxy.cs index 7895a4436..11ebff51b 100644 --- a/src/NzbDrone.Core/MetadataSource/Goodreads/GoodreadsProxy.cs +++ b/src/NzbDrone.Core/MetadataSource/Goodreads/GoodreadsProxy.cs @@ -28,8 +28,11 @@ public class GoodreadsProxy : IProvideAuthorInfo, ISearchForNewAuthor, IProvideB private static readonly Regex NoPhotoRegex = new Regex(@"/nophoto/(book|user)/", RegexOptions.IgnoreCase | RegexOptions.Compiled); - private static readonly Regex SeriesRegex = new Regex(@"\((?[^,]+),\s+#(?[\w\d\.]+)\)$", - RegexOptions.Compiled); + private static readonly List SeriesRegex = new List + { + new Regex(@"\((?[^,]+),\s+#(?[\w\d\.]+)\)$", RegexOptions.Compiled), + new Regex(@"(The\s+(?.+)\s+Series\s+Book\s+(?[\w\d\.]+)\)$)", RegexOptions.Compiled) + }; private readonly ICachedHttpResponseService _cachedHttpClient; private readonly Logger _logger; @@ -841,31 +844,34 @@ private Book MapJsonSearchResult(SearchJsonResource resource, Action ap return book; } - private static List MapSearchSeries(string title, string titleWithoutSeries) + public static List MapSearchSeries(string title, string titleWithoutSeries) { if (title != titleWithoutSeries && title.Substring(0, titleWithoutSeries.Length) == titleWithoutSeries) { var seriesText = title.Substring(titleWithoutSeries.Length); - var match = SeriesRegex.Match(seriesText); - - if (match.Success) + foreach (var regex in SeriesRegex) { - var series = match.Groups["series"].Value; - var position = match.Groups["position"].Value; + var match = regex.Match(seriesText); - return new List + if (match.Success) { - new SeriesBookLink + var series = match.Groups["series"].Value; + var position = match.Groups["position"].Value; + + return new List { - Series = new Series + new SeriesBookLink { - Title = series - }, - Position = position - } - }; + Series = new Series + { + Title = series + }, + Position = position + } + }; + } } }