Raspberry Pi をオートCDリッパーにした話

前回、Raspberry Pi に Volumio をインストールして音が出たところまで書きました。 その後、どうせなら外付けHDDをつけてCDを全部FLACで取り込んでやろうと思い立ったものの、大量のCDを全部人力でリッピングするのは無理だし、どうせなら自動でCDリッピングからエンコード、タグ付けまでしたいですよね。 今回は、Raspberry Pi を 自動CDリッピングマシンにする話です。

CDドライブについて

Raspberry Pi のUSBポートでは、円盤をぶん回す系のドライブを動かすにはパワーが足りず、通常のドライブを直接つなぐとOSが落ちます。 セルフパワーUSBハブをつかうか、電源付きのドライブを用意しましょう。私の場合、幸い手元に電源取り用のUSBケーブルが別にくっついているドライブがあったのでこれを使いました。

各種プログラムの入手

自動CDリッピングには udisks-glue

"Linux 自動リッピング" などと検索してみても、あまり情報が無いのですが、どうも udisks-glue を使うとCDがロードされたときに何かしらのコマンドを実施したりということが出来るらしい。 ので、apt-get install udisks-glue でインストールします。

エンコーダは abcde を使ってみた

こちらのページでおすすめされていたので、リッパー・エンコーダーには abcde を使ってみることに。これも apt-get でインストール。 abcdeは実体はシェルスクリプトのフロントエンドプログラムで、リッピングエンコード、タグ付けなどの個別のプログラムをabcdeをたたくだけでうまいこと扱ってくれる。なので、実際のリッピングエンコーディングは個別のプログラムが必要となります。 僕がやりたかったのは、CDリッピングしてflacおよびmp3にエンコードとタグ付けだったので、abcdeのほかにcdparanoia(リッピング)、flac(flacエンコード)、lame(mp3エンコード)、eyeD3(ID3タグ付け)が必要となりました。cdparanoiaはVolumio(Raspbian?)にはじめから入っていたので、それいがいのものだけabcdeと同時にインストールしました(いずれもapt-get installできます)。 apt-get install abcde,lame,flac,eyeD3 等としてください。

※ eyeD3については、raspbian公式リポジトリのものが古い(0.6.18)ので新しいものが良ければ pip installなどで適宜インストールしてください。私は最新にしてみました。*1

自動CDリッピングのための設定

udisks-glueでCDロード検知 & abcde起動

で、udisks-glue にCDロードを検知させたいので常駐化する方法をぐぐって見たところ、次のページが見つかりました:angryelectron | How to Automount Removable Media on Ubuntu Server。 まずはudisks-glueのコンフィグファイルを書く。/etc/udisks-glue.conf を編集します。udisks-glue.confはどのようなディスクを対象にするかの条件を書く'filter'部と、その条件に一致したディスクに対しての操作を書く'match'部からなるようです。 今回は、オーディオCDがセットされたらabcdeを起動するようにしたいので、以下のようにしました。

filter audiocd {
    optical=true
    optical_disk_has_audio_track=true
}

match audiocd {
    post_insertion_command = "abcde [options...]"
}

post_insertion_commandに、ディスクが挿入された後に実行したいコマンドを記述します。 具体的には以下のように設定しています。

post_insertion_command = "abcde -N -c /etc/abcde.conf -a cddb,cue,read,encode,tag,move,clean -o flac,mp3:\"-b 192 -h\" -D -x 2>> /mnt/USB/tmp/abcde.log"

オプション冗長かもしれないけど。

  • -N : デーモンから実行なので non-interactive に。必須。
  • -c : 設定ファイルのパスを指定。デフォルトで読まれるはずなのですが、うまくいかなかったので明示的に指定。
  • -a : アクションを指定。たぶん冗長(tag指定すればcddb不要、とかあるっぽい)けど一応指定。
  • -o : 出力形式。flacとmp3で、mp3は192kbpsの高音質設定
  • -D : デバッグ出力(コマンド実行がstderrに出る)。いろいろトラブるのでログに書くことに。安定したら外したい。
  • -x : CD読み込み完了後にeject。

お好みでabcdeのマニュアル等参照して設定してください。

