Ejemplo n.º 1
0
        private static void DownloadImages(HtmlAgilityPack.HtmlNodeCollection images, string path)
        {
            if (!System.IO.Directory.Exists(path))
            {
                System.IO.Directory.CreateDirectory(path);
            }

            using (var imageRequest = new System.Net.WebClient())
            {
                foreach (var address in images
                         .Select(x => x.Attributes["src"]))
                {
                    try
                    {
                        imageRequest.DownloadFile(address.Value, $@"{path}\{System.IO.Path.GetFileName(address.Value)}");
                    }
                    catch (Exception)
                    {
                        //握りつぶす
                    }
                }
            }
        }
Ejemplo n.º 2
0
        public HtmlNodeCollection(HtmlAgilityPack.HtmlNodeCollection htmlNodeCollection)
        {
            _htmlNodeCollection = htmlNodeCollection;

            _htmlNodes = htmlNodeCollection.Select(node => new HtmlNode(node)).ToList();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Searches the official beatmap listing for beatmaps.
        /// </summary>
        public static async Task <SearchResultSet> Search(string query, SearchFilters.OsuRankStatus rankedFilter, SearchFilters.OsuModes modeFilter, int page = 1)
        {
            // ranked filter = r
            // mode filter = m

            string rParam;

            // Ranked filter into website param
            if (rankedFilter == SearchFilters.OsuRankStatus.RankedAndApproved)
            {
                rParam = "0";
            }
            else if (rankedFilter == SearchFilters.OsuRankStatus.Approved)
            {
                rParam = "6";
            }
            else if (rankedFilter == SearchFilters.OsuRankStatus.Qualified)
            {
                rParam = "11";
            }
            else if (rankedFilter == SearchFilters.OsuRankStatus.Loved)
            {
                rParam = "12";
            }
            else
            {
                rParam = "4";
            }

            // Search time. Need to use cookies.
            // Same as bloodcat, construct QS
            var qs = HttpUtility.ParseQueryString(string.Empty);

            qs["q"] = query;
            qs["m"] = ((int)modeFilter).ToString();
            qs["r"] = rParam;
            if (page > 1)
            {
                qs["page"] = page.ToString();
            }

            string rawData = await GetRawWithCookies("https://osu.ppy.sh/p/beatmaplist?" + qs.ToString());

            // Check if still logged in
            if (rawData.Contains("Please enter your credentials"))
            {
                throw new CookiesExpiredException();
            }

            // Parse.
            var htmlDoc = new HtmlAgilityPack.HtmlDocument();

            htmlDoc.OptionUseIdAttribute = true;
            htmlDoc.LoadHtml(rawData);
            HtmlAgilityPack.HtmlNodeCollection beatmapNodes = htmlDoc.DocumentNode.SelectNodes("//div[@class='beatmapListing']/div[@class='beatmap']");
            if (beatmapNodes == null)
            {
                return(new SearchResultSet(new List <BeatmapSet>(), false)); // empty
            }
            var sets = beatmapNodes.Select(b => {
                var difficulties = new Dictionary <string, string>();
                try
                {
                    int i = 1;
                    foreach (var d in b.SelectNodes("div[@class='left-aligned']/div[starts-with(@class, 'difficulties')]/div"))
                    {
                        string _d = d.Attributes["class"].Value.Replace("diffIcon ", "");

                        if (_d.Contains("-t"))
                        {
                            _d = "1"; // taiko
                        }
                        else if (_d.Contains("-f"))
                        {
                            _d = "2"; // ctb
                        }
                        else if (_d.Contains("-m"))
                        {
                            _d = "3"; // mania
                        }
                        else
                        {
                            _d = "0"; // standard
                        }
                        difficulties.Add(i.ToString(), _d);
                        i++;
                    }
                }
                catch { } // rip

                // we can only base this off that green/red bar, lol -- or the search filter
                string rankStatus;
                if (rankedFilter == SearchFilters.OsuRankStatus.Loved)
                {
                    rankStatus = "Loved";
                }
                else if (rankedFilter == SearchFilters.OsuRankStatus.Approved)
                {
                    rankStatus = "Approved";
                }
                else if (rankedFilter == SearchFilters.OsuRankStatus.Qualified)
                {
                    rankStatus = "Qualified";
                }
                else if (rankedFilter == SearchFilters.OsuRankStatus.RankedAndApproved)
                {
                    rankStatus = "Ranked/Approved";
                }
                else if (b.SelectSingleNode("div[@class='right-aligned']/div[@class='rating']") != null)
                {
                    rankStatus = "Ranked/Apprv./Quali./Loved";
                }
                else
                {
                    rankStatus = "Pending/Graveyard";
                }

                return(new BeatmapSet(
                           b.Id,
                           TryGetNodeText(b, "div[@class='maintext']/span[@class='artist']"),
                           TryGetNodeText(b, "div[@class='maintext']/a[@class='title']"),
                           TryGetNodeText(b, "div[@class='left-aligned']/div[1]/a"),
                           rankStatus,
                           difficulties,
                           null
                           ));
            });

            bool canLoadMore = htmlDoc.DocumentNode.SelectNodes("//div[@class='pagination']")
                               .Descendants("a")
                               .Any(d => d.InnerText == "Next");

            return(new SearchResultSet(sets, canLoadMore));
        }