public List <Book> GetBooks(ParsedBookInfo parsedBookInfo, Author author, SearchCriteriaBase searchCriteria = null) { var bookTitle = parsedBookInfo.BookTitle; var result = new List <Book>(); if (parsedBookInfo.BookTitle == null) { return(new List <Book>()); } Book bookInfo = null; if (parsedBookInfo.Discography) { if (parsedBookInfo.DiscographyStart > 0) { return(_bookService.AuthorBooksBetweenDates(author, new DateTime(parsedBookInfo.DiscographyStart, 1, 1), new DateTime(parsedBookInfo.DiscographyEnd, 12, 31), false)); } if (parsedBookInfo.DiscographyEnd > 0) { return(_bookService.AuthorBooksBetweenDates(author, new DateTime(1800, 1, 1), new DateTime(parsedBookInfo.DiscographyEnd, 12, 31), false)); } return(_bookService.GetBooksByAuthor(author.Id)); } if (searchCriteria != null) { var cleanTitle = Parser.CleanAuthorName(parsedBookInfo.BookTitle); bookInfo = searchCriteria.Books.ExclusiveOrDefault(e => e.Title == bookTitle || e.CleanTitle == cleanTitle); } if (bookInfo == null) { // TODO: Search by Title and Year instead of just Title when matching bookInfo = _bookService.FindByTitle(author.AuthorMetadataId, parsedBookInfo.BookTitle); } if (bookInfo == null) { var edition = _editionService.FindByTitle(author.AuthorMetadataId, parsedBookInfo.BookTitle); bookInfo = edition?.Book.Value; } if (bookInfo == null) { _logger.Debug("Trying inexact book match for {0}", parsedBookInfo.BookTitle); bookInfo = _bookService.FindByTitleInexact(author.AuthorMetadataId, parsedBookInfo.BookTitle); } if (bookInfo == null) { _logger.Debug("Trying inexact edition match for {0}", parsedBookInfo.BookTitle); var edition = _editionService.FindByTitleInexact(author.AuthorMetadataId, parsedBookInfo.BookTitle); bookInfo = edition?.Book.Value; } if (bookInfo != null) { result.Add(bookInfo); } else { _logger.Debug("Unable to find {0}", parsedBookInfo); } return(result); }