💿

Raspberry Pi を CD リッパーにする

2021/07/11に公開
1

最近、音楽を聴くのはサブスク (Spotify) がメインで、CDなんて、もう、何年も購入していませんが、約400枚くらいのCDを所蔵しています。もはや、CDプレイヤーすら所有しておらず、PCにすらCD-ROM/DVDドライブはついていません。そこで、 NASに音源を配置して、スマフォやタブレットから音楽を聴けるようにしたいと思います。

とは言え、さすがに400枚を1枚づつリッピングしていくのは苦行なので、Raspberry Piを使って、ドライブにCDを入れたらリッピングを開始する、完了したらドライブからCDが出てくるシステムを作りたいと思います。もちろん、Raspberry Piではなく、普通のPCにLinuxをインストールしても実現できます。

用意するもの

  • Raspberry Pi (microSD、電源等を含む)
  • 外付けCD-ROM/DVDドライブ
  • USBメモリ ※ 必要に応じて

Raspberry Piのモデルはどれでも大丈夫だと思いますが、私はRaspberry Pi 4 Model Bを使用しました。おそらく、エンコードにかかる時間が変わってくると思いますが、ドライブの読み込み速度の方が影響が大きいかもしれません。Raspberry Pi 4Bの場合、1枚当たり10 ~ 20分くらいでした。

https://www.amazon.co.jp/dp/B081YD3VL5

DVDドライブに関しては、接続がUSB Type Aのものであればどれでも大丈夫だと思いますが、必ず ACアダプタ で給電してください。Raspberry Piは電源供給が弱いので、USBバスパワー駆動では、モーターなど駆動部が動作しません。

リッピングしたデータは、そのままmicroSDに保存してもよいですが、容量やその後の運用のことを考えてUSBメモリに保存することにしました。ファイルサイズはコーデックやビットレートによって変わってきますが、FLACでエンコードした場合には、アルバム一枚当たり300MB前後でした。

構築

Raspberry Pi OS のインストール

Raspberry Pi Imager を用いて、 Raspberry Pi OS (32-bit) (Disktop版)をインストールします。 Raspberry Pi OS Lite (32-bit) (CLI版)でも大丈夫ですが、この後の設定が、一部、変わってきます。

https://www.raspberrypi.org/software/

Raspberry Pi OS

sshでRaspberry Piにリモート接続するために、sshを有効化します。OSイメージを書き込んだmicroSDのルートフォルダに、Windows のエクスプローラーから ssh という空ファイルを作成します。(当然、Raspberry Pi にキーボードとディスプレイをつなぐのであれば不要です)

sshファイルの作成

ツールのインストール

Raspberry Pi にログインして、CDのリッピングに必要なツールをインストールしていきます。

最初に、OSを最新の状態にしておきます。

sudo apt update
sudo apt full-upgrade

エンコーダーとして abcde をインストールします。コーデックは FLAC を使います。AAC や mp3 を使いたい人は、インストールするコーデックを適宜変更してください。

sudo apt install abcde flac id3v2 eyed3 eject

abcde の設定

abcde の設定ファイルを編集します。

cd /etc
sudo cp abcede.conf abcede.conf.org
sudo nano abcde.conf
Key Value
CDDBMETHOD freedb.freedb.org がもう有効ではないので、 cddb を設定します。
See: https://abcde.einval.com/bugzilla/show_bug.cgi?id=155/
CDDBURL 同上
CDDBPROTO 日本のアーティストを扱いたいので 6 (utf-8) を設定します。
INTERACTIVE 自動でリッピングするため n を設定します。
EYED3 メタデータを編集するために eyeD3 を使用します。
ACTIONS エンコードしたときに実行するアクションを記述します。エンコード時に、プレイリストの作成と、カバーアートの埋め込みも行うようにしています。
OUTPUTDIR 出力先を設定します。/media/pi/<LABEL> というパスにマウントされます。環境に合わせて適宜変更します。
WAVOUTPUTDIR 一時作業領域を設定ます。
OUTPUTTYPE コーデックとして flac を指定します。使用したいコーデックに合わせて適宜変更します。
OUTPUTFORMAT アーティスト名 / アルバム名 / トラック番号.曲名 という形式でファイルを出力します。
VAOUTPUTFORMAT 複数のアーティストが参加するアルバムは Compilation / アルバム名 / トラック番号.アーティスト名-曲名 という形式でファイルを出力します。
PLAYLISTFORMAT アルバムのプレイリストです。
VAPLAYLISTFORMAT 複数のアーティストが参加するアルバムのプレイリストです。
ALBUMARTFILE カバーアートは cover.jpg という名前で保存します。
ALBUMARTTYPE カバーアートは JPEG 形式で保存します。
EJECTCD リッピング完了後にディスクを排出するように y を設定します。
2021-07-13 CDDB について追記

