public async Task<StaffDetailsData> GetStaffDetails(bool force) { var possibleData = force ? null : await DataCache.RetrieveData<StaffDetailsData>(_id.ToString(), "staff_details", 30); if (possibleData != null) return possibleData; var output = new StaffDetailsData(); var raw = await GetRequestResponse(); if (string.IsNullOrEmpty(raw)) return output; var doc = new HtmlDocument(); doc.LoadHtml(raw); output.Id = _id; try { var columns = doc.DocumentNode.Descendants("table").First().ChildNodes[0].ChildNodes.Where( node => node.Name == "td").ToList(); var leftColumn = columns[0]; var image = leftColumn.Descendants("img").FirstOrDefault(); if (image != null && image.Attributes.Contains("alt")) output.ImgUrl = image.Attributes["src"].Value; output.Name = WebUtility.HtmlDecode(doc.DocumentNode.Descendants("h1").First().InnerText.Trim()); bool recording = false; var currentString = ""; int i = 0; foreach (var child in leftColumn.ChildNodes) { if (!recording) { if (child.Attributes.Contains("class") && child.Attributes["class"].Value.Trim() == "js-sns-icon-container icon-block") recording = true; else continue; } if (child.Attributes.Contains("class") && child.Attributes["class"].Value == "spaceit_pad") { output.Details.Add(WebUtility.HtmlDecode(child.InnerText.Trim())); currentString = ""; i = 0; } else if (!string.IsNullOrWhiteSpace(child.InnerText)) { currentString += WebUtility.HtmlDecode(child.InnerText.Trim()) + " "; i++; if (i == 2) { output.Details.Add(currentString); currentString = ""; i = 0; } } if (child.Name == "div" && !child.Attributes.Contains("class")) break; } foreach (var table in columns[1].Descendants("table").Take(2)) try { foreach (var row in table.Descendants("tr")) { var tds = row.Descendants("td").ToList(); if (tds.Count == 4) { var current = new ShowCharacterPair(); var show = new AnimeLightEntry(); var img = tds[0].Descendants("img").First().Attributes["data-src"].Value; if (!img.Contains("questionmark")) { img = Regex.Replace(img, @"\/r\/\d+x\d+", ""); show.ImgUrl = img.Substring(0, img.IndexOf('?')); } var link = tds[1].Descendants("a").First(); show.IsAnime = true; show.Id = int.Parse(link.Attributes["href"].Value.Split('/')[2]); show.Title = WebUtility.HtmlDecode(link.InnerText.Trim()); current.AnimeLightEntry = show; var character = new AnimeCharacter(); character.FromAnime = true; character.ShowId = show.Id.ToString(); link = tds[2].Descendants("a").First(); character.Id = link.Attributes["href"].Value.Split('/')[2]; character.Name = WebUtility.HtmlDecode(link.InnerText.Trim()); character.Notes = WebUtility.HtmlDecode(tds[2].Descendants("div").Last().InnerText); img = tds[3].Descendants("img").First().Attributes["data-src"].Value; if (!img.Contains("questionmark")) { img = Regex.Replace(img, @"\/r\/\d+x\d+", ""); character.ImgUrl = img.Substring(0, img.IndexOf('?')); } current.AnimeCharacter = character; output.ShowCharacterPairs.Add(current); } else { var show = new AnimeLightEntry(); var img = tds[0].Descendants("img").First().Attributes["data-src"].Value; if (!img.Contains("questionmark")) { img = Regex.Replace(img, @"\/r\/\d+x\d+", ""); show.ImgUrl = img.Substring(0, img.IndexOf('?')); } var link = tds[1].Descendants("a").First(); show.IsAnime = !link.Attributes["href"].Value.Contains("/manga/"); show.Id = int.Parse(link.Attributes["href"].Value.Split('/')[2]); show.Title = WebUtility.HtmlDecode(link.InnerText.Trim()); show.Notes = WebUtility.HtmlDecode( tds[1].Descendants("div").Last().InnerText.Replace("add", "").Trim()); output.StaffPositions.Add(show); } } } catch (Exception e) { //htaml } } catch (Exception) { //sorcery } DataCache.SaveData(output, _id.ToString(), "staff_details"); return output; }
public async Task<CharacterDetailsData> GetCharacterDetails(bool force = false) { var possibleData = force ? null : await DataCache.RetrieveData<CharacterDetailsData>(_id.ToString(), "character_details", 30); if (possibleData != null) return possibleData; var output = new CharacterDetailsData(); var raw = await GetRequestResponse(); if (string.IsNullOrEmpty(raw)) return output; var doc = new HtmlDocument(); doc.LoadHtml(raw); output.Id = _id; try { var columns = doc.DocumentNode.Descendants("table").First().ChildNodes[1].ChildNodes.Where(node => node.Name == "td").ToList(); var leftColumn = columns[0]; var tables = leftColumn.Descendants("table"); foreach (var table in tables) { foreach (var descendant in table.Descendants("tr")) { var links = descendant.Descendants("a").ToList(); if (links[0].Attributes["href"].Value.StartsWith("/anime")) { var curr = new AnimeLightEntry { IsAnime = true }; curr.Id = int.Parse(links[0].Attributes["href"].Value.Split('/')[2]); var img = links[0].Descendants("img").First().Attributes["src"].Value; if (!img.Contains("questionmark")) { img = Regex.Replace(img, @"\/r\/\d+x\d+", ""); curr.ImgUrl = img.Substring(0, img.IndexOf('?')); } curr.Title = WebUtility.HtmlDecode(links[1].InnerText.Trim()); output.Animeography.Add(curr); } else { var curr = new AnimeLightEntry { IsAnime = false }; curr.Id = int.Parse(links[0].Attributes["href"].Value.Split('/')[2]); var img = links[0].Descendants("img").First().Attributes["src"].Value; if (!img.Contains("questionmark")) { img = Regex.Replace(img, @"\/r\/\d+x\d+", ""); curr.ImgUrl = img.Substring(0, img.IndexOf('?')); } curr.Title = WebUtility.HtmlDecode(links[1].InnerText.Trim()); output.Mangaography.Add(curr); } } } var image = leftColumn.Descendants("img").First(); if (image.Attributes.Contains("alt")) { output.ImgUrl = image.Attributes["src"].Value; } output.Name = WebUtility.HtmlDecode(doc.DocumentNode.Descendants("h1").First().InnerText).Trim().Replace(" "," "); //because mal tends to leave two spaces there and there's pretty hardcore guy on github who can spot such things... props ;d output.Content = output.SpoilerContent = ""; output.Content += WebUtility.HtmlDecode(leftColumn.LastChild.InnerText.Trim()) + "\n\n"; foreach (var node in columns[1].ChildNodes) { if (node.Name == "#text") output.Content += WebUtility.HtmlDecode(node.InnerText.Trim()); else if (node.Name == "br" && !output.Content.EndsWith("\n\n")) output.Content += "\n"; else if (node.Name == "div" && node.Attributes.Contains("class") && node.Attributes["class"].Value == "spoiler") output.SpoilerContent += WebUtility.HtmlDecode(node.InnerText.Trim()) + "\n\n"; else if (node.Name == "table") { foreach (var descendant in node.Descendants("tr")) { var current = new AnimeStaffPerson(); var img = descendant.Descendants("img").First(); var imgUrl = img.Attributes["src"].Value; if (!imgUrl.Contains("questionmark")) { var pos = imgUrl.LastIndexOf("v"); if (pos != -1) imgUrl = imgUrl.Remove(pos, 1); } current.ImgUrl = imgUrl; var info = descendant.Descendants("td").Last(); current.Id = info.ChildNodes[0].Attributes["href"].Value.Split('/')[2]; current.Name = WebUtility.HtmlDecode(info.ChildNodes[0].InnerText.Trim()); current.Notes = info.ChildNodes[2].InnerText; output.VoiceActors.Add(current); } } } output.Content = output.Content.Trim(); output.SpoilerContent = output.SpoilerContent.Trim(); } catch (Exception) { //html } DataCache.SaveData(output, _id.ToString(), "character_details"); return output; }