//ニコレポ取得 public IList <NicoNicoNicoRepoDataEntry> GetNicoRepo() { //APIと言うのか謎 var api = PrevUrl = @"http://www.nicovideo.jp/my/top/" + Id + @"?innerPage=1&mode=next_page"; //html var html = NicoNicoWrapperMain.GetSession().GetAsync(api).Result; IList <NicoNicoNicoRepoDataEntry> data = new List <NicoNicoNicoRepoDataEntry>(); //XPathでhtmlから抜き出す HtmlDocument doc = new HtmlDocument(); doc.LoadHtml2(html); //ニコレポが存在しなかったら存在しないというエントリを返す if (doc.DocumentNode.SelectSingleNode("/div[@class='nicorepo']/div[@class='nicorepo-page']/div").Attributes["class"].Value.Equals("empty")) { NicoNicoNicoRepoDataEntry entry = new NicoNicoNicoRepoDataEntry(); entry.ImageUrl = entry.IconUrl = null; entry.Description = "ニコレポが存在しません。"; data.Add(entry); return(data); } StoreData(doc, data); return(data); }
//ニコレポ取得 public IList<NicoNicoNicoRepoDataEntry> GetNicoRepo() { //APIと言うのか謎 var api = PrevUrl = @"http://www.nicovideo.jp/my/top/" + Id + @"?innerPage=1&mode=next_page"; //html var html = NicoNicoWrapperMain.GetSession().GetAsync(api).Result; IList<NicoNicoNicoRepoDataEntry> data = new List<NicoNicoNicoRepoDataEntry>(); //XPathでhtmlから抜き出す HtmlDocument doc = new HtmlDocument(); doc.LoadHtml2(html); //ニコレポが存在しなかったら存在しないというエントリを返す if(doc.DocumentNode.SelectSingleNode("/div[@class='nicorepo']/div[@class='nicorepo-page']/div").Attributes["class"].Value.Equals("empty")) { NicoNicoNicoRepoDataEntry entry = new NicoNicoNicoRepoDataEntry(); entry.ImageUrl = entry.IconUrl = null; entry.Description = "ニコレポが存在しません。"; data.Add(entry); return data; } StoreData(doc, data); return data; }
//削除ボタンを利用するならこっち public NicoRepoResultEntryViewModel(NicoNicoNicoRepoDataEntry entry, NicoRepoListViewModel owner) { Owner = owner; Entry = entry; if(entry.IsMyNicoRepo) { ShowDeleteButton = true; } }
//一度nullを返してきたら二度と呼ばない public List <NicoNicoNicoRepoDataEntry> GetUserNicoRepo() { var url = UserPage + "/top?innerPage=1&offset=" + Offset; Owner.Status = "ユーザーニコレポ取得中"; List <NicoNicoNicoRepoDataEntry> ret = new List <NicoNicoNicoRepoDataEntry>(); try { var a = NicoNicoWrapperMain.Session.GetAsync(url).Result; var doc = new HtmlDocument(); doc.LoadHtml2(a); var timeline = doc.DocumentNode.SelectNodes("//div[@class='timeline']/div"); //タイムラインを取得できなかったら終了 if (timeline == null) { Owner.Status = ""; return(null); } //ニコレポタイムライン走査 foreach (HtmlNode node in timeline) { NicoNicoNicoRepoDataEntry entry = new NicoNicoNicoRepoDataEntry(); entry.IconUrl = node.SelectSingleNode("child::div[contains(@class, 'log-author ')]/a/img").Attributes["data-original"].Value; entry.Title = HttpUtility.HtmlDecode(node.SelectSingleNode("child::div[@class='log-content']/div[@class='log-body']").InnerHtml.Trim()); HtmlNode thumbnail = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-target-thumbnail']/a/img"); entry.ImageUrl = thumbnail != null ? thumbnail.Attributes["data-original"].Value : entry.IconUrl; HtmlNode desc = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-target-info']/a"); entry.Description = desc != null?HttpUtility.HtmlDecode(desc.InnerText.Trim()) : ""; entry.VideoUrl = desc != null ? desc.Attributes["href"].Value : ""; HtmlNode time = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-footer']/div/a[contains(@class, 'log-footer-date')]/time"); entry.Time = time.InnerText.Trim(); ret.Add(entry); } Owner.Status = ""; Offset += 20; return(ret); } catch (RequestTimeout) { Owner.Status = "ユーザーニコレポの取得に失敗しました"; return(null); } }
public NicoRepoResultEntryViewModel(NicoNicoNicoRepoDataEntry entry) { Entry = entry; }
private void StoreData(HtmlDocument doc, IList <NicoNicoNicoRepoDataEntry> list) { var timeline = doc.DocumentNode.SelectNodes("//div[@class='timeline']/div"); if (timeline == null) { return; } //ニコレポタイムライン走査 foreach (HtmlNode node in timeline) { NicoNicoNicoRepoDataEntry entry = new NicoNicoNicoRepoDataEntry(); entry.IconUrl = node.SelectSingleNode("child::div[contains(@class, 'log-author ')]/a/img").Attributes["data-original"].Value; entry.Title = HttpUtility.HtmlDecode(node.SelectSingleNode("child::div[@class='log-content']/div[@class='log-body']").InnerHtml.Trim()); HtmlNode thumbnail = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-target-thumbnail']/a/img"); entry.ImageUrl = thumbnail != null ? thumbnail.Attributes["data-original"].Value : entry.IconUrl; HtmlNode desc = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-target-info']/a"); entry.Description = desc != null?HttpUtility.HtmlDecode(desc.InnerText.Trim()) : ""; entry.VideoUrl = desc != null ? desc.Attributes["href"].Value : ""; HtmlNode time = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-footer']/div/a[contains(@class, 'log-footer-date')]/time"); entry.Time = time.InnerText.Trim(); //自分のニコレポだったら HtmlNode delete = node.SelectSingleNode("child::form"); if (delete != null) { entry.IsMyNicoRepo = true; entry.LogId = delete.SelectSingleNode("child::input[@name='log_id']").Attributes["value"].Value; entry.Type = delete.SelectSingleNode("child::input[@name='type']").Attributes["value"].Value; entry.DeleteTime = delete.SelectSingleNode("child::input[@name='time']").Attributes["value"].Value; entry.Token = delete.SelectSingleNode("child::input[@name='token']").Attributes["value"].Value; } list.Add(entry); } if (doc.DocumentNode.SelectSingleNode("/div[@class='nicorepo']/div[@class='nicorepo-page']/div[@class='no-next-page']") != null) { NicoNicoNicoRepoDataEntry entry = new NicoNicoNicoRepoDataEntry(); NextUrl = "end"; entry.ImageUrl = entry.IconUrl = null; entry.Description = "これより過去のニコレポは存在しません。"; list.Add(entry); } else { //過去ニコレポのURL string attr = HttpUtility.HtmlDecode(doc.DocumentNode.SelectSingleNode("/div[@class='nicorepo']/div[@class='nicorepo-page']/div[@class='next-page']/a").Attributes["href"].Value); NextUrl = @"http://www.nicovideo.jp" + attr; } }
private void StoreData(HtmlDocument doc, IList<NicoNicoNicoRepoDataEntry> list) { var timeline = doc.DocumentNode.SelectNodes("//div[@class='timeline']/div"); if(timeline == null) { return; } //ニコレポタイムライン走査 foreach(var node in timeline) { var entry = new NicoNicoNicoRepoDataEntry(); entry.IconUrl = node.SelectSingleNode("child::div[contains(@class, 'log-author ')]/a/img").Attributes["data-original"].Value; var content = node.SelectSingleNode("div[@class='log-content']"); entry.Title = HttpUtility.HtmlDecode(content.SelectSingleNode("div[@class='log-body']").InnerHtml.Trim()); entry.LogId = content.SelectSingleNode("div[contains(@class, 'log-details')]").Attributes["class"].Value; var thumbnail = content.SelectSingleNode("div/div[@class='log-target-thumbnail']/a/img"); entry.ImageUrl = thumbnail != null ? thumbnail.Attributes["data-original"].Value : entry.IconUrl; var desc = content.SelectSingleNode("div/div[@class='log-target-info']/a"); entry.Description = desc != null ? HttpUtility.HtmlDecode(desc.InnerText.Trim()) : ""; entry.VideoUrl = desc != null ? desc.Attributes["href"].Value : ""; var time = content.SelectSingleNode("div/div[@class='log-footer']/div/a[contains(@class, 'log-footer-date')]/time"); entry.Time = time.InnerText.Trim(); //自分のニコレポだったら HtmlNode delete = node.SelectSingleNode("child::form"); if(delete != null) { entry.IsMyNicoRepo = true; entry.LogId = delete.SelectSingleNode("child::input[@name='log_id']").Attributes["value"].Value; entry.Type = delete.SelectSingleNode("child::input[@name='type']").Attributes["value"].Value; entry.DeleteTime = delete.SelectSingleNode("child::input[@name='time']").Attributes["value"].Value; entry.Token = delete.SelectSingleNode("child::input[@name='token']").Attributes["value"].Value; } list.Add(entry); } if(doc.DocumentNode.SelectSingleNode("/div[@class='nicorepo']/div[@class='nicorepo-page']/div[@class='no-next-page']") != null) { NicoNicoNicoRepoDataEntry entry = new NicoNicoNicoRepoDataEntry(); NextUrl = "end"; entry.ImageUrl = entry.IconUrl = entry.Title = entry.Time = entry.LogId = ""; entry.Description = "これより過去のニコレポは存在しません。"; list.Add(entry); } else { //過去ニコレポのURL string attr = HttpUtility.HtmlDecode(doc.DocumentNode.SelectSingleNode("/div[@class='nicorepo']/div[@class='nicorepo-page']/div[@class='next-page']/a").Attributes["href"].Value); NextUrl = @"http://www.nicovideo.jp" + attr; } }
//一度nullを返してきたら二度と呼ばない public List<NicoNicoNicoRepoDataEntry> GetUserNicoRepo() { var url = UserPage + "/top?innerPage=1&offset=" + Offset; Owner.Status = "ユーザーニコレポ取得中"; List<NicoNicoNicoRepoDataEntry> ret = new List<NicoNicoNicoRepoDataEntry>(); try { var a = NicoNicoWrapperMain.Session.GetAsync(url).Result; var doc = new HtmlDocument(); doc.LoadHtml2(a); var timeline = doc.DocumentNode.SelectNodes("//div[@class='timeline']/div"); //タイムラインを取得できなかったら終了 if(timeline == null) { Owner.Status = ""; return null; } //ニコレポタイムライン走査 foreach(HtmlNode node in timeline) { NicoNicoNicoRepoDataEntry entry = new NicoNicoNicoRepoDataEntry(); entry.IconUrl = node.SelectSingleNode("child::div[contains(@class, 'log-author ')]/a/img").Attributes["data-original"].Value; entry.Title = HttpUtility.HtmlDecode(node.SelectSingleNode("child::div[@class='log-content']/div[@class='log-body']").InnerHtml.Trim()); HtmlNode thumbnail = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-target-thumbnail']/a/img"); entry.ImageUrl = thumbnail != null ? thumbnail.Attributes["data-original"].Value : entry.IconUrl; HtmlNode desc = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-target-info']/a"); entry.Description = desc != null ? HttpUtility.HtmlDecode(desc.InnerText.Trim()) : ""; entry.VideoUrl = desc != null ? desc.Attributes["href"].Value : ""; HtmlNode time = node.SelectSingleNode("child::div[@class='log-content']/div/div[@class='log-footer']/div/a[contains(@class, 'log-footer-date')]/time"); entry.Time = time.InnerText.Trim(); ret.Add(entry); } Owner.Status = ""; Offset += 20; return ret; } catch(RequestTimeout) { Owner.Status = "ユーザーニコレポの取得に失敗しました"; return null; } }