* 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:
@@ -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:
|
||||
|
||||
@@ -12,6 +12,6 @@ morituri_PYTHON = \
|
||||
gstreamer.py \
|
||||
log.py \
|
||||
logcommand.py \
|
||||
musicbrainz.py \
|
||||
musicbrainzngs.py \
|
||||
program.py \
|
||||
renamer.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:
|
||||
|
||||
@@ -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]
|
||||
|
||||
12
morituri/extern/Makefile.am
vendored
12
morituri/extern/Makefile.am
vendored
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user