Web ベースの DAAP クライアントを作ってみる

iTunes って同じネットワークの人のライブラリ見れるじゃんスゲー
 ↓
ふむふむ、プロトコルDAAP っていうのか
 ↓
Net::DAAP::ClientRuby で操作できるじゃん
 ↓
Web ベースのクライアントアプリケーションでも作ってみるか
 ↓
ということで作ってみた。

Windows と Net::DAAP::Client

Windows では Net::DAAP::Client を使えないらしい。
正確には daapclient が依存している digest-m4p
Windows にインストールできない。
諦めて Ubuntu Edgy にインストールした。

DAAPの バージョン

Net::DAAP::Client を使って iTunes 7.2 にアクセスを試みるが
どうやっても 403 Forbidden ではじかれる。


どうやら DAAP にはバージョンがあって、
iTunes 7.x の DAAP のバージョンに
Net::DAAP::Client は対応していないらしい。

というか iTunes 7.x の DAAP をしゃべることができる
サードパーティ製のクライアントは現時点では存在しないらしい。
# ちなみにプロトコルを解読すると Save OurTunes というサイトから1,000ドルもらえる。


解決策としては

  • iTunes のバージョンを 6.x に下げる
  • iTunes 6.x 相当の DAAP をしゃべる DAAP サーバを導入する

が考えられるが、今回は後者を選択した。

Firefly Media Server

ということで Firefly Media Server というDAAP サーバを試してみた。
もともと mt-daap という名前で公開されていたらしい。
Windows / Mac / Linux 対応。


起動してスキャンしたら iTunes から見えるようになった。

ただし、Unicode 以外のタグは文字化けする模様。
パッチがどこかにあったので当てれば直るのかもしれない(やっていない

プログラムを書く

以下の2つのファイルを作成した。

  • index.rhtml
  • get.rb

index.rhtml は DAAP サーバから曲の一覧を取ってきて表示するページ。
再生には XSPF Web Music Player (Flash) - Plays MP3 on your website を使用する。

get.rb は 曲のデータを DAAP サーバから取ってくる CGI


index.rhtml - 曲を列挙してテーブルに出力。

<%
require 'rubygems'
require 'net/daap'

daap = Net::DAAP::Client.new('DAAPSERVERNAME', :password => 'PASSWORD')

%>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <link rel="stylesheet" type="text/css" href="Styles/main.css">
  <title>webTunes</title>
</head>
<body>
  <div align="center" id="main">
    <h1>webTunes</h1>
    <table>
      <tr>
        <th>No</th>
        <th>Artist</th>
        <th>Title</th>
        <th>Album</th>
        <th>#</th>
      </tr>
      <% i = 0
         daap.connect do |dsn|
           daap.databases.each do |db|
             db.songs.each do |song|
      %> 
        <tr>
          <td style="text-align:right;"><%= i += 1 %></td>
          <td><%= song.artist %></td>
          <td><%= song.name %></td>
          <td><%= song.album %></td>
          <td>
            <object type="application/x-shockwave-flash"
                    data="./Flash/musicplayer.swf?song_url=get.rb?item=<%= i %>"
                    width="17"
                    height="17">
            </object>
          </td>
        </tr>
      <%
             end
           end
         end
      %>
    </table>
  </div>
</body>
</html>


get.rb - XSPF Web Music Player から呼ばれて"item"パラメータで与えられた曲を読んで書き出す。

#!/usr/bin/ruby

require 'rubygems'
require 'net/daap'
require "cgi"

item = CGI.new["item"]
puts "Content-type: audio/mpeg;\n\n";

daap = Net::DAAP::Client.new('DAAPSERVERNAME', :password => 'PASSWORD')

i = 0
daap.connect do |dsn|
  daap.databases.each do |db|
    db.songs.each do |song|
      puts song.get if (i += 1) == item.to_i
    end
  end
end


ブラウザで index.rhtml にアクセスすると↓

わーいできたー。音もちゃんと鳴るー。


ホントは検索とかリスト再生とかやりたかったけど
なんか満足してしまったのでここまで。
誰か iTunes 7.x の DAAP を解読してください><