1. Andrew's Corner »
  2. Linux Explorations...

abcde: Command Line Music CD Ripping for Linux

I have tried a variety of programs to rip my personal collection of music from CD to computer. I found significant shortcomings with many of the GUI programs and throughout I was also a little nonplussed at the complexities of whole process. Fortunately I came across the script known as abcde which eliminates the needless froth of the GUI as well as seamlessly taking care of much of the complexity of the process. And I have been even more fortunate lately to be given the opportunity to work on the script myself with commit access to the development version of abcde, thanks to Steve for giving me this great opportunity!

This set of guides aims to demonstrate to Linux users how to harness this amazing script for their own purposes. I will describe on this page how to rip and encode music cds to nine different formats: MP3, Ogg Vorbis, FLAC, Musepack, AAC, Monkey's Audio (ape), WavPack, Opus, True Audio (tta) and MPEG-1 Audio Layer II (mp2). I will also for the sake of completion demonstrate the syntax required to convert CDs that contain the spoken word to Speex.

Select your codecs..

abcde can be operated purely from the commandline but it is much easier to run the program from a configuration file. abcde looks for two of these files at startup: /etc/abcde.conf and $HOME/.abcde.conf. The file /etc/abcde.conf is a fully commented configuration file that is well worth looking at if only to copy to your home directory as $HOME/.abcde.conf (as is most usually done). But my gift to you, Gentle Reader, is a set of $HOME/.abcde.conf files, collected on a few separate pages, that will achieve great results "straight out of the box" and will simply require the command abcde or abcde -1 to run the whole process:

Plenty of room for exploration on these pages which attempt to demonstrate the different applications and different options available with each codec. An extra option is to download the CD album art suitable for the CD and this option is comprehensively explained on this page...

One with the lot...

One of the great joys of abcde is that it is possible to encode a single audio CD into multiple different codecs at the same time. So if you are not certain which codec suits you best try the following conf file which will use 11 codecs at the same time:

# -----------------$HOME/.abcde.conf----------------- #
# 
#  A sample configuration file to convert music cds to 
#  MP3, Ogg Vorbis, FLAC, Musepack, AAC, WavPack, Opus,
#  Monkey's Audio (ape), True Audio, AC3 and mp2, 11 formats
#  at the same time! Using abcde version 2.7.2 release version.
# 
#      http://andrews-corner.org/linux/abcde.html
# -------------------------------------------------- #

# Encode tracks immediately after reading. Saves disk space, gives
# better reading of 'scratchy' disks and better troubleshooting of
# encoding process but slows the operation of abcde quite a bit:
LOWDISK=y

# Specify the method to use to retrieve the track information,
# the alternative is to specify 'musicbrainz':
CDDBMETHOD=cddb

# Make a local cache of cddb entries and then volunteer to use 
# these entries when and if they match the cd:
CDDBCOPYLOCAL="y"
CDDBLOCALDIR="$HOME/.cddb"
CDDBLOCALRECURSIVE="y"
CDDBUSELOCAL="y"

OGGENCODERSYNTAX=oggenc                   # Specify encoder for Ogg Vorbis
MP3ENCODERSYNTAX=lame                     # Specify encoder for MP3
FLACENCODERSYNTAX=flac                    # Specify encoder for FLAC
MPCENCODERSYNTAX=mpcenc                   # Specify encoder for Musepack
AACENCODERSYNTAX=fdkaac                   # Specify encoder for AAC
OPUSENCODERSYNTAX=opusenc                 # Specify encoder for Opus
WVENCODERSYNTAX=wavpack                   # Specify encoder for Wavpack
APENCODERSYNTAX=mac                       # Specify encoder for Monkey's Audio
TTAENCODERSYNTAX=tta                      # Specify encoder for True Audio
MP2ENCODERSYNTAX=twolame                  # Specify encoder for MP2
MKAENCODERSYNTAX=ffmpeg                   # Specify encoder for MKA (AC3 via FFmpeg)

