Changeset 551


Ignore:
Timestamp:
19-10-11 20:00:11 (19 months ago)
Author:
thomas
Message:
  • morituri/common/Makefile.am:
  • morituri/common/musicbrainz.py:
  • morituri/common/program.py:
  • morituri/test/Makefile.am:
  • morituri/test/test_common_musicbrainz.py (added):
  • morituri/common/musicbrainz.py (added): Split off musicbrainz-specific code.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/ChangeLog

    r550 r551  
     12011-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 
    1112011-10-19  Thomas Vander Stichele  <thomas at apestaart dot org> 
    212 
  • trunk/morituri/common/Makefile.am

    r510 r551  
    1313        log.py \ 
    1414        logcommand.py \ 
     15        musicbrainz.py \ 
    1516        program.py \ 
    1617        renamer.py 
  • trunk/morituri/common/program.py

    r545 r551  
    2626 
    2727import os 
    28 import urlparse 
    2928import time 
    3029 
    31 from morituri.common import common, log 
     30from morituri.common import common, log, musicbrainz 
    3231from morituri.result import result 
    3332from morituri.program import cdrdao, cdparanoia 
    3433from morituri.image import image 
    3534 
    36 class MusicBrainzException(Exception): 
    37     def __init__(self, exc): 
    38         self.args = (exc, ) 
    39         self.exception = exc 
    40  
    41 class TrackMetadata(object): 
    42     artist = None 
    43     title = None 
    44     duration = None # in ms 
    45     mbid = None 
    46     sortName = None 
    47     mbidArtist = None 
    48  
    49 class DiscMetadata(object): 
    50     """ 
    51     @param release: earliest release date, in YYYY-MM-DD 
    52     @type  release: unicode 
    53     """ 
    54     artist = None 
    55     sortName = None 
    56     title = None 
    57     various = False 
    58     tracks = None 
    59     release = None 
    60  
    61     mbid = None 
    62     mbidArtist = None 
    63  
    64     def __init__(self): 
    65         self.tracks = [] 
    66  
    6735def filterForPath(text): 
    6836    return "-".join(text.split("/")) 
    6937 
    70 def getMetadata(release): 
    71     """ 
    72     @type  release: L{musicbrainz2.model.Release} 
    73  
    74     @rtype: L{DiscMetadata} or None 
    75     """ 
    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 None 
    81  
    82     assert release.id, 'Release does not have an id' 
    83  
    84     metadata = DiscMetadata() 
    85  
    86     isSingleArtist = release.isSingleArtistRelease() 
    87     metadata.various = not isSingleArtist 
    88     metadata.title = release.title 
    89     # getUniqueName gets disambiguating names like Muse (UK rock band) 
    90     metadata.artist = release.artist.name 
    91     metadata.sortName = release.artist.sortName 
    92     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 = False 
    99     duration = 0 
    100  
    101     for t in release.tracks: 
    102         track = TrackMetadata() 
    103  
    104         if isSingleArtist or t.artist == None: 
    105             track.artist = metadata.artist 
    106             track.sortName = metadata.sortName 
    107             track.mbidArtist = metadata.mbidArtist 
    108         else: 
    109             # various artists discs can have tracks with no artist 
    110             track.artist = t.artist and t.artist.name or release.artist.name 
    111             track.sortName = t.artist.sortName 
    112             track.mbidArtist = urlparse.urlparse(t.artist.id)[2].split("/")[-1]  
    113  
    114         track.title = t.title 
    115         track.mbid = urlparse.urlparse(t.id)[2].split("/")[-1] 
    116  
    117         track.duration = t.duration 
    118         if not track.duration: 
    119             log.warning('getMetadata', 
    120                 'track %r (%r) does not have duration' % ( 
    121                     track.title, track.mbid)) 
    122             tainted = True 
    123         else: 
    124             duration += t.duration 
    125  
    126         metadata.tracks.append(track) 
    127  
    128     if not tainted: 
    129         metadata.duration = duration 
    130     else: 
    131         metadata.duration = 0 
    132  
    133     return metadata 
    134  
    135  
    136 # see http://bugs.musicbrainz.org/browser/python-musicbrainz2/trunk/examples/ripper.py 
    137 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 mbdisc 
    143     import musicbrainz2.webservice as mbws 
    144  
    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 now 
    154     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 None 
    163  
    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.release 
    172         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 no 
    175         # 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() None 
    180             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 ret 
    19238 
    19339class Program(log.Loggable): 
     
    19642 
    19743    @ivar metadata: 
    198     @type metadata: L{DiscMetadata} 
     44    @type metadata: L{musicbrainz.DiscMetadata} 
    19945    @ivar result:   the rip's result 
    20046    @type result:   L{result.RipResult} 
     
    379225        for _ in range(0, 4): 
    380226            try: 
    381                 metadatas = musicbrainz(mbdiscid) 
    382             except MusicBrainzException, e: 
     227                metadatas = musicbrainz.musicbrainz(mbdiscid) 
     228            except musicbrainz.MusicBrainzException, e: 
    383229                print "Warning:", e 
    384230                time.sleep(5) 
  • trunk/morituri/test/Makefile.am

    r547 r551  
    66        test_common_accurip.py \ 
    77        test_common_checksum.py \ 
     8        test_common_musicbrainz.py \ 
    89        test_common_program.py \ 
    910        test_common_renamer.py \ 
Note: See TracChangeset for help on using the changeset viewer.