気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
大体、調査が出来たのでいよいよ本格的にビューワーの開発を始めました。今日までで YouTubeからフィードを取得して、情報を画面に表示し、それがクリックされると動画を再生する ところまでいきました。
まだかなり物足りないですが、画面イメージはこんな感じです。

(画像をクリックすると拡大表示します。)

まず、YouTube APIに接続して検索などを行う専用のクラス[YouTubeProxy」を作成しました。 主なメソッドは検索を行うための[Search]です。複合キーワードによる検索など もう少し詳細な処理を追加したいのですが、今のところはこんな感じ。

   /// 
   /// YouTubeからFeedを検索する
   /// 
   /// 検索ワード
   /// 
   public YouTubeFeed Search(String searchWord,int startIndex)
   {
       //APIへのプロキシ
       YouTubeService service = new YouTubeService(_applicationName);

       //クエリオブジェクト
       YouTubeQuery query = new YouTubeQuery();
       query.StartIndex = startIndex;
       query.NumberToRetrieve = _retrieveCount;
       query.Uri = new Uri(String.Format("http://gdata.youtube.com/feeds/api/videos?vq={0}", HttpUtility.UrlEncode(searchWord)));
       query.Formats.Add(YouTubeQuery.VideoFormat.Embeddable); //検索対象を埋め込みPlayerに限定

       //検索を行い、フィードを返却する
       return service.Query(query);
  }


次はフィードのエントリを表示するためのUserControlを作成しました。
今のところ、サムネイルとタイトル、あと説明を表示しています。 サムネイルはPictureBoxを使用して表示しています。ImageLocationにフィードから 取得したサムネイルのURLを設定するのみでした。

   /// 
   /// コンストラクタ
   /// 
   /// 
   public EntryControl(YouTubeEntry entry)
   {
       InitializeComponent();

       _entry = entry;

       MediaGroup group = _entry.Media;

       //Titleを設定
       _title.Text = group.Title.Value;

       //Descを設定
       _desc.Text = group.Description.Value;

       //サムネイル画像を設定
       if (group.Thumbnails.Count != 0)
       {
         SortedList attributes = group.Thumbnails[0].Attributes;
         _thumbnail.ImageLocation = attributes["url"].ToString();
       }

       //動画URLを設定
       foreach (MediaContent content in group.Contents)
       {
         SortedList attributes = content.Attributes;

         //埋め込み型プレーヤーへのURLの場合
         if (attributes["format"].ToString().Equals("5"))
         {
             _movieUrl = attributes["url"].ToString();
             break;
         }
       }
   }


そして、メインフォームの方で検索ボタンクリックのイベントを処理し、 検索を行い、ユーザコントロールを作成し、Panelに貼り付けています。

最初はTableLayoutPanelを使っていたのですが、何故か縦スクロールバーが表示されるタイミングで 横スクロールバーが不必要に表示されてしまうため、Panelに切り替えました。

YouTube APIに接続している間、画面が固まってしまうのが嫌だったので、 その部分は別スレッドに処理させるようにしました。

   private void _searchBtn_Click(object sender, EventArgs e)
   {
       //検索ワードが入力されている場合
       if (searchWord.Text.Length != 0)
       {
         //別スレッドを起動して、非同期で検索処理を行う
         Thread thread = new Thread(new ThreadStart(ExecuteSearch));
         thread.Start();
       }
   }
   
   /// 
   /// 検索を行うスレッドが実行する処理メソッド
   /// 
   private void ExecuteSearch()
   {
       try
       {
         //検索ワード
         String word = null;
   
         Invoke((MethodInvoker)delegate()
         {
             _status.Text = "検索中...";
             word = searchWord.Text;
         });
   
         //YouTube APIに接続して検索を行う
         YouTubeProxy proxy = new YouTubeProxy();
         YouTubeFeed feed = proxy.Search(word,0);
   
         Invoke((MethodInvoker)delegate()
         {
             _status.Text = "結果を取得中...";
   
             _resultPanel.Controls.Clear();
   
             int y = 0;
   
             //エントリ数分ループ
             foreach (YouTubeEntry entry in feed.Entries)
             {
               //エントリを表示するコントロールを生成し、パネルに貼り付ける
               EntryControl entryCtl = new EntryControl(entry);
               entryCtl.Location = new Point(entryCtl.Margin.Left, y);
               y = y + entryCtl.Height + entryCtl.Margin.Top;
   
               _resultPanel.Controls.Add(entryCtl);
   
             }
   
             _status.Text = "";
   
         });
   
       }
       catch
       {
            MessageBox.Show("検索中にエラーが発生しました。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
       }
   }


まだまだ先は長いですが、がんばります。

『ライブラリ』にここまでの成果をソリューション毎置きました。(.Netクライアントライブラリを除く)

ご参考にしてください。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/4-543f1228

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。