public SeriesResource GetSeriesInfo(int foreignSeriesId, bool useCache = true) { _logger.Debug("Getting Series with GoodreadsId of {0}", foreignSeriesId); var httpRequest = _requestBuilder.Create() .SetSegment("route", $"series/{foreignSeriesId}") .AddQueryParam("format", "xml") .Build(); httpRequest.AllowAutoRedirect = true; httpRequest.SuppressHttpError = true; var httpResponse = _cachedHttpClient.Get(httpRequest, useCache, TimeSpan.FromDays(7)); if (httpResponse.HasHttpError) { if (httpResponse.StatusCode == HttpStatusCode.BadRequest) { throw new BadRequestException(foreignSeriesId.ToString()); } else { throw new HttpException(httpRequest, httpResponse); } } var resource = httpResponse.Deserialize <ShowSeriesResource>(); return(resource.Series); }
public Author GetAuthorInfo(string foreignAuthorId, bool useCache = true) { _logger.Debug("Getting Author details GoodreadsId of {0}", foreignAuthorId); var httpRequest = _requestBuilder.Create() .SetSegment("route", $"author/show/{foreignAuthorId}.xml") .AddQueryParam("exclude_books", "true") .Build(); httpRequest.AllowAutoRedirect = true; httpRequest.SuppressHttpError = true; var httpResponse = _cachedHttpClient.Get(httpRequest, useCache, TimeSpan.FromDays(30)); if (httpResponse.HasHttpError) { if (httpResponse.StatusCode == HttpStatusCode.NotFound) { throw new AuthorNotFoundException(foreignAuthorId); } else if (httpResponse.StatusCode == HttpStatusCode.BadRequest) { throw new BadRequestException(foreignAuthorId); } else { throw new HttpException(httpRequest, httpResponse); } } var resource = httpResponse.Deserialize <AuthorResource>(); var author = new Author { Metadata = MapAuthor(resource) }; author.CleanName = Parser.Parser.CleanAuthorName(author.Metadata.Value.Name); author.SortName = Parser.Parser.NormalizeTitle(author.Metadata.Value.Name); // we can only get a rating from the author list page... var listResource = GetAuthorBooksPageResource(foreignAuthorId, 10, 1); var authorResource = listResource.List.SelectMany(x => x.Authors).FirstOrDefault(a => a.Id.ToString() == foreignAuthorId); author.Metadata.Value.Ratings = new Ratings { Votes = authorResource?.RatingsCount ?? 0, Value = authorResource?.AverageRating ?? 0 }; return(author); }
private Author PollAuthorUncached(string foreignAuthorId) { AuthorResource resource = null; var useCache = true; for (var i = 0; i < 60; i++) { var httpRequest = _requestBuilder.GetRequestBuilder().Create() .SetSegment("route", $"author/{foreignAuthorId}") .Build(); httpRequest.AllowAutoRedirect = true; httpRequest.SuppressHttpError = true; var httpResponse = _cachedHttpClient.Get(httpRequest, useCache, TimeSpan.FromMinutes(30)); if (httpResponse.HasHttpError) { if (httpResponse.StatusCode == HttpStatusCode.NotFound) { throw new AuthorNotFoundException(foreignAuthorId); } else if (httpResponse.StatusCode == HttpStatusCode.BadRequest) { throw new BadRequestException(foreignAuthorId); } else { throw new BookInfoException("Unexpected error fetching author data"); } } resource = JsonSerializer.Deserialize <AuthorResource>(httpResponse.Content, SerializerSettings); if (resource.Works != null) { resource.Works ??= new List <WorkResource>(); resource.Series ??= new List <SeriesResource>(); break; } useCache = false; Thread.Sleep(2000); } if (resource?.Works == null) { throw new BookInfoException($"Failed to get works for {foreignAuthorId}"); } return(MapAuthor(resource)); }
public List <SearchJsonResource> Search(string query) { try { var httpRequest = _searchBuilder.Create() .AddQueryParam("q", query) .Build(); var response = _cachedHttpClient.Get <List <SearchJsonResource> >(httpRequest, true, TimeSpan.FromDays(5)); return(response.Resource); } catch (HttpException) { throw new GoodreadsException("Search for '{0}' failed. Unable to communicate with Goodreads.", query); } catch (Exception ex) { _logger.Warn(ex, ex.Message); throw new GoodreadsException("Search for '{0}' failed. Invalid response received from Goodreads.", query); } }