Adsense

2009年2月9日月曜日

SLでの動画再生と YouTube のお話し その2

[2009.4.5 追記] YouTube もしくは pipes の仕様変更により現在この方法は有効ではないようです。ご注意ください。
[2009.4.8 追記] IE/Firefox といったブラウザから同様の仕組みの Javascript で現在でもダウンロードできることから、ユーザーエージェント判別によりアクセス規制しているような気がしますね~。pipes を使ったダウンロードは無効になるようです。
[2009.4.8 追記2] どうやらこういうことらしいです。。。

前回からの続きになります。

YouTube からの mp4 ファイルダウンロードを利用してセカンドライフ内で動画鑑賞することと、ノートカードを使わずに目的の動画の URL を取得すること、それでいてこれまでと同じようにダイアログのボタンを押すことで動画を再生する操作性を維持するために、ステップ バイ ステップでスクリプトを作っていって、そのたびにお友達が集まるところで使ってもらって、また直し、、、の繰り返しをしました。

最初に Yahoo pipes と YouTube API を使った動画検索と、その結果から取得した URL をダイアログのボタン化して youtubemp4 を使って mp4 ファイルダウンロードする単純なものを作ってみました。

YazMania や snumaw というキーワードで YouTube を検索し、その結果を表示する pipe はこちら。(この pipe は最初にテストで作ったので、SnuVideo 玉では最終的には使っていませんので注意してください)

http://pipes.yahoo.com/inworld/getyazmaniavideo

pipes は米国 Yahoo の ID があれば、この pipe のコピーもソースも見ることができるので、興味のある方はご参照ください。といっても、、かなり「決めうち」の汚いソースかもしれません(笑 米国 Yahoo ID についてはこちらの投稿が参考になるかもです。

この pipe では動画の URL と、再生秒数、検索件数などを表示するようにしています。
LSL での取り込み方法はこの出力結果を RSS 形式でもらうようにします。CSV 方式などもできそうなのですが、私がやったかぎりだと日本語が入ってくるとちょっとうまく処理できないみたいだったので、RSS フォーマットでもらうようにしました。[Get as RSS] の URL を使うわけです。

しかし、何度もでてくる llHTTPRequest のレスポンス body 2K の制限で、一度にすべての検索結果を取り込むことができません。 レスポンス body にはスクリプトでは不要な xml の要素も含まれるため、実質 3 ~ 4 件くらいしか検索結果をとることができませんでした。

そこで YouTube API で利用できる start-index を使うことで、1件目~3件目、4件目~6件目、7件目から、、、というように検索結果の受け取りを分割することにしました。

llHTTPRequest を複数なげて、結果を分割してうけとる

実はこの「分割して受けとる」という方法は、昔、雷神においてあった「和英辞書」ですでにやったことがある方法でした。
ずーっと非公開にしていたビデオですが、この前公開した和英辞書の紹介ビデオは以下。
[ビデオ削除。MSN SOAPBOX サービス終了のため]

[あとから追記]
分割してリクエストを投げる方法について補足しますね。
以下に紹介いているように start-index にいれる数値をかえて llHTTPRequest をするのですが、これを for 文を使って一気にやってしまいます。
そのとき、llHTTPRequest を出したときの複数の key を List にいれておきます。
http_response のインベントではイベントが発生したときに受け取る key が上でつくった List にあるかどうかを llListFindList を使ってチェックします。
Key の List の要素分の response が帰ってきたら、リクエストに対するレスポンスが完了したことになり、その要素数にいかずに llSetTimerEvent で指定した timer イベントを拾ったらタイムアウト、という処理にします。
[あとから追記おわり]
イーストさんからこのブログにコメントがあったんですが(たぶんサーバーのログを調べたんでしょうね、、、) 結局、イーストさんの無料の Web サービスを使わせてもらっていて、ほぼ、それがこの辞書の機能そのものなのでこれを販売するようなことはしませんでした。ちなみに私自身イーストさんとはなんの関係もございません。(笑
まぁ、、、マッシュアップって良さそうだけど、いざちょっとでもお金(この場合は Linden$ ですが)が絡むようなことになると使うの面倒、、、というのを実感しました。(笑
話しはもどって、start-index を入力値として追加した pipe が以下になります。
getYazManiaVideo copy

0
で、、、ちょっとした問題に直面しました。
LSL でこれらの pipe を使ったとき、LSL は html ソースとしてこのページを処理するわけです。
pipe の [Get as RSS] をクリックして開いて、ブラウザの [このページのソースを表示] みたいなのでみた感じです。
すると、タイトルなどに " とか & といった HTML 特殊文字が出てきていました。
こんな感じ。

<item>
<title>N.M.R.7 &quot;PROVISIONAL END&quot;</title>
<link>http://www.youtube.com/watch?v=PVHwxmjfcsA</link>
<description>446|14</description>
<guid isPermaLink="false">3fc1df58abba7df74272926d77b18251_
4cd6d2d6eda8695b716217dc5eee39c4</guid>
</item>







これを、、、もとの文字に戻さないと、Second Life 内では &quot; は " と表示されないわけです。&quot; のままなんです。

そこで、いろいろとやり方を探していてたどりついたのが、、、実は以前のこの投稿です。


[LSL] 複数の文字列を一気に置き換えたい


よく使われるだろう特殊文字を一気に変更したかったのでした。(笑


と、、、またまた長くなったので、、、続くw