Пример #1
0
        //取得したストーリーボードのデータにBitmapオブジェクトを追加して返す
        public NicoNicoStoryBoardData GetStoryBoardData()
        {
            //エコノミーだったら
            if (StoryBoardApiBaseUrl.Contains("low"))
            {
                return(null);
            }

            NicoNicoStoryBoardData data = GetStoryBoardInternalData();

            //ストーリーボードが無かったら
            if (data == null)
            {
                return(null);
            }

            //APIURL
            string uri = StoryBoardApiBaseUrl + "&sb=" + data.Id + "&board=";


            int bitmapindex = 0;

            for (int i = 1; i <= data.Count; i++)
            {
                var response = NicoNicoWrapperMain.GetSession().GetStreamAsync(uri + i).Result;

                Bitmap bitmap = new Bitmap(response);

                for (int j = 0; j < data.Cols; j++)
                {
                    for (int k = 0; k < data.Rows; k++)
                    {
                        Rectangle rect = new Rectangle(data.Width * k, data.Height * j, data.Width, data.Height);

                        data.BitmapCollection[bitmapindex] = bitmap.Clone(rect, bitmap.PixelFormat);
                        bitmapindex += data.Interval;
                    }
                }
            }

            return(data);
        }
Пример #2
0
        public async Task <NicoNicoStoryBoardData> GetVideoStoryBoardAsync(string videoUrl)
        {
            try {
                //プロトコルがhttpじゃない時点で取得不可
                if (videoUrl.StartsWith("rtmp"))
                {
                    return(null);
                }

                var res = await App.ViewModelRoot.CurrentUser.Session.GetResponseAsync(videoUrl + "&sb=1");

                //見せてもらえなかったらnullを返すしか無いね
                if (!res.IsSuccessStatusCode || res.Content.Headers.ContentDisposition.FileName.Contains("smile"))
                {
                    return(null);
                }

                //ニコニコのストーリーボードを返すWebサーバがわけわからん文字エンコーディングを返してくるので
                //仕方なくbyte配列から文字列を復元する
                var a = Encoding.UTF8.GetString(await res.Content.ReadAsByteArrayAsync());

                res.Dispose();


                var xml = new XmlDocument();
                xml.LoadXml(a);

                var storyboard = xml.SelectSingleNode("/smile/storyboard[1]");

                var ret = new NicoNicoStoryBoardData()
                {
                    Id       = storyboard.Attributes["id"] != null ? storyboard.Attributes["id"].Value : "1",
                    Cols     = int.Parse(storyboard.SelectSingleNode("board_cols").InnerText),
                    Rows     = int.Parse(storyboard.SelectSingleNode("board_rows").InnerText),
                    Count    = int.Parse(storyboard.SelectSingleNode("board_number").InnerText),
                    Width    = int.Parse(storyboard.SelectSingleNode("thumbnail_width").InnerText),
                    Height   = int.Parse(storyboard.SelectSingleNode("thumbnail_height").InnerText),
                    Interval = int.Parse(storyboard.SelectSingleNode("thumbnail_interval").InnerText),
                    Number   = int.Parse(storyboard.SelectSingleNode("thumbnail_number").InnerText)
                };

                var imageUrl = videoUrl + "&sb=" + ret.Id + "&board=";

                int bitmapindex = 0;
                for (int i = 1; i <= ret.Count; i++)
                {
                    var image = await App.ViewModelRoot.CurrentUser.Session.GetResponseAsync(imageUrl + i);

                    var bitmap = new Bitmap(await image.Content.ReadAsStreamAsync());

                    for (int j = 0; j < ret.Cols; j++)
                    {
                        for (int k = 0; k < ret.Rows; k++)
                        {
                            var rect = new Rectangle(ret.Width * k, ret.Height * j, ret.Width, ret.Height);

                            ret.BitmapCollection[bitmapindex] = bitmap.Clone(rect, bitmap.PixelFormat);
                            bitmapindex += ret.Interval;
                        }
                    }
                }

                return(ret);
            } catch (Exception) {
                Owner.Status = "ストーリーボードの取得に失敗しました";
                return(null);
            }
        }