예제 #1
0
        private async Task GetCharacterAndSeiyuuInformation(IAnime anime, string username, string password)
        {
            try
            {
                //Our first task is to retrieve the MAL anime - for now we cheat and grab it from our example data
                var doc = new HtmlDocument();

                var url = anime.AdditionalInfoUrls.CharactersAndStaff;
                HttpClient webClient;

                if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
                {
                    var handler = new HttpClientHandler {Credentials = new NetworkCredential(username, password)};
                    webClient = new HttpClient(handler);
                }
                else
                {
                    webClient = new HttpClient();
                }
                var data = await webClient.GetStreamAsync(new Uri(url));
                doc.Load(data);

                var tableNodes = doc.DocumentNode.SelectNodes("//table");
                foreach (var table in tableNodes)
                {
                    var rows = table.ChildNodes.Where(t => t.Name == "tr");
                    //var rows = table.SelectNodes("//tr");
                    if (rows != null)
                    {
                        foreach (var row in rows)
                        {
                            var columns = row.ChildNodes.Where(t => t.Name == "td").ToList();
                            if (columns.Count == 3)
                            {
                                var tmpChar = _characterFactory.CreateCharacter();
                                var charPic = columns[0].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["data-src"]?.Value;
                                if (string.IsNullOrEmpty(charPic))
                                {
                                    charPic = columns[0].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["src"]?.Value;
                                }
                                tmpChar.CharacterPicture = charPic;


                                tmpChar.CharacterName = columns[1].ChildNodes["a"].InnerText;
                                tmpChar.CharacterUrl = columns[1].ChildNodes["a"].Attributes["href"].Value;
                                tmpChar.CharacterType = columns[1].ChildNodes["div"].InnerText;

                                var vaDetail = columns[2].ChildNodes["table"]?.ChildNodes.Where(t => t.Name == "tr").ToList();
                                if(vaDetail == null) continue;
                                foreach (var detail in vaDetail)
                                {
                                    var tmpSeiyuu = _characterFactory.CreateSeiyuu();
                                    tmpSeiyuu.Language = detail.ChildNodes["td"].ChildNodes["small"].InnerText;
                                    tmpSeiyuu.Name = detail.ChildNodes["td"].ChildNodes["a"].InnerText;
                                    tmpSeiyuu.Url = detail.ChildNodes["td"].ChildNodes["a"].Attributes["href"].Value;
                                    var tmpImage = detail.ChildNodes[3].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["data-src"]?.Value;
                                    if (string.IsNullOrEmpty(tmpImage))
                                    {
                                        tmpImage = detail.ChildNodes[3].ChildNodes["div"].ChildNodes["a"].ChildNodes["img"].Attributes["src"].Value;
                                    }
                                    tmpSeiyuu.PictureUrl = tmpImage;
                                    tmpChar.Seiyuu.Add(tmpSeiyuu);
                                }
                                if(anime.CharacterInformation.Count(t => t.CharacterUrl == tmpChar.CharacterUrl) == 0)
                                    anime.CharacterInformation.Add(tmpChar);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error occured while trying to retrieve character and staff data");
            }

        }