mirror of
https://github.com/Readarr/Readarr
synced 2025-12-24 09:12:51 +01:00
Fixed: Parse series for search results
This commit is contained in:
parent
110e867bd3
commit
9be948b7cc
3 changed files with 61 additions and 0 deletions
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
|
|
@ -54,6 +55,17 @@ public void should_be_able_to_get_book_detail(string mbId, string 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]
|
||||
public void getting_details_of_invalid_author()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using FluentAssertions;
|
||||
using Moq;
|
||||
using NUnit.Framework;
|
||||
|
|
@ -104,5 +105,16 @@ public void successful_combined_search(string query, int position, Type resultTy
|
|||
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 @@ 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(@"\((?<series>[^,]+),\s+#(?<position>[\w\d\.]+)\)$",
|
||||
RegexOptions.Compiled);
|
||||
|
||||
private readonly ICachedHttpResponseService _cachedHttpClient;
|
||||
private readonly Logger _logger;
|
||||
private readonly IAuthorService _authorService;
|
||||
|
|
@ -657,6 +660,8 @@ private static Book MapBook(BookResource resource)
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -794,8 +799,40 @@ private Book MapJsonSearchResult(SearchJsonResource resource)
|
|||
book.Author = author;
|
||||
book.AuthorMetadata = book.Author.Value.Metadata.Value;
|
||||
book.CleanTitle = book.Title.CleanAuthorName();
|
||||
book.SeriesLinks = MapSearchSeries(resource.Title, resource.BookTitleBare);
|
||||
|
||||
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…
Reference in a new issue