private async Task <Author> GetAuthorAsync(GoodReadsDto bookModel, Country country) { var author = await this.db.Authors.FirstOrDefaultAsync(a => a.FirstName == bookModel.AuthorFirstName && a.LastName == bookModel.AuthorLastName && a.DateOfBirth == bookModel.AuthorDateOfBirth); if (author == null) { author = new Author { FirstName = bookModel.AuthorFirstName, SecondName = bookModel.AuthorSecondName, LastName = bookModel.AuthorLastName, Biography = bookModel.AuthorBiography, DateOfBirth = bookModel.AuthorDateOfBirth, ProfilePicture = bookModel.AuthorPicture, Country = country, CreatedOn = DateTime.UtcNow, }; await this.db.Authors.AddAsync(author); await this.db.SaveChangesAsync(); } return(author); }
private async Task <Book> GetBookAsync(GoodReadsDto bookModel, EditionLanguage language, Author author) { var book = await this.db.Books.FirstOrDefaultAsync(b => b.Title == bookModel.Title && b.PublishedOn == bookModel.PublishedOn); if (book == null) { book = new Book { Title = bookModel.Title, Summary = bookModel.Summary, PictureURL = bookModel.Image, Pages = bookModel.Pages, PublishedOn = bookModel.PublishedOn, EditionLanguage = language, Author = author, CreatedOn = DateTime.UtcNow, }; await this.db.Books.AddAsync(book); await this.db.SaveChangesAsync(); } return(book); }
private GoodReadsDto GetBook(int i) { var dto = new GoodReadsDto(); var document = this.context.OpenAsync($"https://www.goodreads.com/book/show/{i}.Twilight") .GetAwaiter().GetResult(); if (document.StatusCode == HttpStatusCode.NotFound) { throw new InvalidOperationException(); } var title = document.QuerySelector("div > #metacol > #bookTitle"); dto.Title = title.TextContent.Trim(); var authorLink = document.QuerySelectorAll(".leftContainer > #topcol > #metacol > #bookAuthors > span > .authorName__container > .authorName").FirstOrDefault(); var authorDocument = this.context.OpenAsync(authorLink.GetAttribute("href")) .GetAwaiter().GetResult(); var authorName = authorDocument.QuerySelector(".rightContainer > div > .authorName > span"); var names = authorName.TextContent.Split(" ", StringSplitOptions.RemoveEmptyEntries); dto.AuthorFirstName = names[0]; if (names.Length == 3) { dto.AuthorSecondName = names[1]; dto.AuthorLastName = names[2]; } else { dto.AuthorLastName = names[1]; } var authorDateOfBirth = authorDocument.QuerySelector(".rightContainer > .dataItem"); dto.AuthorDateOfBirth = DateTime.Parse(authorDateOfBirth.TextContent.Trim()); var authorCountry = authorDocument.QuerySelector(".rightContainer"); dto.AuthorCountry = authorCountry.TextContent; var authorBiography = authorDocument.QuerySelector(".rightContainer > .aboutAuthorInfo > span"); dto.AuthorBiography = authorBiography.TextContent; // Can be null var authorPicture = authorDocument.QuerySelector(".leftContainer > a > img"); var authPic = authorPicture.GetAttribute("src"); dto.AuthorPicture = authPic; var summary = document.QuerySelector("#descriptionContainer > #description > span"); dto.Summary = summary.TextContent; var image = document.QuerySelectorAll(".leftContainer > #topcol > #imagecol > .bookCoverContainer > .bookCoverPrimary > a > #coverImage").FirstOrDefault(); dto.Image = image.GetAttribute("src"); var pagesText = document.QuerySelectorAll("#details > div > span").LastOrDefault().TextContent.ToString(); var pages = int.Parse(pagesText.Split(" ").FirstOrDefault()); dto.Pages = pages; var publishedOn = document.QuerySelectorAll("#details > div").ToArray()[1].TextContent.ToString(); var date = publishedOn.Remove(publishedOn.IndexOf("Published"), 9); date = date.Remove(date.IndexOf("by "), date.Length - date.IndexOf("by ")).Trim(); if (date.Contains("th")) { date = date.Remove(date.IndexOf("th"), 2); } var realDate = DateTime.Parse(date); dto.PublishedOn = realDate; var editionLanguage = document.QuerySelectorAll("#details > .buttons > #bookDataBox > div > .infoBoxRowItem").ToArray()[2]; dto.EditionLanguage = editionLanguage.TextContent; var awards = document.QuerySelectorAll("#details > .buttons > #bookDataBox > div > div > .award"); if (awards != null) { foreach (var award in awards) { dto.Awards.Add(award.TextContent); } } var genres = document.QuerySelectorAll(".rightContainer > .stacked > div > .bigBoxBody > .bigBoxContent > div > .left > a").ToArray(); foreach (var genre in genres) { dto.Genres.Add(genre.TextContent); } Console.WriteLine("found"); return(dto); }