Recently I built myself a nice media center. I obtained a 16×3.5″ bay IBM server case. It’s 4U tall and really makes one hell of a system. This case is very, very big so I probably shouldn’t be using it as a media center case but what’s technology if you don’t over do it here and there.

One of the things that always frustrated me was ripping media such as CD’s and DVD’s. I either had to rip by hand, or… well rip by hand. Later on kept finding “one click rip” solutions, but there were two issues. First of all, it was never really one click. Second of all, I didn’t find one click acceptable. I wanted no clicks. I attempted this a couple of years ago at a previous job with a machine loaded with 4 DVD drives which was so famously dubbed the Ripasaurus. That was running on Windows. Now I’m a couple years older, and a couple years wiser so I decided to base my media center off Linux. Finally, Ripasaurus is reborn.

First I just want to outline the system I have running right now. It’s probably overkill, but hey it gets the job done. At the heart of the system is a Intel Core i5 3350P. This alone has made this the best media center I’ve ever built, and trust me, I’ve built a lot. I’m running on 4GB of DDR3 1333MHz RAM which runs just fine. To get better image quality (and the possibility of running some games) I dropped in a Nvidia Geforce GTX 460. For storage I’ve got a 32GB Sandisk SSD running my OS and 3x3TB Western Digital Red hard drives for my main storage. The hard drives are formatted for ZFS and they run in a RAID-Z just to make things a bit safer. Finally, I’ve got a Pioneer Blu-ray ROM drive I picked up off Amazon. This will be our best friend in this post.

Alright, let’s do some business.I will separate this post into sections as we will be covering how to rip audio CD’s, DVD’s, and Blu-ray discs. We will be running the DVD and Blu-ray rips through our friend Handbrake to give us a bit better file sizes and a lot more compatibility with software like XBMC.

Audio CD’s

Audio CD’s are pretty simple. We only really use one program, ABCDE (A Better CD Encoder). I’m running Ubuntu, so installation is a snap:

    sudo apt-get install abcde

After ABCDE is installed, we need to make a config file. Open up your favorite text editor and save the text below in your home directory as .abcde.conf (~/.abcde.conf)

    CDROM=/dev/sr0
    OUTPUTTYPE=flac
    INTERACTIVE=n
    PADTRACKS=y
    EJECTCD=y
    OUTPUTDIR=/data/Music

    OUTPUTFORMAT='${ARTISTFILE}/${ALBUMFILE}/${TRACKNUM}. ${TRACKFILE}'
    VAOUTPUTFORMAT='Various-${ALBUMFILE}/${TRACKNUM}.${ARTISTFILE}-${TRACKFILE}'

    ONETRACKOUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}'
    VAONETRACKOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}'
    mungefilename ()
    {
       echo "$@" | sed s,:,-,g | tr / _ | tr -d \'\"\?\[:cntrl:\]
    }

Obviously you’ll want to replace some information in this config with your own. My source drive by default was /dev/sr0 and I wanted my output to be in /data/Music as defined by OUTPUTDIR. The rest of he stuff I wouldn’t worry about. It places an album under the format Artist/Album/Track.ext

After this is created, you’ll want to make sure that ABCDE is ran when you insert a disc. We can utilize MIME types for this situation. Ubuntu (and I think all Debian distros? Don’t quote me on that) uses .desktop files for defining what applications can open what kinds of files along with a custom MIME type list. Lets make our CD ripping .desktop application file. Save the text below as /usr/share/applications/ripcd.desktop

    [Desktop Entry]
    Name=Rip CD
    Comment=This will start the automated CD ripping process
    Exec=abcde
    TryExec=abcde
    MimeType=x-content/audio-cdda
    Type=Application

If we didn’t have the MimeType definition, this would look like any other program. But that line lets us do just a little bit more. For lack of a better word it tricks the system into thinking that our program will play the CD.

We’re going to want a second file created that we will reference later. Copy paste the following into ~/.local/share/applications/mimeapps.list

    [Default Applications]
    x-content/audio-cdda=ripcd.desktop;
    x-content/video-dvd=ripdvd.desktop;
    x-content/video-bluray=ripbluray.desktop
    [Added Associations]
    x-content/audio-cdda=ripcd.desktop;
    x-content/video-dvd=ripdvd.desktop;
    x-content/video-bluray=ripbluray.desktop;

