public async Task <List <VideoModel> > GetVideos() { var results = new List <VideoModel>(); var xml = await GetXmlChannelAsync(MylistUrl); foreach (var item in xml.Descendants("item")) { var video = new VideoModel(); // 明細部をXDocumentで読み込むために整形 var descriptionString = item.Element("description").Value; descriptionString = descriptionString.Replace(" ", " "); //descriptionString = HttpUtility.HtmlDecode(descriptionString); descriptionString = descriptionString.Replace("&", "&"); //descriptionString = descriptionString.Replace("'", "'"); // 明細部読み込み var desc = ToXml($"<root>{descriptionString}</root>"); //// 動画時間 //var lengthSecondsStr = (string)desc // .Descendants("strong") // .Where(x => (string)x.Attribute("class") == "nico-info-length") // .First(); video.VideoUrl = item.Element("link").Value; video.StartTime = NicoUtil.ToRankingDatetime(desc, "nico-info-date"); results.Add(video); } return(results); }
public async Task AddVideo(VideoModel video) { if (!Videos.Any(v => v.VideoId == video.VideoId)) { // 元データのステータス更新 video.Status = VideoStatus.New; // ビデオ追加 await AddVideo(video.VideoId); } }
/// <summary> /// Xmlからモデルを作成します。 /// </summary> /// <param name="item">Xml</param> /// <param name="view">viewのタグ名</param> /// <param name="mylist">mylistのタグ名</param> /// <param name="comment">commentのタグ名</param> /// <returns></returns> protected async Task <VideoModel> CreateVideoFromXml(XElement item, string view, string mylist, string comment) { try { //// 明細部をXDocumentで読み込むために整形 //var descriptionString = item.Element("description").Value; //descriptionString = descriptionString.Replace(" ", " "); ////descriptionString = HttpUtility.HtmlDecode(descriptionString); //descriptionString = descriptionString.Replace("&", "&"); ////descriptionString = descriptionString.Replace("'", "'"); //// 明細部読み込み //var desc = ToXml($"<root>{descriptionString}</root>"); //// 動画時間 //var lengthSecondsStr = (string)desc // .Descendants("strong") // .Where(x => (string)x.Attribute("class") == "nico-info-length") // .First(); var video = await VideoModel.CreateInstance(item.Element("link").Value); //video.VideoUrl = item.Element("link").Value; video.Title = item.Element("title").Value; //video.ViewCounter = NicoUtil.ToCounter(desc, view); //video.MylistCounter = NicoUtil.ToCounter(desc, mylist); //video.CommentCounter = NicoUtil.ToCounter(desc, comment); //video.StartTime = NicoUtil.ToRankingDatetime(desc, "nico-info-date"); //video.ThumbnailUrl = (string)desc.Descendants("img").First().Attribute("src"); //video.LengthSeconds = NicoUtil.ToLengthSeconds(lengthSecondsStr); //video.Description = (string)desc.Descendants("p").FirstOrDefault(x => (string)x.Attribute("class") == "nico-description"); /* * <item> * <title>第1位:【女子2人】初めてパンの気持ちを理解する実況【I am Bread】</title> * <link>http://www.nicovideo.jp/watch/sm34525974</link> * <guid isPermaLink="false">tag:nicovideo.jp,2019-01-25:/watch/sm34525974</guid> * <pubDate>Thu, 31 Jan 2019 07:06:01 +0900</pubDate> * <description><![CDATA[ * <p class="nico-thumbnail"><img alt="【女子2人】初めてパンの気持ちを理解する実況【I am Bread】" src="http://tn.smilevideo.jp/smile?i=34525974.59215" width="94" height="70" border="0"/></p> * <p class="nico-description">全パンの想いを背負いし者----------------------関西弁女子実況グループ『サイコロジカルサーカス』が、第13回実況者杯に参加します!フリー部門実況動画の部、謎部門にエントリー!再生数・コメント・マイリス数で順位が決まります!!応援よろよろ!( ˘ω˘ )ニコニ広告が可能です!よければ広告で宣伝もよろしくお願いします(強欲の壺)テーマは【初】この動画はフリー部門実況動画の部の動画です。 今回は映画風の始まりにしてみました!楽しんで見てもらえるとうれしい!(*^^*)今回のプログラム⇒mylist/63232841大会詳細⇒sm33431601パンフレット⇒mylist/55555016舞台袖⇒co3253598プレイメンバー…ノイジーワールド(紫)・馬面なおと(桃) Twitter…https://twitter.com/rojikaru2525</p> * <p class="nico-info"><small><strong class="nico-info-number">20,404</strong>pts.|<strong class="nico-info-length">20:04</strong>|<strong class="nico-info-date">2019年01月25日 18:11:01</strong> 投稿<br/><strong>合計</strong> 再生:<strong class="nico-info-total-view">729</strong> コメント:<strong class="nico-info-total-res">59</strong> マイリスト:<strong class="nico-info-total-mylist">9</strong><br/><strong>毎時</strong> 再生:<strong class="nico-info-hourly-view">4</strong> コメント:<strong class="nico-info-hourly-res">0</strong> マイリスト:<strong class="nico-info-hourly-mylist">0</strong><br/></small></p> * ]]></description> * </item> * */ return(video); } catch { Console.WriteLine(item); throw; } }
public async Task ReloadTemporary() { const string url = "http://www.nicovideo.jp/api/deflist/list"; var json = await GetJsonAsync(url); Videos.Clear(); foreach (dynamic item in json["mylistitem"]) { VideoModel video; if (item["item_data"]["deleted"] == "0") { video = await VideoModel.CreateInstance(item["item_data"]["video_id"]); } else { video = new VideoModel(); video.VideoUrl = item["item_data"]["video_id"]; video.Title = item["item_data"]["title"]; video.Description = item["description"]; //video.Tags = data["tags"]; //video.CategoryTag = data["categoryTags"]; video.ViewCounter = long.Parse(item["item_data"]["view_counter"]); video.MylistCounter = long.Parse(item["item_data"]["mylist_counter"]); video.CommentCounter = long.Parse(item["item_data"]["num_res"]); video.StartTime = NicoUtil.FromUnixTime((long)item["item_data"]["first_retrieve"]); //video.LastCommentTime = Converter.item(data["lastCommentTime"]); video.LengthSeconds = long.Parse(item["item_data"]["length_seconds"]); video.ThumbnailUrl = item["item_data"]["thumbnail_url"]; //video.LastResBody = item["item_data"]["last_res_body"]; //video.CommunityIcon = data["communityIcon"]; } Videos.Add(video); } MainViewModel.Instance.TemporaryCount = Videos.Count; }
public async Task AddVideo(string id) { const string url = "http://www.nicovideo.jp/api/deflist/add?item_type=0&item_id={0}&description={1}&token={2}"; if (!Videos.Any(v => v.VideoId == id)) { // インスタンス作成 var video = await VideoModel.CreateInstance(id); // URLに追加 var txt = await GetStringAsync(string.Format(url, await GetItemId(video.VideoId), "", await GetToken())); // ステータス更新 video.Status = VideoStatus.New; // 自身に追加 Videos.Insert(0, video); // 履歴に追加 await AddHistory(video.VideoId); MainViewModel.Instance.TemporaryCount = Videos.Count; } }
private async Task RefreshAsync() { var results = new List <string>(); // 履歴に残っている動画のリスト(ID重複削除) var targets = Histories .Select(history => history.VideoId) .Distinct() .ToArray(); foreach (var id in targets) { var v = await VideoModel.CreateInstance(id); if (v.Status == VideoStatus.Delete) { // 削除済の履歴はDBからも削除 results.Add(id); } } if (!results.Any()) { return; } using (var accessor = DbAccessor.GetAccessor()) using (var control = accessor.GetCommand()) { await control.BeginTransaction(); await control.DeleteVideoHistory(results.ToArray()); await control.Commit(); } }
public async Task DeleteVideo(VideoModel video) { await DeleteVideo(video.VideoId); }