示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }