Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

Plagger で、はてなミュージックを Windows 以外でも使えるようにする

はてラボで、はてなミュージックなんてな素敵サービスがリリースされ、音楽好きとしてはこれ以上ない楽しみなわけで、さっそく遊んでいます。しかし、いまんとこはてなミュージックの曲情報更新クライアントは Windows + iTunes にしか対応していないわけで、

はやくMacではてなミュージックしたいです。

なんてな記述も見受けられます。まぁ、ちょっと追加のコードを書きさえすれば、まさに「それPla」な話。そこで、はてなミュージックの更新クライアントの挙動を調べて、まずは WebService::Hatelabo::Music というモジュールを作り、それを Plagger から使うために Plagger::Plugin::Publish::HatelaboMusic というプラグインを作りました。

まぁ、以前「antipop - mixi ミュージック、あるいは Web2.0 のレッスン」なんてエントリを書いたりもしてるので、mixi をいじっておいて、はてなをいじらないわけにもいかないし!

WebService::Hatelabo::Music

WebService::Hatelabo::Music はこんな風に使います。まぁ、new して add_tracks するだけ。

use WebService::Hatelabo::Music;

my $music = WebService::Hatelabo::Music->new(
    username => $username,
    password => $password,
);

$music->add_tracks(
    {
        artist => 'Cornelius',
        album  => 'Sensuous',
        track  => 'Music',
        date   => '2006-11-11 01:46:08',
        length => 292,
        count  => 11,
    },
    {
        artist => 'Kahimi Karie',
        album  => 'Nunki',
        track  => 'He shoots the sun',
        date   => '2006-11-11 01:51:00',
        length => 165,
        count  => 4,
    },
);

Plagger::Plugin::Publish::HatelaboMusic

んでもって Plagger::Plugin::Publish::HatelaboMusic について。iTunes の曲情報を取得するプラグインはすでに存在するので(CustomFeed::iTunesRecentPlay)、それを使います。その際、title_format フィールドを %title と明示的に指定しておくほうがよいです。設定他、詳しくはそれぞれのプラグインの POD やソースをご覧ください。

  - module: CustomFeed::iTunesRecentPlay
    config:
      library_path: /path/to/iTunes Music Library.xml
      duration:     120
      title_format: %track # you'll prefer it in most case

  - module: Publish::HatelaboMusic
    config:
      username: hatena_id
      password: hatena_password

こんな感じで、Windows 以外の環境でも、はてなミュージックを楽しめるようになります。楽しみましょう。

はてなミュージック曲情報更新プロトコルについて

いろいろ調べてコードを書いたのですが、音ログ 開発日記 | はてなミュージックは AudioScrobbler 互換? 及びコメントによると、Audioscrobbler - The Music Technology Playground from Last.fm と互換のプロトコルとのこと!うおお。そうなるといろいろとアレしないとならなくなってきたなあああ。
というわけで仕様の詳細がわかったので、以下の記述はあんまり読む必要ないです(微妙に違うところがあったり、他の環境での実装の参考になる点はいくつかあるとは思いますが)。

まぁせっかくなので、上記のコードを書くにあたって調べたことを、他の環境でクライアントを作成したい方のために、まとめておきます。当然、API の非公式な使用ですので、今後の保証はまったくありません。

クライアント起動時

はてなミュージック更新クライアントは、起動時に http://music.hatelabo.jp/tools/HatenaMusic.rdf をリクエストします。その中身はこんな感じ。クライアント自体の更新があったときに、自動更新かなんかするためでしょう。

<RDF:RDF xmlns:RDF="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <RDF:Description about="urn:hatenamusic">
  <hatena:version>0.1</hatena:version>
  <hatena:updateLink>http://music.hatelabo.jp/tools/HatenaMusicSetup.exe</hatena:updateLink>
  </RDF:Description>
</RDF:RDF>
認証に用いるための MD5 ハッシュ文字列の取得

認証方法は、Digest 認証ぽい感じの方法を用いているようです。最初に、パスワードをダイジェストするのに使うための MD5 ハッシュ文字列を取得します。
まず http://music.hatelabo.jp/trackauth に対して、

hs
hand shake
p
protocol?
c
client?
u
user

こんな感じのよくわからないパラメタ付きでリクエストします。以下のような感じ。

http://music.hatelabo.jp/trackauth?hs=true&p=1.1&c=hatena&v=1.0&u=hatena_id

リクエスト成功時には以下のようなレスポンスが返されます。

UPTODATE
(MD5 ハッシュ)
http://music.hatelabo.jp/trackadd
INTERVAL 1

リクエスト失敗時には以下のようなレスポンスが返されます。
hs が true 以外

FAILED handshake is not requested. INTERVAL 1

u が指定されていない

BADUSER INTERVAL 1

p や c が指定されていない

FAILED prams are short. INTERVAL 1
セッションの確立、曲情報の送信

次に、上述の過程で取得した MD5 ハッシュ文字列を元に、セッションを確立します。セッションの確立に用いられる文字列の作成方法は、以下の通り(例の md5_hex は、Perl の Digest::MD5::md5_hex)。

s = md5_hex(md5_hex(password) + サーバから送られてきた MD5 ハッシュ文字列)

このようにして作成したセッション文字列を用いて、http://music.hatelabo.jp/trackadd に対して、以下のようなリクエストを送ります。

u=hatena_id&s=上記で作成したセッション文字列&a[0]=&b[0]=&t[0]=&i[0]=1970-01-01 00:00:00&l[0]=0&p[0]=1&r[0]=0&c[0]=0&f[0]=20

以下のようなレスポンスが返されたら、認証に成功したことがわかります。

OK
INTERVAL 1

認証が成功したら、上記と同様、http://music.hatelabo.jp/trackadd に対して、曲情報を送信します。パラメータは以下の通り

a (required)
artist の名前
b (required)
album の名前
t (required)
track の名前
i (required)
再生した時刻
l (required)
length (秒単位)
c
count(アルバムの何曲目か)
p
不明
r
不明
f
不明

また、それぞれのパラメタは配列のような形式をとっており、複数の曲情報を送信することができます。例としては、以下のようなパラメタになります。

u=hatena_id&s=上記で作成したセッション文字列&a[0]=℃-ute&b[0]=キューティークイーンVol.1&t[0]=YES! しあわせ&i[0]=2006-11-10 09:05:14&l[0]=275&p[0]=0&r[0]=0&c[0]=8&f[0]=0

リクエスト成功時には以下のようなレスポンスが返されます。

OK
INTERVAL 1

リクエスト失敗時には以下のようなレスポンスが返されます。

BADAUTH
INTERVAL 5
注意点

http://music.hatelabo.jp/trackadd にアクセスし、MD5 ハッシュ文字列を取得するたびに、セッション文字列を再構築しなければならないことに注意が必要です。例えば、自作プログラムではてなミュージックにアクセスしている間に、通常の iTunes プラグインや、ブラウザ等によって http://music.hatelabo.jp/trackadd にアクセスがあると、セッションが初期化されるので、セッションを再確立しなければなりません。詳細については、WebService::Hatelabo::Music の add_tracks() と retry() メソッドのあたりの実装をごらんください。