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

Debian 8.0 Jessie での Docker インストールではまった

Docker を試そうとして、Docker 公式から Debian へのインストール方法などを見ていたところ、Debian 8.0 Jessie からはapt-getで一発でいける旨の記載(Debian - Docker Documentation)があったので、じゃあってことで Virtual BoxにDebian 8.0(64bit) をいれて apt-get install docker.io してみたけど、

Package docker.io is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'docker.io' has no installation candidate

などとなってしまう。 apt-get update してもだめで、しばらく悩んだんだけど、現状 Jessie の公式リポジトリに docker.io がまだ登録されていないだけだった… どうも、sid (unstable) 版のリポジトリにはあるようなので(Debian -- Package Search Results -- docker.io)、unstable から testing に変わった時点で、取り込まれてない状態になってしまっているのだろうか…

なので /etc/apt/sources.list に以下を追加してから

deb http://ftp.jp.debian.org/debian/ sid main
deb-src http://ftp.jp.debian.org/debian/ sid main

apt-get update して apt-get install docker.io でインストールしましたとさ。

Raspberry Pi に Volumio をインストールした話

Raspberry Pi 2 が出たとき、そのちょっと前から「Raspberry Piちょっと欲しいかも〜」などと思っていたところだったので、勢いで購入してしまった。そこで使い道をググったりしていたら、Volumioというミュージックサーバ用のパッケージがあるとのことだったので、こいつを導入してミュージックサーバ+CDリッパー+ファイルサーバとして使おうとした記録を公開します。

Volumioのインストール

Volumio公式サイトからディスクイメージをダウンロードしてGet Started に従って操作をするだけで簡単にインストール出来ます。

HDMI出力から映像出力したい場合

Volumio (バージョン1.55) では、デフォルトでHDMI出力が無効になっています。初回ブート時からHDMIで画面を確認したい場合、インストール完了したSDカードをもう一度PCに差してconfig.txtを編集する必要があります(ブートパーティションの直下にあります)。 http://d.hatena.ne.jp/hamtaro/20140601#p12 などを参考に、設定します。私も先のページと同様の設定で出力出来ました。

# hdmi_drive=2
hdmi_group=2 # 1が家電系,2がモニター系。hdmi_mode設定の意味合いが変わります
hdmi_mode=82 # hdmi_group=2のとき82は1920x1080/60Hz
hdmi_force_hotplug=1 # ホットプラグ有効化

config.txtについての各オプションの詳細は http://www.raspberrypi.org/documentation/configuration/config-txt.md にあります。

ちなみに、LANケーブルをつなぐことが出来るなら Web UI から一通りの設定が出来ますので、HDMI出力しなくても特に問題ありません。

各種設定

ネットワーク

Volumioを書き込んだSDカードを Raspberry Pi にさし、LANケーブルと、(使う場合は)USB無線LAN子機をさして起動します。起動が完了すると http://volumio.local/ でVolumioの Web UI にアクセスすることが出来ます(ホスト名のアクセスにはAvahi/Bonjourが必要です。Mac OSXやiOS、多くのLinuxディストリビューションには含まれているようですが、Windows環境では別途インストールが必要です。IPアドレスがわかれば、Avahi/Bonjourが無くてもアクセスできます)。 Web UI にアクセスさえできれば、ブラウザから各種の設定が出来ます。

Web UI 右上のMENU > Network と進むと上段が有線接続、下段が無線接続の設定になっています。有線の場合ここからIPアドレスが固定できます。無線の場合はAP名、セキュリティのタイプとパスワードを入力し Save Changes を押せば接続されます。 ただ、無線についてはここでIPアドレス固定できないようです。私はルータ側DHCP設定で当該MACアドレスへのIPリースを固定する方法をとりました。たぶんその方が楽。

オーディオ設定

ネットワーク設定が終わったら、USB DAC 等を Raspberry Pi のUSBに接続します。僕は、CDスロットインが故障気味のKenwood R-K731 のPC-INに接続しました。 Web UI から MENU > Playback に進み、Audio Output がCODECになっていれば、USBオーディオから音が出るはず。一発です。ほかの設定項目も気になるところがあれば確認しましょう。 R-K731では、USBからのボリュームコントロールは受け付けないようなので、Volume Control Mixer / Mixer Type を Software にしました。これで、Web UIのPlayback画面でボリュームがコントロールできるようになります (当然、音量を下げれば音質は犠牲になりますが、音質より音量変えたいですよね?)。

