[SCM] morituri/master: * morituri/result/logger.py: Fix for toctable->table * morituri/common/program.py: * morituri/rip/cd.py: Move lots of functionality to program module.
js at users.alioth.debian.org
js at users.alioth.debian.org
Sun Oct 19 20:09:07 UTC 2014
The following commit has been merged in the master branch:
commit a460abc4759ae4285ece4e6db203bc4636b5a2fe
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date: Sun Jun 7 15:22:55 2009 +0000
* morituri/result/logger.py:
Fix for toctable->table
* morituri/common/program.py:
* morituri/rip/cd.py:
Move lots of functionality to program module.
diff --git a/ChangeLog b/ChangeLog
index 51a7aeb..08d1c40 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
2009-06-07 Thomas Vander Stichele <thomas at apestaart dot org>
+ * morituri/result/logger.py:
+ Fix for toctable->table
+ * morituri/common/program.py:
+ * morituri/rip/cd.py:
+ Move lots of functionality to program module.
+
+2009-06-07 Thomas Vander Stichele <thomas at apestaart dot org>
+
* morituri/result/result.py:
Change toctable to table since it's a full index table.
* morituri/common/Makefile.am:
diff --git a/morituri/common/program.py b/morituri/common/program.py
index 9c674a2..27fd2f1a 100644
--- a/morituri/common/program.py
+++ b/morituri/common/program.py
@@ -24,11 +24,150 @@
Common functionality and class for all programs using morituri.
"""
-from morituri.common import common
+import os
+
+from morituri.common import common, log
from morituri.result import result
-from morituri.program import cdrdao
+from morituri.program import cdrdao, cdparanoia
-import os
+import gst
+
+class MusicBrainzException(Exception):
+ def __init__(self, exc):
+ self.args = (exc, )
+ self.exception = exc
+
+class TrackMetadata(object):
+ artist = None
+ title = None
+
+class DiscMetadata(object):
+ """
+ @param release: earliest release date, in YYYY-MM-DD
+ @type release: unicode
+ """
+ artist = None
+ title = None
+ various = False
+ tracks = None
+ release = None
+
+ def __init__(self):
+ self.tracks = []
+
+def filterForPath(text):
+ return "-".join(text.split("/"))
+
+def getMetadata(release):
+ metadata = DiscMetadata()
+
+ isSingleArtist = release.isSingleArtistRelease()
+ metadata.various = not isSingleArtist
+ metadata.title = release.title
+ # getUniqueName gets disambiguating names like Muse (UK rock band)
+ metadata.artist = release.artist.name
+ metadata.release = release.getEarliestReleaseDate()
+
+ for t in release.tracks:
+ track = TrackMetadata()
+ if isSingleArtist:
+ track.artist = metadata.artist
+ track.title = t.title
+ else:
+ track.artist = t.artist.name
+ track.title = t.title
+ metadata.tracks.append(track)
+
+ return metadata
+
+
+def musicbrainz(discid):
+ #import musicbrainz2.disc as mbdisc
+ import musicbrainz2.webservice as mbws
+
+
+ # Setup a Query object.
+ service = mbws.WebService()
+ query = mbws.Query(service)
+
+
+ # Query for all discs matching the given DiscID.
+ # FIXME: let mbws.WebServiceError go through for now
+ try:
+ rfilter = mbws.ReleaseFilter(discId=discid)
+ results = query.getReleases(rfilter)
+ except mbws.WebServiceError, e:
+ raise MusicBrainzException(e)
+
+ # No disc matching this DiscID has been found.
+ if len(results) == 0:
+ return None
+
+ # Display the returned results to the user.
+ ret = []
+
+ for result in results:
+ release = result.release
+ # The returned release object only contains title and artist, but no
+ # tracks. Query the web service once again to get all data we need.
+ try:
+ inc = mbws.ReleaseIncludes(artist=True, tracks=True,
+ releaseEvents=True)
+ release = query.getReleaseById(release.getId(), inc)
+ except mbws.WebServiceError, e:
+ raise MusicBrainzException(e)
+
+ ret.append(getMetadata(release))
+
+ return ret
+
+def getPath(outdir, template, metadata, mbdiscid, i):
+ """
+ Based on the template, get a complete path for the given track,
+ minus extension.
+ Also works for the disc name, using disc variables for the template.
+
+ @param outdir: the directory where to write the files
+ @type outdir: str
+ @param template: the template for writing the file
+ @type template: str
+ @param metadata:
+ @type metadata: L{DiscMetadata}
+ @param i: track number (0 for HTOA)
+ @type i: int
+ """
+ # returns without extension
+
+ v = {}
+
+ v['t'] = '%02d' % i
+
+ # default values
+ v['A'] = 'Unknown Artist'
+ v['d'] = mbdiscid
+
+ v['a'] = v['A']
+ v['n'] = 'Unknown Track %d' % i
+
+ if metadata:
+ v['A'] = filterForPath(metadata.artist)
+ v['d'] = filterForPath(metadata.title)
+ if i > 0:
+ try:
+ v['a'] = filterForPath(metadata.tracks[i - 1].artist)
+ v['n'] = filterForPath(metadata.tracks[i - 1].title)
+ except IndexError, e:
+ print 'ERROR: no track %d found, %r' % (i, e)
+ raise
+ else:
+ # htoa defaults to disc's artist
+ v['a'] = filterForPath(metadata.artist)
+ v['n'] = filterForPath('Hidden Track One Audio')
+
+ import re
+ template = re.sub(r'%(\w)', r'%(\1)s', template)
+
+ return os.path.join(outdir, template % v)
class Program(object):
@@ -79,6 +218,76 @@ class Program(object):
return itable
+ def getTagList(self, metadata, i):
+ """
+ Based on the metadata, get a gst.TagList for the given track.
+
+ @param metadata:
+ @type metadata: L{DiscMetadata}
+ @param i: track number (0 for HTOA)
+ @type i: int
+
+ @rtype: L{gst.TagList}
+ """
+ artist = u'Unknown Artist'
+ disc = u'Unknown Disc'
+ title = u'Unknown Track'
+
+ if metadata:
+ artist = metadata.artist
+ disc = metadata.title
+ if i > 0:
+ try:
+ artist = metadata.tracks[i - 1].artist
+ title = metadata.tracks[i - 1].title
+ except IndexError, e:
+ print 'ERROR: no track %d found, %r' % (i, e)
+ raise
+ else:
+ # htoa defaults to disc's artist
+ title = 'Hidden Track One Audio'
+
+ ret = gst.TagList()
+
+ # gst-python 0.10.15.1 does not handle unicode -> utf8 string conversion
+ # see http://bugzilla.gnome.org/show_bug.cgi?id=584445
+ ret[gst.TAG_ARTIST] = artist.encode('utf-8')
+ ret[gst.TAG_TITLE] = title.encode('utf-8')
+ ret[gst.TAG_ALBUM] = disc.encode('utf-8')
+
+ # gst-python 0.10.15.1 does not handle tags that are UINT
+ # see gst-python commit 26fa6dd184a8d6d103eaddf5f12bd7e5144413fb
+ # FIXME: no way to compare against 'master' version after 0.10.15
+ if gst.pygst_version >= (0, 10, 15):
+ ret[gst.TAG_TRACK_NUMBER] = i
+ if metadata:
+ # works, but not sure we want this
+ # if gst.pygst_version >= (0, 10, 15):
+ # ret[gst.TAG_TRACK_COUNT] = len(metadata.tracks)
+ # hack to get a GstDate which we cannot instantiate directly in
+ # 0.10.15.1
+ # FIXME: The dates are strings and must have the format 'YYYY',
+ # 'YYYY-MM' or 'YYYY-MM-DD'.
+ # GstDate expects a full date, so default to Jan and 1st if MM and DD
+ # are missing
+ date = metadata.release
+ if date:
+ log.debug('metadata',
+ 'Converting release date %r to structure', date)
+ if len(date) == 4:
+ date += '-01'
+ if len(date) == 7:
+ date += '-01'
+
+ s = gst.structure_from_string('hi,date=(GstDate)%s' %
+ str(date))
+ ret[gst.TAG_DATE] = s['date']
+
+ # FIXME: gst.TAG_ISRC
+
+ return ret
+
+
def writeCue(self, discName):
assert self.result.table.canCue()
@@ -95,7 +304,7 @@ class Program(object):
def writeLog(self, discName, logger):
logPath = '%s.log' % discName
handle = open(logPath, 'w')
- handle.write(logger.log(res).encode('utf-8'))
+ handle.write(logger.log(self.result).encode('utf-8'))
handle.close()
self.logPath = logPath
diff --git a/morituri/result/logger.py b/morituri/result/logger.py
index 715eb2f..8a6145b 100644
--- a/morituri/result/logger.py
+++ b/morituri/result/logger.py
@@ -64,7 +64,7 @@ class MorituriLogger(object):
" Track | Start | Length")
lines.append(
" ------------------------------------------------")
- table = ripResult.toctable
+ table = ripResult.table
for t in table.tracks:
diff --git a/morituri/rip/cd.py b/morituri/rip/cd.py
index d443e09..8ce89de 100644
--- a/morituri/rip/cd.py
+++ b/morituri/rip/cd.py
@@ -21,231 +21,17 @@
# along with morituri. If not, see <http://www.gnu.org/licenses/>.
import os
-import sys
import math
import gobject
gobject.threads_init()
-import gst
-
from morituri.common import logcommand, task, checksum, common, accurip, log
from morituri.common import drive, encode, program
from morituri.result import result
from morituri.image import image, cue, table
from morituri.program import cdrdao, cdparanoia
-class TrackMetadata(object):
- artist = None
- title = None
-
-class DiscMetadata(object):
- """
- @param release: earliest release date, in YYYY-MM-DD
- @type release: unicode
- """
- artist = None
- title = None
- various = False
- tracks = None
- release = None
-
- def __init__(self):
- self.tracks = []
-
-def filterForPath(text):
- return "-".join(text.split("/"))
-
-def musicbrainz(discid):
- metadata = DiscMetadata()
-
- #import musicbrainz2.disc as mbdisc
- import musicbrainz2.webservice as mbws
-
-
- # Setup a Query object.
- service = mbws.WebService()
- query = mbws.Query(service)
-
-
- # Query for all discs matching the given DiscID.
- try:
- rfilter = mbws.ReleaseFilter(discId=discid)
- results = query.getReleases(rfilter)
- except mbws.WebServiceError, e:
- print "Error:", e
- return
-
-
- # No disc matching this DiscID has been found.
- if len(results) == 0:
- print "Disc is not yet in the MusicBrainz database."
- print "Consider adding it."
- return
-
-
- # Display the returned results to the user.
- print 'Matching releases:'
-
- for result in results:
- release = result.release
- print 'Artist :', release.artist.name
- print 'Title :', release.title
- print
-
-
- # Select one of the returned releases. We just pick the first one.
- selectedRelease = results[0].release
-
-
- # The returned release object only contains title and artist, but no tracks.
- # Query the web service once again to get all data we need.
- try:
- inc = mbws.ReleaseIncludes(artist=True, tracks=True, releaseEvents=True)
- release = query.getReleaseById(selectedRelease.getId(), inc)
- except mbws.WebServiceError, e:
- print "Error:", e
- sys.exit(2)
-
-
- # convert to our objects
- isSingleArtist = release.isSingleArtistRelease()
- metadata.various = not isSingleArtist
- metadata.title = release.title
- # getUniqueName gets disambiguating names like Muse (UK rock band)
- metadata.artist = release.artist.name
- metadata.release = release.getEarliestReleaseDate()
-
- print "%s - %s" % (release.artist.name, release.title)
-
- for t in release.tracks:
- track = TrackMetadata()
- if isSingleArtist:
- track.artist = metadata.artist
- track.title = t.title
- else:
- track.artist = t.artist.name
- track.title = t.title
- metadata.tracks.append(track)
-
- return metadata
-
-def getPath(outdir, template, metadata, mbdiscid, i):
- """
- Based on the template, get a complete path for the given track,
- minus extension.
- Also works for the disc name, using disc variables for the template.
-
- @param outdir: the directory where to write the files
- @type outdir: str
- @param template: the template for writing the file
- @type template: str
- @param metadata:
- @type metadata: L{DiscMetadata}
- @param i: track number (0 for HTOA)
- @type i: int
- """
- # returns without extension
-
- v = {}
-
- v['t'] = '%02d' % i
-
- # default values
- v['A'] = 'Unknown Artist'
- v['d'] = mbdiscid
-
- v['a'] = v['A']
- v['n'] = 'Unknown Track %d' % i
-
- if metadata:
- v['A'] = filterForPath(metadata.artist)
- v['d'] = filterForPath(metadata.title)
- if i > 0:
- try:
- v['a'] = filterForPath(metadata.tracks[i - 1].artist)
- v['n'] = filterForPath(metadata.tracks[i - 1].title)
- except IndexError, e:
- print 'ERROR: no track %d found, %r' % (i, e)
- raise
- else:
- # htoa defaults to disc's artist
- v['a'] = filterForPath(metadata.artist)
- v['n'] = filterForPath('Hidden Track One Audio')
-
- import re
- template = re.sub(r'%(\w)', r'%(\1)s', template)
-
- return os.path.join(outdir, template % v)
-
-def getTagList(metadata, i):
- """
- Based on the metadata, get a gst.TagList for the given track.
-
- @param metadata:
- @type metadata: L{DiscMetadata}
- @param i: track number (0 for HTOA)
- @type i: int
-
- @rtype: L{gst.TagList}
- """
- artist = u'Unknown Artist'
- disc = u'Unknown Disc'
- title = u'Unknown Track'
-
- if metadata:
- artist = metadata.artist
- disc = metadata.title
- if i > 0:
- try:
- artist = metadata.tracks[i - 1].artist
- title = metadata.tracks[i - 1].title
- except IndexError, e:
- print 'ERROR: no track %d found, %r' % (i, e)
- raise
- else:
- # htoa defaults to disc's artist
- title = 'Hidden Track One Audio'
-
- ret = gst.TagList()
-
- # gst-python 0.10.15.1 does not handle unicode -> utf8 string conversion
- # see http://bugzilla.gnome.org/show_bug.cgi?id=584445
- ret[gst.TAG_ARTIST] = artist.encode('utf-8')
- ret[gst.TAG_TITLE] = title.encode('utf-8')
- ret[gst.TAG_ALBUM] = disc.encode('utf-8')
-
- # gst-python 0.10.15.1 does not handle tags that are UINT
- # see gst-python commit 26fa6dd184a8d6d103eaddf5f12bd7e5144413fb
- # FIXME: no way to compare against 'master' version after 0.10.15
- if gst.pygst_version >= (0, 10, 15):
- ret[gst.TAG_TRACK_NUMBER] = i
- if metadata:
- # works, but not sure we want this
- # if gst.pygst_version >= (0, 10, 15):
- # ret[gst.TAG_TRACK_COUNT] = len(metadata.tracks)
- # hack to get a GstDate which we cannot instantiate directly in
- # 0.10.15.1
- # FIXME: The dates are strings and must have the format 'YYYY',
- # 'YYYY-MM' or 'YYYY-MM-DD'.
- # GstDate expects a full date, so default to Jan and 1st if MM and DD
- # are missing
- date = metadata.release
- if date:
- log.debug('metadata',
- 'Converting release date %r to structure', date)
- if len(date) == 4:
- date += '-01'
- if len(date) == 7:
- date += '-01'
-
- s = gst.structure_from_string('hi,date=(GstDate)%s' %
- str(date))
- ret[gst.TAG_DATE] = s['date']
-
- # FIXME: gst.TAG_ISRC
-
- return ret
class Rip(logcommand.LogCommand):
summary = "rip CD"
@@ -311,10 +97,27 @@ class Rip(logcommand.LogCommand):
mbdiscid = ittoc.getMusicBrainzDiscId()
print "MusicBrainz disc id", mbdiscid
- metadata = musicbrainz(mbdiscid)
- if not metadata:
+ # look up disc on musicbrainz
+ try:
+ metadatas = program.musicbrainz(mbdiscid)
+ except program.MusicBrainzException, e:
+ print "Error:", e
+ return
+
+ metadata = None
+
+ if metadatas:
+ print 'Matching releases:'
+ for metadata in metadatas:
+ print 'Artist :', metadata.artist
+ print 'Title :', metadata.title
+
+ # Select one of the returned releases. We just pick the first one.
+ metadata = metadatas[0]
+ else:
print 'Submit this disc to MusicBrainz at:'
print ittoc.getMusicBrainzSubmitURL()
+ print
# now, read the complete index table, which is slower
itable = prog.getTable(runner, ittoc.getCDDBDiscId(), device)
@@ -334,18 +137,17 @@ class Rip(logcommand.LogCommand):
extension = profile.extension
# result
- res = prog.result
- res.offset = int(self.options.offset)
- res.artist = metadata and metadata.artist or 'Unknown Artist'
- res.title = metadata and metadata.title or 'Unknown Title'
+ prog.result.offset = int(self.options.offset)
+ prog.result.artist = metadata and metadata.artist or 'Unknown Artist'
+ prog.result.title = metadata and metadata.title or 'Unknown Title'
# cdio is optional for now
try:
import cdio
- _, res.vendor, res.model, __ = cdio.Device(device).get_hwinfo()
+ _, prog.result.vendor, prog.result.model, __ = cdio.Device(device).get_hwinfo()
except ImportError:
print 'WARNING: pycdio not installed, cannot identify drive'
- res.vendor = 'Unknown'
- res.model = 'Unknown'
+ prog.result.vendor = 'Unknown'
+ prog.result.model = 'Unknown'
# check for hidden track one audio
@@ -364,8 +166,8 @@ class Rip(logcommand.LogCommand):
start, stop)
# rip it
- htoapath = getPath(outdir, self.options.track_template, metadata,
- mbdiscid, 0) + '.' + extension
+ htoapath = program.getPath(outdir, self.options.track_template,
+ metadata, mbdiscid, 0) + '.' + extension
dirname = os.path.dirname(htoapath)
if not os.path.exists(dirname):
os.makedirs(dirname)
@@ -378,7 +180,7 @@ class Rip(logcommand.LogCommand):
offset=int(self.options.offset),
device=self.parentCommand.options.device,
profile=profile,
- taglist=getTagList(metadata, 0))
+ taglist=prog.getTagList(metadata, 0))
function(runner, t)
if t.checksum is not None:
@@ -402,9 +204,9 @@ class Rip(logcommand.LogCommand):
continue
trackResult = result.TrackResult()
- res.tracks.append(trackResult)
+ prog.result.tracks.append(trackResult)
- path = getPath(outdir, self.options.track_template, metadata,
+ path = program.getPath(outdir, self.options.track_template, metadata,
mbdiscid, i + 1) + '.' + extension
trackResult.number = i + 1
trackResult.filename = path
@@ -423,7 +225,7 @@ class Rip(logcommand.LogCommand):
offset=int(self.options.offset),
device=self.parentCommand.options.device,
profile=profile,
- taglist=getTagList(metadata, i + 1))
+ taglist=prog.getTagList(metadata, i + 1))
t.description = 'Reading Track %d' % (i + 1)
function(runner, t)
if t.checksum:
@@ -445,7 +247,7 @@ class Rip(logcommand.LogCommand):
### write disc files
- discName = getPath(outdir, self.options.disc_template, metadata,
+ discName = program.getPath(outdir, self.options.disc_template, metadata,
mbdiscid, 0)
dirname = os.path.dirname(discName)
if not os.path.exists(dirname):
@@ -467,7 +269,7 @@ class Rip(logcommand.LogCommand):
if not track.audio:
continue
- path = getPath(outdir, self.options.track_template, metadata,
+ path = program.getPath(outdir, self.options.track_template, metadata,
mbdiscid, i + 1) + '.' + extension
u = u'#EXTINF:%d,%s\n' % (
itable.getTrackLength(i + 1) / common.FRAMES_PER_SECOND,
@@ -507,7 +309,7 @@ class Rip(logcommand.LogCommand):
# loop over tracks
for i, csum in enumerate(cuetask.checksums):
- trackResult = res.tracks[i]
+ trackResult = prog.result.tracks[i]
trackResult.accuripCRC = csum
status = 'rip NOT accurate'
--
morituri packaging
More information about the pkg-multimedia-commits
mailing list