SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C#からYouTube APIを使って動画情報を取得する

C#でYouTube APIのラッパークラスを作成する

  • X ポスト
  • このエントリーをはてなブックマークに追加

クラスのデザイン

 作成するクラスはおおまかに2種類に分類されます。取得するデータを表現するEntityクラスと、YouTubeの各種APIをコールし、それに応じたEntityを取得するメソッドを持つクラスです。YouTubeのAPIをコールするクラスを通じて、各Entityの配列が取得できます。このような形にしておくことで、データの利用側が型変換などを意識することなくデータを操作できるようになります。

 下図は、list_featuredを呼び出したとき用のEntityクラス「ListRecordクラス」と、APIをコールするクラス「YouTubeクラス」を表したものです。

ListRecordクラスとYouTubeクラス
ListRecordクラスとYouTubeクラス

 それでは各クラスの詳細を見てみましょう。

APIをコールするクラスの実装

 以下、APIをコールし、動画情報の配列を返すYouTubeクラスのメソッドについての説明します。ここではGetListRecordFeaturedメソッドを例に説明していきます(他のメソッドも取り扱うEntityの種類が違うだけで動作はほぼ同じです)。

  1. YouTubeのAPIをコールし、動画情報に関するXMLファイルを取得する
  2. XMLファイルをDataSetに読み込む
  3. 読み込んだDataSetから、EntityであるListRecordクラスの配列を生成する
  4. メソッドの呼び出し元にListRecordクラス配列を返す

GetListRecordFeaturedメソッド

 まずはGetListRecordFeaturedメソッドについてです。このメソッドは外部から呼ばれ、呼び出し元に動画情報配列を返すメソッドです。

GetListRecordFeaturedメソッド
public YouTube.ListRecord[] GetListRecordFeatured()
{
  String RequestUrl = String.Format(
   "http://youtube.com/api2_rest?method=youtube.videos.{0}&dev_id={1}"
   , ListRecord.Method.list_featured, this.zDeveloperID);
   return YouTube.GetListRecord(RequestUrl);
}

 GetListRecordFeaturedメソッドでは、リクエスト先のAPIのURLを作成します。StringクラスのFormatメソッドを使って見やすく記述します。FormatメソッドはObject型で引数を受け入れるのでToString()などを使った型変換が必要なく、ちょっとだけ楽になります。

 そして、作成したURLを使ってYouTubeクラスのGetListRecordというstaticメソッドを呼び出します。

GetListRecordメソッド

 このメソッドは、実際にYouTubeのAPIをコールし、動画情報をYouTubeから受け取ります。

GetListRecord
public static YouTube.ListRecord[] GetListRecord(String inRequestUrl)
{
    ListRecord[] rVideoList = null;
    DataSet ds = new DataSet();

    WebRequest rq = WebRequest.Create(inRequestUrl);
    WebResponse rs = rq.GetResponse();

    ds.ReadXml(rs.GetResponseStream());

    DataTable dt = ds.Tables["video"];
    rVideoList = new ListRecord[dt.Rows.Count];
    for (int i = 0; i < dt.Rows.Count; i++)
    {
        rVideoList[i] = new ListRecord(dt.Rows[i]);
    }
    return rVideoList;
}

 このメソッドの中ではWebRequestクラスを利用し、YouTubeに対してリクエストを送っており、レスポンスで取得したXMLファイルをDataSetに読み込んでいます。

 DataSetクラスはXMLファイル形式のデータを暗黙的にRDBの形に変換してくれます。DataSetにXMLファイルを読み込む(ds.ReadXml(rs.GetResponseStream());の部分)と、そのデータは3つのテーブルとして展開されます。

list_featured
list_featured

 そして、videoテーブルに格納されているデータをListRecordの生成に利用します。Entity生成はListRecordコンストラクタで行います。

ListRecordコンストラクタ

 GetListRecordメソッド内のfor文でデータを渡されたListRecordインスタンスは、DataTableのDataRowをコンストラクタで受け取り、各メンバフィールドにセットします。

