2017-05-18 23 views
1

ストリーミングラジオサービスに現在再生中の曲を尋ねるいくつかの標準的な方法がありますか? 私は現在、各ステーションごとに異なる方法で行っています。 (SomaFM):ストリーミングラジオからの情報を取得

$wg=join("\n",`wget -q -O - https://somafm.com/secretagent/songhistory.html`); 
    $wg=~/\(Now\).*>([^<]*)<\/a><\/td><td>([^<]*)/s; 
    print "Secret Agent\n$1\n$2\n" 

または(ラジオSvizzeraクラシカ):

$wg=join("\n",`wget -q -O - http://www.radioswissclassic.ch/en`); 
$wg=~/On Air.*?titletag">([^<]*).*?artist">([^<]*)/s; 
print "Radio Svizzera Classic\n$1\n$2\n" 

...しかし、それを行うには、より標準的な方法は多分があれば、私はそのHTMLページをダウンロードするに頼らない、不思議遅かれ早かれに変更される可能性があります。

答えて

1

ICYメタデータ(インターネットラジオ局の大半を占める)を持つSHOUTcast/Icecast形式のステーションでは、このデータをストリーム自体から取得するのが最善の方法です。

まず、実際のストリームへのURLが必要です。あなたがSomaFMのSecret Agentページhttp://somafm.com/secretagent/に行くと、他のプレイヤーで聞くためのリンクが表示されます。例として、http://somafm.com/secretagent130.plsを指す128k AACリンクを使用しましょう。これは実際のストリームではありません。実際のストリームへのリンクを含むプレイリストファイルです。私が何を意味するか見るためにあなたの好きなテキストやコードエディタで開きます。

[playlist] 
numberofentries=2 
File1=http://ice1.somafm.com/secretagent-128-aac 
Title1=SomaFM: Secret Agent (#1 ): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too! 
Length1=-1 
File2=http://ice2.somafm.com/secretagent-128-aac 
Title2=SomaFM: Secret Agent (#2 ): The soundtrack for your stylish, mysterious, dangerous life. For Spies and PIs too! 
Length2=-1 
Version=2 

インターネットラジオ局は、一般的に、フェイルオーバーのために、ここで複数のサーバが含まれます。リスナーとの接続が切断された場合、プレーヤーは通常、次のアイテムに移動します。これは、あるサーバーがリスナーの制限に達すると便利です。プレイヤーは最終的には、別のサーバーがアクティブになることを望みます。

とにかく、Wiresharkやその他のパケットスニファのコピーを焼いてください。オーディオプレーヤーのURLの1つを押して、トラフィックを調べます。最初に見ていくのはリクエストとレスポンスです。

GET /secretagent-128-aac HTTP/1.1 
Host: ice1.somafm.com 
User-Agent: VLC/2.2.4 LibVLC/2.2.4 
Range: bytes=0- 
Connection: close 
Icy-MetaData: 1 

HTTP/1.0 200 OK 
Content-Type: audio/aacp 
Date: Sat, 20 May 2017 20:43:56 GMT 
icy-br:128 
icy-genre:Various 
icy-name:Secret Agent from SomaFM [SomaFM] 
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR> 
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.5<BR> 
icy-pub:0 
icy-url:http://SomaFM.com 
Server: Icecast 2.4.0-kh3 
Cache-Control: no-cache, no-store 
Pragma: no-cache 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: Origin, Accept, X-Requested-With, Content-Type 
Access-Control-Allow-Methods: GET, OPTIONS, HEAD 
Connection: Close 
Expires: Mon, 26 Jul 1997 05:00:00 GMT 
icy-metaint:45000 

これらのインターネットラジオサーバは、(Icecastのと他人の場合)HTTPまたはそれに本当に近い(レガシーシャウトキャスト)のいずれかであり、通常のGET要求を受け入れます。この場合、私のプレーヤー(VLC)はGETの要求を/secretagent-128-aacとします。これは実際のストリームへのパスです。

私のプレーヤーは、1つのキーのリクエストヘッダが含まれています

Icy-MetaData: 1 

このIcy-MetaDataヘッダは、オーディオストリームデータとメタデータをMUXへサーバーを要求します。すなわち、「現在再生中の」トラック情報は、周期的にストリームに注入されることになる。

サーバーのレスポンスヘッダでは、別のキーのヘッダーがあります:

icy-metaint:45000 

これは私たちに二つのことを伝えます...最初は、サーバは、メタデータを送信することに同意したということです。 2番目は、のメタデータ間隔が45,000バイトであることです。 45,000バイトごとに、サーバーはメタデータのチャンクを挿入します。私たちのパケットスニファに戻りましょう、これはどのように見えるかを参照してください。

ICY Metadata Hex Dump

メタデータチャンクの非常に最初のバイト、0x06、メタデータチャンクがどのくらいを教えてくれる。そのバイトの値に16を掛ければ、メタデータチャンクの長さはバイト単位になります。つまり、最初のメタデータチャンクバイトの0x06は、通常のストリームデータに戻る前に、次の96バイトがメタデータとなることを示しています。これは、メタデータ全体が97バイト...長さインジケータの場合は1バイト、残りの場合は96バイト(この場合は96バイト)であることに注意してください。

それでは、実際のテキストメタデータ形式に取得してみましょう:

StreamTitle='Buscemi - First Flight To London';StreamUrl='http://SomaFM.com/secretagent/'; 

それは非常に簡単に見えます。 key='value'、セミコロン;で区切られています。しかし、これにはいくつかの大きなキャッチがあります。たとえば、一重引用符をエスケープするための標準的な方法はありません。メタデータの値に一重引用符を含める必要がある場合は、\'、時には'''となることがあります。時にはそれはまったくエスケープされません!

また、すべてのサーバーで同じ文字エンコードが使用されるわけではありません。あなたはおそらくUTF-8を安全に想定しているかもしれませんが、一部のサーバーが異なっていたり、単に独自のメタデータエンコーディングで壊れていると思われたりします。

とにかく、これでどのように動作するかを知ったので、実装することができます。あなたが望むなら、私はあなたがライセンスできるコードをいくつか持っています。 1つはNode.js APIサーバーです。ストリームURLを指定するとメタデータが返され、すべてのバッファリングとサーバー側の解析が行われます。もう1つはMSEに基づくクライアント側プレーヤーです...これはCORSをサポートするサーバーでのみ動作しますが、私の知る限り、自分のサーバー(AudioPump CDN)だけが今日行います。このコードに興味がある場合は、brad @ audiopump.coまで電子メールでお気軽にお問い合わせください。スタックオーバーフローに関する私の答えに関する質問がある場合は、ここにコメントを投稿してください。

+0

詳細&完全回答ありがとうございます!私は私のプログラム(私はPythonを使用して)で動作させるようにしようとします... – alessandro

関連する問題