private async Task <AnimeCharacter> InsertCharacterAsync(long malId) { var existingCharacter = await _characterRepository.GetAsync(malId); if (existingCharacter != null) { return(existingCharacter); } var parsedData = await _malApiService.GetCharacterDataAsync(malId); if (parsedData is null) { return(null); } var newCharacter = new AnimeCharacter { Id = Guid.NewGuid(), MalId = malId, ImageUrl = parsedData.ImageUrl, Name = parsedData.Name, Popularity = parsedData.Popularity, About = parsedData.About, KanjiName = parsedData.JapaneseName, Nicknames = parsedData.Nicknames }; await _characterRepository.AddAsync(newCharacter); return(newCharacter); }
public AnimeComparisonSubEntry(AnimeCharacter character, Anime anime) { Anime = anime; Characters = new List <AnimeCharacter> { character }; }
public SeiyuuComparisonSubEntry(AnimeCharacter character, Seiyuu seiyuu) { Seiyuu = seiyuu; Characters = new List <AnimeCharacter> { character }; }
private void UpdateCharacter(AnimeCharacter characterToUpdate, MalCharacterUpdateData updateData) { characterToUpdate.Name = updateData.Name; characterToUpdate.About = updateData.About; characterToUpdate.KanjiName = updateData.JapaneseName; characterToUpdate.ImageUrl = updateData.ImageUrl; characterToUpdate.Nicknames = !string.IsNullOrWhiteSpace(updateData.Nicknames) ? updateData.Nicknames : characterToUpdate.Nicknames; characterToUpdate.Popularity = updateData.Popularity; }
private void NavigateDetails(AnimeCharacter character) { ViewModelLocator.GeneralMain.Navigate(PageIndex.PageAnimeDetails, new AnimeDetailsPageNavigationArgs(int.Parse(character.ShowId), character.Notes, null, null) { Source = PageIndex.PageProfile, AnimeMode = character.FromAnime }); }
public SeiyuuComparisonEntry(Anime anime, AnimeCharacter character, Seiyuu seiyuu) { Anime = new List <Anime> { anime }; SeiyuuCharacters = new List <SeiyuuComparisonSubEntry> { new SeiyuuComparisonSubEntry(character, seiyuu) }; }
public async Task <List <AnimeCharacter> > GetSearchResults() { var output = new List <AnimeCharacter>(); var raw = await GetRequestResponse(); if (string.IsNullOrEmpty(raw)) { return(null); } var doc = new HtmlDocument(); doc.LoadHtml(raw); try { foreach (var row in doc.DocumentNode.Descendants("table").First().Descendants("tr").Skip(1)) { try { var character = new AnimeCharacter(); var tds = row.Descendants("td").ToList(); var link = tds[1].Descendants("a").First(); character.Id = link.Attributes["href"].Value.Split('/')[2]; character.Name = WebUtility.HtmlDecode(link.InnerText.Trim()); var smalls = tds[1].Descendants("small"); if (smalls.Any()) { character.Notes = WebUtility.HtmlDecode(smalls.Last().InnerText); } var img = tds[0].Descendants("img").First().Attributes["src"].Value; if (!img.Contains("questionmark")) { img = Regex.Replace(img, @"\/r\/\d+x\d+", ""); character.ImgUrl = img.Substring(0, img.IndexOf('?')); } output.Add(character); } catch (Exception) { // } } } catch (Exception) { // } return(output); }
// Use this for initialization void Start () { gameControl = GameObject.Find("GameControl").GetComponent("GameControl") as GameControl; sound = GameObject.Find("Sound").GetComponent("SoundControl") as SoundControl; anime = gameObject.GetComponent<AnimeCharacter>(); _collider = (BoxCollider2D)GetComponent(typeof(BoxCollider2D)); sizeCollider = _collider.size; _smoke.emit = false; jumpMission = PlayerPrefs.GetInt("LV_Mission_Jump"); dashMission = PlayerPrefs.GetInt("LV_Mission_Dash"); if(jumpMission < 1) jumpNum = PlayerPrefs.GetInt("Jump_Count"); if(dashMission < 1) dashNum = PlayerPrefs.GetInt("Dash_Count"); }
/// <summary> /// Cast is aggregated, and therefore not in each provider /// </summary> /// <param name="ctx"></param> /// <param name="animeID"></param> /// <returns></returns> public static List <Role> GetCast(HttpContext ctx, int animeID) { List <Role> roles = new List <Role>(); var xrefAnimeStaff = RepoFactory.CrossRef_Anime_Staff.GetByAnimeIDAndRoleType(animeID, StaffRoleType.Seiyuu); foreach (var xref in xrefAnimeStaff) { if (xref.RoleID == null) { continue; } AnimeCharacter character = RepoFactory.AnimeCharacter.GetByID(xref.RoleID.Value); if (character == null) { continue; } AnimeStaff staff = RepoFactory.AnimeStaff.GetByID(xref.StaffID); if (staff == null) { continue; } Role role = new Role { Character = new Role.Person { Name = character.Name, AlternateName = character.AlternateName, Image = new Image(xref.RoleID.Value, ImageEntityType.Character), Description = character.Description }, Staff = new Role.Person { Name = staff.Name, AlternateName = staff.AlternateName, Description = staff.Description, Image = new Image(xref.StaffID, ImageEntityType.Staff), }, RoleName = ((StaffRoleType)xref.RoleType).ToString(), RoleDetails = xref.Role }; roles.Add(role); } return(roles); }
public async Task <IActionResult> OnPostAsync(int?id) { if (id == null) { return(NotFound()); } AnimeCharacter = await _context.AnimeCharacter.FindAsync(id); if (AnimeCharacter != null) { _context.AnimeCharacter.Remove(AnimeCharacter); await _context.SaveChangesAsync(); } return(RedirectToPage("./Index")); }
public async Task <IActionResult> OnGetAsync(int?id) { if (id == null) { return(NotFound()); } AnimeCharacter = await _context.AnimeCharacter .Include(a => a.Anime) .Include(a => a.Character).FirstOrDefaultAsync(m => m.AnimeCharacterID == id); if (AnimeCharacter == null) { return(NotFound()); } return(Page()); }
/// <summary> /// Cast is aggregated, and therefore not in each provider /// </summary> /// <param name="ctx"></param> /// <param name="animeID"></param> /// <param name="roleType"></param> /// <returns></returns> public static List <Role> GetCast(HttpContext ctx, int animeID, Role.CreatorRoleType?roleType = null) { List <Role> roles = new List <Role>(); var xrefAnimeStaff = roleType.HasValue ? RepoFactory.CrossRef_Anime_Staff.GetByAnimeIDAndRoleType(animeID, (StaffRoleType)roleType.Value) : RepoFactory.CrossRef_Anime_Staff.GetByAnimeID(animeID); foreach (var xref in xrefAnimeStaff) { AnimeCharacter character = xref.RoleID.HasValue ? RepoFactory.AnimeCharacter.GetByID(xref.RoleID.Value) : null; AnimeStaff staff = RepoFactory.AnimeStaff.GetByID(xref.StaffID); if (staff == null) { continue; } Role role = new Role { Character = character != null ? new Role.Person { Name = character.Name, AlternateName = character.AlternateName, Image = new Image(character.CharacterID, ImageEntityType.Character), Description = character.Description } : null, Staff = new Role.Person { Name = staff.Name, AlternateName = staff.AlternateName, Description = staff.Description, Image = staff.ImagePath != null ? new Image(staff.StaffID, ImageEntityType.Staff) : null, }, RoleName = (Role.CreatorRoleType)xref.RoleType, RoleDetails = xref.Role }; roles.Add(role); } return(roles); }
public static string GetImagePath(ImageEntityType type, int id) { string path; switch (type) { // 1 case ImageEntityType.AniDB_Cover: SVR_AniDB_Anime anime = Repo.Instance.AniDB_Anime.GetByID(id); if (anime == null) { return(null); } path = anime.PosterPath; if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; // 4 case ImageEntityType.TvDB_Banner: TvDB_ImageWideBanner wideBanner = Repo.Instance.TvDB_ImageWideBanner.GetByID(id); if (wideBanner == null) { return(null); } path = wideBanner.GetFullImagePath(); if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; // 5 case ImageEntityType.TvDB_Cover: TvDB_ImagePoster poster = Repo.Instance.TvDB_ImagePoster.GetByID(id); if (poster == null) { return(null); } path = poster.GetFullImagePath(); if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; // 6 case ImageEntityType.TvDB_Episode: TvDB_Episode ep = Repo.Instance.TvDB_Episode.GetByID(id); if (ep == null) { return(null); } path = ep.GetFullImagePath(); if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; // 7 case ImageEntityType.TvDB_FanArt: TvDB_ImageFanart fanart = Repo.Instance.TvDB_ImageFanart.GetByID(id); if (fanart == null) { return(null); } path = fanart.GetFullImagePath(); if (File.Exists(path)) { return(path); } path = string.Empty; break; // 8 case ImageEntityType.MovieDB_FanArt: MovieDB_Fanart mFanart = Repo.Instance.MovieDB_Fanart.GetByID(id); if (mFanart == null) { return(null); } mFanart = Repo.Instance.MovieDB_Fanart.GetByOnlineID(mFanart.URL); if (mFanart == null) { return(null); } path = mFanart.GetFullImagePath(); if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; // 9 case ImageEntityType.MovieDB_Poster: MovieDB_Poster mPoster = Repo.Instance.MovieDB_Poster.GetByID(id); if (mPoster == null) { return(null); } mPoster = Repo.Instance.MovieDB_Poster.GetByOnlineID(mPoster.URL); if (mPoster == null) { return(null); } path = mPoster.GetFullImagePath(); if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; case ImageEntityType.Character: AnimeCharacter character = Repo.Instance.AnimeCharacter.GetByID(id); if (character == null) { return(null); } path = ImageUtils.GetBaseAniDBCharacterImagesPath() + Path.DirectorySeparatorChar + character.ImagePath; if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; case ImageEntityType.Staff: var staff = Repo.Instance.AnimeStaff.GetByID(id); if (staff == null) { return(null); } path = ImageUtils.GetBaseAniDBCreatorImagesPath() + Path.DirectorySeparatorChar + staff.ImagePath; if (File.Exists(path)) { return(path); } else { path = string.Empty; } break; default: path = string.Empty; break; } return(path); }
public SeiyuuComparisonSubEntryBuilder WithCharacter(AnimeCharacter character) { _character = character; return(this); }
public async Task <ProfileData> GetProfileData(bool force = false, bool updateFavsOnly = false) { ProfileData possibleData = null; if (!force) { possibleData = await DataCache.RetrieveProfileData(_userName); } if (possibleData != null) { return(possibleData); } var raw = !updateFavsOnly ? await(await (await MalHttpContextProvider.GetHttpContextAsync()).GetAsync($"/profile/{_userName}")).Content.ReadAsStringAsync() : await GetRequestResponse(); var doc = new HtmlDocument(); doc.LoadHtml(raw); var current = new ProfileData { User = { Name = _userName } }; #region Recents try { var i = 1; foreach ( var recentNode in doc.DocumentNode.Descendants("div") .Where( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:recentUpdateNode:class"])) { if (i <= 3) { current.RecentAnime.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8).Split('/')[2])); } else { current.RecentManga.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8).Split('/')[2])); } i++; } } catch (Exception) { //no recents } #endregion #region FavChar try { foreach ( var favCharNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favCharacterNode:class"]) .Descendants("li")) { var curr = new AnimeCharacter(); var imgNode = favCharNode.Descendants("a").First(); var styleString = imgNode.Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); var infoNode = favCharNode.Descendants("div").Skip(1).First(); var nameNode = infoNode.Descendants("a").First(); curr.Name = nameNode.InnerText.Trim(); curr.Id = nameNode.Attributes["href"].Value.Substring(9).Split('/')[2]; var originNode = infoNode.Descendants("a").Skip(1).First(); curr.Notes = originNode.InnerText.Trim(); curr.ShowId = originNode.Attributes["href"].Value.Split('/')[2]; curr.FromAnime = originNode.Attributes["href"].Value.Split('/')[1] == "anime"; current.FavouriteCharacters.Add(curr); } } catch (Exception) { //no favs } #endregion #region FavManga try { foreach ( var favMangaNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favMangaNode:class"]) .Descendants("li")) { current.FavouriteManga.Add( int.Parse( favMangaNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavAnime try { foreach ( var favAnimeNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favAnimeNode:class"]) .Descendants("li")) { current.FavouriteAnime.Add( int.Parse( favAnimeNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavPpl try { foreach ( var favPersonNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == HtmlClassMgr.ClassDefs["#Profile:favPeopleNode:class"]) .Descendants("li")) { var curr = new AnimeStaffPerson(); var aElems = favPersonNode.Descendants("a"); var styleString = aElems.First().Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = aElems.Skip(1).First().InnerText.Trim(); curr.Id = aElems.Skip(1).First().Attributes["href"].Value.Substring(9).Split('/')[2]; current.FavouritePeople.Add(curr); } } catch (Exception) { //no favs } #endregion #region Stats if (!updateFavsOnly) { try { var animeStats = doc.FirstOfDescendantsWithClass("div", "stats anime"); var generalStats = animeStats.Descendants("div").First().Descendants("div"); current.AnimeDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim()); current.AnimeMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim()); var i = 0; #region AnimeStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.AnimeWatching = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 1: current.AnimeCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 2: current.AnimeOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 3: current.AnimeDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 4: current.AnimePlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r").Descendants("li")) { switch (i) { case 0: current.AnimeTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 1: current.AnimeRewatched = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 2: current.AnimeEpisodes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; } i++; } //we are done with anime #endregion i = 0; animeStats = doc.FirstOfDescendantsWithClass("div", "stats manga"); generalStats = animeStats.Descendants("div").First().Descendants("div"); current.MangaDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim()); current.MangaMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim()); #region MangaStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.MangaReading = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 1: current.MangaCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 2: current.MangaOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 3: current.MangaDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; case 4: current.MangaPlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim().Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r").Descendants("li")) { switch (i) { case 0: current.MangaTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 1: current.MangaReread = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 2: current.MangaChapters = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; case 3: current.MangaVolumes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim().Replace(",", "")); break; } i++; } //we are done with manga #endregion } catch (Exception) { //hatml } } #endregion #region LeftSideBar if (!updateFavsOnly) { try { var sideInfo = doc.FirstOfDescendantsWithClass("ul", "user-status border-top pb8 mb4").Descendants("li").ToList(); try { foreach (var htmlNode in sideInfo) { var left = WebUtility.HtmlDecode(htmlNode.FirstChild.InnerText); if (left == "Supporter") { continue; } current.Details.Add(new Tuple <string, string>(left, WebUtility.HtmlDecode(htmlNode.LastChild.InnerText))); } //current.LastOnline = sideInfo[0].LastChild.InnerText; //current.Gender = sideInfo[1].LastChild.InnerText; //current.Birthday = sideInfo[2].LastChild.InnerText; //current.Location = sideInfo[3].LastChild.InnerText; //current.Joined = sideInfo[4].LastChild.InnerText; } catch (Exception) { //current.LastOnline = sideInfo[0].LastChild.InnerText; //current.Joined = sideInfo[1].LastChild.InnerText; } current.User.ImgUrl = doc.FirstOfDescendantsWithClass("div", "user-image mb8").Descendants("img").First().Attributes["src" ] .Value; } catch (Exception) { //??? } } #endregion #region Friends if (!updateFavsOnly) { try { var friends = doc.FirstOfDescendantsWithClass("div", "user-friends pt4 pb12").Descendants("a"); foreach (var friend in friends) { var curr = new MalUser(); var styleString = friend.Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/76x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = friend.InnerText; current.Friends.Add(curr); } } catch (Exception) { // } } #endregion #region Comments if (!updateFavsOnly) { try { var commentBox = doc.FirstOfDescendantsWithClass("div", "user-comments mt24 pt24"); foreach (var comment in commentBox.WhereOfDescendantsWithClass("div", "comment clearfix")) { var curr = new MalComment(); curr.User.ImgUrl = comment.Descendants("img").First().Attributes["src"].Value; var textBlock = comment.Descendants("div").First(); var header = textBlock.Descendants("div").First(); curr.User.Name = header.ChildNodes[1].InnerText; curr.Date = header.ChildNodes[3].InnerText; curr.Content = WebUtility.HtmlDecode(textBlock.Descendants("div").Skip(1).First().InnerText.Trim()); var postActionNodes = comment.WhereOfDescendantsWithClass("a", "ml8"); var convNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Conversation"); if (convNode != null) { curr.ComToCom = WebUtility.HtmlDecode(convNode.Attributes["href"].Value.Split('?').Last()); } var deleteNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Delete"); if (deleteNode != null) { curr.CanDelete = true; curr.Id = deleteNode.Attributes["onclick"].Value.Split(new char[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries).Last(); } foreach (var img in comment.Descendants("img").Skip(1)) { if (img.Attributes.Contains("src")) { curr.Images.Add(img.Attributes["src"].Value); } } current.Comments.Add(curr); } } catch (Exception e) { //no comments } } #endregion try { current.ProfileMemId = doc.DocumentNode.Descendants("input") .First(node => node.Attributes.Contains("name") && node.Attributes["name"].Value == "profileMemId") .Attributes["value"].Value; } catch (Exception) { //restricted } try { current.HtmlContent = doc.FirstOfDescendantsWithClass("div", "word-break").OuterHtml; } catch (Exception) { // } if (_userName == Credentials.UserName) //umm why do we need someone's favs? { FavouritesManager.ForceNewSet(FavouriteType.Anime, current.FavouriteAnime.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Manga, current.FavouriteManga.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Character, current.FavouriteCharacters.Select(i => i.Id).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Person, current.FavouritePeople.Select(i => i.Id).ToList()); } if (!updateFavsOnly) { DataCache.SaveProfileData(_userName, current); } return(current); }
public async Task <ProfileData> GetProfileData(bool force = false, bool updateFavsOnly = false) { try { ProfileData possibleData = null; if (!force) { possibleData = await DataCache.RetrieveProfileData(_userName); } if (possibleData != null) { possibleData.Cached = true; return(possibleData); } var raw = !updateFavsOnly ? await(await (await ResourceLocator.MalHttpContextProvider.GetHttpContextAsync()) .GetAsync($"/profile/{_userName}")).Content.ReadAsStringAsync() : await GetRequestResponse(); var doc = new HtmlDocument(); doc.LoadHtml(raw); var current = new ProfileData { User = { Name = _userName } }; #region Recents try { var i = 1; foreach ( var recentNode in doc.DocumentNode.Descendants("div") .Where( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "statistics-updates di-b w100 mb8")) { if (i <= 3) { current.RecentAnime.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8) .Split('/')[2])); } else { current.RecentManga.Add( int.Parse( recentNode.Descendants("a").First().Attributes["href"].Value.Substring(8) .Split('/')[2])); } i++; } } catch (Exception) { //no recents } #endregion #region FavChar try { foreach ( var favCharNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list characters") .Descendants("li")) { var curr = new AnimeCharacter(); var imgNode = favCharNode.Descendants("a").First(); var styleString = imgNode.Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); var infoNode = favCharNode.Descendants("div").Skip(1).First(); var nameNode = infoNode.Descendants("a").First(); curr.Name = nameNode.InnerText.Trim(); curr.Id = nameNode.Attributes["href"].Value.Substring(9).Split('/')[2]; var originNode = infoNode.Descendants("a").Skip(1).First(); curr.Notes = originNode.InnerText.Trim(); curr.ShowId = originNode.Attributes["href"].Value.Split('/')[2]; curr.FromAnime = originNode.Attributes["href"].Value.Split('/')[1] == "anime"; current.FavouriteCharacters.Add(curr); } } catch (Exception) { //no favs } #endregion #region FavManga try { foreach ( var favMangaNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list manga") .Descendants("li")) { current.FavouriteManga.Add( int.Parse( favMangaNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavAnime try { foreach ( var favAnimeNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list anime") .Descendants("li")) { current.FavouriteAnime.Add( int.Parse( favAnimeNode.Descendants("a").First().Attributes["href"].Value.Substring(9).Split('/')[2 ])); } } catch (Exception) { //no favs } #endregion #region FavPpl try { foreach ( var favPersonNode in doc.DocumentNode.Descendants("ul") .First( node => node.Attributes.Contains("class") && node.Attributes["class"].Value == "favorites-list people") .Descendants("li")) { var curr = new AnimeStaffPerson(); var aElems = favPersonNode.Descendants("a"); var styleString = aElems.First().Attributes["style"].Value.Substring(22); curr.ImgUrl = styleString.Replace("/r/80x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = aElems.Skip(1).First().InnerText.Trim(); curr.Id = aElems.Skip(1).First().Attributes["href"].Value.Substring(9).Split('/')[2]; current.FavouritePeople.Add(curr); } } catch (Exception) { //no favs } #endregion #region Stats if (!updateFavsOnly) { try { var animeStats = doc.FirstOfDescendantsWithClass("div", "stats anime"); var generalStats = animeStats.Descendants("div").First().Descendants("div"); current.AnimeDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); current.AnimeMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); var i = 0; #region AnimeStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.AnimeWatching = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 1: current.AnimeCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 2: current.AnimeOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 3: current.AnimeDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 4: current.AnimePlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r") .Descendants("li")) { switch (i) { case 0: current.AnimeTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 1: current.AnimeRewatched = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 2: current.AnimeEpisodes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; } i++; } //we are done with anime #endregion i = 0; animeStats = doc.FirstOfDescendantsWithClass("div", "stats manga"); generalStats = animeStats.Descendants("div").First().Descendants("div"); current.MangaDays = float.Parse(generalStats.First().InnerText.Substring(5).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); current.MangaMean = float.Parse(generalStats.Last().InnerText.Substring(11).Trim(), NumberStyles.Any, CultureInfo.InvariantCulture); #region MangaStats foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-status fl-l").Descendants("li")) { switch (i) { case 0: current.MangaReading = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 1: current.MangaCompleted = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 2: current.MangaOnHold = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 3: current.MangaDropped = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; case 4: current.MangaPlanned = int.Parse(htmlNode.Descendants("span").First().InnerText.Trim() .Replace(",", "")); break; } i++; } //left stats done now right i = 0; foreach ( var htmlNode in animeStats.FirstOfDescendantsWithClass("ul", "stats-data fl-r") .Descendants("li")) { switch (i) { case 0: current.MangaTotal = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 1: current.MangaReread = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 2: current.MangaChapters = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; case 3: current.MangaVolumes = int.Parse(htmlNode.Descendants("span").Last().InnerText.Trim() .Replace(",", "")); break; } i++; } //we are done with manga #endregion } catch (Exception e) { //hatml } } #endregion #region LeftSideBar if (!updateFavsOnly) { try { var sideInfo = doc.FirstOfDescendantsWithClass("ul", "user-status border-top pb8 mb4").Descendants("li") .ToList(); try { foreach (var htmlNode in sideInfo) { var left = WebUtility.HtmlDecode(htmlNode.FirstChild.InnerText); if (left == "Supporter") { continue; } current.Details.Add(new Tuple <string, string>(left, WebUtility.HtmlDecode(htmlNode.LastChild.InnerText))); } } catch (Exception) { } current.User.ImgUrl = doc.FirstOfDescendantsWithClass("div", "user-image mb8").Descendants("img").First() .Attributes["src"].Value; } catch (Exception) { //??? } } #endregion #region Friends if (!updateFavsOnly) { try { var friends = doc.FirstOfDescendantsWithClass("div", "user-friends pt4 pb12").Descendants("a"); foreach (var friend in friends) { var curr = new MalUser(); var styleString = friend.Attributes["data-bg"].Value; curr.ImgUrl = styleString.Replace("/r/76x120", ""); curr.ImgUrl = curr.ImgUrl.Substring(0, curr.ImgUrl.IndexOf('?')); curr.Name = friend.InnerText; current.Friends.Add(curr); } } catch (Exception) { // } } #endregion #region Comments if (!updateFavsOnly) { try { var commentBox = doc.FirstOfDescendantsWithClass("div", "user-comments mt24 pt24"); foreach (var comment in commentBox.WhereOfDescendantsWithClass("div", "comment clearfix")) { var curr = new MalComment(); var imgNode = comment.Descendants("img").First(); if (imgNode.Attributes.Contains("srcset")) { curr.User.ImgUrl = imgNode.Attributes["srcset"].Value.Split(',').Last() .Replace("2x", "").Trim(); } else if (imgNode.Attributes.Contains("data-src")) { curr.User.ImgUrl = imgNode.Attributes["data-src"].Value; } var textBlock = comment.Descendants("div").First(); var header = textBlock.Descendants("div").First(); curr.User.Name = header.ChildNodes[1].InnerText; curr.Date = header.ChildNodes[3].InnerText; curr.Content = WebUtility.HtmlDecode(textBlock.Descendants("div").Skip(1).First().InnerText.Trim()); var postActionNodes = comment.WhereOfDescendantsWithClass("a", "ml8"); var convNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Conversation"); if (convNode != null) { curr.ComToCom = WebUtility.HtmlDecode(convNode.Attributes["href"].Value.Split('?').Last()); } var deleteNode = postActionNodes.FirstOrDefault(node => node.InnerText.Trim() == "Delete"); if (deleteNode != null) { curr.CanDelete = true; curr.Id = deleteNode.Attributes["onclick"].Value.Split(new char[] { '(', ')' }, StringSplitOptions.RemoveEmptyEntries).Last(); } foreach (var img in comment.Descendants("img").Skip(1)) { if (img.Attributes.Contains("src")) { curr.Images.Add(img.Attributes["src"].Value); } } current.Comments.Add(curr); } } catch (Exception e) { //no comments } } #endregion try { current.ProfileMemId = doc.DocumentNode.Descendants("input") .First(node => node.Attributes.Contains("name") && node.Attributes["name"].Value == "profileMemId") .Attributes["value"].Value; } catch (Exception) { //restricted } try { current.HtmlContent = doc.FirstOfDescendantsWithClass("div", "profile-about-user js-truncate-inner").OuterHtml; } catch (Exception) { // } if (_userName.Equals(Credentials.UserName, StringComparison.CurrentCultureIgnoreCase)) //umm why do we need someone's favs? { FavouritesManager.ForceNewSet(FavouriteType.Anime, current.FavouriteAnime.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Manga, current.FavouriteManga.Select(i => i.ToString()).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Character, current.FavouriteCharacters.Select(i => i.Id).ToList()); FavouritesManager.ForceNewSet(FavouriteType.Person, current.FavouritePeople.Select(i => i.Id).ToList()); } current.IsFriend = doc.FirstOrDefaultOfDescendantsWithClass("a", "icon-user-function icon-remove js-user-function") != null; current.CanAddFriend = doc.FirstOrDefaultOfDescendantsWithClass("a", "icon-user-function icon-request js-user-function") != null; if (!updateFavsOnly) { DataCache.SaveProfileData(_userName, current); } return(current); } catch (Exception e) { ResourceLocator.TelemetryProvider.LogEvent($"Profile Query Crash: {_userName}, {e}"); ResourceLocator.MessageDialogProvider.ShowMessageDialog( "Hmm, you have encountered bug that'm hunting. I've just sent report to myself. If everything goes well it should be gone in next release :). Sorry for inconvenience!", "Ooopsies!"); } return(new ProfileData()); }
public async Task AddAsync(AnimeCharacter character) { await _dbContext.AddAsync(character); await _dbContext.SaveChangesAsync(); }
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('/')[4]); 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('/')[4]; 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('/')[4]); 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 UpdateAsync(AnimeCharacter character) { character.ModificationDate = DateTime.UtcNow; _dbContext.Update(character); await _dbContext.SaveChangesAsync(); }
public AnimeRoleBuilder WithCharacter(AnimeCharacter character) { _character = character; return(this); }
private async void NavigateCharacterWebPage(AnimeCharacter character) { ResourceLocator.SystemControlsLauncherService.LaunchUri( new Uri($"https://myanimelist.net/character/{character.Id}")); }
/// <summary> /// Internal function that return valid image file path on server that exist /// </summary> /// <param name="id">image id</param> /// <param name="type">image type</param> /// <param name="thumb">thumb mode</param> /// <returns>string</returns> internal string GetImagePath(int type, int id, bool thumb) { ImageEntityType imageType = (ImageEntityType)type; string path; switch (imageType) { // 1 case ImageEntityType.AniDB_Cover: SVR_AniDB_Anime anime = RepoFactory.AniDB_Anime.GetByAnimeID(id); if (anime == null) { return(null); } path = anime.PosterPath; if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find AniDB_Cover image: {0}", anime.PosterPath); } break; // 2 case ImageEntityType.AniDB_Character: AniDB_Character chr = RepoFactory.AniDB_Character.GetByCharID(id); if (chr == null) { return(null); } path = chr.GetPosterPath(); if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find AniDB_Character image: {0}", chr.GetPosterPath()); } break; // 3 case ImageEntityType.AniDB_Creator: AniDB_Seiyuu creator = RepoFactory.AniDB_Seiyuu.GetBySeiyuuID(id); if (creator == null) { return(null); } path = creator.GetPosterPath(); if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find AniDB_Creator image: {0}", creator.GetPosterPath()); } break; // 4 case ImageEntityType.TvDB_Banner: TvDB_ImageWideBanner wideBanner = RepoFactory.TvDB_ImageWideBanner.GetByID(id); if (wideBanner == null) { return(null); } path = wideBanner.GetFullImagePath(); if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find TvDB_Banner image: {0}", wideBanner.GetFullImagePath()); } break; // 5 case ImageEntityType.TvDB_Cover: TvDB_ImagePoster poster = RepoFactory.TvDB_ImagePoster.GetByID(id); if (poster == null) { return(null); } path = poster.GetFullImagePath(); if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find TvDB_Cover image: {0}", poster.GetFullImagePath()); } break; // 6 case ImageEntityType.TvDB_Episode: TvDB_Episode ep = RepoFactory.TvDB_Episode.GetByID(id); if (ep == null) { return(null); } path = ep.GetFullImagePath(); if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find TvDB_Episode image: {0}", ep.GetFullImagePath()); } break; // 7 case ImageEntityType.TvDB_FanArt: TvDB_ImageFanart fanart = RepoFactory.TvDB_ImageFanart.GetByID(id); if (fanart == null) { return(null); } if (thumb) { //ratio path = fanart.GetFullThumbnailPath(); if (System.IO.File.Exists(path)) { return(path); } path = string.Empty; logger.Trace("Could not find TvDB_FanArt image: {0}", fanart.GetFullThumbnailPath()); } else { path = fanart.GetFullImagePath(); if (System.IO.File.Exists(path)) { return(path); } path = string.Empty; logger.Trace("Could not find TvDB_FanArt image: {0}", fanart.GetFullImagePath()); } break; // 8 case ImageEntityType.MovieDB_FanArt: MovieDB_Fanart mFanart = RepoFactory.MovieDB_Fanart.GetByID(id); if (mFanart == null) { return(null); } mFanart = RepoFactory.MovieDB_Fanart.GetByOnlineID(mFanart.URL); if (mFanart == null) { return(null); } path = mFanart.GetFullImagePath(); if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find MovieDB_FanArt image: {0}", mFanart.GetFullImagePath()); } break; // 9 case ImageEntityType.MovieDB_Poster: MovieDB_Poster mPoster = RepoFactory.MovieDB_Poster.GetByID(id); if (mPoster == null) { return(null); } mPoster = RepoFactory.MovieDB_Poster.GetByOnlineID(mPoster.URL); if (mPoster == null) { return(null); } path = mPoster.GetFullImagePath(); if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find MovieDB_Poster image: {0}", mPoster.GetFullImagePath()); } break; case ImageEntityType.Character: AnimeCharacter character = RepoFactory.AnimeCharacter.GetByID(id); if (character == null) { return(null); } path = ImageUtils.GetBaseAniDBCharacterImagesPath() + Path.DirectorySeparatorChar + character.ImagePath; if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find Character image: {0}", ImageUtils.GetBaseAniDBCharacterImagesPath() + Path.DirectorySeparatorChar + character.ImagePath); } break; case ImageEntityType.Staff: var staff = RepoFactory.AnimeStaff.GetByID(id); if (staff == null) { return(null); } path = ImageUtils.GetBaseAniDBCreatorImagesPath() + Path.DirectorySeparatorChar + staff.ImagePath; if (System.IO.File.Exists(path)) { return(path); } else { path = string.Empty; logger.Trace("Could not find Staff image: {0}", ImageUtils.GetBaseAniDBCreatorImagesPath() + Path.DirectorySeparatorChar + staff.ImagePath); } break; default: path = string.Empty; break; } return(path); }
public SeasonSummaryEntryBuilder WithCharacter(AnimeCharacter character) { _character = character; return(this); }
public async Task <List <AnimeCharacter> > GetMangaCharacters(bool force) //html is malformed { if (_animeMode) { throw new InvalidOperationException("You fed constructor with anime, remember?"); } var output = force ? new List <AnimeCharacter>() : await DataCache.RetrieveData <List <AnimeCharacter> >($"staff_{_animeId}", "MangaDetails", 7) ?? new List <AnimeCharacter>(); var raw = await GetRequestResponse(); 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(); foreach (var table in tables) { try { var current = new AnimeCharacter(); var imgs = table.Descendants("img").ToList(); var infos = table.Descendants("td").ToList(); //character 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.FromAnime = _animeMode; current.ShowId = _animeId.ToString(); current.Name = WebUtility.HtmlDecode(imgs[0].Attributes["alt"].Value.Replace(",", "")); current.Id = infos[0].ChildNodes[1].ChildNodes[0].Attributes["href"].Value.Split('/')[2]; current.Notes = ""; //malformed html here TODO: Check if fixed //table.Descendants("small").First().InnerText; output.Add(current); } catch (Exception) { // } } } catch (Exception) { //html strikes again } return(output); }
public void GenerateFromAniDB_Anime(HttpContext ctx, SVR_AniDB_Anime anime) { anidb_id = anime.AnimeID; restricted = anime.Restricted == 1; if (ctx.Items.ContainsKey("description")) { description = new List <Description> { new Description { source = "AniDB", language = "en", description = anime.Description } }; } ratings = new List <Rating> { new Rating { source = "AniDB", rating = (decimal)anime.Rating / 10, max_rating = 100, votes = anime.VoteCount } }; name = anime.MainTitle; series_type = anime.AnimeType.ToString(); if (anime.AirDate != null) { var airdate = anime.AirDate.Value; if (airdate != DateTime.MinValue) { air_date = airdate.ToString("yyyy-MM-dd"); } } if (anime.EndDate != null) { var enddate = anime.EndDate.Value; if (enddate != DateTime.MinValue) { end_date = enddate.ToString("yyyy-MM-dd"); } } AniDB_Vote vote = Repo.Instance.AniDB_Vote.GetByEntityAndType(anime.AnimeID, AniDBVoteType.Anime) ?? Repo.Instance.AniDB_Vote.GetByEntityAndType(anime.AnimeID, AniDBVoteType.AnimeTemp); if (vote != null) { string voteType = (AniDBVoteType)vote.VoteType == AniDBVoteType.Anime ? "Permanent" : "Temporary"; user_rating = new Rating { rating = (decimal)Math.Round(vote.VoteValue / 100D, 1), max_rating = 10, type = voteType, source = "User" }; } if (ctx.Items.ContainsKey("titles")) { titles = anime.GetTitles().Select(title => new Title { language = title.Language, title = title.Title, type = title.TitleType }).ToList(); } PopulateArtFromAniDBAnime(ctx, anime); if (ctx.Items.ContainsKey("cast")) { var xref_animestaff = Repo.Instance.CrossRef_Anime_Staff.GetByAnimeIDAndRoleType(anime.AnimeID, StaffRoleType.Seiyuu); foreach (var xref in xref_animestaff) { if (xref.RoleID == null) { continue; } AnimeCharacter character = Repo.Instance.AnimeCharacter.GetByID(xref.RoleID.Value); if (character == null) { continue; } AnimeStaff staff = Repo.Instance.AnimeStaff.GetByID(xref.StaffID); if (staff == null) { continue; } Role role = new Role { character = new Role.Person { name = character.Name, alternate_name = character.AlternateName, image = new Image(ctx, xref.RoleID.Value, ImageEntityType.Character), description = character.Description }, staff = new Role.Person { name = staff.Name, alternate_name = staff.AlternateName, description = staff.Description, image = new Image(ctx, xref.StaffID, ImageEntityType.Staff), }, role = ((StaffRoleType)xref.RoleType).ToString(), role_details = xref.Role }; if (cast == null) { cast = new List <Role>(); } cast.Add(role); } } if (ctx.Items.ContainsKey("tags")) { var animeTags = anime.GetAllTags(); if (animeTags != null) { if (!ctx.Items.TryGetValue("tagfilter", out object tagfilter)) { tagfilter = 0; } tags = TagFilter.ProcessTags((TagFilter.Filter)tagfilter, animeTags.ToList()); } } }