Present Perfect


Picture Gallery
Present Perfect

morituri 0.1.1 ‘Dead’ released!

Filed under: Hacking,morituri,Releases — Thomas @ 23:30


For some unfathomable reason it's been a rather productive two weeks of short ##morituri hacking sessions.

I was wondering why I wasn't getting any feedback or trac tickets, until I found out that a) I had five month old patches lying around in my trac and b) I forgot to configure the ticket mails properly.

That, spurred with actual bug reports from blizzard who seems to have ripped 600 CD's with this piece of code already (more than me, in any case), kept me going towards a new release.

So, this new release adds, among other things:

  • 'rip image encode' to encode a lossless image to a lossy one (vorbis, mp3, ...)
  • tagging tracks with MusicBrainz id's
  • 'rip image retag' to apply up-to-date musicbrainz info (including id's) to existing rips. I did this one specifically for Chris when he found out none of his rips had the MusicBrainz id's and I felt guilty.
  • added an auto-generated man page.
  • Generate a complete list of known drive offsets to try with 'rip offset find' based on the AccurateRip database.
  • improved the basic Task code I wrote for abstracting asynchronous operations that can be hooked into a GLib mainloop or Twisted reactor. Exception information is now more useful.

A bunch of bugs were fixed too, and I especially want to thank Peter Oliver who provided me with three patches that I sadly overlooked. I hope he comes back.

In any case, enjoy the code and start ripping!

As for the next release, I've already started on ripping the data track (which ended up being easier than I thought, using dd and wrapping it in a Task parsing the output). However, I haven't yet been able to write a full image back to a CD, for various reasons. First of all, the .cue files I generate have multiple FILE statements, which doesn't seem to be supported by wodim, and only recently was added to cdrecord. Second, actually writing the data track so far has given me only errors.

It has been possible to rewrite the .iso file into one that can be mounted, and I might have to actually do the writing of discs by first decoding to a single file then writing from that. We'll see.

On the other hand, with tag reading and writing tasks now written, I might start using those in a separate application to finally start managing my music across my different machines.


  1. A valueable addition to the Linux audio stack. While just one year ago audio enthusiasts would have avoided Linux for various reasons, there has been a lot of catch up recently. Secure ripping and gapless playing seem to be perfectly possible for now. The last missing piece seems to me gapless lame MP3 (as gapless ogg and flac playing seems to be possible with current releases of rhytmbox and banshee). I wonder if Brasero or one of those players would use morituri as an ripping backend.

    Comment by amano — 2010-04-17 @ 03:55

  2. I want to thank you for your continued work on this. Despite my comments on your last news post for morituri, I still have not gotten around to trying it myself! I was recently married, and so life has been adjusting.

    While I still look forward to using this, I have a couple questions that I figure I should ask about sooner than later. Without being super familiar with AccurateRip (just reading your information and some information on its own site), how are discs handled by morituri when they’re not already in the AccurateRip database? I have at least 3 CDs that were produced by local artists that I want to make sure are faithfully ripped. It sounds like morituri would handle this by ripping, clearing the drive cache, ripping again, and comparing the checksums of the two, correct? The thought is that the checksums would only match if it was correctly ripped?

    If a CD is not in the AccurateRip database, does morituri have a mechanism to submit such information to the database? While I don’t expect these CDs to be ripped by anyone else using similar tools, I can’t say that for sure. I would love to be able to have the albums’ information submitted automatically.

    Thanks again for designing this awesome tool. I look forward to trying it once life settles down (perhaps you’ll be all the way to a 1.0 release by then!).

    Comment by Gideon "Gnafu" Mayhak — 2010-04-18 @ 20:17

  3. morituri will always do copy and test; ie, rip a track, clear the cache (cdparanoia should be doing this), then rerip the track and compare checksums. This is unrelated to accuraterip.

    After that, it does an accuraterip check, which of course only works if the disc is in the accuraterip database.

    The accuraterip maintainer last time considered morituri ‘to new’ to accept submissions. I should contact him again. I would like them submitted too.

    Comment by Thomas — 2010-06-02 @ 10:24

  4. Can you point me to build instructions for Ubuntu, please? “configure” seems to work fine, but somehow make brings up nothing but errors, like that
    “Making all in bin
    make[1]: Entering directory `/home/stefan/Downloads/apps/morituri-0.1.1/bin’
    make[1]: Nothing to be done for `all’.
    make[1]: Leaving directory `/home/stefan/Downloads/apps/morituri-0.1.1/bin’
    Making all in etc
    make[1]: Entering directory `/home/stefan/Downloads/apps/morituri-0.1.1/etc’
    Making all in bash_completion.d”. Is there a package I might be missing?

    Comment by Astron — 2010-04-18 @ 21:52

  5. Hi Astron,

    none of those are errors, it looks like it built fine, but you didn’t give me the complete output.

    Comment by Thomas — 2010-04-19 @ 09:23

  6. Aston, for ubuntu, the debian package at http://packages.debian.org/sid/morituri seems to work, at least on lucid.

    Comment by chrysn — 2010-04-20 @ 19:01

  7. You are right, yes, it does build. Sorry and thanks. Anyway, I was also missing some packages, so looking at the debian package’s depends helped remedy that.
    Btw: “rip cd rip” to me seems to be a mildly confusing command. Would “morituri cd rip” be possible in future versions? Or, might “rip cd” suffice (since “rip” at the moment is the only subcommand for “rip cd”)?

    Comment by Astron — 2010-04-27 @ 18:06

  8. The binary is called rip because the command line client is not going to end up being the only frontend.

    There are more subcommands planned for rip cd.

    I think people can survive rip cd rip being confusing.

    Comment by Thomas — 2010-04-28 @ 10:52

  9. Thomas,

    I hate to bug you, and I don’t want to minimize how awesome I think you are! But I was wondering if you might be able to offer a response to my earlier questions?



    Comment by Gideon "Gnafu" Mayhak — 2010-06-01 @ 04:27

  10. Can’t wait to see new feature “Riping to single file image” planned for 0.1.2


    Comment by petrovicivan — 2010-11-16 @ 23:00

  11. Hi
    I’m not sure if this tool is still maintained. I tried to make it work under Ubuntu.
    After installing hopefully all dependencies and pycdio, compiling and installing it successfully,
    I run into following problem, when trying to rip a CD. It doesn’t matter if I specify offest or not.

    The process fails after step 4 the 2nd CRC check.

    Any help is appreciated.


    sc@server:~$ rip cd rip –profile=wav –offset=30 -O /tmp
    Checking device /dev/sr0
    CDDB disc id a30aa90d
    MusicBrainz disc id iBgj7doxOuEoFbf7Sg9qDxOA6nc-
    Matching releases:
    Artist : Norah Jones
    Title : Not Too Late

    Ripping track 1 of 13: 01. Norah Jones – Wish I Could.wav
    Traceback (most recent call last):
    File “/usr/local/bin/rip”, line 35, in
    File “/usr/local/lib/python2.7/site-packages/morituri/rip/main.py”, line 12, in main
    ret = c.parse(argv)
    File “/usr/local/lib/python2.7/site-packages/morituri/extern/command/command.py”, line 329, in parse
    return self.subCommands[command].parse(args[1:])
    File “/usr/local/lib/python2.7/site-packages/morituri/extern/command/command.py”, line 329, in parse
    return self.subCommands[command].parse(args[1:])
    File “/usr/local/lib/python2.7/site-packages/morituri/extern/command/command.py”, line 300, in parse
    ret = self.do(args)
    File “/usr/local/lib/python2.7/site-packages/morituri/rip/cd.py”, line 228, in do
    ripIfNotRipped(i + 1)
    File “/usr/local/lib/python2.7/site-packages/morituri/rip/cd.py”, line 185, in ripIfNotRipped
    File “/usr/local/lib/python2.7/site-packages/morituri/common/program.py”, line 450, in ripTrack
    File “/usr/local/lib/python2.7/site-packages/morituri/common/task.py”, line 390, in run
    raise TaskException(task.exception, message=task.exceptionMessage)
    morituri.common.task.TaskException: (AttributeError(“‘__main__.GstWavEnc’ object has no attribute ‘merge_tags'”,), “exception AttributeError at morituri/common/encode.py:179: start(): ‘__main__.GstWavEnc’ object has no attribute ‘merge_tags'”)

    Comment by Klaus — 2011-04-08 @ 07:14

  12. Hi Klaus,

    yes, it’s still maintained.

    I just Committed revision 434 that should handle this. wavenc does not merge tags apparently.

    Could you try svn trunk and see ?

    Comment by Thomas — 2011-04-08 @ 10:05

  13. Ah one more. I found the fully ripped 1. wav tmp5iTpKZ.morituri.wav on /tmp outside the target folder. The file size of that file is identical compared to a cdparanoia ripped file.

    Comment by Klaus — 2011-04-08 @ 09:46

RSS feed for comments on this post. TrackBack URL

Leave a comment