Esempio n. 1
0
        public static async Task <F95ZoneGame> LoadGame(string url, ILogger logger)
        {
            var web      = new HtmlWeb();
            var document = await web.LoadFromWebAsync(url);

            if (document == null)
            {
                return(null);
            }

            var game = new F95ZoneGame
            {
                F95Link = url
            };

            var node     = document.DocumentNode;
            var bodyNode = node.SelectSingleNode("//div[@class='uix_contentWrapper']/div[@class='p-body-main  ']/div[@class='p-body-content']");

            if (bodyNode.IsNull(logger, "Body", url))
            {
                return(null);
            }

            var headerNode =
                bodyNode.SelectSingleNode(
                    "//div[@class='pageContent']/div[@class='uix_headerInner']");

            if (headerNode.IsNull(logger, "Header", url))
            {
                return(null);
            }

            var labels = headerNode.SelectNodes("div[@class='p-title ']/h1[@class='p-title-value']/a[@class='labelLink']");

            if (!labels.IsNullOrEmpty(logger, "Labels", url))
            {
                game.LabelList = labels.Select(x =>
                                               !x.TryGetInnerText("span", logger, "Label", url, out var label)
                        ? null
                        : label)
                                 .NotNull().ToList();
            }

            if (headerNode.TryGetInnerText(
                    "div[@class='p-title ']/h1[@class='p-title-value']",
                    logger, "Title", url, out var id))
            {
                if (game.LabelList == null)
                {
                    game.Name = id;
                }
                else
                {
                    game.LabelList = game.LabelList.Select(label =>
                    {
                        if (id.Contains(label))
                        {
                            id = id.Replace(label, "");
                        }

                        if (label.StartsWith("["))
                        {
                            label = label.Substring(1, label.Length - 1);
                        }

                        if (label.EndsWith("]"))
                        {
                            label = label.Substring(0, label.Length - 1);
                        }

                        return(label);
                    }).ToList();

                    id = id.Trim();

                    var lastStartingBracket = id.LastIndexOf('[');
                    var lastClosingBracket  = id.LastIndexOf(']');

                    if (lastStartingBracket != -1 && lastClosingBracket != -1)
                    {
                        var dev = id.Substring(lastStartingBracket + 1, lastClosingBracket - lastStartingBracket - 1);
                        game.Developer = dev;
                    }

                    id        = id.Substring(0, lastStartingBracket).Trim();
                    game.Name = id;
                }
            }
            else
            {
                return(null);
            }

            var tags = headerNode.SelectNodes(
                "div[@class='p-description']/ul/li[@class='groupedTags']/a[@class='tagItem']");

            if (!tags.IsNullOrEmpty(logger, "Tags", id))
            {
                game.Genres = tags.Select(x =>
                {
                    var innerText = x.DecodeInnerText();
                    return(innerText.IsEmpty(logger, "Tag", id)
                        ? null
                        : innerText);

                    /*var ti = new CultureInfo("en-US").TextInfo;
                     * if (innerText.IsEmpty(logger, "Tag", id))
                     *  return null;
                     *
                     * if (innerText == "2dcg")
                     *  return "2DCG";
                     * if (innerText == "3dcg")
                     *  return "3DCG";
                     *
                     * return ti.ToTitleCase(innerText);*/
                }).NotNull().ToList();
            }

            var contentNode = bodyNode.SelectSingleNode("//div[@class='message-inner']/div[@class='message-cell message-cell--main']/div[@class='message-main uix_messageContent js-quickEditTarget']/div/div/article[@class='message-body js-selectToQuote']/div[@class='bbWrapper']");

            if (contentNode.IsNull(logger, "Content", id))
            {
                return(null);
            }

            var topNode = contentNode.SelectSingleNode("div");

            if (!topNode.IsNull(logger, "Top", id))
            {
                var coverImageNode = topNode.SelectSingleNode("a");
                if (!coverImageNode.IsNull(logger, "Cover Image", id))
                {
                    var href = coverImageNode.GetValue("href");
                    if (!href.IsEmpty(logger, "Cover Image", id))
                    {
                        game.CoverImageURL = href;
                    }
                }

                topNode.RemoveChild(coverImageNode);
                game.Overview = HttpUtility.HtmlDecode(topNode.InnerHtml);
            }

            var previewImages = contentNode.SelectNodes("//img[@class='bbImage ']");

            if (!previewImages.IsNullOrEmpty(logger, "Preview Images", id))
            {
                game.PreviewImageURLs = previewImages.Select(x =>
                {
                    var a    = x.ParentNode;
                    var href = a.GetValue("href");
                    return(href.IsEmpty(logger, "Preview Image href", id)
                        ? null
                        : href);
                }).NotNull().ToList();
            }

            return(game);
        }
        private List <MetadataField> GetAvailableFields()
        {
            var game = _options.GameData;
            var list = new List <MetadataField>();

            var name = game.Name;

            if (name.IsEmpty())
            {
                var link = game.Links.FirstOrDefault(x =>
                                                     x.Name.Equals("F95Zone", StringComparison.InvariantCultureIgnoreCase));
                if (link == null)
                {
                    return(list);
                }
                name = link.Url;
            }

            if (!name.StartsWith(F95ZoneGame.Root))
            {
                var link = game.Links.FirstOrDefault(x =>
                                                     x.Name.Equals("F95Zone", StringComparison.InvariantCultureIgnoreCase));
                if (link == null)
                {
                    return(list);
                }
                name = link.Url;
            }

            _game = F95ZoneGame.LoadGame(name, Logger).Result;
            if (_game == null)
            {
                throw new Exception($"Game for {name} is null!");
            }

            list.Add(MetadataField.Links);

            if (!_game.Name.IsEmpty())
            {
                list.Add(MetadataField.Name);
            }

            if (!_game.Developer.IsEmpty())
            {
                list.Add(MetadataField.Developers);
            }

            if (!_game.Overview.IsEmpty())
            {
                list.Add(MetadataField.Description);
            }

            if (_game.Genres != null && _game.Genres.Count > 0)
            {
                list.Add(MetadataField.Genres);
            }

            if (_game.LabelList != null && _game.LabelList.Count > 0)
            {
                list.Add(MetadataField.Tags);
            }

            if (!_game.CoverImageURL.IsEmpty())
            {
                list.Add(MetadataField.CoverImage);
            }

            if (_game.PreviewImageURLs != null && _game.PreviewImageURLs.Count > 0)
            {
                list.Add(MetadataField.BackgroundImage);
            }

            return(list);
        }