* 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.
This commit is contained in:
Thomas Vander Stichele
2011-10-22 15:52:57 +00:00
parent 83d212a20e
commit b5fc509747
5 changed files with 60 additions and 16 deletions

View File

@@ -1,3 +1,12 @@
2011-10-22 Thomas Vander Stichele <thomas at apestaart dot org>
* 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 <thomas at apestaart dot org>
* morituri/rip/debug.py:

View File

@@ -12,6 +12,6 @@ morituri_PYTHON = \
gstreamer.py \
log.py \
logcommand.py \
musicbrainz.py \
musicbrainzngs.py \
program.py \
renamer.py

View File

@@ -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:

View File

@@ -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]

View File

@@ -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