コンテンツへスキップ
2011/06/24 / Javelina

PHPでYouTubeの動画アップロード&削除を試してみる

以前、WordPressの管理画面上で自分のYouTubeの動画をリスト表示するプラグインを作った話を書いたのですが、一覧表示したなら動画のアップロードや削除も試してみたいな!ということで、再びリファレンスを読みつつチャレンジしてみました。前回と違って、WordPress上でやるつもりではありませんが。
 

前回同様、YouTubeのデベロッパーキーが必要なのでこちらから取得しておきます。
それとZend Frameworkが必要なのでダウンロードします。→Zend Framework
前回は書き忘れてしまいましたが、Zend FrameworkはMinimal Packageのほうをダウンロードすれば大丈夫です。

解凍するとフォルダ名の最後にバージョンが入っていると思いますが、ここでは「Zend Framework」にリネームしているものとします。
前回からZend Frameworkをset_include_path()で使用していますが、php.iniなどが書ける場合はもちろんそれでいいと思います。

ではまずは、アップロード用のファイルから。
色々やりようはあるかと思いますがこんな感じになりました↓
 

アップロード用ファイル “youtube_upload.php”

<?php
$pagesubmit = $_GET['pagesubmit'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta http-equiv="Content-Style-Type" content="text/css" /> 
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>Youtube Upload</title>
<style type="text/css" media="screen">
html{
width:100%;
height:100%;
margin:0;
padding:0;
}
body{
width:90%;
height:auto;
margin:0 auto;
padding:20px 0;
}
p{
font-size:13px;
color:#333;
}
</style>
<?php if($pagesubmit == '1'){?>
<script type="text/javascript">
function loading(){
	document.getElementById('loading').style.display = 'block';
}
function loading_hidden(){
	document.getElementById('loading').style.display = 'none';
}
window.onload = loading_hidden;
</script>
<?php }?>
</head>
<body>
<?php
$site_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
?>
<h1>Youtube Upload</h1>
<div>
<?php if(empty($pagesubmit)){?>
<form action="<?php echo $site_url;?>?pagesubmit=1" method="post">

<p>■動画タイトル:<br />
<input type="text" name="movie_title" value="" size="50" />
</p>

<p>カテゴリー:<br />
<select name="movie_category">
<option value="Film">映画とアニメ</option>
<option value="Autos">自動車と乗り物</option>
<option value="Music">音楽</option>
<option value="Animals">ペットと動物</option>
<option value="Sports">スポーツ</option>
<option value="Travel">旅行とイベント</option>
<option value="Games">ゲーム</option>
<option value="Comedy">コメディー</option>
<option value="People">ブログと人</option>
<option value="News">ニュースと政治</option>
<option value="Entertainment">エンターテイメント</option>
<option value="Education">教育</option>
<option value="Howto">ハウツーとスタイル</option>
<option value="Nonprofit">非営利団体と社会活動</option>
<option value="Tech">科学と技術</option>
</select>
</p>

<p>■タグ:<br />
<input type="text" name="movie_tags[]" /><br />
<input type="text" name="movie_tags[]" /><br />
<input type="text" name="movie_tags[]" /><br />
<input type="text" name="movie_tags[]" /><br />
<input type="text" name="movie_tags[]" /><br />
</p>

<p>■動画説明文:<textarea name="movie_description" cols="1" rows="1" style="width:98%; height:100px; margin-top:5px;"></textarea></p>
<input value="次へ" type="submit" />

</form>
<?php }?>
<?php if($pagesubmit == '1'){?>
<?php
$movie_title = $_POST['movie_title'];
$movie_category = $_POST['movie_category'];
$movie_tags = $_POST['movie_tags'];
$movie_description = $_POST['movie_description'];

if(empty($movie_title)){
	$movie_title = 'upload at ' . date(Y.m.j);
}

$quotation_array = array('"'=> '', "'" => '');
$movie_title =strtr($movie_title,$quotation_array);
$movie_description =strtr($movie_description,$quotation_array);

if(is_array($movie_tags)){
	$movie_tags = implode(',',$movie_tags);
}

$loadingimage = 'images/loading.gif';//ローディング用画像などのパス

$lib = dirname(__FILE__) . "/ZendFramework/library/";//←適宜指定
set_include_path(get_include_path() . PATH_SEPARATOR . $lib);
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin';
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
$username = '**********',//ユーザー名
$password = '**********',//ログインパスワード
$service = 'youtube',
$client = null,
$source = 'MySource',
$loginToken = null,
$loginCaptcha = null,
$authenticationURL);

$myDeveloperKey = '******************************';//取得したデベロッパーキー
$httpClient->setHeaders('X-GData-Key', "key=${myDeveloperKey}");
$yt = new Zend_Gdata_YouTube($httpClient);

$myVideoEntry= new Zend_Gdata_YouTube_VideoEntry();

$mediaGroup = $yt->newMediaGroup();
$mediaGroup->title = $yt->newMediaTitle()->setText("{$movie_title}");
$mediaGroup->description = $yt->newMediaDescription()->setText("{$movie_description}");

$categoryScheme = 'http://gdata.youtube.com/schemas/2007/categories.cat';
$developerTagScheme = 'http://gdata.youtube.com/schemas/2007/developertags.cat';

$mediaGroup->category = array(
$yt->newMediaCategory()->setText("{$movie_category}")->setScheme($categoryScheme),
$yt->newMediaCategory()->setText('mydevelopertag')->setScheme($developerTagScheme),
$yt->newMediaCategory()->setText('anotherdevelopertag')->setScheme($developerTagScheme)
);

$mediaGroup->keywords = $yt->newMediaKeywords()->setText("{$movie_tags}");
$myVideoEntry->mediaGroup = $mediaGroup;

$tokenHandlerUrl = 'http://gdata.youtube.com/action/GetUploadToken';
$tokenArray = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);
$tokenValue = $tokenArray['token'];
$postUrl = $tokenArray['url'];
?>
<div>
<form action="<?php echo $postUrl;?>?nexturl=<?php echo $site_url;?>?pagesubmit=2" method="post" enctype="multipart/form-data">
<p>■アップロードする動画ファイルを選択:</p>
<p>
<input name="file" type="file" />
<input value="アップロード" type="submit" onClick="return loading()" />
</p>
<input name="token" type="hidden" value="<?php echo $tokenValue;?>"/>
</form>
</div>

