From b5fc509747d55cd0923711d22ff61994d6fda1ac Mon Sep 17 00:00:00 2001 From: Thomas Vander Stichele Date: Sat, 22 Oct 2011 15:52:57 +0000 Subject: [PATCH] * morituri/common/Makefile.am: * morituri/common/musicbrainzngs.py: * morituri/common/program.py: * morituri/extern/Makefile.am: Use musicbrainz NGS for ripping. Can now rip Weezer, the Blue Album, both discs. --- ChangeLog | 9 +++++++++ morituri/common/Makefile.am | 2 +- morituri/common/musicbrainzngs.py | 29 +++++++++++++++++++++++------ morituri/common/program.py | 24 ++++++++++++++++-------- morituri/extern/Makefile.am | 12 +++++++++++- 5 files changed, 60 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2187f1c..5b70da5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2011-10-22 Thomas Vander Stichele + + * morituri/common/Makefile.am: + * morituri/common/musicbrainzngs.py: + * morituri/common/program.py: + * morituri/extern/Makefile.am: + Use musicbrainz NGS for ripping. + Can now rip Weezer, the Blue Album, both discs. + 2011-10-20 Thomas Vander Stichele * morituri/rip/debug.py: diff --git a/morituri/common/Makefile.am b/morituri/common/Makefile.am index 5e9b978..71a13e6 100644 --- a/morituri/common/Makefile.am +++ b/morituri/common/Makefile.am @@ -12,6 +12,6 @@ morituri_PYTHON = \ gstreamer.py \ log.py \ logcommand.py \ - musicbrainz.py \ + musicbrainzngs.py \ program.py \ renamer.py diff --git a/morituri/common/musicbrainzngs.py b/morituri/common/musicbrainzngs.py index 951db55..a4ac957 100644 --- a/morituri/common/musicbrainzngs.py +++ b/morituri/common/musicbrainzngs.py @@ -25,6 +25,7 @@ Handles communication with the musicbrainz server using NGS. """ import urlparse +import urllib2 from morituri.common import log @@ -36,6 +37,10 @@ class MusicBrainzException(Exception): self.args = (exc, ) self.exception = exc +class NotFoundException(MusicBrainzException): + def __str__(self): + return "Disc not found in MusicBrainz" + class TrackMetadata(object): artist = None @@ -48,8 +53,10 @@ class TrackMetadata(object): class DiscMetadata(object): """ - @param release: earliest release date, in YYYY-MM-DD - @type release: unicode + @param release: earliest release date, in YYYY-MM-DD + @type release: unicode + @param title: title of the disc (with disambiguation) + @param releaseTitle: title of the release (without disambiguation) """ artist = None sortName = None @@ -58,6 +65,8 @@ class DiscMetadata(object): tracks = None release = None + releaseTitle = None + mbid = None mbidArtist = None @@ -111,14 +120,15 @@ def _getMetadata(release, discid): for disc in medium['disc-list']: if disc['id'] == discid: title = release['title'] + metadata.releaseTitle = title if release.has_key('disambiguation'): title += " (%s)" % release['disambiguation'] count = len(release['medium-list']) if count > 1: - title += ' - Disc %d of %d' % ( + title += ' (Disc %d of %d)' % ( int(medium['position']), count) if medium.has_key('title'): - title += " - %s" % medium['title'] + title += ": %s" % medium['title'] metadata.title = title for t in medium['track-list']: track = TrackMetadata() @@ -177,8 +187,15 @@ def musicbrainz(discid): results = [] - result = musicbrainz.get_releases_by_discid(discid, - includes=["artists", "recordings", "release-groups"]) + try: + result = musicbrainz.get_releases_by_discid(discid, + includes=["artists", "recordings", "release-groups"]) + except musicbrainz.ResponseError, e: + if isinstance(e.cause, urllib2.HTTPError): + if e.cause.code == 404: + raise NotFoundException(e) + + raise MusicBrainzException(e) # No disc matching this DiscID has been found. if len(result) == 0: diff --git a/morituri/common/program.py b/morituri/common/program.py index fb05cf7..00f6f76 100644 --- a/morituri/common/program.py +++ b/morituri/common/program.py @@ -27,7 +27,7 @@ Common functionality and class for all programs using morituri. import os import time -from morituri.common import common, log, musicbrainz +from morituri.common import common, log, musicbrainzngs from morituri.result import result from morituri.program import cdrdao, cdparanoia from morituri.image import image @@ -224,8 +224,10 @@ class Program(log.Loggable): for _ in range(0, 4): try: - metadatas = musicbrainz.musicbrainz(mbdiscid) - except musicbrainz.MusicBrainzException, e: + metadatas = musicbrainzngs.musicbrainz(mbdiscid) + except musicbrainzngs.NotFoundException, e: + break + except musicbrainzngs.MusicBrainzException, e: print "Warning:", e time.sleep(5) continue @@ -259,17 +261,23 @@ class Program(log.Loggable): metadatas = deltas[lowest] if len(metadatas) > 1: artist = metadatas[0].artist - title = metadatas[0].title - for metadata in metadatas: - assert artist == metadata.artist - assert title == metadata.title + releaseTitle = metadatas[0].releaseTitle + for i, metadata in enumerate(metadatas): + if not artist == metadata.artist: + self.warning("artist 0: %r and artist %d: %r " + "are not the same" % ( + artist, i, metadata.artist)) + if not releaseTitle == metadata.releaseTitle: + self.warning("title 0: %r and title %d: %r " + "are not the same" % ( + releaseTitle, i, metadata.releaseTitle)) if (len(deltas.keys()) > 1): print print 'Picked closest match in duration.' print 'Others may be wrong in musicbrainz, please correct.' print 'Artist : %s' % artist - print 'Title : %s' % title + print 'Title : %s' % metadatas[0].title # Select one of the returned releases. We just pick the first one. ret = metadatas[0] diff --git a/morituri/extern/Makefile.am b/morituri/extern/Makefile.am index 302a4c5..6b0a299 100644 --- a/morituri/extern/Makefile.am +++ b/morituri/extern/Makefile.am @@ -26,9 +26,19 @@ task_PYTHON = \ task/taskgtk.py \ task/gstreamer.py +musicbrainzngsdir = $(PYTHONLIBDIR)/morituri/extern/musicbrainzngs + +musicbrainzngs_PYTHON = \ + musicbrainzngs/__init__.py \ + musicbrainzngs/musicbrainz.py \ + musicbrainzngs/mbxml.py + + EXTRA_DIST = log/test_log.py command/test_command.py command/help2man.py python-musicbrainz-ngs: git clone https://github.com/thomasvs/python-musicbrainz-ngs.git -all: python-musicbrainz-ngs +$(top_srcdir)/musicbrainzngs/musicbrainz.py: python-musicbrainz-ngs + +all: musicbrainzngs/musicbrainz.py