メモ:YouTubeAPI + PHP(Zend)

何はともあれ、動画をアップロードしてみたいんだもじゃー

動画のアップロード方法

http://code.google.com/intl/ja/apis/youtube/developers_guide_protocol.html#Uploading_Videos

"ブラウザベース"アップロード(動画のメタデータのみをうp?)

自ホストで動画データを受信・格納せず、Youtubeにデータを処理させる方法を指す。

"直接"アップロード

"自ホスト"(自分が持っているサイト)に動画をアップロードしてもらい、自ホストで動画データを保管するとともに、自ホストがAPIを使ってyoutubeにもデータを送信・保管する方法を指す。

アップロードの制限

サイズは100MB(102,400KB)まで。 ZIPで圧縮してもいいが(しねーよ)、サイズの制限は伸張後のファイルに適用される。

デベロッパータグとデベロッパーキー

デベロッパータグ(正体不明)は、デベロッパーキーとセットで使うこと。
あるデベロッパータグを持つデータを探そうとする時、そこで使用するデベロッパーキーは、そのデベロッパータグを割り当てるために使ったデベロッパーキーと同じものでなくてはならない。


<?php
  /***
   * ブラウザベースアップロードのサンプル作成
   *   2009.02.05
   */

  //

  // エラーリポート
error_reporting(E_ALL  ^ E_NOTICE);
ini_set('display_errors', true);
ini_set('log_errors', false);
ini_set('mbstring.http_output' , 'pass');


// include_path設定
$include_path[] = "";
$include_path[] = "/usr/share/zend/library";
ini_set( 'include_path', implode((!strncasecmp(PHP_OS, "WIN", 3) ? ";" : ":"), $include_path));



// Zend Loaderで必要なライブラリの読み込み
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube'); 
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); 


// YouTubeサービス利用のログイン情報
//  * YouTubeAPIの開発コード - 取得して代入
$sDeveloperKey = '[取得したデベロッパーキー]';  
//  * YouTubeアカウント名
$sAccount      = 'ftshJp'; 
//  * YouTubeログインパスワード
$sPassword     = '[取得したパスワード]'; 



// 動画アップロードについての情報
//  [ アップロードする動画のタイトル ]
$sMovieTitle     = 'ftsh Test Movie';
//  [ 動画の説明文 ]
$sDescription    = 'none...';
//  [ デベロッパータグ ] - 
$sDevTag         = 'ftshftsh';
//  [ タグ ] - 
$sTags           = 'Film,Tech';
//  [ カテゴリー ] - 定義のあるカテゴリーを使うこと - http://gdata.youtube.com/schemas/2007/categories.cat
$sCats           = 'Film';      
//  [ キーワード ] 
$sKeywords       = 'ftsh.jp';
//  [ アップロード後に遷移する画面 ]
$sNextUrl        = 'http://zend.localhost/yt_01_uploaded.php';


//  [ YouTubeクライアントログイン用のURL ]
$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin'; 



// クライアントログインオブジェクト作成
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
                                                    $username     = $sAccount,
                                                    $password     = $sPassword,
                                                    $service      = 'youtube',
                                                    $client       = null,
                                                    $source       = 'ftshYTtest', // a short string identifying your application
                                                    $loginToken   = null,
                                                    $loginCaptcha = null,
                                                    $authenticationURL
                                                    );
$httpClient->setHeaders('X-GData-Key', "key={$sDeveloperKey}"); //出来たオブジェクトにデベロッパーキーも持たせる。







/***********
 * アップロードのコア
 */

$yt = new Zend_Gdata_YouTube($httpClient);
// create a Zend_Gdata_YouTube_VideoEntry
$myVideoEntry= new Zend_Gdata_YouTube_VideoEntry();

// set up media group as in the example above
$mediaGroup              = $yt->newMediaGroup();
$mediaGroup->title       = $yt->newMediaTitle()->setText( $sMovieTitle );
$mediaGroup->description = $yt->newMediaDescription()->setText( $sDescription );
$mediaGroup->keywords    = $yt->newMediaKeywords()->setText( $sKeywords );


// note the different schemes for categories and developer tags
//  [使えるカテゴリの一覧] ...が定義されていると思う。多分。
$categoryScheme     = 'http://gdata.youtube.com/schemas/2007/categories.cat';
//  [デベロッパータグの定義]
$developerTagScheme = 'http://gdata.youtube.com/schemas/2007/developertags.cat';

$mediaGroup->category = array(  
                     $yt->newMediaCategory()->setText($sCats)->setScheme($categoryScheme),
                     $yt->newMediaCategory()->setText($sDevTag)->setScheme($developerTagScheme),
                     $yt->newMediaCategory()->setText('テケトー')->setScheme($developerTagScheme)
               );

$myVideoEntry->mediaGroup = $mediaGroup;

// アップロード用のトークンの取得
$tokenHandlerUrl  = 'http://gdata.youtube.com/action/GetUploadToken';
$tokenArray       = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);
$tokenValue       = $tokenArray['token'];
$postUrl          = $tokenArray['url'];


//動画ファイルを指定させるHTML
$form  = "<h2>YouTube + php/Zend : ブラウザベースアップロード</h2>";
$form .= "<p><strong>Title</strong>: {$sMovieTitle}</p>";
$form .= "<p><strong>Desc.</strong>: {$sDescription}</p>";
$form .= "<p><strong>DevTag</strong>: {$sDevTag}</p>";
$form .= "<p><strong>Tags</strong>:  {$sTags}</p>";
$form .= "<p><strong>Keywords</strong>: {$sKeywords}</p>";
$form .= "<p><strong>Category</strong>: {$sCats}</p>";
$form .= '<form action="'. $postUrl .'?nexturl='. $sNextUrl .
                      '" method="post" enctype="multipart/form-data">' ;
$form .= '<input name="file" type="file"/>' ;
$form .= '<input name="token" type="hidden" value="'. $tokenValue .'"/>' ;
$form .= '<input value="Upload Video File" type="submit" />' ;
$form .= '</form>';

print $form;

// アップロード完了後、$sNextUrl のページにリダイレクトされる。
?>
<?php
  /***
   * ブラウザベースアップロードのサンプル作成 - アップロード後の結果を受け取る子
   *   2009.02.05
   */

echo "<h2>YouTube + php/Zend : ブラウザベースアップロード</h2>";
if( $_REQUEST['status'] === '200' )
{
  echo '<p>動画がアップロードされまんた!</p>';
  echo '<p><strong>動画ID:</strong> '.$_REQUEST["id"].'</p>';
  //こういう風にアップロード結果をすぐ見ようとしても、たいてい変換中なので観れない。
?>
<object width="425" height="344">
<param name="movie" value="http://www.youtube.com/v/<?php echo $_REQUEST["id"]; ?>&hl=ja&fs=1"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowscriptaccess" value="always"></param>
<embed 
   src="http://www.youtube.com/v/<?php echo $_REQUEST["id"]; ?>&hl=ja&fs=1" 
   type="application/x-shockwave-flash" 
   allowscriptaccess="always" 
   allowfullscreen="true" 
   width="425" 
   height="344"
   ></embed>
</object>

<?php
  
}
else
{
  echo '<p>動画のアップロードに失敗した模様...</p>';
}

echo '<div style="text-align:center"><a href="./yt_01.php">戻る</a></div>';

?>