If you won’t be doing DVD or Blu-ray ripping you can take those lines out.

In Ubuntu if you go to System Settings > Details > Removable Media and then click on the Audio CD drop down, you’ll notice our Rip CD program is listed. Choose this as your default. At this point you can pop in a disc and watch it rip. Note since this is a no-click solution, you won’t be notified of any errors and the only feedback you’ll get is when the tracks are created into files or the purring of the optical drive.

DVD’s

Time to move onto DVD’s. These are a bit trickier as we first have to break the encryption on the disc and rip it to the hard drive. Then we have to convert it to a better format for us to play. First thing you’ll want to do is install dvdbackup:

    sudo apt-get install dvdbackup

We also need to install libdvdcss to allow us to break DVD encryption. We’ll also need to install git (it’s usually the first thing I install on any machine along with vim) and clone the libdvdcss repo.

    sudo apt-get install git
    git clone git://git.videolan.org/libdvdcss

Now we compile and install libdvdcss

    ./configure
    make
    sudo make install
    echo '/usr/local/lib' > /etc/ld.so.conf.d/libdvdcss.conf
    ldconfig -v

We’ll also need Handbrake to do the video conversion for us

    sudo add-apt-repository ppa:stebbins/handbrake-snapshots
    sudo apt-get update
    sudo apt-get install handbrake-cli handbrake-gtk

I usually install both the GUI and CLI versions of Handbrake. We’ll need the CLI in our script, but I end up using the GUI to make my encoding presets.

