さて、サイトの方で対応して頂いたことで
一件落着の YouTube TV の件ですが、
おかげで今回いろいろ勉強になりましたので、
メモとしてここに書いておくことにします。
(1) YouTube 動画を mp4 形式でダウンロードする方法。(official)
これについては、以前の日記にも書きました通り、
Google 側がその方法を公開しています。
http://googlesystem.blogspot.com/2008/04/download-youtube-videos-as-mp4-files.html
英語のページなので、ポイントだけ要約すると、
つまり次の URL にアクセスすればいいということ。
http://www.youtube.com/get_video?video_id=[チャンネルのID]&t=[SIGNATUREと呼ばれるコード]&fmt=18
チャンネルの ID の方はいいですね。
そのチャンネルのページ、
http://www.youtube.com/watch?v=xL7fl2Dwn_Y
の「watch?v=」の後の11桁のコードです。
問題は「SIGNATURE」の方。
これは、見たいチャンネルのページのソースを表示して、
2100文字目あたりにある「"t": 」に続く44桁のコードです。
最初は、ふんふん簡単簡単、と思いました。
自前のサーバにこのページのソースを取得して、
その部分だけ切り出すPHPファイルを置いてあげればいいからです。
ところが。。。
実は、僕が日頃使っている Mac にはサーバ環境が作ってあって、
PHP ファイルはここでテストしたものを
実際のWeb上のサーバにアップロードしています。
ところが、ローカルでうまくいったはずのものが
実際のWEBではうまくいかない。。。
SIGNATUREは取得できるのですが、
どうも無効なようで、ダウンロードができないのです。
実は、どうもこれが今回の問題と関係あることがわかってきました。
ローカルにあるサーバからのリクエストも
僕が直接ソースコードを開いている、そのリクエストも
結局のところ同じPCからのリクエストです。
ところが、外部サーバの場合は、別のコンピュータです。
リクエストを投げてきたコンピュータと
ダウンロード先のコンピュータが異なる場合、
その要求には応じない、というのが今回の
YouTube(なり Google)の仕変だったわけです。
では、ローカル側で取得した SIGNATURE をセットしておけばよいか?
というと、これまたそうではないことがわかりました。
実は、ソースコードをよく見ると、SIGNATURE に先だって
「token」なるものがあります。
どうも、セッションごとに(接続するごとに)トークンが発行され
これは期限付きのようですね。
SIGNATURE はこれと抱き合わせになっていて、
トークンの期限が切れると、その SIGNATURE を使っても、
たとえ同じマシンからのリクエストであっても、
YouTube のサーバは要求に応えるのを拒否するのです。
よくもまあ、2段構え、3段構えになっているものです。
こうなると、外部サーバを使わず、
しかもセッションごとに毎回 SIGNATURE を取りに行く
というしくみが必要となります。
となれば、LSL でやるんだったら llHTTPRequest という関数を
使うことになるのですが、
結局は拾えるのは 2048文字まで。
となると、SIGNATUREのある場所は2100文字目あたりなので、
これまた無理! ということになります。
外部サーバが使えない、LSLも使い物にならない。。。
とすると、、、
(2) 結局外部の変換サイトを利用する方法
何と、vidney なるサイトに行き当たりました。
http://www.vidney.com/
これ一体何なんでしょうか?
都度変換してるというよりは
YouTube 動画のライブラリを
そのまま持っているような印象のページですね。
僕のビデオを名前入れたらすぐサムネール入りで出てきましたから
これには驚きました。
これはもしかして、既に変換サイトではない?
まぁ、Google の制約が厳しくなったとも言えますが、
著作物ですから、それは当然のことかもしれません。
結局のところ、変換サイトを使うにしても
vidney のような所を使うにしても
ハッキング的な感は免れないからです。
そもそもは、LSLの仕様、そしてメディアの仕様が
もっと柔軟に発展してほしいところです。
そして、前にも書いたように、スクリプトを
PHP や VB で書けるようになるともっと楽なのだけれど。。。
リンデンさん、どうぞよろしくお願いします。