Ripoff: Python tools for CD ripping

Ripoff is:
  1. a highly configurable CD ripper written in Python and designed for high-throughput ripping
  2. a collection of Python modules for the various tasks common to CD rippers: CD-ROM drive control, CDDB/CDIndex disc ID computations, CDDB lookup/caching, ID3 tagging, etc.
Most of the underlying code was shamelessly stolen from other, similar projects. See the list of modules in the Python ripoff package below for credits. Hence the name "ripoff".

Currently, Ripoff is only available through CVS. Use the links on the right.

Principles

Extraction is the process of extracting digital audio from a CD. Ripoff relies on an external program, such as cdparanoia or cdda2wav for extraction. The output of audio extraction is very large uncompressed audio files (about 10 MB per minute of audio, or around 600-700 MB for a full CD).

Encoding is the process of encoding digital audio to a compressed, usually lossy, format, such as MP3 or Ogg Vorbis. Ripoff relies on an external program such as lame or bladeenc for encoding.

To maximize throughput, it's best if extraction and encoding run simultaneously, so this is what Ripoff tries to do by default.

The script

If you're an adventurous Linux/Unix user not afraid of checking code out of CVS and playing around, Ripoff might be useful for you -- especially if you're more interested in getting fiddly details (like filenames, ID3v2 tags, and the command-line arguments to your encoder of choice) "just right" than in a fancy GUI.

Ripoff is also very keen on maximizing throughput, ie. the number of CDs you can rip per hour. It has two basic modes of operation:

Synchronous operation is selected with the -p (--use-pipes) option; asynchronous operation is selected with -f (--use-files).

Ripoff's user interface is rather unusual. Like many Unix programs, it's controlled by command-line options and an editable configuration file; use

  ripoff --help
to learn what command-line options are available.

And like most Unix programs, Ripoff runs in a text console. But unlike most other Unix programs, Ripoff opens up other consoles where its "slaves" -- namely, audio extraction and encoding programs -- do all the hard work.

The rationale for this unusual interface is that the audio extraction and encoding tools I've played with under Linux have fairly noisy console output: they print a running progress report to their terminal. This is interesting and useful information, and I didn't want to throw it away or compress it to a little progress bar in a GUI. But have you ever tried to run, say, cdparanoia and lame simultaneously in the same window? It isn't pretty. I toyed for a while with running Ripoff in a big window, and doing some curses and pseudo-tty magic to make it all work. But then I remembered: that's what windowing systems are for! So now Ripoff just fires off a couple of terminal emulators (xterm, rxvt, gnome-terminal, whatever you like) and runs its slaves inside of them. It's weird, it's wonky, and it takes up a lot of screen real estate. But it works!

The library

If you're a Python programmer looking to write your own CD ripper (and, after re-reading the above explanation, I'm not sure I blame you...), then Ripoff is most likely useful to you as a library. The ripoff package includes the following modules:
ripoff.cdrom C extension for controlling a CD-ROM drive (useful for reading the TOC to compute disc IDs) (stolen from Ben Gertzfield)
ripoff.disc_id code for computing CDDB and CDIndex disc IDs. CDDB code stolen from Ben Gertzfield, CDIndex code from Guido van Rossum.
ripoff.disc_info provides the DiscInfo class, which abstracts the information provided by both CDDB and CDIndex. Based on code by Guido van Rossum.
ripoff.cddb provides an implementation of the CDDB protocol (stolen from Guido van Rossum) and a local CDDB cache
ripoff.id3v1 ID3v1 (including v1.1) implementation (stolen from Ryan Finnie)
ripoff.id3v2 partial ID3v2 implementation (based on Ryan Finnie's code)
(The real reason it's called "ripoff" should be clear from the above list of credits.)