abcde設定ファイル

abcde.conf の設定についてはmanやらネットの各種リソースがありますが、設定した方が良さそうなオプションを以下に列挙します。

  • CDDBMETHOD : デフォルトは freedb ですが musicbrainz も選べます。自動リッパーとしては、データ数の多い freedb の方が良いかもしれませんが、musicbrainz の方がデータはきれい。
  • EYED3OPTS : eyeD3 はタグの文字エンコードについての指定のしかたがバージョンによってかなり違っているので、使っているバージョンに合うようにエンコード指定オプションを書き換えた方が良いです。エラーが出ないか、事前に実行してみて確認するのが良し。
  • OUTPUTDIR : 出力先。
  • WAVOUTPUTDIR : リッピング後のwav一時置き場。
  • OUTPUTFORMAT : フォルダ/ファイル名の設定ルール
  • VAOUTPUTFORMAT : Various Artist アルバムのフォルダ/ファイル名の設定ルール。VAだろうが同じ構成にしたい場合は、OUTPUTFORMATと合わせておかないと変なところにファイルが出来てしまって困る。

ここまで出来たら、CDをセットしてみてから、先ほど post_insertion_command に指定したコマンドを実行して、期待通りの動きをするか確認しましょう。とくにID3タグがちゃんと設定しているかは見た方が良い。ぱっと見ちゃんと終わってるんだけど、中身開けたらタグついてないっていうケースで、タグなしmp3を量産してしまいました。

udisks-glue のデーモン化 & 自動起動

さきほどのページを参考にして、/etc/init.d/udisks-glue を作成します。

※ /usr/local/bin などの下にあるコマンドを使用する際(たとえば eyeD3 を apt-get ではなく pip 等で別途インストールした場合など) は、起動スクリプトから実行する場合にはパスに含まれていないため、スクリプト内にPATHを設定してあげる必要があります。*2

#!/bin/bash

### BEGIN INIT INFO
# Provides:   udisks-glue
# Required-Start: $all 
# Required-Stop: $all
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: udisks-glue automounter 
# Description: Automounts removable media 
### END INIT INFO

. /lib/lsb/init-functions

# /usr/local/bin以下のコマンドを使用する場合、以下を追加
PATH=$PATH:/usr/local/bin

NAME=udisks-glue
PIDFILE=/var/run/udisks.pid
DAEMON="/usr/bin/udisks-glue"
DAEMON_OPTS="-c /etc/udisks-glue.conf"

case "$1" in
    start)
        log_daemon_msg "Starting Automounter" "$NAME"
        start-stop-daemon --start --exec $DAEMON -- $DAEMON_OPTS -p $PIDFILE
        log_end_msg $?
        ;;
    stop)
        log_daemon_msg "Stopping Automounter" "$NAME"
        start-stop-daemon --stop --exec $DAEMON
        log_end_msg $?
        rm -f $PIDFILE
        ;;
    restart | force-reload)
        $0 stop && sleep 2 && $0 start
        ;;
    try-restart)
        if $0 status >/dev/null; then
            $0 restart
        else
            exit 0
        fi
        ;;
    reload)
        exit 3
        ;;
    status)
        status_of_proc $DAEMON "udisks-glue"
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
        exit 2
    ;;
esac

ここまでできたら、service udisks-glue start として起動してみて、お手持ちのCDをドライブに入れてみましょう。abcdeが起動されていれば(WAVEOUTPUTDIRにファイルが出来ている、ps ax でabcdeがいる、など)ひとまず成功。

正常動作が確認できたら、起動時スクリプトとして登録。

update-rc.d udisks-glue defaults

リブートしてみましょう。動きましたか?

おわりに

Linux初心者なので勘所がつかめなくて辛い (◞‸◟)

*1: eyeD3公式は pip install eyeD3 やれと書いてるんだけど、うまくいかなかったのでURL指定で pip install http://eyeD3.nicfit.net//releases/eyeD3-0.7.5.tgz とした。

*2:どうやらPATHは、/etc/init.d/rc に設定されているものが適用されている模様 参考: http://www.seinan-gu.ac.jp/~shito/old_pages/hacking/shell/sh/boot_shutdown.html