ソラマメブログ

2010年02月08日

インワールドでYoutubeを見てみました(2)


先週の記事の続きですが、、、

誰でも見れるようにならないかなーと中途半端な記事を書いたところ
Whitfield-In-World さんから紹介していただいた記事でキャッシュサーバのURLを使って再生すればいいってことがわかったので、この週末は、サーバ用のスクリプトに挑戦してみました。


インワールドでYoutubeを見てみました(2)

といってもperlがよくわかんないので、テスト用のスクリプトと、考え方だけメモします。

* * *

■インワールドでYoutubeを見るためのサーバー用スクリプト(テスト版)

作ったといっても、ほとんど前回紹介したYoutubeMp4の作者の方の記事がベースです。
やってることは、前の記事に書いた内容とほぼ変わりありません。
見たいムービのIDを元に、タグを取得してget_videoというAPIをコールしています。
get_videoでコールすると、キャッシュサーバのURLにリダイレクトされますが、
そのアドレスを取り出してプレイリストを作成しています。

プレイリストのまま出力するとSLの中で再生がスタートできなかったので、
一旦ファイルに書き出して、書き出したファイルにリダイレクトするようにしました。

#!/usr/bin/perl
use strict;
use warnings;(.*)

#----------------------------------------------------------------------------
# YoutubeのURLをダウンロードURLに変換するCGI
# 【使い方】youtube_test.cgi?id=(ビデオID)
#    v1.0 Feb 06, 2010 by jinko spitteler
#    Ref:http://yusukebe.com/archives/08/03/16/101841.html
#----------------------------------------------------------------------------
use LWP::UserAgent;
use URI;
use CGI;

#外部変数
my $query = CGI->new;
my $id = $query->param('id');

#トークンの取得
my $ua = LWP::UserAgent->new();
my $req = HTTP::Request->new(GET=> "http://www.youtube.com/get_video_info?video_id=$id" );
my $res = $ua->simple_request( $req );
my $token = $1 if ($res->content =~ /&token=(.+?)&/);

#get_videoでリスエストしてヘッダーの中のURLを取得
$req = HTTP::Request->new(GET => "http://www.youtube.com/get_video?fmt=18&video_id=$id&t=$token" );
$res = $ua->simple_request( $req );
my $uri = URI->new($res->header('Location'));

#プレイリスト生成
my $body= <<EOD;
<?xml version="1.0">
<?quicktime type="application/smil"?>
<smil
    xmlns:qt="http://www.apple.com/quicktime/resources/smilextensions"
    qt:time-slider="true">
<head>
</head>
<body>
    <video src="$uri" />
</body>
</smil>
EOD

#プレイリストファイル出力
my $fname = "media/".time().".mov";
open my $fh, '>', $fname or die $!;
print $fh $body;
close ($fh);

#プレイリストにリダイレクト
print "Location: $fname\n\n";
exit;



セキュリティ対策もエラー処理もなんにもしてませんが、インワールドでYoutubeを見るための最低限のテストはできると思います。
上のスクリプトを適当な名前で保存して、以下のパラメータ付でコールしてください。
ブラウザでもSLのメディアURLからでもムービがスタートするハズです。

http://aaa.com/xxxx.cgi?id=(ビデオID)



■拡張のためのヒント

◎YoutubeAPIは変化します
ここで使用したYoutubeAPIは、よく仕様が変わっているようです。
アナウンスとか一切なくて、ある朝仕様がかわってた・・・
という過去の記事をたくさんみかけましたので、十分ご注意ください。

◎Embed禁止対策
上のスクリプトは、Embed禁止のムービは変換できません。
Embed禁止だと、watchのAPIでソース見ることもできなくなってるようです。


◎アクセス管理
不思議なことに、LSLのllHTTPRequest()を使用する場合と違って、
メディアURLからのリスエストは、X_SECONDLIFE_系のヘッダー情報を付加していないようです。
CGIへのアクセスを制限する場合は、LSLでリクエストを発行し、もどってきたプレイリストのURLをメディアURLにセットするなどの工夫が必要ですね。

◎キャッシュURLの寿命
キャッシュURLを良く見ると、expire=1265421600というパラメータがついています。
数字の部分はUnixtimeのタイムスタンプで、有効期限がこの時刻までになっている感じです。
(正確な時刻は未確認ですが、有効期限を過ぎるとエラーになっていることは確認できました)

MediaURLに設定してOKを押すアクセスあり
アバターがメディア再生ボタンを押すアクセスあり
メディアがAutoRepeatで最初から再生アクセスなし


各アバターがメディア再生ボタンを押したタイミングでプレイリストは再度生成するようにすれば
たぶん大丈夫と思います。

◎検索とかその他API
Youtubeのほかの公開APIを使えば検索とかカテゴリーとかいろいろできそうです。
詳しくは、こちら→YouTube APIs and Tools:Migration Guide
(よく読んでないですが・・・たぶん使えるんじゃないかなってことで^^;)




■中途半端なものを作ってみました

あんなことやこんなことができたらいいなーって想像して遊ぶのも楽しいんですが、本当にできるかどうか気になります。
といっても、公開に使えるサーバがないので、できるかどうかを試すだけの感じでCGIを勉強しつつ自分でも作ってみました。

(サーバ側)
-プレイリスト登録用CGI
-プレイリスト再生用CGI

(LSL側)
-コントロール用LSL