<div id="loading" style="display:none; width:100%; text-align:center; color:#666; margin:0; padding:30px 0 0 0;">
<img src="<?php echo $loadingimage;?>" border="0" alt="" style="width:48px; height:48px; margin:0 auto;" /><br />&nbsp;<br />
<strong>Youtubeにアップロード中</strong><br />&nbsp;<br />
※この処理には時間がかかります。少々お待ち下さい。
</div>
<?php }?>
<?php if($pagesubmit == '2'){?>
<?php
$movie_id = $_GET['id'];
$movie_url = 'http://www.youtube.com/watch?v=' . $movie_id;
?>
<h2>動画のアップロードが完了しました。</h2>
<p>ID : <?php echo $movie_id;?></p>
<p>URL : <?php echo $movie_url;?></p>
<p><a href="<?php echo $movie_url;?>" target="_blank">≫動画を確認</a><p>
<p style="padding-top:20px;"><a href="<?php echo $site_url;?>">≪戻る</a><p>
<?php }?>
</div>
</body>
</html>

スクリーンショット↓

youtube_upload1 youtube_upload2 youtube_upload3 youtube_upload4

 

追記:
AuthLogin認証を使用したアップロードはこちら→PHPでYouTubeのAuthSub認証を試してみる

 

おお、意外とあっさりできた!
ということで、この調子で削除用のファイルを・・・と早速取り掛かったんですが、こちらは結構てこずりました。
 

削除用ファイル “youtube_delete.php”

