Changeset 551
- Timestamp:
- 19-10-11 20:00:11 (19 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 4 edited
-
ChangeLog (modified) (1 diff)
-
morituri/common/Makefile.am (modified) (1 diff)
-
morituri/common/musicbrainz.py (added)
-
morituri/common/program.py (modified) (3 diffs)
-
morituri/test/Makefile.am (modified) (1 diff)
-
morituri/test/test_common_musicbrainz.py (added)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ChangeLog
r550 r551 1 2011-10-19 Thomas Vander Stichele <thomas at apestaart dot org> 2 3 * morituri/common/Makefile.am: 4 * morituri/common/musicbrainz.py: 5 * morituri/common/program.py: 6 * morituri/test/Makefile.am: 7 * morituri/test/test_common_musicbrainz.py (added): 8 * morituri/common/musicbrainz.py (added): 9 Split off musicbrainz-specific code. 10 1 11 2011-10-19 Thomas Vander Stichele <thomas at apestaart dot org> 2 12 -
trunk/morituri/common/Makefile.am
r510 r551 13 13 log.py \ 14 14 logcommand.py \ 15 musicbrainz.py \ 15 16 program.py \ 16 17 renamer.py -
trunk/morituri/common/program.py
r545 r551 26 26 27 27 import os 28 import urlparse29 28 import time 30 29 31 from morituri.common import common, log 30 from morituri.common import common, log, musicbrainz 32 31 from morituri.result import result 33 32 from morituri.program import cdrdao, cdparanoia 34 33 from morituri.image import image 35 34 36 class MusicBrainzException(Exception):37 def __init__(self, exc):38 self.args = (exc, )39 self.exception = exc40 41 class TrackMetadata(object):42 artist = None43 title = None44 duration = None # in ms45 mbid = None46 sortName = None47 mbidArtist = None48 49 class DiscMetadata(object):50 """51 @param release: earliest release date, in YYYY-MM-DD52 @type release: unicode53 """54 artist = None55 sortName = None56 title = None57 various = False58 tracks = None59 release = None60 61 mbid = None62 mbidArtist = None63 64 def __init__(self):65 self.tracks = []66 67 35 def filterForPath(text): 68 36 return "-".join(text.split("/")) 69 37 70 def getMetadata(release):71 """72 @type release: L{musicbrainz2.model.Release}73 74 @rtype: L{DiscMetadata} or None75 """76 log.debug('program', 'getMetadata for release id %r',77 release.getId())78 if not release.getId():79 log.warning('program', 'No id for release %r', release)80 return None81 82 assert release.id, 'Release does not have an id'83 84 metadata = DiscMetadata()85 86 isSingleArtist = release.isSingleArtistRelease()87 metadata.various = not isSingleArtist88 metadata.title = release.title89 # getUniqueName gets disambiguating names like Muse (UK rock band)90 metadata.artist = release.artist.name91 metadata.sortName = release.artist.sortName92 metadata.release = release.getEarliestReleaseDate()93 94 metadata.mbid = urlparse.urlparse(release.id)[2].split("/")[-1]95 metadata.mbidArtist = urlparse.urlparse(release.artist.id)[2].split("/")[-1]96 metadata.url = release.getId()97 98 tainted = False99 duration = 0100 101 for t in release.tracks:102 track = TrackMetadata()103 104 if isSingleArtist or t.artist == None:105 track.artist = metadata.artist106 track.sortName = metadata.sortName107 track.mbidArtist = metadata.mbidArtist108 else:109 # various artists discs can have tracks with no artist110 track.artist = t.artist and t.artist.name or release.artist.name111 track.sortName = t.artist.sortName112 track.mbidArtist = urlparse.urlparse(t.artist.id)[2].split("/")[-1]113 114 track.title = t.title115 track.mbid = urlparse.urlparse(t.id)[2].split("/")[-1]116 117 track.duration = t.duration118 if not track.duration:119 log.warning('getMetadata',120 'track %r (%r) does not have duration' % (121 track.title, track.mbid))122 tainted = True123 else:124 duration += t.duration125 126 metadata.tracks.append(track)127 128 if not tainted:129 metadata.duration = duration130 else:131 metadata.duration = 0132 133 return metadata134 135 136 # see http://bugs.musicbrainz.org/browser/python-musicbrainz2/trunk/examples/ripper.py137 def musicbrainz(discid):138 """139 @rtype: list of L{DiscMetadata}140 """141 log.debug('musicbrainz', 'looking up results for discid %r', discid)142 #import musicbrainz2.disc as mbdisc143 import musicbrainz2.webservice as mbws144 145 results = []146 147 # Setup a Query object.148 service = mbws.WebService()149 query = mbws.Query(service)150 151 152 # Query for all discs matching the given DiscID.153 # FIXME: let mbws.WebServiceError go through for now154 try:155 rfilter = mbws.ReleaseFilter(discId=discid)156 results = query.getReleases(rfilter)157 except mbws.WebServiceError, e:158 raise MusicBrainzException(e)159 160 # No disc matching this DiscID has been found.161 if len(results) == 0:162 return None163 164 log.debug('musicbrainz', 'found %d results for discid %r', len(results),165 discid)166 167 # Display the returned results to the user.168 ret = []169 170 for result in results:171 release = result.release172 log.debug('program', 'result %r: artist %r, title %r' % (173 release, release.artist.getName(), release.title))174 # The returned release object only contains title and artist, but no175 # tracks. Query the web service once again to get all data we need.176 try:177 inc = mbws.ReleaseIncludes(artist=True, tracks=True,178 releaseEvents=True, discs=True)179 # Arid - Under the Cold Street Lights has getId() None180 if release.getId():181 release = query.getReleaseById(release.getId(), inc)182 except mbws.WebServiceError, e:183 raise MusicBrainzException(e)184 185 md = getMetadata(release)186 if md:187 log.debug('program', 'duration %r', md.duration)188 ret.append(md)189 190 191 return ret192 38 193 39 class Program(log.Loggable): … … 196 42 197 43 @ivar metadata: 198 @type metadata: L{ DiscMetadata}44 @type metadata: L{musicbrainz.DiscMetadata} 199 45 @ivar result: the rip's result 200 46 @type result: L{result.RipResult} … … 379 225 for _ in range(0, 4): 380 226 try: 381 metadatas = musicbrainz (mbdiscid)382 except MusicBrainzException, e:227 metadatas = musicbrainz.musicbrainz(mbdiscid) 228 except musicbrainz.MusicBrainzException, e: 383 229 print "Warning:", e 384 230 time.sleep(5) -
trunk/morituri/test/Makefile.am
r547 r551 6 6 test_common_accurip.py \ 7 7 test_common_checksum.py \ 8 test_common_musicbrainz.py \ 8 9 test_common_program.py \ 9 10 test_common_renamer.py \
Note: See TracChangeset
for help on using the changeset viewer.
