Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 public AnimeComparisonSubEntry(AnimeCharacter character, Anime anime)
 {
     Anime      = anime;
     Characters = new List <AnimeCharacter>
     {
         character
     };
 }
Esempio n. 3
0
 public SeiyuuComparisonSubEntry(AnimeCharacter character, Seiyuu seiyuu)
 {
     Seiyuu     = seiyuu;
     Characters = new List <AnimeCharacter>
     {
         character
     };
 }
Esempio n. 4
0
 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;
 }
Esempio n. 5
0
 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
     });
 }
Esempio n. 6
0
 public SeiyuuComparisonEntry(Anime anime, AnimeCharacter character, Seiyuu seiyuu)
 {
     Anime = new List <Anime>
     {
         anime
     };
     SeiyuuCharacters = new List <SeiyuuComparisonSubEntry>
     {
         new SeiyuuComparisonSubEntry(character, seiyuu)
     };
 }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
	// 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");
	}
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        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"));
        }
Esempio n. 11
0
        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());
        }
Esempio n. 12
0
        /// <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);
        }
Esempio n. 13
0
        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);
 }
Esempio n. 15
0
        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);
        }
Esempio n. 16
0
        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());
        }
Esempio n. 17
0
        public async Task AddAsync(AnimeCharacter character)
        {
            await _dbContext.AddAsync(character);

            await _dbContext.SaveChangesAsync();
        }
Esempio n. 18
0
        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);
        }
Esempio n. 19
0
 public async Task UpdateAsync(AnimeCharacter character)
 {
     character.ModificationDate = DateTime.UtcNow;
     _dbContext.Update(character);
     await _dbContext.SaveChangesAsync();
 }
Esempio n. 20
0
 public AnimeRoleBuilder WithCharacter(AnimeCharacter character)
 {
     _character = character;
     return(this);
 }
Esempio n. 21
0
 private async void NavigateCharacterWebPage(AnimeCharacter character)
 {
     ResourceLocator.SystemControlsLauncherService.LaunchUri(
         new Uri($"https://myanimelist.net/character/{character.Id}"));
 }
Esempio n. 22
0
        /// <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);
        }
Esempio n. 25
0
        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());
                }
            }
        }