まだ音楽ファイルがないので、試しにネットラジオを再生してみましょう。画面下のタブからBrowseを選ぶとWEBRADIOの項目があるのでたどっていくと、プリセットされた局が表示されます。ただこのプリセット局、聞けないものが結構混じっています。Audiophile〜系は軒並みだめでした(Volumio 1.55 2015/02/20現在)。鳴らない場合はほかの局も試してみてください。

音が出た!

これで、一通り音が出るところまでのセットアップは完了です。ただ、ネットラジオだけ聴けても楽しくないので、HDDドライブをつなげ、かつCDリッピングを自動で行うような形にしたかった。 次回は、その部分について書きます。 -> 次回:Raspberry Pi をオートCDリッパーにした話 - reppets.log

作業ログ

Rictyインストール

参考:プログラムに最適なフォント『Ricty』を超簡単にインストール[Mac限定] - 酒と泪とRubyとRailsと

brew tap sanemat/font
brew install ricty
cp -f <Rictyインストールディレクトリ>/share/fonts/Ricty*.ttf ~/Library/Fonts/
fc-cache -vf

emacs (24.3.1) フォント設定

参考:Mac OS X Lion + Cocoa Emacs 24 でフォントの設定 - めもめも

(create-fontset-from-ascii-font "Ricty-14:weight=normal:slant=normal" nil "ricty")
(set-fontset-font "fontset-ricty"
                  'unicode
                  (font-spec :family "Ricty" :size 14)
                  nil
                  'append)
(add-to-list 'default-frame-alist '(font . "fontset-ricty"))

みんPy(改訂版) 読書メモ Chapter 13 - 標準ライブラリを使う

標準ライブラリの紹介

みんPy(改訂版) 読書メモ Chapter 12

Chapter12 スコープとオブジェクト

Pythonのスコープ

スコープみっつ
  • ビルトインスコープ: 組み込み関数や、組み込み変数が属するスコープ。このスコープに新たに定義することはできない。
  • モジュール(グローバル)スコープ: モジュールのトップレベルのスコープ。Pythonの最大スコープはモジュールごとなので、厳密なグローバルスコープとは異なる。
  • ローカルスコープ: 関数定義内のスコープ。
global

ローカルスコープでの変数定義時に global 文を指定すると、その変数をグローバル変数で定義されたものとして扱う。

def func():
    global b
    b=10
    return

func()
print b    #=> 10

また、関数内からグローバルスコープに定義された変数は、参照できるが通常代入はできない。この場合にも global とすることで、グローバルスコープの変数への代入が可能となる(参照: http://inside.ascade.co.jp/node/41)

Pythonのオブジェクト

dir()

オブジェクトに定義されているアトリビュートを一覧できる。

関数オブジェクト

Pythonでは関数は first-class object なので、変数に代入することができる。def による関数定義は、定義した名前の変数に関数オブジェクトを代入しているのと等しい。

型検査
  • type() : 引数に渡したオブジェクトの型を返す組み込み関数(type型を返す(ややこしい))
  • isinstance() : 第一引数のオブジェクトが、第二引数の型であるかを返す。
  • issubclass() : 第一引数のクラスが、第二引数のクラスであるかを返す。
getattr()

第一引数のオブジェクトから第二引数に指定した名前(文字列)を持つアトリビュートの値を取得する。

みんPy(改訂版) 読書メモ Chapter 11

Chapter 11 モジュール

import

import <モジュール名> (as <別名>)
from <モジュール名> import <識別子> (as <別名>)

カンマで区切って複数指定も可。

モジュールの検索パス

  1. ホームディレクト
  2. 環境変数PYTHONPATHディレクト
  3. 標準ライブラリのモジュールディレクト
  4. site-packages

sys.pathで参照可能。

モジュールファイルの作成

Pythonでは、モジュール=スクリプトファイルの単位。スクリプトファイル名は命名規則の制約を受ける。

モジュールはインポート時に、トップレベルの処理が実行される。

モジュールがインポートしたものは、モジュールの持ち物としてアクセスすることができる。

__name__

組み込み属性 __name__ は、そのスクリプトPython に渡されて実行されたときには __main__ が代入され、インポートされたときには、自身のモジュール名が代入されている。 そのため、__name__ == '__main__' を判定すれば、直接実行されたときのみ実行される処理を書くことができる。

パッケージ

パッケージは、ディレクトリ構造。ただし、そのディレクトリに __init__.py ファイルが必要。このファイルが、パッケージのインポート時に実行される。空でもよい。

サードパーティライブラリ

  • 探すなら: PyPI
  • インストールは: EasyInstall
  • EasyInstall使えないなら、手動ビルド -> site-packagesに 配置