Entry

NPR を聴いてみよう その2

2005年01月06日

前回の続きです(参照:「NPR を聴いてみよう その1」)。前回は,単に NPR の RTSP サーバにつないで,ストリーミングを試聴しただけだったのでした。わざわざエントリを作るまでもなかったですね……。

もっとも,ストリーミングサーバへのリンクは Javascript を介してしていることから,まっとうな方法で聴くには,Javascript を理解できるブラウザからリンクをたどらなくちゃいけないという不便があったのでした。ここまでが続きです。今回は,ブラウザ無しでもストリーミングサーバにアクセスする方法を考えてみました。

リンクボタンをたどった後の様子をちょっと見たところ,どうやらストリーミングサーバにアクセスするためには,次のような手順を踏んでいるようです。

  • Javascript から getMedia() 関数を呼ぶ
  • HTTP で目的の放送について書かれた SMIL(みたいなもの)が送られてくる
  • RTSP を喋れるクライアントアプリケーションから,SMIL(みたいなもの)に入っている URL にアクセスして再生する

ざっとこんな具合です。

npr.rb

上の手順を見てみると,ブラウザ無しでやるには Javascript の代わりに HTTP リクエストを生成して,戻ってくる SMIL(みたいな)データを解析して,さらに RTSP を喋れるアプリケーションに渡すといったスクリプトを作ればよさそうです。

はじめの getMedia() 関数は,各ニュースページにはありません。探してみたところ http://www.npr.org//include/javascript/jsfuncs.js にありました。どうやら,引数を元にして URL を生成,HTTP リクエストを作るみたいなことをするようですね。これだけなら,他の言語でも楽に実装できます。

そんなわけで,もったいぶるのもなんなんで,作ったスクリプトを紹介しておきます。ジャンクスクリプトに名前を付けるのもなんですけど,一応ここでは npr.rb としておきます。

えーと……一応 getMedia() 関数を真似ようと思ったんですけれど,条件分岐が複雑すぎて訳が分からなくなってしまいました。WindowsMedia 関係や昔のニュースは,とりあえず置いておくことにして,よく使いそうな部分だけを実装してみました。

必要なもの

このスクリプトを動かすのに必要なモノは,以下の通りです。

  • Ruby (>= 1.8.1)
  • ymXML (>= 0.4.9)
  • MPlayer (with RealMedia plug-in)
  • 午後のこ〜だ

ymXML は,簡単な XML パーサです。ここでは SMIL ファイルを解析するのに使っています。この他,MPlayer は,ストリーミングデータをダンプしたり再生したりするのに,午後のこ〜だは MP3 ファイルを作るのに使っています。後2者は,好きなプログラムに差し替えても問題ないと思います。

使い方

使い方は,コマンドオプションとして,「操作(operation)」と「オプション(options)」を取ります。「操作」は,

-L
SMIL のデータをリストとして表示する
-P
SMIL のデータを再生するように,他のプログラム(MPlayer)に渡す
-R
SMIL のデータを録音するように,他のプログラム(MPlayer 等)に渡す

といったものです。「オプション」は,

-d
欲しい放送の日付
-p
番組名(ヘルプ(-h)参照)
-s
番組番号
-h
ヘルプを表示する

になっています。大まかな手順としては,まず -L でリストを表示して,-P や -R で再生・録音するといった感じになるのかな……。例えば,2005年1月5日の ME (Morning Edition)についてリストを表示する場合,以下のような感じ。

% npr.rb -L -d 20050105 -p ME -s ALL
>>>> [LIST]
(01)  Proposed Social Security Fix Could Cut Benefits
(02)  Examining the History of Social Security
(03)  Considering Long-Term Terrorist Detention
(04)  Schwarzenegger Prepares to Address Calif. Fiscal Crisis
(05)  Swedish Tsunami Dead Return Home
(06)  Helicopter Aid Slowly Helping Indonesian Town Recover
(07)  Uncertainty the Rule in Gauging Deaths from Tsunami
(08)  Confronting Career Roadblocks by Changing Roads
(09)  Last American Audio Tape Maker Closes
(10)  Aceh Province Hospitals Benefiting from Foreign Help
(11)  Tsunami Warning System Proposed
(12)  SEC Chairman Donaldson Argues for New Regulations
(13)  USC Claims Football Crown in Convincing Fashion
(14)  Report Says Palestinian Economy Deteriorating
(15)  The Hidden Costs of Rooting for the Yankees  
(16)  Dare Wright's 'Lonely Doll' 
(17)  'Spirit' Comic Creator Will Eisner Dies

その日付に登録されている番組を全て表示したいときは,ALL を指定します(省略できます)。さらに,この中で,「(12) SEC Chairman Donaldson Argues for New Regulations」を聴きたかったら,

% npr.rb -P -d 20050105 -p ME -s 12

みたいにするわけです。

おおむねよく動いているみたいだけれど,たまに ymXML のパースエラーが出ることがあるみたい。まだ,ちょっくら作り込み方が足りないようなので,もう少し改良してみます。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN