Fixed: Attempt to fix uncaught exceptions fetching book data

Closes #1465
Closes #1464
pull/1470/head
ta264 3 years ago
parent 3ea0c8e5fa
commit 565fb77713

@ -0,0 +1,27 @@
using NzbDrone.Common.Exceptions;
namespace NzbDrone.Core.Exceptions
{
public class EditionNotFoundException : NzbDroneException
{
public string MusicBrainzId { get; set; }
public EditionNotFoundException(string musicbrainzId)
: base(string.Format("Edition with id {0} was not found, it may have been removed from metadata server.", musicbrainzId))
{
MusicBrainzId = musicbrainzId;
}
public EditionNotFoundException(string musicbrainzId, string message, params object[] args)
: base(message, args)
{
MusicBrainzId = musicbrainzId;
}
public EditionNotFoundException(string musicbrainzId, string message)
: base(message)
{
MusicBrainzId = musicbrainzId;
}
}
}

@ -82,12 +82,20 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
{ {
_logger.Debug("Getting Author details GoodreadsId of {0}", foreignAuthorId); _logger.Debug("Getting Author details GoodreadsId of {0}", foreignAuthorId);
if (useCache) try
{ {
return PollAuthor(foreignAuthorId); if (useCache)
} {
return PollAuthor(foreignAuthorId);
}
return PollAuthorUncached(foreignAuthorId); return PollAuthorUncached(foreignAuthorId);
}
catch (BookInfoException e)
{
_logger.Warn(e, "Unexpected error getting author info");
throw new AuthorNotFoundException(foreignAuthorId);
}
} }
public HashSet<string> GetChangedBooks(DateTime startTime) public HashSet<string> GetChangedBooks(DateTime startTime)
@ -102,7 +110,15 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
public Tuple<string, Book, List<AuthorMetadata>> GetBookInfo(string foreignBookId) public Tuple<string, Book, List<AuthorMetadata>> GetBookInfo(string foreignBookId)
{ {
return PollBook(foreignBookId); try
{
return PollBook(foreignBookId);
}
catch (BookInfoException e)
{
_logger.Warn(e, "Unexpected error getting book info");
throw new AuthorNotFoundException(foreignBookId);
}
} }
public List<object> SearchForNewEntity(string title) public List<object> SearchForNewEntity(string title)
@ -211,7 +227,17 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
private List<Book> Search(string query, bool getAllEditions) private List<Book> Search(string query, bool getAllEditions)
{ {
var result = _goodreadsSearchProxy.Search(query); List<SearchJsonResource> result;
try
{
result = _goodreadsSearchProxy.Search(query);
}
catch (Exception e)
{
_logger.Warn(e, "Error searching for {0}", query);
return new List<Book>();
}
var books = new List<Book>(); var books = new List<Book>();
if (getAllEditions) if (getAllEditions)
@ -250,18 +276,19 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
if (ids.Count == 1) if (ids.Count == 1)
{ {
try return SearchByGoodreadsBookId(ids[0], false);
{ }
return SearchByGoodreadsBookId(ids[0], false);
} try
catch (BookNotFoundException) {
{ return MapSearchResult(ids);
_logger.Debug($"Couldn't fetch book info for {ids[0]}");
return new List<Book>();
}
} }
catch (Exception e)
{
_logger.Warn(e, "Error mapping search results");
return MapSearchResult(ids); return new List<Book>();
}
} }
} }
@ -285,6 +312,11 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
{ {
return new List<Book>(); return new List<Book>();
} }
catch (BookInfoException e)
{
_logger.Warn(e, "Error searching by author id");
return new List<Book>();
}
} }
public List<Book> SearchByGoodreadsWorkId(int id) public List<Book> SearchByGoodreadsWorkId(int id)
@ -299,9 +331,41 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
{ {
return new List<Book>(); return new List<Book>();
} }
catch (BookInfoException e)
{
_logger.Warn(e, "Error searching by work id");
return new List<Book>();
}
} }
public List<Book> SearchByGoodreadsBookId(int id, bool getAllEditions) public List<Book> SearchByGoodreadsBookId(int id, bool getAllEditions)
{
try
{
var book = GetEditionInfo(id, getAllEditions);
return new List<Book> { book };
}
catch (AuthorNotFoundException)
{
return new List<Book>();
}
catch (BookNotFoundException)
{
return new List<Book>();
}
catch (EditionNotFoundException)
{
return new List<Book>();
}
catch (BookInfoException e)
{
_logger.Warn(e, "Error searching by book id");
return new List<Book>();
}
}
private Book GetEditionInfo(int id, bool getAllEditions)
{ {
var httpRequest = _requestBuilder.GetRequestBuilder().Create() var httpRequest = _requestBuilder.GetRequestBuilder().Create()
.SetSegment("route", $"book/{id}") .SetSegment("route", $"book/{id}")
@ -314,7 +378,7 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
if (httpResponse.StatusCode == HttpStatusCode.NotFound) if (httpResponse.StatusCode == HttpStatusCode.NotFound)
{ {
return new List<Book>(); throw new EditionNotFoundException(id.ToString());
} }
if (!httpResponse.HasHttpRedirect) if (!httpResponse.HasHttpRedirect)
@ -349,9 +413,9 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
throw new NotImplementedException($"Unexpected response from {httpResponse.Request.Url}"); throw new NotImplementedException($"Unexpected response from {httpResponse.Request.Url}");
} }
if (book == null) if (book == null || book.Editions.Value.All(e => e.ForeignEditionId != id.ToString()))
{ {
return new List<Book>(); throw new EditionNotFoundException(id.ToString());
} }
if (!getAllEditions) if (!getAllEditions)
@ -362,20 +426,15 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
trimmed.AuthorMetadata = book.AuthorMetadata.Value; trimmed.AuthorMetadata = book.AuthorMetadata.Value;
trimmed.SeriesLinks = book.SeriesLinks; trimmed.SeriesLinks = book.SeriesLinks;
var edition = book.Editions.Value.SingleOrDefault(e => e.ForeignEditionId == id.ToString()); var edition = book.Editions.Value.SingleOrDefault(e => e.ForeignEditionId == id.ToString());
if (edition == null)
{
return new List<Book>();
}
trimmed.Editions = new List<Edition> { edition }; trimmed.Editions = new List<Edition> { edition };
return trimmed;
return new List<Book> { trimmed };
} }
var authorDict = authors.ToDictionary(x => x.ForeignAuthorId); var authorDict = authors.ToDictionary(x => x.ForeignAuthorId);
AddDbIds(book.AuthorMetadata.Value.ForeignAuthorId, book, authorDict); AddDbIds(book.AuthorMetadata.Value.ForeignAuthorId, book, authorDict);
return new List<Book> { book }; return book;
} }
private List<Book> MapSearchResult(List<int> ids) private List<Book> MapSearchResult(List<int> ids)
@ -454,7 +513,10 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
if (author == null) if (author == null)
{ {
var metadata = authors[authorId]; if (!authors.TryGetValue(authorId, out var metadata))
{
throw new BookInfoException(string.Format("Expected author metadata for id [{0}] in book data {1}", authorId, book));
}
author = new Author author = new Author
{ {
@ -502,7 +564,7 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
} }
else else
{ {
throw new HttpException(httpRequest, httpResponse); throw new BookInfoException("Unexpected error fetching author data");
} }
} }
@ -582,7 +644,7 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
} }
else else
{ {
throw new HttpException(httpRequest, httpResponse); throw new BookInfoException("Unexpected response fetching book data");
} }
} }
@ -596,7 +658,7 @@ namespace NzbDrone.Core.MetadataSource.BookInfo
Thread.Sleep(2000); Thread.Sleep(2000);
} }
if (resource?.Books == null) if (resource?.Books == null || resource?.Authors == null || (!resource?.Authors?.Any() ?? false))
{ {
throw new BookInfoException($"Failed to get books for {foreignBookId}"); throw new BookInfoException($"Failed to get books for {foreignBookId}");
} }

Loading…
Cancel
Save