2006/02/28(火)AjaxでAudioscrobbler表示
とりあえずこのカテに置いておこうか。
うちのサイドバーのプロフィールの下に表示してるヤツね。
続きは、JavaScriptが弄れる人向け。
XMLHttpRequestは便利ねぇ。
IEのビヘイビアみたいなのがどのブラウザでも動きますよー! みたいな(笑
Audioscrobblerってのは今更説明要らないと思いますが、
再生した曲が自動的にそこに表示されるってヤツです。
一時期あちこちのブログで流行っていましたね。
今はもうあまり姿を見かけない気がしないでもないですが。
しかし、どーすっかなー。
結構ローカライズしちゃってあるんだよなぁ。
自分のサイトに都合のいいように書いてあるというか。
まー、そんな長くねーし、てけとーに読んでもらえりゃいーか。
まー、どーせ、誰も参考にはしねそーw
まずはJavaScriptファイル。
/* audioscrobbler.js */
// 串のパス
// Ajaxでは、データ入出力対象のCGIは同じホストに置く必要がある。
// これは、ただのプロキシCGI。この下のPerlスクリを参照のこと。
var as_proxycgi = "/nph-asproxy.cgi";
// タグとID。ここで指定したIDを持つタグの中身が書き換えられる。
// 以下は ulが対象。JavaScriptがOFFだと、
// そもそもこのタグが出力されないことになるので、
// その時にXMLの整合性を乱さないよう考慮すること。
var as_tagid = 'nowplaying';
var as_tag = '<div class="list"><div class="listname">';
as_tag += '<a target="_blank" href="http://www.last.fm/user/tu-sa/">http://www.last.fm/user/tu-sa/">最近の再生メディア</a></div>';
as_tag += '<ul id="'+as_tagid+'"><li>非対応ブラウザかも</li></ul></div>';
// XMLHttpRequest のオブジェクトを作る
var xmlhttp = createXmlHttp();
function createXmlHttp()
{
if (window.XMLHttpRequest)
{ // Mozilla, Firefox, Safari, IE7
return new XMLHttpRequest();
}
else if (window.ActiveXObject)
{ // IE5, IE6
try {
return new ActiveXObject("Msxml2.XMLHTTP"); // MSXML3
} catch(e) {
return new ActiveXObject("Microsoft.XMLHTTP"); // MSXML2
}
}
else
{ // だめぽ
return null;
}
}
function audioscrobblerLoad()
{
// ブラウザが非対応のとき何もしない
if (xmlhttp == null)
return;
// "読み込み開始" に書き換える
onData("_load");
// リクエストの準備。
xmlhttp.onreadystatechange = onHttpEvent;
xmlhttp.open("GET", as_proxycgi , true);
xmlhttp.send("");
}
function onHttpEvent()
{
if (xmlhttp.readyState == 4) // とりあえず完了
{
if (xmlhttp.status == 200) // HTTP 200 OK!
onData(xmlhttp.responseText);
else // なんかエラー
onData("_error");
}
}
function fmt_02d(n){ return (n<10) ? "0"+n : n }
// 表示書き換え関数
function onData(s)
{
// この変数にtag_idで指定したタグの中身を代入すればOK。
var html = "";
// ロード開始
if( s == "_load" )
html = "<li>読み込み中...</li>";
// 何らかのエラーが発生
else if( s == "_error" )
html = "<li>エラー</li>";
// 正常
else
{
var songlist = s.split("\\n");
if(songlist.length-1 > 0) // 1曲以上の情報がある
{
var objDate = new Date();
// 最大5曲まで。
for(var i=0; i<Math.min(songlist.length-1,5); i++)
{
// 時刻(songdata[0])と曲名(songdata[1])に分割。
var songdata = songlist[i].split(",");
// 時刻を適当にフォーマットする。
objDate.setTime(eval("songdata[0]")*1000);
var dtfmt = "("+objDate.getHours()+":"+fmt_02d(objDate.getMinutes())+")";
// 連結。
html+= "<li>"+dtfmt+" "+songdata[1]+"</li>";
}
objDate = null;
}
else // データなし
html = "<li>オフライン</li>";
}
// 実際のHTMLを置き換え
document.getElementById(as_tagid).innerHTML = html;
}
// 最初にタグしておく。
document.write(as_tag);
// ロード開始
audioscrobblerLoad();
次に示すのがaudioscrobbler用のプロキシ。
内容については特に説明不要な気がします。
ファイル名は nph- で始めること。
んで、そのcgiのパスを、↑スクリプトの最初の変数に格納すること。
#!/usr/local/bin/perl
# nph-asproxy.cgi
$id = "tu-sa";
# 踏み台にされる危険性が出るため、URLをクエリーに頼らない。
$host = 'ws.audioscrobbler.com';
$path = '/1.0/user/'.$id.'/recenttracks.txt';
# サーバに繋いで結果をそのまま返す。
use Socket;
socket(S, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
connect(S, sockaddr_in(80, inet_aton($host)));
select(S); $|=1; select(STDOUT);
print S "GET $path HTTP/1.1\\r\\nHost: $host\\r\\n\\r\\n";
print STDOUT <S>;
close(S);
後は、タグを挿入したい位置に、
なんて書くだけかね。