How to Deploy abcde on Rocky Linux 10

abcde — A Better CD Encoder — is still the best pipeline I know for taking an audio CD and turning it into a tagged, encoded music collection. It is a Perl script that reads the disc, rips it with whatever CD reader you have, and fans the tracks out to whichever encoders are installed, tagging the results as it goes. The latest release is 2.9.3, dated 2019, which looks old until you remember the CD ripping world has not moved on much either. It just works.

I deployed it on a Rocky Linux 10 box with an optical drive, and this is everything that was involved, including the one dependency that no package on the system provides.

Getting abcde

The download page is https://abcde.einval.com/download/ and the latest release is 2.9.3. The tarball installs with the project’s own Makefile:

curl -fsSL -o /tmp/abcde-2.9.3.tar.gz https://abcde.einval.com/download/abcde-2.9.3.tar.gz
cd /tmp
tar xzf abcde-2.9.3.tar.gz
cd abcde-2.9.3
sudo make install

Before running it, it is worth a glance at the install targets, because this is a system-wide install from a third-party tarball. The Makefile places:

Destination What goes there
/usr/local/bin abcde, cddb-tool, abcde-musicbrainz-tool
/etc/abcde.conf the sample configuration
/usr/local/share/doc/abcde-2.9.3 changelog, COPYING, FAQ, README
/usr/local/share/man/man1 abcde.1, cddb-tool.1

The FAQ and README in the doc directory are the real documentation; the man page is thin.

First run: no cdreader found

Run it once and watch it fail:

$ abcde
[ERROR] abcde: no cdreader found in your PATH
[ERROR] abcde: hints: are all dependencies installed? has the $PATH been modified?

That is expected on a clean box. abcde is a frontend, and every stage of the pipeline is an external program. Grouped by role, here is what it looks for:

Role Tools abcde looks for
CD reader cdparanoia (required)
Encoders lame, flac, oggenc, mpcenc, aacenc, faac, ttaenc, opusenc, wavpack, ffmpeg (fallback)
Taggers id3v2, mid3v2, eyeD3, metaflac, vorbiscomment
Disc IDs and cuesheets cd-discid (required), mkcue, cdio

Installing the packages

EPEL carries most of the pieces:

sudo dnf install -y epel-release
sudo dnf install -y cdparanoia flac sox vorbis-tools ffmpeg-free lame wavpack python3-pip

Two things will surprise you.

ffmpeg is not in the Rocky 10 repositories under that name. The free build is packaged as ffmpeg-free, and on Rocky 10 that is ffmpeg 7.1.2 — no problem at all as the encoder fallback.

mutagen is not packaged either. There is no python3-mutagen in any repository, but PyPI has it, and Rocky 10’s pip does not enforce PEP 668, so a system-wide install works without flags:

sudo pip install mutagen

That drops mid3v2 into /usr/local/bin, which is the tagger abcde prefers for ID3v2/ID3v1 work.

Tool Version From
cdparanoia 10.2 EPEL
ffmpeg 7.1.2 EPEL (ffmpeg-free)
sox 14.4.2 EPEL
flac, metaflac 1.4.3 AppStream
lame 3.100 AppStream
oggenc, vorbiscomment 1.4.2 EPEL (vorbis-tools)
wavpack 5.6.0 AppStream
mid3v2 (mutagen) 1.48.1 PyPI

cd-discid: the piece nothing packages

Run abcde again:

$ abcde
[ERROR] abcde: cd-discid is not in your path.
[INFO] Define the full path to the executable if it exists on your system.

This one is not in any Rocky repository — dnf provides /usr/bin/cd-discid comes back empty — and it is not in libcdio either, despite the name. cd-discid is a small standalone C program, originally written by Robert Woodcock and now maintained as a separate project, that prints the CDDB disc ID of whatever disc is in the drive. abcde’s startup check requires it unconditionally, even when every other tool is stock.

The current upstream is https://github.com/taem/cd-discid, and it builds in about a minute:

sudo dnf install -y git gcc make
git clone https://github.com/taem/cd-discid.git
cd cd-discid
make
sudo make install

It installs /usr/local/bin/cd-discid and its man page, both under /usr/local, so nothing here ever fights the distro’s own files.

Verifying the setup

A quick sweep of the toolchain:

for t in abcde cdparanoia sox flac metaflac lame mid3v2 oggenc vorbiscomment wavpack ffmpeg cd-discid; do
    printf "%-14s %s\n" "$t:" "$(command -v $t || echo MISSING)"
done

Then give abcde a dry run with the drive empty:

$ abcde
[WARNING] something went wrong while querying the CD... Maybe a DATA CD or the CD is not loaded?
[WARNING] Error trying to calculate disc ids without lead-out information.

With an empty drive that is the success state: every dependency check passed, and abcde is genuinely trying to read a disc. Put an audio CD in and the same command rips and encodes it.

Pointing it at your music

The sample /etc/abcde.conf ships with everything commented out. The lines you actually want to set are the output type and where the music lands:

OUTPUTTYPE="mp3"
OUTPUTDIR="$HOME/Music"

Leave the CDDB defaults alone unless you want to change where track names come from or submit entries; the defaults query Freedb and work out of the box.

What I left out

The encoders for the less common formats are not in the repositories, and a mp3/flac/ogg/wavpack setup does not need them:

Format Encoder Status
MPC mpcenc not packaged — build from source
TTA ttaenc not packaged — build from source
AAC aacenc / faac not packaged — build from source
Opus opusenc not packaged — build from source
Cuesheets mkcue not packaged — build from source

That is the whole job: one tarball, one dnf line, one pip line, one git clone, and a CD drive.

Updated: