private List <PendingRelease> IncludeRemoteBooks(List <PendingRelease> releases, Dictionary <string, RemoteBook> knownRemoteBooks = null) { var result = new List <PendingRelease>(); var authorMap = new Dictionary <int, Author>(); if (knownRemoteBooks != null) { foreach (var author in knownRemoteBooks.Values.Select(v => v.Author)) { if (!authorMap.ContainsKey(author.Id)) { authorMap[author.Id] = author; } } } foreach (var author in _authorService.GetAuthors(releases.Select(v => v.AuthorId).Distinct().Where(v => !authorMap.ContainsKey(v)))) { authorMap[author.Id] = author; } foreach (var release in releases) { var author = authorMap.GetValueOrDefault(release.AuthorId); // Just in case the author was removed, but wasn't cleaned up yet (housekeeper will clean it up) if (author == null) { return(null); } List <Book> books; RemoteBook knownRemoteBook; if (knownRemoteBooks != null && knownRemoteBooks.TryGetValue(release.Release.Title, out knownRemoteBook)) { books = knownRemoteBook.Books; } else { books = _parsingService.GetBooks(release.ParsedBookInfo, author); } release.RemoteBook = new RemoteBook { Author = author, Books = books, ParsedBookInfo = release.ParsedBookInfo, Release = release.Release }; result.Add(release); } return(result); }
private object DownloadRelease(ReleaseResource release) { var remoteBook = _remoteBookCache.Find(GetCacheKey(release)); if (remoteBook == null) { _logger.Debug("Couldn't find requested release in cache, cache timeout probably expired."); throw new NzbDroneClientException(HttpStatusCode.NotFound, "Couldn't find requested release in cache, try searching again"); } try { if (remoteBook.Author == null) { if (release.BookId.HasValue) { var book = _bookService.GetBook(release.BookId.Value); remoteBook.Author = _authorService.GetAuthor(book.AuthorId); remoteBook.Books = new List <Book> { book }; } else if (release.AuthorId.HasValue) { var author = _authorService.GetAuthor(release.AuthorId.Value); var books = _parsingService.GetBooks(remoteBook.ParsedBookInfo, author); if (books.Empty()) { throw new NzbDroneClientException(HttpStatusCode.NotFound, "Unable to parse books in the release"); } remoteBook.Author = author; remoteBook.Books = books; } else { throw new NzbDroneClientException(HttpStatusCode.NotFound, "Unable to find matching author and books"); } } else if (remoteBook.Books.Empty()) { var books = _parsingService.GetBooks(remoteBook.ParsedBookInfo, remoteBook.Author); if (books.Empty() && release.BookId.HasValue) { var book = _bookService.GetBook(release.BookId.Value); books = new List <Book> { book }; } remoteBook.Books = books; } if (remoteBook.Books.Empty()) { throw new NzbDroneClientException(HttpStatusCode.NotFound, "Unable to parse books in the release"); } _downloadService.DownloadReport(remoteBook); } catch (ReleaseDownloadException ex) { _logger.Error(ex, "Getting release from indexer failed"); throw new NzbDroneClientException(HttpStatusCode.Conflict, "Getting release from indexer failed"); } return(release); }