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」の下にある各欄を上から順につなげたものになります。
- 欠けて見えませんが、"http://www.youtube.com/get_video?video_id="
- これも、結合線が隠れてしまっていますが、3のモジュールで作成した動画ID
- "&"
- 5のモジュールで作成したitem.loop:strregexの中身。要するに"t=xxxxxxxxxxxxxxxxx"の部分
- "&fmt="
- 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 件のコメント:
コメントを投稿