internal ListRecord(DataRow inDataRow)
{
    DataRow dr = inDataRow;
    Int32 s = 0;

    this.zAuthor = Cast.ToString(dr["author"]);
    this.zID = Cast.ToString(dr["id"]);
    this.zTitle = Cast.ToString(dr["title"]);
    this.zLengthSeconds = Cast.ToInt32(dr["length_seconds"], -1);
    this.zTime = new TimeSpan(0, 0, this.zLengthSeconds);
    this.zRatingAverage = Cast.ToDouble(dr["rating_avg"], -1);
    this.zRatingCount = Cast.ToInt32(dr["rating_count"], -1);
    this.zDescription = Cast.ToString(dr["description"]);
    this.zViewCount = Cast.ToInt32(dr["view_count"], -1);
    s = Cast.ToInt32(dr["upload_time"], 0);
    this.zUploadTime = YouTube.BaseTime.AddSeconds(s);
    this.zCommentCount = Cast.ToInt32(dr["comment_count"], -1);
    this.zTags.AddRange(Cast.ToString(dr["tags"]).Split(' '));
    this.zUrl = Cast.ToString(dr["url"]);
    this.zThumbnailUrl = Cast.ToString(dr["thumbnail_url"]);
}

 コンストラクタのアクセス修飾子をinternalにしておきます。これにより、クラスをDLLで配布する際に、YouTubeクラスの各メソッドを利用する以外にインスタンスを生成できないようすることができます。これは、publicにしてしまうと、スキーマの異なるDataRowをもとにインスタンスを生成してしまうなど、不適切な利用をされる可能性があるためです。

 なお、型の変換は私が作成したCastクラスを使用しています。Castクラスについては添付ファイルを参照してください。

使用方法

 それでは、今まで作成したクラスを使ってみましょう。

ラッパークラスの利用
Default.aspx
protected void Page_Load(object sender, EventArgs e)
{
    HtmlGenericControl div = null;
    HtmlGenericControl div1 = null;
    HyperLink hp = null;
    Label lb = null;
    YouTube y = new YouTube("qguspDF-1Gg");
    YouTube.ListRecord r = null;

    this.zRecords = y.GetListRecordFeatured();

    for (int i = 0; i < this.zRecords.Length; i++)
    {
        r = this.zRecords[i];
        ///コンテナの生成
        this.Zone.Controls.Add(new HtmlGenericControl("div"));
        div = this.Zone.Controls[this.Zone.Controls.Count - 1] 
                as HtmlGenericControl;
        div.Attributes["class"] = "Row" + (i % 2).ToString();
        ///画像の生成
        div.Controls.Add(new HyperLink());
        hp = div.Controls[div.Controls.Count - 1] as HyperLink;
        hp.ImageUrl = r.ThumbnailUrl;
        hp.NavigateUrl = r.Url;
        hp.CssClass = "ThumbnailImage";
        ///タイトルの生成
        div.Controls.Add(new HyperLink());
        hp = div.Controls[div.Controls.Count - 1] as HyperLink;
        hp.Text = r.Title;
        hp.CssClass = "Title";
        ///詳細の生成
        div.Controls.Add(new HtmlGenericControl("div"));
        div1 = div.Controls[div.Controls.Count - 1] 
                 as HtmlGenericControl;
        div1.InnerHtml = r.Description;
        div1.Attributes["class"] = "Description";
        ///回り込みの解除
        div.Controls.Add(new Label());
        lb = div.Controls[div.Controls.Count - 1] as Label;
        lb.Style.Add("clear", "both");
    }
}

 上記のようにしてYouTubeクラスのGetListRecordFeaturedメソッドを呼び出すと、ListRecordの配列が取得できます。強く型付けされているのでインテリセンスを利用しながら値を取り出すことができます。

 取得したデータの利用方法はさまざまです。例えば以下のような、動画情報を一覧できるページを作ることもできると思います。

ビデオ一覧画面
ビデオ一覧画面

まとめ

 このようにクラスの配列としてデータを取得できるようにメソッドを設計することで、データの再利用が容易になります。強く型付けすることでインテリセンスの利用によるコーディング速度のUpと、型変換エラーの発生率を低減することができるでしょう。結果としてアプリケーション作成のコストを下げることが可能です。

 私が運営しているサイトでもこのクラスを利用したガジェットを作成しています。

YouTubeガジェット
YouTubeガジェット

 お試し利用はこちらからどうぞ。ブログも書いています。もしかしたら何かお役にたつ記事があるかもしれません。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

Higty(Higty)

C#マスターになるべく勉強中の身分です。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1155 2007/04/23 08:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング