Amazon MP3 Downloader on 64bit Gentoo Linux

Update 2010/12/04: A commenter recommended clamz instead. I've installed it but not yet tried it, but it's certainly easier than installing another OS in a chroot.

(This is going to be a bit of a narrative. If you're impatient, scroll to the "How-To" section at the bottom of the post.)

Today I decided to download an MP3 album from Amazon. I actually wanted all the songs on the particular album, and noted that you save a couple bucks by downloading the whole album vs. downloading each individual song. So click through, and find that it requires the Amazon Download Manager thingo.

Lame, I think. I click the download link, and it actually gives me some buttons to choose from that have to do with Linux. Huh. Nice work. However, I assume it's closed-source proprietary crap. But hey, why not give it a try.

My choices are two .deb files, one for Ubuntu Jaunty, and one for Debian 5, or two .rpm files, one for Fedora 11, and one for OpenSuse somethingorother.

So I grab the Ubuntu one. I'm on Gentoo, so I "emerge dpkg", and then run "dpkg -x amazonmp3.deb ." in an empty directory. I look in usr/bin that it created, and find a binary. But it's a 32bit binary.

Crap.

I run 'ldd' on it, and of course it needs gtk and a bunch of other stuff that I don't have 32bit libraries for. Like boost.

So I think, ok, I can install a 32bit chroot. So I download the stage3 Gentoo i686 tarball and unpack it in /opt/gentoo32. I also "emerge schroot" in my regular system, and set that up. I recently found schroot while using Ubuntu at work. It's awesome. Eventually the stage3 tarball finishes up, so I schroot into my new 32bit environment and "emerge libboost". After it's finished, I note a problem. Amazon's binary is expecting some weird version of boost that has "gcc42" in the filename. Also, I just installed boost 1.35, and it wants 1.34. Out of desperation, I try to make symlinks to the correct file names, assuming it probably won't work. I was right: it doesn't work. Balls.

Then I think... well, why not install a chroot of 32bit Ubuntu Jaunty? I "emerge debootstrap" and pray... yep, it's in portage, excellent. I install it, schroot into it, and apt-get a bunch of the libboost packages, and... holy crap, it works.

How-To

Here's a step-by-step. This is for Gentoo, but it should work equally well on any system where you can install debootstrap and chroot. The following instructions assume you've installed them already.

As root on the "main" system:

# mkdir -p /opt/ubuntu-jaunty-32
# debootstrap --arch i386 jaunty /opt/ubuntu-jaunty-32 http://archive.ubuntu.com/ubuntu/
# cat >/etc/schroot/chroot.d/jaunty32.conf
[ubuntu-jaunty-32]
type=directory
description=Ubuntu Jaunty (32-bit)
location=/opt/ubuntu-jaunty-32
priority=3
users=$USER
groups=$USER,root
root-users=root,$USER
root-groups=root,wheel
personality=linux32
run-setup-scripts=true
run-exec-scripts=true
aliases=jaunty
[hit ctrl+d]
# cat >/etc/schroot/mount-defaults
/proc/procnonerw,bind 00
/proc/bus/usb/proc/bus/usbnonerw,bind00
/sys/sysnone    rw,bind00
/dev/devnonerw,bind00
/dev/pts/dev/ptsnonerw,bind00
/dev/shm/dev/shmnonerw,bind00
/home/homenonerw,bind00
/tmp/tmpnonerw,bind00
/var/run/dbus/var/run/dbusnonerw,bind00
/usr/portage/usr/portagenonerw,bind00
[hit ctrl+d]
# schroot -c jaunty
(32bit)# groupadd -r staff
(32bit)# apt-get update
(32bit)# apt-get install sudo curl libglademm-2.4-1c2a xdg-utils libboost-date-time1.34.1 libboost-filesystem1.34.1 libboost-iostreams1.34.1 libboost-regex1.34.1 libboost-signals1.34.1 libboost-thread1.34.1
(32bit)# dpkg -i $DOWNLOAD_DIR/amazonmp3.deb

Note that I didn't just type all this verbatim... this was just my memory of what I did. So if something's missing, please leave a note in the comments and I'll update this.

Next you can try running "amazonmp3" to test it. If that works, you can go back out to your "real" system (just type "exit" in that shell), and do this:

# mkdir -p /usr/local/bin
# cat >/usr/local/bin/amazonmp3
#!/bin/bash
schroot -c jaunty -p /usr/bin/amazonmp3 -- "$@"
[hit ctrl+d]
# chmod +x amazonmp3

This creates a script in your "real" system that will chain to the 32bit amazonmp3 binary in your Jaunty chroot. You can set up your browser of choice to automatically launch this script when you download .amz files. At this point you can try running "amazonmp3" from your "real" system (outside the chroot) and see if that works.

There are also a few other things: 1. If you are running a system that uses GDM to log in, you may need to add /var/run/gdm to the bind mounts in the mount-defaults file or else apps started in your chroot won't be able to connect to your X server.

  1. If you're using non-default gtk2 theme engines on your "real" desktop", you'll need to install them in the chroot (via apt-get) as well. Well, ok, you don't have to, but if you don't, the Amazon app will look uglier than it should.

  2. Remember to always pass the "-p" option to schroot. If you don't, the environment in the chroot will get reset, which means you'll lose your DISPLAY env var, and you won't be able to connect to the X server without manually setting it.

  3. When I first ran the apt-get command in the chroot, I got some weird errors at the end of the process about some packages not being configured because another package (gtk, I think) that it depended on hadn't been configured yet. Just running the same apt-get command a couple times fixed it, strangely.

  4. Make sure your "real" system has /usr/local/bin in the PATH.

Anyhow, that's it. Works like a charm.