2009-02-11

YouTube動画をSLで - Yahoo Pipes

YouTubeをSLで再生するために必要なURL
http://www.youtube.com/get_video?video_id={動画ID}&t={動画識別コード}&fmt={出力形式}
は、どうやってつくるのでしょう。

ここではJvnさんの「【中級】youtube url変換Webサービス公開」で使われているPipeを自分用にコピー(Cloneを作成)してソースを覗きます。

(見やすいようにちょっと配置替えをしてあります)

それでは各モジュールの機能を説明していきましょう。

1.youtube url(url) ※一番上の真ん中

これはモジュール名が書き換わってしまっていますが、User Inputカテゴリの「URL Input」で、ユーザからURLを入力させるためのものです。といっても、キーボードからの入力ではなくて、URLのパラメータ(正しい言い方か、これ?w)としての入力です。
JvnさんのLSLを思い出してください。
strURL = "http://pipes.yahoo.com/pipes/pipe.run?_id=5a068edc3e7197ed30c21a4f90363fe2&_render=csv&format=18&url=" + strURL;
この最後の「url=xxxx」の部分に当たります。
Default欄には何も指定していないので、このPipeを実行する際には必ず指定すべきものです。

2.movie format (number) ※右はじ上

これも同様に名前が書き換わっていますが、User Inputカテゴリの「Number Input」で、ユーザから数値を入力させるためのものです。
JvnさんのLSLでいくと、「format=xx」の部分になります。

3.String Regex ※中央やや上

これはStringカテゴリにあるモジュールです。文字列を正規化表現を使って生成するものです。
(正規化表現についてはつっこまないでください! 超苦手です!)
何をやっているかというと、1で指定されたYouTubeURLの文字列からv=以降の動画IDを抜き出しています。
http://www.youtube.com/watch?v=ohvjtDevshU
こういうYouTube URLだと「ohvjtDevshU」の部分です。

4.Fetch Page ※左一番上

これはSouceカテゴリにあるモジュールです。指定されたURLのHTMLページ(ソース)を読み込みます。さらに「Cut content from...to」欄で、HTMLソース上の指定した部分だけをitemとして取り出します。
つまりHTMLソース上の「watch_fullscreen?」で始まり、次の「;」までです。

実はここにYouTubeをSLで再生させるためのt=パラメータ「動画識別コード(勝手に命名)」が書かれているのです。

[2009-02-12 追記]
実はもう一箇所あって、同じHTMLソース上の"var swfArgs = {"で始まり、次の"};"で終わる部分にもあります。(別の動画の識別コードなので上記とコードは異なっています)

ただし、こちらの場合だと、識別コードを取得したあと"t="と組み合わせるという手間が増えるので、上記のほうがいいかと思います。

5.Loop ※左上から2番目

Operatorカテゴリにあるモジュールです。item数分だけ指定した処理を行います。
この場合は1個しかitemがないので1回処理されるだけです。
処理の内容は、Loopモジュール中にある「String Regex」で、文字列を正規化表現を使って書き換えるものです。

item.content(4で切り取ってきた文字列が入っている)の中身から、「t=」で始まり次の「&」で終わる部分までを取り出し、item.loop:strregexに格納します。

6.Loop ※左一番下

5と同様、Loopモジュールです。5と同様、ここでも1個しかitemがないので1回処理されるだけです。
処理の内容は、「String Builder」モジュールを使って、文字列を生成し、新規のitemとして出力します。

生成用の文字列は「String」の下にある各欄を上から順につなげたものになります。
  1. 欠けて見えませんが、"http://www.youtube.com/get_video?video_id="
  2. これも、結合線が隠れてしまっていますが、3のモジュールで作成した動画ID
  3. "&"
  4. 5のモジュールで作成したitem.loop:strregexの中身。要するに"t=xxxxxxxxxxxxxxxxx"の部分
  5. "&fmt="
  6. 2のモジュールで指定された数字。出力形式

と、これで、http://www.youtube.com/get_video?video_id={動画ID}&t={動画識別コード}&fmt={出力形式}
RSS形式で生成され出力されます。

さて次はこのpipeの出力結果をLSLで利用します。
llHTTPRequest()関数でこのpipeを実行します。
pipeの実行は
http://pipes.yahoo.com/pipes/pipe.run?_id={pipeのID}
の後に、必要なパラメータを指定していきます。このpipeの場合は
&url={YouTube URL}&format={出力形式}
です。指定の順番は気にしなくて大丈夫です。

結果はhttp_responseイベントのbodyに返ってきます。

ここで、pipeを普通に実行するとRSS形式のデータが返ってくることに注意してください。
単純に
http://pipes.yahoo.com/pipes/pipe.run?_id={pipeのID}&url={YouTubeURL}&format={出力形式}
としてやると、
bodyはrssのタグやらなにやらが大量に含まれます。

しかもきちんとRSSの仕様に準拠していないと、値は返ってきません。

このpipeでは単純にURLの1行文字列が必要なので、CSV形式で結果を返すようにpipeを実行します。
CSV形式の出力には実行URLに
&_render=csv
を追加します。

※ただしCSV出力にはSnumaさんのブログにあるとおり、日本語文字列に問題が発生します。CSVデータには文字コード指定(mime)がないからだと思われます。

あとは、返ってきたbodyの内容からURL部分だけを抜き出して、HTML特殊文字表記(こういう名称だっけ?)になっている"&"を"&"に置き換え、llParcelMediaCommandList()関数でURL等をセットするだけです。

0 件のコメント: