public async Task<AnimeStaffData> GetCharStaffData(bool force = false) { if (!_animeMode) throw new InvalidOperationException("Umm you said it's going to be manga..."); var output = force ? new AnimeStaffData() : await DataCache.RetrieveData<AnimeStaffData>($"staff_{_animeId}", "AnimeDetails", 7) ?? new AnimeStaffData(); if (output.AnimeCharacterPairs.Count > 0 || output.AnimeStaff.Count > 0) return output; var raw = await GetRequestResponse(false); if (string.IsNullOrEmpty(raw)) return null; var doc = new HtmlDocument(); doc.LoadHtml(raw); try { var mainContainer = doc.FirstOfDescendantsWithClass("div", "js-scrollfix-bottom-rel"); var tables = mainContainer.ChildNodes.Where(node => node.Name == "table").ToList(); int i = 0; foreach (var table in tables.Take(tables.Count - 1)) { try { var current = new AnimeCharacterStaffModel(); var imgs = table.Descendants("img").ToList(); var infos = table.Descendants("td").ToList(); //2nd is character 4th is person //character var img = imgs[0].Attributes["data-src"].Value; if (!img.Contains("questionmark")) { img = img.Replace("/r/46x64", ""); current.AnimeCharacter.ImgUrl = img.Substring(0, img.IndexOf('?')); } current.AnimeCharacter.FromAnime = _animeMode; current.AnimeCharacter.ShowId = _animeId.ToString(); current.AnimeCharacter.Name = WebUtility.HtmlDecode(imgs[0].Attributes["alt"].Value.Replace(",", "")); current.AnimeCharacter.Id = infos[1].ChildNodes[1].Attributes["href"].Value.Split('/')[2]; current.AnimeCharacter.Notes = infos[1].ChildNodes[3].InnerText; //voiceactor try { img = imgs[1].Attributes["data-src"].Value; if (!img.Contains("questionmark")) { img = img.Replace("/r/46x64", ""); current.AnimeStaffPerson.ImgUrl = img.Substring(0, img.IndexOf('?')); } current.AnimeStaffPerson.Name = WebUtility.HtmlDecode(imgs[1].Attributes["alt"].Value.Replace(",", "")); current.AnimeStaffPerson.Id = infos[3].ChildNodes[1].Attributes["href"].Value.Split('/')[2]; current.AnimeStaffPerson.Notes = infos[3].ChildNodes[4].InnerText; } catch (Exception) { //no voice actor current.AnimeStaffPerson.Name = "Unknown"; current.AnimeStaffPerson.IsUnknown = true; } output.AnimeCharacterPairs.Add(current); if (i++ > 30) break; } catch (Exception) { //oddities } } i = 0; foreach (var staffRow in tables.Last().Descendants("tr")) { try { var current = new AnimeStaffPerson(); var imgs = staffRow.Descendants("img").ToList(); var info = staffRow.Descendants("td").Last(); //we want last var img = imgs[0].Attributes["data-src"].Value; if (!img.Contains("questionmark")) { img = img.Replace("/r/46x64", ""); current.ImgUrl = img.Substring(0, img.IndexOf('?')); } current.Name = WebUtility.HtmlDecode(imgs[0].Attributes["alt"].Value.Replace(",", "")); current.Id = info.ChildNodes[0].Attributes["href"].Value.Split('/')[2]; current.Notes = info.ChildNodes[3].InnerText; output.AnimeStaff.Add(current); if (i++ > 30) break; } catch (Exception) { //what can I say? } } } catch (Exception) { //mysteries of html } DataCache.SaveData(output,$"staff_{_animeId}","AnimeDetails"); return output; }
public AnimeCharacterStaffModelViewModel(AnimeCharacterStaffModel data) { AnimeCharacter = new FavouriteViewModel(data.AnimeCharacter); AnimeStaffPerson = new FavouriteViewModel(data.AnimeStaffPerson); }