<?php
$start_index = $_GET['start'];
if(empty($start_index)){
$start_index = 1;
}
$max_results = 50;//一ページの表示件数。変更可能
$pm_count = $start_index + $max_results;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta http-equiv="Content-Style-Type" content="text/css" /> 
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>Youtube Delete</title>
<style type="text/css" media="screen">
html{
width:100%;
height:100%;
margin:0;
padding:0;
}
body{
width:90%;
height:auto;
margin:0 auto;
padding:20px 0;
}
p{
font-size:13px;
color:#333;
}
table{
border:1px solid #aaa;
border-collapse:collapse;
}
table tr th,
table tr td{
font-size:0.7em;
border:1px solid #aaa;
text-align:center;
padding:5px;
}
a img{
border:none;
}
</style>
<script type="text/javascript"> 
function check(){
flag = 0;
var deletelist = document.getElementsByName('delete[]');

for (i = 0; i < deletelist.length; i++){
	if(deletelist[i].checked){
		flag = 1;
	}
}
if(flag == 1){ 
	if(window.confirm('本当に削除しますか?')){
		return true;
	}else{
		return false;
	}
}else{
	alert('チェックが入っていません');
	return false;
}
}
</script>
</head>
<body>
<?php
$site_url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
?>
<h1>Youtube Delete</h1>
<?php
$lib = dirname(__FILE__) . "/ZendFramework/library/";//←適宜指定
set_include_path(get_include_path() . PATH_SEPARATOR . $lib);
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin';
$httpClient = Zend_Gdata_ClientLogin::getHttpClient(
$username = '**********',//ユーザー名
$password = '**********',//ログインパスワード
$service = 'youtube',
$client = null,
$source = 'MySource',
$loginToken = null,
$loginCaptcha = null,
$authenticationURL);

$myDeveloperKey = '******************************';//取得したデベロッパーキー

$httpClient->setHeaders('X-GData-Key', "key=${myDeveloperKey}");
$yt = new Zend_Gdata_YouTube($httpClient);

$yt->setMajorProtocolVersion(2);
$url = Zend_Gdata_YouTube::USER_URI .'/'. $username .'/'. Zend_Gdata_YouTube::UPLOADS_URI_SUFFIX . '?start-index=' . $start_index . '&max-results=' . $max_results;

$myFeed = $yt->getVideoFeed($url);


$deletelist = $_POST['delete'];
if(isset($deletelist)){
	foreach($myFeed as $videoEntry){
		$movieID = $videoEntry->getVideoId();
		if(in_array($movieID,$deletelist)){
			$yt->delete($videoEntry);
			$delete_collect = '<p style="color:red; font-weight:bold;">動画の削除が完了しました。</p>';
		}
	}
}

$userprof_url = 'http://gdata.youtube.com/feeds/api/users/' . $username;
$userprof_xml = simplexml_load_file($userprof_url);
$user_upload_count = $userprof_xml->children('gd',true)->feedLink[5]->attributes()->countHint;

if($start_index > 1){
	$prev_start = $start_index - $max_results;
	$prev_url = $site_url . '?start=' . $prev_start;
	$prev_link = '<p><a href="' . $prev_url . '">≪前の' . $max_results . '件</a></p>' . "\n";
}
if($user_upload_count >= $pm_count){
	$next_url = $site_url . '?start=' . $pm_count;
	$next_link = '<p><a href="' . $next_url . '">≫次の' . $max_results . '件</a></p>' . "\n";
}


function printVideoFeed($videoFeed){
	foreach ($videoFeed as $videoEntry){
		echo '<tr>';
		printVideoEntry($videoEntry);
		echo "\n";
		echo '</tr>';
	}
}
	