OGGENC=oggenc                             # Path to Ogg Vorbis encoder
LAME=lame                                 # Path to MP3 encoder
FLAC=flac                                 # Path to FLAC encoder
MPCENC=mpcenc                             # Path to Musepack encoder
FDKAAC=fdkaac                             # Path to the AAC encoder
OPUSENC=opusenc                           # Path to Opus encoder
WVENC=wavpack                             # Path to WavPack encoder
APENC=mac                                 # Path to Monkey's Audio encoder
TTA=tta                                   # Path to True Audio encoder
TWOLAME=twolame                           # Path to MP2 encoder
FFMPEG=ffmpeg                             # Path to FFmpeg (AC3 via FFmpeg)

OGGENCOPTS='-q 6'                         # Options for Ogg Vorbis
LAMEOPTS='-V 2'                           # Options for MP3 
FLACOPTS='-s -e -V -8'                    # Options for FLAC
MPCENCOPTS='--extreme'                    # Options for Musepack
FDKAACENCOPTS='-p 2 -m 5 -a 1'            # Options for fdkaac
OPUSENCOPTS="--vbr --bitrate 128"         # Options for Opus
WVENCOPTS="-hx3"                          # Options for WavPack
APENCOPTS="-c4000"                        # Options for Monkey's Audio
TTAENCOPTS=""                             # Options for True Audio
TWOLAMENCOPTS="--bitrate 320"             # Options for MP2
FFMPEGENCOPTS="-c:a ac3 -b:a 448k"        # Options for MKA (AC3 via FFmpeg)

OUTPUTTYPE="ogg,mp3,flac,mpc,m4a,opus,wv,ape,tta,mp2,mka"  # Encode to 11 formats!

# The cd ripping program to use. There are a few choices here: cdda2wav,
# dagrab, cddafs (Mac OS X only) and flac. New to abcde 2.7 is 'libcdio'.
CDROMREADERSYNTAX=cdparanoia            
                                     
# Give the location of the ripping program and pass any extra options,
# if using libcdio set 'CD_PARANOIA=cd-paranoia'.
CDPARANOIA=cdparanoia  
CDPARANOIAOPTS="--never-skip=40"

# Give the location of the CD identification program:       
CDDISCID=cd-discid           
                               
# Give the base location here for the encoded music files.
OUTPUTDIR="$HOME/Music"               

# The default actions that abcde will take.
ACTIONS=cddb,playlist,read,encode,tag,move,clean

# Decide here how you want the tracks labelled for a standard 'single-artist',
# multi-track encode and also for a multi-track, 'various-artist' encode:
OUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${TRACKNUM}.${TRACKFILE}'
VAOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${TRACKNUM}.${ARTISTFILE}-${TRACKFILE}'

# Decide here how you want the tracks labelled for a standard 'single-artist',
# single-track encode and also for a single-track 'various-artist' encode.
# (Create a single-track encode with 'abcde -1' from the commandline.)
ONETRACKOUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}'
VAONETRACKOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}'

# Create playlists for single and various-artist encodes. I would suggest
# commenting these out for single-track encoding.
PLAYLISTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}.m3u'
VAPLAYLISTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}.m3u'

# This function takes out dots preceding the album name, and removes a grab
# bag of illegal characters. It allows spaces, if you do not wish spaces add
# in -e 's/ /_/g' after the first sed command.
mungefilename ()
{
  echo "$@" | sed -e 's/^\.*//' | tr -d ":><|*/\"'?[:cntrl:]"
}

MAXPROCS=2                                # Run a few encoders simultaneously
PADTRACKS=y                               # Makes tracks 01 02 not 1 2
EXTRAVERBOSE=2                            # Useful for debugging
COMMENT='abcde version 2.7.2'             # Place a comment...
EJECTCD=y                                 # Please eject cd when finished :-)

Ripping to 11 codecs with a single CD rip is pretty much the most cool thing I have seen for quite some time and I hope that you, Gentle Reader, think so too!

And in conclusion...

Of all the pages that I have written for Linux this one has been the most fun. I guess because abcde is such a beautifully written script that invites you to explore programs that are all gems in their own right. Please feel free to use the email address at the base of this page to pass on your thoughts about this page, any corrections, praise or condemnation. Perhaps also consider dropping in on the new Freenode IRC channel: #abcde and we can chat in realtime. And remember: Have fun!