Fixed: Parse series for search results

pull/965/head
ta264 4 years ago
parent 110e867bd3
commit 9be948b7cc

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
@ -54,6 +55,17 @@ namespace NzbDrone.Core.Test.MetadataSource.Goodreads
details.Item2.Title.Should().Be(name); details.Item2.Title.Should().Be(name);
} }
[TestCase("54837483", "The Book of Dust", "1")]
[TestCase("28360360", "October Daye", "9.3")]
public void should_parse_series_from_title(string id, string series, string position)
{
var result = Subject.GetBookInfo(id);
var link = result.Item2.SeriesLinks.Value.First();
link.Series.Value.Title.Should().Be(series);
link.Position.Should().Be(position);
}
[Test] [Test]
public void getting_details_of_invalid_author() public void getting_details_of_invalid_author()
{ {

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using FluentAssertions; using FluentAssertions;
using Moq; using Moq;
using NUnit.Framework; using NUnit.Framework;
@ -104,5 +105,16 @@ namespace NzbDrone.Core.Test.MetadataSource.Goodreads
cast.Title.Should().Be(expected); cast.Title.Should().Be(expected);
} }
} }
[TestCase("B01N390U59", "The Book of Dust", "1")]
[TestCase("B0191WS1EE", "October Daye", "9.3")]
public void should_parse_series_from_title(string query, string series, string position)
{
var result = Subject.SearchByField("field", query);
var link = result.First().SeriesLinks.Value.First();
link.Series.Value.Title.Should().Be(series);
link.Position.Should().Be(position);
}
} }
} }

@ -28,6 +28,9 @@ namespace NzbDrone.Core.MetadataSource.Goodreads
private static readonly Regex NoPhotoRegex = new Regex(@"/nophoto/(book|user)/", private static readonly Regex NoPhotoRegex = new Regex(@"/nophoto/(book|user)/",
RegexOptions.IgnoreCase | RegexOptions.Compiled); RegexOptions.IgnoreCase | RegexOptions.Compiled);
private static readonly Regex SeriesRegex = new Regex(@"\((?<series>[^,]+),\s+#(?<position>[\w\d\.]+)\)$",
RegexOptions.Compiled);
private readonly ICachedHttpResponseService _cachedHttpClient; private readonly ICachedHttpResponseService _cachedHttpClient;
private readonly Logger _logger; private readonly Logger _logger;
private readonly IAuthorService _authorService; private readonly IAuthorService _authorService;
@ -657,6 +660,8 @@ namespace NzbDrone.Core.MetadataSource.Goodreads
Debug.Assert(!book.Editions.Value.Any() || book.Editions.Value.Count(x => x.Monitored) == 1, "one edition monitored"); Debug.Assert(!book.Editions.Value.Any() || book.Editions.Value.Count(x => x.Monitored) == 1, "one edition monitored");
book.SeriesLinks = MapSearchSeries(resource.Title, resource.TitleWithoutSeries);
return book; return book;
} }
@ -794,8 +799,40 @@ namespace NzbDrone.Core.MetadataSource.Goodreads
book.Author = author; book.Author = author;
book.AuthorMetadata = book.Author.Value.Metadata.Value; book.AuthorMetadata = book.Author.Value.Metadata.Value;
book.CleanTitle = book.Title.CleanAuthorName(); book.CleanTitle = book.Title.CleanAuthorName();
book.SeriesLinks = MapSearchSeries(resource.Title, resource.BookTitleBare);
return book; return book;
} }
private static List<SeriesBookLink> 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)
{
var series = match.Groups["series"].Value;
var position = match.Groups["position"].Value;
return new List<SeriesBookLink>
{
new SeriesBookLink
{
Series = new Series
{
Title = series
},
Position = position
}
};
}
}
return null;
}
} }
} }

Loading…
Cancel
Save