function printVideoEntry($videoEntry){
	$cat_tran_array =array(
	'Film' => '映画とアニメ',
	'Autos' => '自動車と乗り物',
	'Music' => '音楽',
	'Animals' => 'ペットと動物',
	'Sports' => 'スポーツ',
	'Travel' => '旅行とイベント',
	'Games' => 'ゲーム',
	'Comedy' => 'コメディー',
	'People' => 'ブログと人',
	'News' => 'ニュースと政治',
	'Entertainment' => 'エンターテイメント',
	'Education' => '教育',
	'Howto' => 'ハウツーとスタイル',
	'Nonprofit' => '非営利団体と社会活動',
	'Tech' => '科学と技術');
	
	$title = $videoEntry->getVideoTitle();
	$videoid = $videoEntry->getVideoID();
	$description = $videoEntry->getVideoDescription();
	$category = $videoEntry->getVideoCategory();
	$category = strtr($category,$cat_tran_array);
	$tags = $videoEntry->getVideoTags();
	if(is_array($tags)){$tags = implode(',',$tags);}
	$lurl = $videoEntry->getVideoWatchPageUrl();
	$surl = 'http://youtu.be/' . $videoid;
	$time = gmdate('i:s', $videoEntry->getVideoDuration());
	$count = $videoEntry->getVideoViewCount();
	if(empty($count)){$count = 0;}
	$ratinginfo = $videoEntry->getVideoRatingInfo();
	$rating = $ratinginfo['numRaters'];
	if(empty($rating)){$rating = 0;}
	$thumbnail = 'http://i.ytimg.com/vi/' . $videoid . '/default.jpg';
	
	echo '<td> <input type="checkbox" name="delete[]" value="' . $videoid . '"> </td>';
	echo '<th><a href="' . $lurl . '" title="' . $description . '" target="_blank">'.
	'<img src="' . $thumbnail . '" width="80" /></a></th>';
	echo '<td><a href="' . $lurl . '" title="' . $description . '" target="_blank">'. $title . '</a></td>';
	echo '<td>' . $videoid . '</td>';
	echo '<td>' . $surl . '</td>';
	echo '<td>' . $category . '</td>';
	echo '<td>' . $tags . '</td>';
	echo '<td>' . $time . '</td>';
	echo '<td>' . $count . '</td>';
	echo '<td>' . $rating . '</td>';
}
?>
<div>
<?php if(isset($deletelist)){
echo $delete_collect;
echo '<p style="padding-top:20px;"><a href="' . $site_url . '">≪戻る</a></p>';
}else{?>
<form action="<?php echo $site_url;?>" method="post" onSubmit="return check()">
<p><input type="submit" value="選択した動画を削除" /></p>
<table>
<thead>
<tr>
<th><!-- --></th>
<th>サムネイル</th>
<th>タイトル</th>
<th>ID</th>
<th>短縮URL</th>
<th>カテゴリー</th>
<th>タグ</th>
<th>再生時間</th>
<th>閲覧数</th>
<th>評価</th>
</tr>
</thead>
<tbody>
<?php printVideoFeed($myFeed);?>
</tbody>
</table>
<p><input type="submit" value="選択した動画を削除" /></p>
</form>
<?php }?>
<?php echo $prev_link;?>
<?php echo $next_link;?>
</div>
</body>
</html>

スクリーンショット↓

youtube_upload5

 
前回書いた一覧表示のコードを踏まえながら、選択式で動画を消去するようにしています。
怪しい箇所はいくつかあるのですが、中でもユーザーの総投稿数を取得している部分が不安です。(一応動きますが)

$userprof_url = 'http://gdata.youtube.com/feeds/api/users/' . $username;
$userprof_xml = simplexml_load_file($userprof_url);
$user_upload_count = $userprof_xml->children('gd',true)->feedLink[5]->attributes()->countHint;

この部分ですね。。。
総投稿数を取得する関数が見つからなかったので、simplexml_load_fileでxmlから無理矢理引っ張ってきてる形になっています。もっとちゃんとした形で取得できるとは思うんですが・・・う~む。
 

若干不安は残りますが、一応アップロード/削除共に成功したので満足満足。
前回の一覧表示プラグインに組み込んでも面白そうですが、別にWordPressの管理画面上でそこまでできなくてもいいよな、ということで保留。

アップロードの方は記事投稿画面で使えるようにしたら便利かもしれないですね~。
 

コメントを残す