//取得したストーリーボードのデータに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); }
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); } }