Youtubeで動画を探すのはそもそもYoutubeのサイトでできるので、プレイリストの登録作業は、
ブラウザでやるのが手っ取り早いと思いました。
別に手作業でも良かったのですが、URL変換してリストに書き出すだけなので作ってみました。
(複数の人が使う前提だと簡単にいかないと思いますが・・・)
メインはプレイリスト再生用CGIです。
これがインワールド側から、リスト情報や、キャッシュアドレスを要求して受け取るためのスクリプトになっています。


インワールドでYoutubeを見てみました(2)
※HUDデザインがめんどくさかったので、どこかで見たアレの形をしてますが気にしないでください^^;

コントロール用のLSLは、設置型でもよかったのですが、HUDにできるんやろか?と思ったので、試しにHUDにしてみました。
やってみると・・・

HUDにしても、ちゃんとムービが再生されてるんですよねー
自分の土地ならどこにいてもムービが動いてる感じ・・・
すごくいいです。


インワールドでYoutubeを見てみました(2)

HUDをクリックすると、サーバに登録されているプレイリストを問い合わせて、返ってきた結果を
ダイアログに表示します。


インワールドでYoutubeを見てみました(2)

プレイリストを選択すると、もう一度サーバに今度は曲名を問い合わせます。
ループで連続再生するのですが、どの曲からスタートするか選べるようにしてみました。

※LSLでは現在どの曲がかかってるかわからないので「次の曲の先頭にジャンプ」みたいなことができないのが残念です。

単純ですが、こんな感じでした。



* * *

普通の人より1年ぐらい遅れてYoutubeで遊んでみたんですが、すごく面白いですよね。
なんかいろいろ可能性がひろがりそうです。

今回の方法も際どいやり方なんですが、インワールドでYoutubeを見れるような正式サポート。
してくれへんかなー
自分でサーバたてなくても、LSLからYoutubeサーバと直接やりとりできるようになって欲しいし
それからLSLのメディアコントロールに関しても、もう少し機能が必要だと思います。


インワールドでYoutubeを見てみました(2)

シネコンみたいなのも作ってみました^^
写真用ですので適当ですけど・・・これも案外楽しいね^^
またヒマがあったらやってみよ♪

(追記:2/25)
Viewer2.0でこんなややこしいことしなくてよくなるっぽいですが、一応調べてみました。
インワールドでYoutubeを(3) ビュアー2でどうなの?






同じカテゴリー(Creation)の記事画像
なんとなく目玉クリップを作ってみました^^
お花いっぱいの場所でいろいろ教えていただきました^^
ライオンみたいなものを作ってみました^^
1プリムのキャンドルに挑戦してみました^^
セカンドライフからTwitterしてみました^^
夏のお洋服つくってみました^^
同じカテゴリー(Creation)の記事
 なんとなく目玉クリップを作ってみました^^ (2011-09-25 22:50)
 お花いっぱいの場所でいろいろ教えていただきました^^ (2011-04-17 14:59)
 ライオンみたいなものを作ってみました^^ (2011-03-31 09:41)
 1プリムのキャンドルに挑戦してみました^^ (2010-12-11 23:55)
 セカンドライフからTwitterしてみました^^ (2010-10-21 11:16)
 夏のお洋服つくってみました^^ (2010-08-15 10:08)

Posted by jinko at 18:33│Comments(2)Creation
この記事へのコメント
おもしろいよね~ HUD にするとやっぱり、、、つくりたくなるよね ○Pod.
機会があったらぜひ見せてほしいです。

そして、SL Viewer で YouTube って、そんな遠くない将来に実現するかも。

snumaw.blogspot.com/2009/08/sl.html

あと、勘違いだとゴメンナサイなのですが、プレイリストで「次の曲」の再生はスクリプトのリストで管理するとできるかもです。
・プレイリスト選択
・選択されたプレイリストの曲名、URLを取得>Listへ
・曲名リストの曲名とボタン番号表示(List要素順とボタン番号を同期)
・再生>クリックされた曲の番号を current として保持
・次へボタンで、番号+1 で List から曲、URLを取得、llParcelMedia..へ
・current を +1
問題点は別のところかしら。
Posted by Whitfield-In-World at 2010年02月09日 14:17
Whitfieldさん^^

いろいろ情報ありがとねー
おかげで、誰でも聞けるようになったのに肝心のサーバが・・・
また気長に探しますね

HUDはすごく面白いですね。
本物をもってなかったりするんですが、ちょっと気分も味わえました。

セカンドライフからMediaAPIの記事も拝見しました。
いろんな未来が開けそうですね^^
ワタシとしては、簡単に使えるようになるの希望です

あとQTのコンポーネントで拡張するとか・・・
ワタシのとこはWindowsなのであまり世の中に出回っていませんが
Macな人はWMVとかFLVとかも再生できるんでしょう?
ちょっとうらやましいです。

プレイリストのロジックもありがとうございました。
だいたいそんなイメージですが、(1)終了タイミングがわからないので、LSLだけで連続再生できない。(2)プレイリストを使うと連続再生できるけど、どの曲がかかっているかLSLではわからない。って状況です。
曲の再生時間は、サーバからの情報取得でわかっているので、LSLのタイマで強制的にということはできますが、回線の状態によっては、おしりの部分が切れちゃうかなって思って、、、だから「次」ではなく「新しく開始」みたいなイメージに作ってみました。

こういう不便さもLSLならではですよね^^
Posted by jinkojinko at 2010年02月10日 08:18
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。