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("&nbsp;", "&#x20;");
                //descriptionString = HttpUtility.HtmlDecode(descriptionString);
                descriptionString = descriptionString.Replace("&", "&amp;");
                //descriptionString = descriptionString.Replace("'", "&apos;");

                // 明細部読み込み
                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);
        }
Example #2
0
        public async Task AddVideo(VideoModel video)
        {
            if (!Videos.Any(v => v.VideoId == video.VideoId))
            {
                // 元データのステータス更新
                video.Status = VideoStatus.New;

                // ビデオ追加
                await AddVideo(video.VideoId);
            }
        }
Example #3
0
        /// <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("&nbsp;", "&#x20;");
                ////descriptionString = HttpUtility.HtmlDecode(descriptionString);
                //descriptionString = descriptionString.Replace("&", "&amp;");
                ////descriptionString = descriptionString.Replace("'", "&apos;");

                //// 明細部読み込み
                //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;
            }
        }
Example #4
0
        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;
        }
Example #5
0
        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();
                }
        }
Example #7
0
 public async Task DeleteVideo(VideoModel video)
 {
     await DeleteVideo(video.VideoId);
 }