【PHP】YouTubeの新APIを使って動画をアップロードする

YouTubeの新しくなったAPIを調査中。2008/3/13のニュース記事

Googleが公開しているドキュメントに従ってサンプルコードを流用して書いていけばとりあえず動画の投稿はできた。

まずはここからZend Frameworkをダウンロードしてくる。現在の最新は1.5.2。使うのはlibrary/Zend以下のファイル群。実際に動かすときには、このlibraryにパスが通っている必要がある。こういう方法とか

開発中の最新バージョンがほしい場合はここを参考にsubversionクライアントを使って取得する。私の場合はこれで取得。

次にYouTube APIで必要な開発コードを取得する。ここから。

YouTubeでアカウントを登録してない場合は登録する。

とりあえずAPIを使って投稿したいだけならば、ここにZendが作ったサンプルコードが置いてあるので、これを使うだけでも動作確認はできる。

しかし、このコードだとユーザが自分のアカウントを入力しないといけない。実現したかったのは共通のアカウントを使っての動画投稿(いちいちアカウントを入力しない)。

以下、実際のコードです。これを実行するとファイルを参照するフォームが表示されるので、ファイル選択後→uploadボタンクリックで投稿できるはず。とりあえずはここまで。

<?php
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

$sDeveloperKey = 'AI39...'; //YouTubeAPIの開発コード
$sAccount = 'account'; //YouTubeアカウント名
$sPassword = 'password'; //YouTubeログインパスワード

$sMovieTitle = 'My Test Movie'; //アップロードする動画のタイトル
$sDescription = 'My description'; //動画の説明文
$sTags = 'cars, funny'; //タグ
$sNextUrl = 'http://test.net/test.php'; //アップロード後に遷移する画面

$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin';
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
    $username = $sAccount,
    $password = $sPassword,
    $service = 'youtube',
    $client = null,
    $source = 'gwiki', // 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);

// 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('Autos')->setScheme($categoryScheme),
    $yt->newMediaCategory()->setText('mydevelopertag')->setScheme($developerTagScheme),
    $yt->newMediaCategory()->setText('anotherdevelopertag')->setScheme($developerTagScheme)
    );

// set keywords, please note that they cannot contain white-space
$mediaGroup->keywords = $yt->newMediaKeywords()->setText($sTags);
$myVideoEntry->mediaGroup = $mediaGroup;

$tokenHandlerUrl = 'http://gdata.youtube.com/action/GetUploadToken';
$tokenArray = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);
$tokenValue = $tokenArray['token'];
$postUrl = $tokenArray['url'];

// place to redirect user after upload
$nextUrl = $sNextUrl;

// build the form
$form = '<form action="'. $postUrl .'?nexturl='. $nextUrl .
        '" method="post" enctype="multipart/form-data">'.
        '<input name="file" type="file"/>'.
        '<input name="token" type="hidden" value="'. $tokenValue .'"/>'.
        '<input value="Upload Video File" type="submit" />'.
        '</form>';

echo $form;
?>