Пример #1
0
        protected Movie MapResult(HtmlDocument doc)
        {
            var xPath = _movieXPathRepository.GetXPath();

            if (xPath == null)
            {
                throw new Exception("No XPathSetup");
            }

            var title        = doc.DocumentNode.SelectSingleNode(xPath.Title).OuterHtmlClean();
            var strRate      = doc.DocumentNode.SelectSingleNode(xPath.Rate).InnerHtml();
            var rate         = Convert.ToDouble(String.IsNullOrEmpty(strRate) ? "0" : strRate);
            var dateReleased = doc.DocumentNode.SelectSingleNode(xPath.DateReleased).InnerTextClean();
            var rating       = doc.DocumentNode.SelectSingleNode(xPath.Rating).Attribute("content");

            var summary = doc.DocumentNode.SelectSingleNode(xPath.Summary).OuterHtmlClean();
            var year    = doc.DocumentNode.SelectSingleNode(xPath.Year).InnerText();
            var genre   = String.Join(", ", doc.DocumentNode.SelectNodes(xPath.Genre).Select(x => x.InnerTextClean()));
            var runtime = doc.DocumentNode.SelectSingleNode(xPath.Runtime).InnerTextClean();

            var stars   = String.Join(",", doc.DocumentNode.SelectNodes(xPath.Stars).Select(x => x.SelectSingleNode("*/span").InnerTextClean()));
            var writers = doc.DocumentNode.SelectNodes(xPath.Writers) != null?
                          String.Join(",", doc.DocumentNode.SelectNodes(xPath.Writers).Select(x => x.SelectSingleNode("*/span").InnerTextClean()))
                              : "";

            var directors = doc.DocumentNode.SelectNodes(xPath.Directors) != null?
                            String.Join(",", doc.DocumentNode.SelectNodes(xPath.Directors).Select(x => x.SelectSingleNode("*/span").InnerTextClean()))
                                : "";

            //using headers
            var header      = doc.DocumentNode.SelectSingleNode(xPath.Header);
            var poster      = header.SelectSingleNode(xPath.Poster).Attribute("src");
            var hdPosterUrl = "";

            if (!String.IsNullOrEmpty(poster))
            {
                var hdPosterLink = header.SelectSingleNode(xPath.Poster).ParentNode;
                if (hdPosterLink != null)
                {
                    hdPosterUrl = hdPosterLink.Attribute("href");
                }
            }

            var hdPoster = poster;

            //get the HD
            if (!String.IsNullOrEmpty(poster))
            {
                var splittedPosterUrl = poster.Split(new string[] { "@@" }, StringSplitOptions.None);
                if (splittedPosterUrl.Length > 1)
                {
                    hdPoster = splittedPosterUrl[0] + "@@._V1_SY1000_CR0,0,676,1000_AL_.jpg";
                }
                else
                {
                    if (poster.Contains("._V1_"))
                    {
                        splittedPosterUrl = poster.Split(new string[] { "._V1_" }, StringSplitOptions.None);
                        if (splittedPosterUrl.Length > 1)
                        {
                            hdPoster = splittedPosterUrl[0] + "._V1_SY1000_CR0,0,676,1000_AL_.jpg";
                        }
                    }
                }
            }

            var titleDetails = doc.DocumentNode.SelectSingleNode(xPath.TitleDetails).SelectNodes("*/h4");
            var country      = titleDetails.FirstOrDefault(x => x.InnerText == "Country:").TitleDetailsAnchor();
            var language     = titleDetails.FirstOrDefault(x => x.InnerText == "Language:").TitleDetailsAnchor();
            var alsoKnownAs  = titleDetails.FirstOrDefault(x => x.InnerText == "Also Known As:").TitleDetailsText();
            var budget       = titleDetails.FirstOrDefault(x => x.InnerText == "Budget:").TitleDetailsText();
            var gross        = titleDetails.FirstOrDefault(x => x.InnerText == "Gross:").TitleDetailsText();

            //Related Movies
            var relatedMoviesList = new List <Movie>();
            var overviews         = doc.DocumentNode.SelectNodes(xPath.RelatedRoot);

            if (overviews != null)
            {
                foreach (var overview in overviews)
                {
                    var genres        = overview.SelectSingleNode(xPath.RelatedGenre);
                    var directorsNode = overview.SelectSingleNode(xPath.RelatedDirectors);
                    var actorsNode    = overview.SelectSingleNode(xPath.RelatedStars);
                    var rateNode      = overview.SelectSingleNode(xPath.RelatedRate);

                    if (directorsNode != null)
                    {
                        var directorNode = directorsNode.SelectSingleNode("b");
                        if (directorNode != null)
                        {
                            directorsNode.RemoveChild(directorsNode.SelectSingleNode("b"));
                        }
                    }

                    var actorNode = actorsNode.SelectSingleNode("b");
                    if (actorNode != null)
                    {
                        actorsNode.RemoveChild(actorsNode.SelectSingleNode("b"));
                    }

                    var genreSpans = genres.SelectNodes("span");
                    if (genreSpans != null)
                    {
                        foreach (var span in genreSpans)
                        {
                            genres.RemoveChild(span);
                        }
                    }

                    double relateMovieRate = 0;
                    var    movieRate       = rateNode != null?Double.TryParse(rateNode.InnerText, out relateMovieRate) : false;

                    relatedMoviesList.Add(new Movie
                    {
                        ImdbId    = overview.Attribute("data-tconst"),
                        Title     = overview.SelectSingleNode(xPath.RelatedTitle).InnerTextClean(),
                        Year      = overview.SelectSingleNode(xPath.RelatedYear).InnerTextClean().Replace("(", "").Replace(")", ""),
                        Poster    = overview.SelectSingleNode(xPath.RelatedPoster).Attribute("src"),
                        Genre     = genres.InnerText.CleanHtml().Replace("                                 ", "|"),
                        Summary   = overview.SelectSingleNode(xPath.RelatedSummary).InnerTextClean(),
                        Directors = directorsNode != null ? directorsNode.InnerTextClean() : "",
                        Stars     = actorsNode.InnerTextClean(),
                        Rate      = movieRate ? relateMovieRate : 0
                    });
                }
            }

            var movie = new Movie
            {
                Title          = title,
                Rate           = rate,
                DateReleased   = dateReleased,
                Rating         = rating,
                OriginalPoster = poster,
                Poster         = hdPoster,
                HdPosterLink   = hdPosterUrl,
                Stars          = stars,
                Summary        = summary,
                Year           = year,
                Genre          = genre,
                Runtime        = runtime,
                Directors      = directors,
                Writers        = writers,
                RelatedMovie   = String.Join(",", relatedMoviesList.Select(x => x.ImdbId)), //String.Join(",", strRelatedMovies),
                Country        = country,
                Language       = language,
                AlsoKnownAs    = alsoKnownAs,
                Budget         = budget,
                Gross          = gross,
                RelatedMovies  = relatedMoviesList
            };

            return(movie);
        }