mattintosh note

どこかのエンジニアモドキの備忘録

Linux で qaac がさくっと使える Docker コンテナを作った

C93 で CD を色々買ってきたので PC に取り込もうとしたんだけど、新しい PC に qaac の実行環境を作ってなかったので Docker で作れるようにしてみました。

github.com

qaac って何?

(ざっくり言うと)iTunes なしでコマンドラインから AppleAAC/ALAC エンコーダーを使えるようにするもの。

Docker コンテナイメージを作成する

Docker コンテナを作る前に qaac のセットアップが必要です。(コンテナ内で qaac のセットアップをしようと思ったのですが、セットアップ用のパッケージを入れるとイメージサイズが大きくなるのでホスト側で作成することにしました)

$ git clone https://github.com/mattintosh4/docker-qaac64
$ cd docker-qaac64
$ ./qaac_builder.sh

イメージを作成します。qaac は Wine 経由で実行するようになっているため、Wine のセットアップに多少時間がかかります。Wine は Ubuntuリポジトリではなく WineHQ のリポジトリを使うようになっています。(後日、時間が出来たら依存関係の数を減らす予定)

$ docker build -t qaac64 .

qaac は GitHubAPI から常に最新版の情報を取得するので最新版が落ちてきます。

iTunes のバージョンは 12.7.2 ですが、Apple の配信が終了すると使えなくなる可能性があります。その場合、iTunes64Setup.exe をブラウザでダウンロードし、qaac_builder.sh と同じディレクトリに置いて iTunes64Setup.exe.sha1 を更新してもらえらば好きなバージョンが使えます。

$ sha1sum iTunes64Setup.exe > iTunes64Setup.exe.sha1

qaac64.exe を使う

docker images でイメージが作成されていることを確認します。

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
qaac64                    latest              c6e8b5ada977        6 hours ago         985 MB
ubuntu                    xenial              00fd29ccc6f1        2 weeks ago         111 MB

コンテナ内で qaac を使ってエンコードをするわけですが、肝心のオーディオファイルはホスト側にあるので Docker のボリューム機能を使ってコンテナ内にホストのディレクトリをマウントさせる必要があります。

基本的な書式は下記の通りです。作業用ディレクトリ等を作成せずに使う場合はパスにスペースが混入する可能性があるので $PWD 部分を "$PWD" としておいた方が安全かもしれません。--rm を忘れるとエンコードの度にコンテナが増えていくので気をつけましょう。 (WINEPREFIX をイメージを作成する際に実行していたのですが、何故かそのあと qaac64.exe を実行するとアクセス出来ないというエラーになってしまうため毎回 WINEPREFIX の作成に数秒かかります)

docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe

以下、カレントディレクトリに BIN や CUE ファイルがある場合の例です。BIN は cdrdao で抽出した状態のもので、フォーマットは s16b になります。

$ docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe --raw --raw-format s16b --raw-channels 2 --raw-rate 44100 cdda.bin

CUE シートを使う場合はオプションに --text-codepage 65001UTF-8の場合)を追加します。--fname-format 等でアーティスト、アルバム名の指定ができます。詳しくは qaac のヘルプを読んでください。

$ docker run --rm -v $PWD:/mnt qaac64 wine qaac64.exe --raw --raw-format s16b --raw-channels 2 --raw-rate 44100 --text-codepage 65001 cdda.cue

毎回 docker run と書くのが面倒な場合

~/.bashrc などに関数を書いておくとよいです。

qaac64(){ docker run --rm -v "$PWD":/mnt qaac64 wine qaac64.exe "$@"; }