freedb.freedb.org がもう有効ではないらしいので、 CDDBMETHODcddb を追加しました。
詳しくは https://abcde.einval.com/bugzilla/show_bug.cgi?id=155/ を参照してください。

自動リッピングの設定

DVD ドライブに CD が挿入されたら、自動的にリッピングが開始されるような設定を行います。仕組みとしては、 udev でディスクの挿入を検出し、sysytemd のサービスを起動します。

udev rule の作成

udev rule を作成します。

sudo nano /etc/udev/rules.d/99-audio-cd-ripping.rules

systemd の設定

systemd に udev から起動されるサービスを追加します。

sudo nano /etc/systemd/system/rip-audio-cd@sr0.service

実行ファイルの作成

実際にリッピングを行う実行ファイルを作成します。

sudo nano /usr/local/sbin/audio-cd-ripper.sh

ファイルに実行権限を付けます。

sudo chmod a+x /usr/local/sbin/audio-cd-ripper.sh

以上で設定は完了です。

動作確認

FAT32にフォーマットされたUSBメモリを挿し、マウントされていることを確認します。

$ df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        7332696 3226080   3755352  47% /

... (snip) ...

/dev/sda1       30833664     512  30833152   1% /media/pi/MEDIA

ドライブに CD を挿入します。 /var/log/cdrip.log にログが出力されます。候補が複数見つかった場合には、1番最初のものが使用されます、

Started at Sun 11 Jul 2021 08:54:05 PM JST
Grabbing entire CD - tracks:  01 02 03 04 05 06 07 08 09 10 11 12 13
Retrieved 3 matches...
#1 (Musicbrainz): ---- Alanis Morissette / Jagged Little Pill ----
1: All I Really Want
2: You Oughta Know
3: Perfect
4: Hand in My Pocket
5: Right Through You
6: Forgiven
7: You Learn
8: Head Over Feet
9: Mary Jane
10: Ironic
11: Not the Doctor
12: Wake Up
13: You Oughta Know (Jimmy the Saint Blend) / Your House

#2 (Musicbrainz): ---- Alanis Morissette / Jagged Little Pill ----
1: All I Really Want

... (snip) ...

13: You Oughta Know (Jimmy the Saint blend) / Your House (a cappella)

Finished.
Finished at Sun 11 Jul 2021 09:17:35 PM JST

リッピングが完了すると、CDがドライブから排出され、指定されたディレクトリにファイルが出力されていることが確認できます。

$ tree /media/pi/MEDIA/MUSIC/
/media/pi/MEDIA/MUSIC/
├── Alanis_Morissette
│   └── Jagged_Little_Pill
│       ├── 01.All_I_Really_Want.flac
│       ├── 02.You_Oughta_Know.flac
│       ├── 03.Perfect.flac
│       ├── 04.Hand_in_My_Pocket.flac
│       ├── 05.Right_Through_You.flac
│       ├── 06.Forgiven.flac
│       ├── 07.You_Learn.flac
│       ├── 08.Head_Over_Feet.flac
│       ├── 09.Mary_Jane.flac
│       ├── 10.Ironic.flac
│       ├── 11.Not_the_Doctor.flac
│       ├── 12.Wake_Up.flac
│       ├── 13.You_Oughta_Know_(Jimmy_the_Saint_Blend)__Your_House.flac
│       └── albumart_backup
│           └── cover.jpg
├── Alanis_Morissette-Jagged_Little_Pill.flac.m3u

プレイヤーアプリで確認すると、メタ情報が入力され、カバーアートもファイルに埋め込まれていることが確認できます。

メタ情報

まとめ

udev, systemd を使って、abcde によるエンコードを半自動化することができました。

Discussion

takerutakeru

ドライブ10台ぐらい繋いで平行にたくさんできたら需要あるかも?