public MusicDetail GetMusicDetail(Uri uri) { string id = _idRegex.Match(uri.ToString()).Groups[1].Value; string responseString = DownloadString(uri); HtmlDocument document = new HtmlDocument(); document.LoadHtml(responseString); HtmlNode musicDetailElement = document.DocumentNode.SelectNodes("//div[contains(@class, 'pdMusicDetail')]")[0]; MusicDetail musicDetail = MusicDetail.ParseFromElement(musicDetailElement, id); HtmlNodeCollection charts = document.DocumentNode.SelectNodes("//div[@class='pdm-result']"); foreach (HtmlNode chartElement in charts) { ChartScore chart = ChartScore.ParseFromElement(chartElement); musicDetail.AddChart(chart); } return(musicDetail); }
public static ChartScore ParseFromElement(HtmlNode element) { ChartScore score = new ChartScore(); HtmlNode resultHead = element.ChildNodes[1]; // pdm-resultHead foreach (ChartDifficulty difficulty in Enum.GetValues(typeof(ChartDifficulty))) { if (resultHead.HasClass(difficulty.ToString().ToLower())) { score.Difficulty = difficulty; break; } } score.Level = int.Parse(resultHead.ChildNodes[3].SelectSingleNode("text()").InnerText.Trim()); score.NoteCount = int.Parse(resultHead.ChildNodes[5].SelectSingleNode("text()").InnerText.Trim()); HtmlNode leftResult = element.ChildNodes[3].ChildNodes[1]; // pdResultList score.HighScore = int.Parse(leftResult.ChildNodes[3].InnerText.Trim()); score.ClearRate = decimal.Parse(leftResult.ChildNodes[7].InnerText.Trim().TrimEnd('%')); decimal rankPoint; if (decimal.TryParse(leftResult.ChildNodes[11].InnerText.Trim(), out rankPoint)) { score.RankPoints = rankPoint; } else { score.RankPoints = 0; } HtmlNode rightResult = element.ChildNodes[5].ChildNodes[1]; // pdResultIco HtmlNode clearContainer = rightResult.ChildNodes[1]; // li class=clear if (clearContainer.ChildNodes.Count > 1) { HtmlNode clearImage = clearContainer.ChildNodes[1].ChildNodes[1]; string clearImageUrl = clearImage.Attributes["src"].Value; if (clearImageUrl.StartsWith("https://rev-srw.ac.capcom.jp/assets/common/img_common/bnr_ULTIMATE_CLEAR.png")) { score.ClearType = ChartClearType.Ultimate; } else if (clearImageUrl.StartsWith("https://rev-srw.ac.capcom.jp/assets/common/img_common/bnr_SURVIVAL_CLEAR.png")) { score.ClearType = ChartClearType.Survival; } } HtmlNode gradeContainer = rightResult.ChildNodes[3]; // li class=grade string gradeImageUrl = gradeContainer.ChildNodes[1].Attributes["src"].Value; score.GradeValue = GradeHelper.GetGradeFromImageUrl(gradeImageUrl); if (rightResult.ChildNodes.Count == 7) { score.IsFullCombo = true; } if (score.ClearType == ChartClearType.Unknown) { if (score.GradeValue == 11) { score.ClearType = ChartClearType.Unplayed; } else if (score.GradeValue == 10) { score.ClearType = ChartClearType.Failed; } else { score.ClearType = ChartClearType.Cleared; } } return(score); }
public void AddChart(ChartScore score) { Scores.Add(score.Difficulty, score); }