DigitalDJ でリモートの音楽データを再生する

CD のリッピング作業はパワーのあるデスクトップマシンでやっているので音楽データはローカルホストに存在する。構成としてはこんな感じ。

      server                  client
 +--------------+       +-----------------+
 | MySQL server |-------| DigitalDJ       |
 | DigitalDJ DB |       | Ogg Vorbis file |
 +--------------+       | sox             |
                        +-----------------+

サーバ側には DB のみ。これだと他のホストで再生できないのがちょっと不満。それよりなによりクライアントマシンの HDD が全然足りなくなってきた。そこで音楽データを HDD 容量の大きなサーバ側に移し、DigitalDJ でリモートのデータを再生するように変更することにした(サーバに DigitalDJ を入れといて画面は X で、音声は esd で飛ばすのでもいいけど)。

手順は簡単で

  1. 音楽データをサーバ側に移動
  2. apache などでクライアント側からファイルが見えるようにする
  3. DigitalDJ がリモートのデータを再生できるように設定

これだけ。ただ3番目は素直には実現できないのでちょっと工夫が要る。

DigitalDJ は再生ソフトにファイル名を引数として渡す。そのファイル名は DB から取ってくる訳ですが、んじゃあ DB にはどんな値が入っているかというと Grip でエンコードした時のファイル名が入っている。なので手としては

  • ファイル名を url に置換するラッパーを噛ます
  • DB の中のファイル名を全て url に書き直す(これでも大丈夫だと思う、多分。未検証。)

といったところでしょうか。今回は作業の手間と変更の自由度から前者を選択した。

例えば、エンコードした時のファイル名が

~/music/artist/disc_name/title.ogg

だとしてこのファイルが

http://jukebox/artist/disc_name/title.ogg

こんな url でアクセスできるとすると、こんなかんじのラッパーを

#!/bin/sh

server="http://jukebox"
file="$(echo -n "$1" \
    | perl -pe 's@^/home/userid/music/@@; \
    s@([^a-zA-Z0-9/])@"%" . unpack("H2", $1)@eg;')"

player="ogg123"
player_opt="--quiet"

exec "$player" "$player_opt" "$server/$file"

~/bin/ddj.remote.player として保存。最後に DigitalDJ の [Config]->[Options] の [Player executable] を

/home/userid/bin/ddj.remote.player %f

と設定してやれば完了。ogg123 は url をエンコードしたうえで渡してやんないとうまく動いてくれないみたい。mplayer ならばそのまま渡しても問題無いみたいです。

最終的にはこんな構成に。

        server                client
 +-----------------+       +-----------+
 | MySQL server    |-------| DigitalDJ |
 | DigitalDJ DB    |       | ogg123    |
 | httpd           |       +-----------+
 | Ogg Vorbis file |
 +-----------------+

これでどのクライアントからでも好きに音楽を楽しむことができるようになった。


残る問題は DigitalDJ の文字化けだなあ…。