And now we can build our DVD ripping script. Save this as /usr/bin/ripdvd

    #!/bin/bash

    OUTPUT_DIR="/data/Ripping/DVD"
    SOURCE_DRIVE="/dev/sr0"
    HANDBRAKE_PRESET="AppleTV 2"
    EXTENSION="m4v"

    function rip_dvd() {

            # Grab the DVD title
            DVD_TITLE=$(blkid -o value -s LABEL $SOURCE_DRIVE)
            # Replace spaces with underscores
            DVD_TITLE=${DVD_TITLE// /_}

            # Backup the DVD to out hard drive
            dvdbackup -i $SOURCE_DRIVE -o $OUTPUT_DIR -M -n $DVD_TITLE

            # grep for the HandBrakeCLI process and get the PID
            HANDBRAKE_PID=`ps aux|grep H\[a\]ndBrakeCLI`
            set -- $HANDBRAKE_PID
            HANDBRAKE_PID=$2

            # Wait until our previous Handbrake job is done
            if [ -n "$HANDBRAKE_PID" ]
            then
                    while [ -e /proc/$HANDBRAKE_PID ]; do sleep 1; done
            fi

            # HandBrake isn't ripping anything so we can pop out the disc
            eject $SOURCE_DRIVE

            # And now we can start encoding
            HandBrakeCLI -i $OUTPUT_DIR/$DVD_TITLE -o $OUTPUT_DIR/$DVD_TITLE.$EXTENSION --preset=$HANDBRAKE_PRESET

            # Clean up
            rm -R $OUTPUT_DIR/$DVD_TITLE
    }

    rip_dvd

Make it executable

sudo chmod +x /usr/bin/ripdvd

Now you can throw a disc in the drive and type ripdvd and watch the script do its magic. That’s not zero click, so we have to do the same thing with our audio cd’s and make a .desktop file. Save this as /usr/share/applications/ripdvd.desktop

[Desktop Entry]
Name=Rip DVD
Comment=This will start the automated DVD ripping process
Exec=ripdvd
TryExec=ripdvd
MimeType=x-content/video-dvd
Type=Application

Go back to System Settings > Details > Removable Media and change the DVD video disc option to our Rip DVD program. Now you can pop a disc in the drive and it will rip and encode our DVD. Don’t worry about sticking discs in while Handbrake is still encoding. Since ripping the DVD itself uses barely any processing power, you can start ripping the next disc while the last one is encoding with Handbrake. If you queue up another disc, it will wait until the previous Handbrake job is finished before ejecting.

Blu-ray

The moment we’ve all been waiting for, a zero click solution for ripping Blu-ray. This method works almost exactly like ripping DVD’s. First we need to get an unencrypted rip of the disc on our hard drive, then we’ll encode it using Handbrake. First we’ll need to install some programs. The first one is MakeMKV. This will do the actual ripping and decryption for us. Just a little note, this program is not FOSS and does cost $50.

We’ll need some tools to help us with compiling and installing MakeMKV

sudo apt-get install build-essential libc6-dev libssl-dev libexpat1-dev libavcodec-dev libgl1-mesa-dev libqt4-dev

Now download the binaries and source for MakeMKV

wget http://www.makemkv.com/download/makemkv-bin-1.8.6.tar.gz
wget http://www.makemkv.com/download/makemkv-oss-1.8.6.tar.gz

Extract

tar xvzf makemkv-oss-1.8.6.tar.gz
tar xvzf makemkv-bin-1.8.6.tar.gz

Now we’ll go and run make and make install in each directory

cd makemkv-oss-1.8.6
make -f makefile.linux
sudo make -f makefile.linux install
cd makemkv-bin-1.8.6
make -f makefile.linux
sudo make -f makefile.linux install

Cleanup time

rm -R makemkv*

And now we can build our script. Save this as /usr/bin/ripbluray

    #!/bin/bash

    OUTPUT_DIR="/data/Ripping/Bluray"
    SOURCE_DRIVE="/dev/sr0"
    HANDBRAKE_PRESET="AppleTV 2"
    EXTENSION="mkv"

    function rip_bluray() {

            # Grab the DVD title
            BLURAY_TITLE=$(blkid -o value -s LABEL $SOURCE_DRIVE)
            # Replace spaces with underscores
            BLURAY_TITLE=${BLURAY_TITLE// /_}

            # Backup the DVD to out hard drive
            makemkvcon backup disc:0 $OUTPUT_DIR/$BLURAY_TITLE --decrypt

            # grep for the HandBrakeCLI process and get the PID
            HANDBRAKE_PID=`ps aux|grep H\[a\]ndBrakeCLI`
            set -- $HANDBRAKE_PID
            HANDBRAKE_PID=$2

            # Wait until our previous Handbrake job is done
            if [ -n "$HANDBRAKE_PID" ]
            then
                    while [ -e /proc/$HANDBRAKE_PID ]; do sleep 1; done
            fi

            # HandBrake isn't ripping anything so we can pop out the disc
            eject $SOURCE_DRIVE

            # And now we can start encoding
            HandBrakeCLI -i $OUTPUT_DIR/$BLURAY_TITLE -o $OUTPUT_DIR/$BLURAY_TITLE.$EXTENSION --preset=$HANDBRAKE_PRESET

            # Clean up
            rm -R $OUTPUT_DIR/$BLURAY_TITLE
    }

    rip_bluray

And make it executable

sudo chmod +x /usr/bin/ripbluray

Just like for ripping audio CD’s and DVD’s we’ll need a .desktop file. /usr/share/applications/ripbluray.desktop

[Desktop Entry]
Name=Rip Blu-ray
Comment=This will start the automated Blu-ray ripping process
Exec=ripbluray
TryExec=ripbluray
MimeType=x-content/video-bluray
Type=Application

Go back to System Settings > Details > Removable Media and you’ll notice there’s no Blu-ray option. Click the additional media button and look for Blu-ray video disc. Change this to our Rip Blu-ray program. That’s it. Zero click blu-ray ripping with a script and a couple of programs.

Just a few final notes, you can encode to other filetypes for each of these media types. Audio CD’s are controlled by ~/.abcde.conf, while DVD’s and Blu-rays are encoded according to Handbrake presets. If you make a Handbrake preset that you really like, save it and then replace the HANDBRAKE_PRESET value in each script. Feel free to change around the scripts. If you find something that makes the ripping process faster or better, leave a comment!