def musicbrainz(discid, country=None, record=False): """ Based on a MusicBrainz disc id, get a list of DiscMetadata objects for the given disc id. Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4- @type discid: str @rtype: list of L{DiscMetadata} """ log.debug('musicbrainzngs', 'looking up results for discid %r', discid) import musicbrainzngs ret = [] try: result = musicbrainzngs.get_releases_by_discid( discid, includes=["artists", "recordings", "release-groups"]) except musicbrainzngs.ResponseError, e: if isinstance(e.cause, urllib2.HTTPError): if e.cause.code == 404: raise NotFoundException(e) else: log.debug('musicbrainzngs', 'received bad response from the server') raise MusicBrainzException(e)
def main(argv): # load plugins from morituri.configure import configure pluginsdir = configure.pluginsdir homepluginsdir = os.path.join(os.path.expanduser('~'), '.morituri', 'plugins') distributions, errors = pkg_resources.working_set.find_plugins( pkg_resources.Environment([pluginsdir, homepluginsdir])) if errors: log.warning('errors finding plugins: %r', errors) log.debug('mapping distributions %r', distributions) map(pkg_resources.working_set.add, distributions) # validate dependencies from morituri.common import deps h = deps.DepsHandler() h.validate() # set user agent from morituri.extern.musicbrainzngs import musicbrainz musicbrainz.set_useragent("morituri", configure.version, 'https://thomas.apestaart.org/morituri/trac') c = Rip() try: ret = c.parse(argv) except SystemError, e: sys.stderr.write('rip: error: %s\n' % e.args) return 255
def musicbrainz(discid, country=None, record=False): """ Based on a MusicBrainz disc id, get a list of DiscMetadata objects for the given disc id. Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4- @type discid: str @rtype: list of L{DiscMetadata} """ log.debug("musicbrainzngs", "looking up results for discid %r", discid) import musicbrainzngs ret = [] try: result = musicbrainzngs.get_releases_by_discid(discid, includes=["artists", "recordings", "release-groups"]) except musicbrainzngs.ResponseError, e: if isinstance(e.cause, urllib2.HTTPError): if e.cause.code == 404: raise NotFoundException(e) else: log.debug("musicbrainzngs", "received bad response from the server") raise MusicBrainzException(e)
def musicbrainz(discid): """ Based on a MusicBrainz disc id, get a list of DiscMetadata objects for the given disc id. Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4- @type discid: str @rtype: list of L{DiscMetadata} """ log.debug('musicbrainz', 'looking up results for discid %r', discid) #import musicbrainz2.disc as mbdisc import musicbrainz2.webservice as mbws results = [] # 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)
def musicbrainz(discid, record=False): """ Based on a MusicBrainz disc id, get a list of DiscMetadata objects for the given disc id. Example disc id: Mj48G109whzEmAbPBoGvd4KyCS4- @type discid: str @rtype: list of L{DiscMetadata} """ log.debug('musicbrainz', 'looking up results for discid %r', discid) from morituri.extern.musicbrainzngs import musicbrainz ret = [] 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)
def main(argv): # load plugins from morituri.configure import configure pluginsdir = configure.pluginsdir homepluginsdir = os.path.join(os.path.expanduser('~'), '.morituri', 'plugins') distributions, errors = pkg_resources.working_set.find_plugins( pkg_resources.Environment([pluginsdir, homepluginsdir])) if errors: log.warning('errors finding plugins: %r', errors) log.debug('mapping distributions %r', distributions) map(pkg_resources.working_set.add, distributions) # validate dependencies from morituri.common import deps h = deps.DepsHandler() h.validate() # set user agent import musicbrainzngs musicbrainzngs.set_useragent("morituri", configure.version, 'https://thomas.apestaart.org/morituri/trac') c = Rip() try: ret = c.parse(argv) except SystemError, e: sys.stderr.write('rip: error: %s\n' % e.args) return 255
def addOptions(self): # FIXME: is this the right place ? log.init() log.debug("morituri", "This is morituri version %s (%s)", configure.version, configure.revision) self.parser.add_option('-R', '--record', action="store_true", dest="record", help="record API requests for playback") self.parser.add_option('-v', '--version', action="store_true", dest="version", help="show version information")
def verifyTrack(self, runner, trackResult): # here to avoid import gst eating our options from morituri.common import checksum t = checksum.CRC32Task(trackResult.filename) runner.run(t) ret = trackResult.testcrc == t.checksum log.debug('program', 'verifyTrack: track result crc %r, file crc %r, result %r', trackResult.testcrc, t.checksum, ret) return ret
def addOptions(self): # FIXME: is this the right place ? log.init() from morituri.configure import configure log.debug("morituri", "This is morituri version %s (%s)", configure.version, configure.revision) self.parser.add_option('-R', '--record', action="store_true", dest="record", help="record API requests for playback") self.parser.add_option('-v', '--version', action="store_true", dest="version", help="show version information")
def removeAudioParsers(): log.debug('gstreamer', 'Removing buggy audioparsers plugin if needed') import gst registry = gst.registry_get_default() plugin = registry.find_plugin("audioparsersbad") if plugin: # always remove from bad log.debug('gstreamer', 'removing audioparsersbad plugin from registry') registry.remove_plugin(plugin) plugin = registry.find_plugin("audioparsers") if plugin: log.debug('gstreamer', 'Found audioparsers plugin from %s %s', plugin.get_source(), plugin.get_version()) # was fixed after 0.10.30 and before 0.10.31 if plugin.get_source() == 'gst-plugins-good' \ and plugin.get_version() > '0.10.30.1': return registry.remove_plugin(plugin)
def removeAudioParsers(): log.debug("gstreamer", "Removing buggy audioparsers plugin if needed") import gst registry = gst.registry_get_default() plugin = registry.find_plugin("audioparsersbad") if plugin: # always remove from bad log.debug("gstreamer", "removing audioparsersbad plugin from registry") registry.remove_plugin(plugin) plugin = registry.find_plugin("audioparsers") if plugin: log.debug("gstreamer", "removing audioparsers plugin from %s %s", plugin.get_source(), plugin.get_version()) # the query bug was fixed after 0.10.30 and before 0.10.31 # the seek bug is still there though # if plugin.get_source() == 'gst-plugins-good' \ # and plugin.get_version() > '0.10.30.1': # return registry.remove_plugin(plugin)
def _getMetadata(release, discid): """ @type release: C{dict} @param release: a release dict as returned in the value for key release from get_release_by_id @rtype: L{DiscMetadata} or None """ log.debug('program', 'getMetadata for release id %r', release['id']) if not release['id']: log.warning('program', 'No id for release %r', release) return None assert release['id'], 'Release does not have an id' metadata = DiscMetadata() credit = release['artist-credit'] artist = credit[0]['artist'] if len(credit) > 1: log.debug('musicbrainzngs', 'artist-credit more than 1: %r', credit) for i, c in enumerate(credit): if isinstance(c, dict): credit[i] = c.get('name', c['artist'].get('name', None)) albumArtistName = "".join(credit) # FIXME: is there a better way to check for VA metadata.various = False if artist['id'] == VA_ID: metadata.various = True # getUniqueName gets disambiguating names like Muse (UK rock band) metadata.artist = albumArtistName metadata.sortName = artist['sort-name'] # FIXME: is format str ? if not 'date' in release: log.warning('musicbrainzngs', 'Release %r does not have date', release) else: metadata.release = release['date'] metadata.mbid = release['id'] metadata.mbidArtist = artist['id'] metadata.url = 'http://musicbrainz.org/release/' + release['id'] tainted = False duration = 0 # only show discs from medium-list->disc-list with matching discid for medium in release['medium-list']: for disc in medium['disc-list']: if disc['id'] == discid: title = release['title'] metadata.releaseTitle = title if 'disambiguation' in release: title += " (%s)" % release['disambiguation'] count = len(release['medium-list']) if count > 1: title += ' (Disc %d of %d)' % (int( medium['position']), count) if 'title' in medium: title += ": %s" % medium['title'] metadata.title = title for t in medium['track-list']: track = TrackMetadata() credit = t['recording']['artist-credit'] if len(credit) > 1: log.debug('musicbrainzngs', 'artist-credit more than 1: %r', credit) # credit is of the form [dict, str, dict, ... ] for i, c in enumerate(credit): if isinstance(c, dict): credit[i] = c.get('name', c['artist'].get('name', None)) trackArtistName = "".join(credit) if not artist: track.artist = metadata.artist track.sortName = metadata.sortName track.mbidArtist = metadata.mbidArtist else: # various artists discs can have tracks with no artist track.artist = trackArtistName track.sortName = artist['sort-name'] track.mbidArtist = artist['id'] track.title = t['recording']['title'] track.mbid = t['recording']['id'] # FIXME: unit of duration ? track.duration = int(t['recording'].get('length', 0)) if not track.duration: log.warning( 'getMetadata', 'track %r (%r) does not have duration' % (track.title, track.mbid)) tainted = True else: duration += track.duration metadata.tracks.append(track) if not tainted: metadata.duration = duration else: metadata.duration = 0 return metadata
def _getMetadata(release, discid): """ @type release: C{dict} @param release: a release dict as returned in the value for key release from get_release_by_id @rtype: L{DiscMetadata} or None """ log.debug('program', 'getMetadata for release id %r', release['id']) if not release['id']: log.warning('program', 'No id for release %r', release) return None assert release['id'], 'Release does not have an id' metadata = DiscMetadata() credit = release['artist-credit'] artist = credit[0]['artist'] if len(credit) > 1: log.debug('musicbrainzngs', 'artist-credit more than 1: %r', credit) for i, c in enumerate(credit): if isinstance(c, dict): credit[i] = c.get( 'name', c['artist'].get('name', None)) albumArtistName = "".join(credit) # FIXME: is there a better way to check for VA metadata.various = False if artist['id'] == VA_ID: metadata.various = True # getUniqueName gets disambiguating names like Muse (UK rock band) metadata.artist = albumArtistName metadata.sortName = artist['sort-name'] # FIXME: is format str ? if not 'date' in release: log.warning('musicbrainzngs', 'Release %r does not have date', release) else: metadata.release = release['date'] metadata.mbid = release['id'] metadata.mbidArtist = artist['id'] metadata.url = 'http://musicbrainz.org/release/' + release['id'] tainted = False duration = 0 # only show discs from medium-list->disc-list with matching discid for medium in release['medium-list']: for disc in medium['disc-list']: if disc['id'] == discid: title = release['title'] metadata.releaseTitle = title if 'disambiguation' in release: title += " (%s)" % release['disambiguation'] count = len(release['medium-list']) if count > 1: title += ' (Disc %d of %d)' % ( int(medium['position']), count) if 'title' in medium: title += ": %s" % medium['title'] metadata.title = title for t in medium['track-list']: track = TrackMetadata() credit = t['recording']['artist-credit'] if len(credit) > 1: log.debug('musicbrainzngs', 'artist-credit more than 1: %r', credit) # credit is of the form [dict, str, dict, ... ] for i, c in enumerate(credit): if isinstance(c, dict): credit[i] = c.get( 'name', c['artist'].get('name', None)) trackArtistName = "".join(credit) if not artist: track.artist = metadata.artist track.sortName = metadata.sortName track.mbidArtist = metadata.mbidArtist else: # various artists discs can have tracks with no artist track.artist = trackArtistName track.sortName = artist['sort-name'] track.mbidArtist = artist['id'] track.title = t['recording']['title'] track.mbid = t['recording']['id'] # FIXME: unit of duration ? track.duration = int(t['recording'].get('length', 0)) if not track.duration: log.warning('getMetadata', 'track %r (%r) does not have duration' % ( track.title, track.mbid)) tainted = True else: duration += track.duration metadata.tracks.append(track) if not tainted: metadata.duration = duration else: metadata.duration = 0 return metadata
# FIXME: no way to compare against 'master' version after 0.10.15 if gst.pygst_version >= (0, 10, 15): ret[gst.TAG_TRACK_NUMBER] = number if self.metadata: # works, but not sure we want this # if gst.pygst_version >= (0, 10, 15): # ret[gst.TAG_TRACK_COUNT] = len(self.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 = self.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'] # no musicbrainz info for htoa tracks if number > 0: ret["musicbrainz-trackid"] = mbidTrack ret["musicbrainz-artistid"] = mbidTrackArtist ret["musicbrainz-albumid"] = mbidAlbum ret["musicbrainz-albumartistid"] = mbidTrackAlbum
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: return None log.debug('musicbrainzngs', 'found %d releases for discid %r', len(result['disc']['release-list']), discid) _record(record, 'releases', discid, result) # Display the returned results to the user. for release in result['disc']['release-list']: log.debug('program', 'result %r: artist %r, title %r' % ( release, release['artist-credit-phrase'], release['title'])) # to get titles of recordings, we need to query the release with # artist-credits res = musicbrainz.get_release_by_id(release['id'], includes=["artists", "artist-credits", "recordings", "discids"]) _record(record, 'release', release['id'], res)
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 log.debug('musicbrainz', 'found %d results for discid %r', len(results), discid) # Display the returned results to the user. ret = [] for result in results: release = result.release log.debug('program', 'result %r: artist %r, title %r' % ( release, release.artist.getName(), release.title)) # 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, discs=True) # Arid - Under the Cold Street Lights has getId() None if release.getId():
def parse(self, argv): log.debug("morituri", "rip %s" % " ".join(argv)) logcommand.LogCommand.parse(self, argv)
def _getMetadata(release): """ @type release: L{musicbrainz2.model.Release} @rtype: L{DiscMetadata} or None """ log.debug('program', 'getMetadata for release id %r', release.getId()) if not release.getId(): log.warning('program', 'No id for release %r', release) return None assert release.id, 'Release does not have an id' 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.sortName = release.artist.sortName metadata.release = release.getEarliestReleaseDate() metadata.mbid = urlparse.urlparse(release.id)[2].split("/")[-1] metadata.mbidArtist = urlparse.urlparse(release.artist.id)[2].split("/")[-1] metadata.url = release.getId() tainted = False duration = 0 for t in release.tracks: track = TrackMetadata() if isSingleArtist or t.artist == None: track.artist = metadata.artist track.sortName = metadata.sortName track.mbidArtist = metadata.mbidArtist else: # various artists discs can have tracks with no artist track.artist = t.artist and t.artist.name or release.artist.name track.sortName = t.artist.sortName track.mbidArtist = urlparse.urlparse(t.artist.id)[2].split("/")[-1] track.title = t.title track.mbid = urlparse.urlparse(t.id)[2].split("/")[-1] track.duration = t.duration if not track.duration: log.warning('getMetadata', 'track %r (%r) does not have duration' % ( track.title, track.mbid)) tainted = True else: duration += t.duration metadata.tracks.append(track) if not tainted: metadata.duration = duration else: metadata.duration = 0 return metadata
except task.TaskException, e: if isinstance(e.exception, common.MissingDependencyException): sys.stderr.write('rip: error: missing dependency "%s"\n' % e.exception.dependency) return 255 # FIXME: move this exception from morituri.program import cdrdao if isinstance(e.exception, cdrdao.DeviceOpenException): sys.stderr.write("""rip: error: cannot read CD from drive. cdrdao says: %s """ % e.exception.msg) return 255 if isinstance(e.exception, common.EmptyError): log.debug('main', "EmptyError: %r", log.getExceptionMessage(e.exception)) sys.stderr.write( 'rip: error: Could not create encoded file.\n') return 255 raise except command.CommandError, e: sys.stderr.write('rip: error: %s\n' % e.output) return e.status if ret is None: return 0 return ret
# FIXME: no way to compare against 'master' version after 0.10.15 if gst.pygst_version >= (0, 10, 15): ret[gst.TAG_TRACK_NUMBER] = number if self.metadata: # works, but not sure we want this # if gst.pygst_version >= (0, 10, 15): # ret[gst.TAG_TRACK_COUNT] = len(self.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 = self.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'] # no musicbrainz info for htoa tracks if number > 0: ret["musicbrainz-trackid"] = mbidTrack ret["musicbrainz-artistid"] = mbidTrackArtist ret["musicbrainz-albumid"] = mbidAlbum ret["musicbrainz-albumartistid"] = mbidTrackAlbum
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: return None log.debug('musicbrainzngs', 'found %d releases for discid %r', len(result['disc']['release-list']), discid) _record(record, 'releases', discid, result) # Display the returned results to the user. for release in result['disc']['release-list']: log.debug( 'program', 'result %r: artist %r, title %r' % (release, release['artist-credit-phrase'], release['title'])) # to get titles of recordings, we need to query the release with # artist-credits res = musicbrainz.get_release_by_id( release['id'], includes=["artists", "artist-credits", "recordings", "discids"])
ret = c.parse(sys.argv[1:]) except SystemError, e: sys.stderr.write('rip: error: %s\n' % e.args) return 255 except ImportError, e: raise ImportError(e) except task.TaskException, e: if isinstance(e.exception, ImportError): raise ImportError(e.exception) elif isinstance(e.exception, common.MissingDependencyException): sys.stderr.write('rip: error: missing dependency "%s"\n' % e.exception.dependency) return 255 if isinstance(e.exception, common.EmptyError): log.debug('main', "EmptyError: %r", log.getExceptionMessage(e.exception)) sys.stderr.write('rip: error: Could not create encoded file.\n') return 255 raise except command.CommandError, e: sys.stderr.write('rip: error: %s\n' % e.output) return e.status if ret is None: return 0 return ret class Rip(logcommand.LogCommand):
ret = [] try: result = musicbrainzngs.get_releases_by_discid(discid, includes=["artists", "recordings", "release-groups"]) except musicbrainzngs.ResponseError, e: if isinstance(e.cause, urllib2.HTTPError): if e.cause.code == 404: raise NotFoundException(e) else: log.debug("musicbrainzngs", "received bad response from the server") raise MusicBrainzException(e) # The result can either be a "disc" or a "cdstub" if result.get("disc"): log.debug("musicbrainzngs", "found %d releases for discid %r", len(result["disc"]["release-list"]), discid) _record(record, "releases", discid, result) # Display the returned results to the user. import json for release in result["disc"]["release-list"]: formatted = json.dumps(release, sort_keys=False, indent=4) log.debug( "program", "result %s: artist %r, title %r" % (formatted, release["artist-credit-phrase"], release["title"]), ) # to get titles of recordings, we need to query the release with # artist-credits
def _getMetadata(releaseShort, release, discid, country=None): """ @type release: C{dict} @param release: a release dict as returned in the value for key release from get_release_by_id @rtype: L{DiscMetadata} or None """ log.debug("program", "getMetadata for release id %r", release["id"]) if not release["id"]: log.warning("program", "No id for release %r", release) return None assert release["id"], "Release does not have an id" if "country" in release and country and release["country"] != country: log.warning("program", "%r was not released in %r", release, country) return None discMD = DiscMetadata() discMD.releaseType = releaseShort.get("release-group", {}).get("type") discCredit = _Credit(release["artist-credit"]) # FIXME: is there a better way to check for VA ? discMD.various = False if discCredit[0]["artist"]["id"] == VA_ID: discMD.various = True if len(discCredit) > 1: log.debug("mbngs", "artist-credit more than 1: %r", discCredit) albumArtistName = discCredit.getName() # getUniqueName gets disambiguating names like Muse (UK rock band) discMD.artist = albumArtistName discMD.sortName = discCredit.getSortName() # FIXME: is format str ? if not "date" in release: log.warning("mbngs", "Release %r does not have date", release) else: discMD.release = release["date"] discMD.mbid = release["id"] discMD.mbidArtist = discCredit.getIds() discMD.url = "https://musicbrainz.org/release/" + release["id"] discMD.barcode = release.get("barcode", None) lil = release.get("label-info-list", [{}]) if lil: discMD.catalogNumber = lil[0].get("catalog-number") tainted = False duration = 0 # only show discs from medium-list->disc-list with matching discid for medium in release["medium-list"]: for disc in medium["disc-list"]: if disc["id"] == discid: title = release["title"] discMD.releaseTitle = title if "disambiguation" in release: title += " (%s)" % release["disambiguation"] count = len(release["medium-list"]) if count > 1: title += " (Disc %d of %d)" % (int(medium["position"]), count) if "title" in medium: title += ": %s" % medium["title"] discMD.title = title for t in medium["track-list"]: track = TrackMetadata() trackCredit = _Credit(t["recording"]["artist-credit"]) if len(trackCredit) > 1: log.debug("mbngs", "artist-credit more than 1: %r", trackCredit) # FIXME: leftover comment, need an example # various artists discs can have tracks with no artist track.artist = trackCredit.getName() track.sortName = trackCredit.getSortName() track.mbidArtist = trackCredit.getIds() track.title = t["recording"]["title"] track.mbid = t["recording"]["id"] # FIXME: unit of duration ? track.duration = int(t["recording"].get("length", 0)) if not track.duration: log.warning("getMetadata", "track %r (%r) does not have duration" % (track.title, track.mbid)) tainted = True else: duration += track.duration discMD.tracks.append(track) if not tainted: discMD.duration = duration else: discMD.duration = 0 return discMD
try: result = musicbrainzngs.get_releases_by_discid( discid, includes=["artists", "recordings", "release-groups"]) except musicbrainzngs.ResponseError, e: if isinstance(e.cause, urllib2.HTTPError): if e.cause.code == 404: raise NotFoundException(e) else: log.debug('musicbrainzngs', 'received bad response from the server') raise MusicBrainzException(e) # The result can either be a "disc" or a "cdstub" if result.get('disc'): log.debug('musicbrainzngs', 'found %d releases for discid %r', len(result['disc']['release-list']), discid) _record(record, 'releases', discid, result) # Display the returned results to the user. import json for release in result['disc']['release-list']: formatted = json.dumps(release, sort_keys=False, indent=4) log.debug( 'program', 'result %s: artist %r, title %r' % (formatted, release['artist-credit-phrase'], release['title'])) # to get titles of recordings, we need to query the release with # artist-credits res = musicbrainzngs.get_release_by_id(release['id'],
def _getMetadata(releaseShort, release, discid, country=None): """ @type release: C{dict} @param release: a release dict as returned in the value for key release from get_release_by_id @rtype: L{DiscMetadata} or None """ log.debug('program', 'getMetadata for release id %r', release['id']) if not release['id']: log.warning('program', 'No id for release %r', release) return None assert release['id'], 'Release does not have an id' if 'country' in release and country and release['country'] != country: log.warning('program', '%r was not released in %r', release, country) return None discMD = DiscMetadata() discMD.releaseType = releaseShort.get('release-group', {}).get('type') discCredit = _Credit(release['artist-credit']) # FIXME: is there a better way to check for VA ? discMD.various = False if discCredit[0]['artist']['id'] == VA_ID: discMD.various = True if len(discCredit) > 1: log.debug('mbngs', 'artist-credit more than 1: %r', discCredit) albumArtistName = discCredit.getName() # getUniqueName gets disambiguating names like Muse (UK rock band) discMD.artist = albumArtistName discMD.sortName = discCredit.getSortName() # FIXME: is format str ? if not 'date' in release: log.warning('mbngs', 'Release %r does not have date', release) else: discMD.release = release['date'] discMD.mbid = release['id'] discMD.mbidArtist = discCredit.getIds() discMD.url = 'https://musicbrainz.org/release/' + release['id'] discMD.barcode = release.get('barcode', None) lil = release.get('label-info-list', [{}]) if lil: discMD.catalogNumber = lil[0].get('catalog-number') tainted = False duration = 0 # only show discs from medium-list->disc-list with matching discid for medium in release['medium-list']: for disc in medium['disc-list']: if disc['id'] == discid: title = release['title'] discMD.releaseTitle = title if 'disambiguation' in release: title += " (%s)" % release['disambiguation'] count = len(release['medium-list']) if count > 1: title += ' (Disc %d of %d)' % (int( medium['position']), count) if 'title' in medium: title += ": %s" % medium['title'] discMD.title = title for t in medium['track-list']: track = TrackMetadata() trackCredit = _Credit(t['recording']['artist-credit']) if len(trackCredit) > 1: log.debug('mbngs', 'artist-credit more than 1: %r', trackCredit) # FIXME: leftover comment, need an example # various artists discs can have tracks with no artist track.artist = trackCredit.getName() track.sortName = trackCredit.getSortName() track.mbidArtist = trackCredit.getIds() track.title = t['recording']['title'] track.mbid = t['recording']['id'] # FIXME: unit of duration ? track.duration = int(t['recording'].get('length', 0)) if not track.duration: log.warning( 'getMetadata', 'track %r (%r) does not have duration' % (track.title, track.mbid)) tainted = True else: duration += track.duration discMD.tracks.append(track) if not tainted: discMD.duration = duration else: discMD.duration = 0 return discMD
def _getMetadata(releaseShort, release, discid, country=None): """ @type release: C{dict} @param release: a release dict as returned in the value for key release from get_release_by_id @rtype: L{DiscMetadata} or None """ log.debug('program', 'getMetadata for release id %r', release['id']) if not release['id']: log.warning('program', 'No id for release %r', release) return None assert release['id'], 'Release does not have an id' if 'country' in release and country and release['country'] != country: log.warning('program', '%r was not released in %r', release, country) return None discMD = DiscMetadata() discMD.releaseType = releaseShort.get('release-group', {}).get('type') discCredit = _Credit(release['artist-credit']) # FIXME: is there a better way to check for VA ? discMD.various = False if discCredit[0]['artist']['id'] == VA_ID: discMD.various = True if len(discCredit) > 1: log.debug('mbngs', 'artist-credit more than 1: %r', discCredit) albumArtistName = discCredit.getName() # getUniqueName gets disambiguating names like Muse (UK rock band) discMD.artist = albumArtistName discMD.sortName = discCredit.getSortName() # FIXME: is format str ? if not 'date' in release: log.warning('mbngs', 'Release %r does not have date', release) else: discMD.release = release['date'] discMD.mbid = release['id'] discMD.mbidArtist = discCredit.getIds() discMD.url = 'https://musicbrainz.org/release/' + release['id'] discMD.barcode = release.get('barcode', None) lil = release.get('label-info-list', [{}]) if lil: discMD.catalogNumber = lil[0].get('catalog-number') tainted = False duration = 0 # only show discs from medium-list->disc-list with matching discid for medium in release['medium-list']: for disc in medium['disc-list']: if disc['id'] == discid: title = release['title'] discMD.releaseTitle = title if 'disambiguation' in release: title += " (%s)" % release['disambiguation'] count = len(release['medium-list']) if count > 1: title += ' (Disc %d of %d)' % ( int(medium['position']), count) if 'title' in medium: title += ": %s" % medium['title'] discMD.title = title for t in medium['track-list']: track = TrackMetadata() trackCredit = _Credit(t['recording']['artist-credit']) if len(trackCredit) > 1: log.debug('mbngs', 'artist-credit more than 1: %r', trackCredit) # FIXME: leftover comment, need an example # various artists discs can have tracks with no artist track.artist = trackCredit.getName() track.sortName = trackCredit.getSortName() track.mbidArtist = trackCredit.getIds() track.title = t['recording']['title'] track.mbid = t['recording']['id'] # FIXME: unit of duration ? track.duration = int(t['recording'].get('length', 0)) if not track.duration: log.warning('getMetadata', 'track %r (%r) does not have duration' % ( track.title, track.mbid)) tainted = True else: duration += track.duration discMD.tracks.append(track) if not tainted: discMD.duration = duration else: discMD.duration = 0 return discMD
def _getMetadata(release): """ @type release: L{musicbrainz2.model.Release} @rtype: L{DiscMetadata} or None """ log.debug('program', 'getMetadata for release id %r', release.getId()) if not release.getId(): log.warning('program', 'No id for release %r', release) return None assert release.id, 'Release does not have an id' 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.sortName = release.artist.sortName metadata.release = release.getEarliestReleaseDate() metadata.mbid = urlparse.urlparse(release.id)[2].split("/")[-1] metadata.mbidArtist = urlparse.urlparse( release.artist.id)[2].split("/")[-1] metadata.url = release.getId() tainted = False duration = 0 for t in release.tracks: track = TrackMetadata() if isSingleArtist or t.artist == None: track.artist = metadata.artist track.sortName = metadata.sortName track.mbidArtist = metadata.mbidArtist else: # various artists discs can have tracks with no artist track.artist = t.artist and t.artist.name or release.artist.name track.sortName = t.artist.sortName track.mbidArtist = urlparse.urlparse(t.artist.id)[2].split("/")[-1] track.title = t.title track.mbid = urlparse.urlparse(t.id)[2].split("/")[-1] track.duration = t.duration if not track.duration: log.warning('getMetadata', 'track %r (%r) does not have duration' % ( track.title, track.mbid)) tainted = True else: duration += t.duration metadata.tracks.append(track) if not tainted: metadata.duration = duration else: metadata.duration = 0 return metadata
# FIXME: no way to compare against 'master' version after 0.10.15 if gst.pygst_version >= (0, 10, 15): ret[gst.TAG_TRACK_NUMBER] = number if self.metadata: # works, but not sure we want this # if gst.pygst_version >= (0, 10, 15): # ret[gst.TAG_TRACK_COUNT] = len(self.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 = self.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"] # no musicbrainz info for htoa tracks if number > 0: ret["musicbrainz-trackid"] = mbidTrack ret["musicbrainz-artistid"] = mbidTrackArtist ret["musicbrainz-albumid"] = mbidAlbum ret["musicbrainz-albumartistid"] = mbidTrackAlbum ret["musicbrainz-discid"] = mbDiscId
def _getMetadata(releaseShort, release, discid): """ @type release: C{dict} @param release: a release dict as returned in the value for key release from get_release_by_id @rtype: L{DiscMetadata} or None """ log.debug("program", "getMetadata for release id %r", release["id"]) if not release["id"]: log.warning("program", "No id for release %r", release) return None assert release["id"], "Release does not have an id" metadata = DiscMetadata() metadata.releaseType = releaseShort.get("release-group", {}).get("type") credit = release["artist-credit"] artist = credit[0]["artist"] if len(credit) > 1: log.debug("musicbrainzngs", "artist-credit more than 1: %r", credit) for i, c in enumerate(credit): if isinstance(c, dict): credit[i] = c.get("name", c["artist"].get("name", None)) albumArtistName = "".join(credit) # FIXME: is there a better way to check for VA metadata.various = False if artist["id"] == VA_ID: metadata.various = True # getUniqueName gets disambiguating names like Muse (UK rock band) metadata.artist = albumArtistName metadata.sortName = artist["sort-name"] # FIXME: is format str ? if not "date" in release: log.warning("musicbrainzngs", "Release %r does not have date", release) else: metadata.release = release["date"] metadata.mbid = release["id"] metadata.mbidArtist = artist["id"] metadata.url = "http://musicbrainz.org/release/" + release["id"] metadata.barcode = release.get("barcode", None) lil = release.get("label-info-list", [{}]) if lil: metadata.catalogNumber = lil[0].get("catalog-number") tainted = False duration = 0 # only show discs from medium-list->disc-list with matching discid for medium in release["medium-list"]: for disc in medium["disc-list"]: if disc["id"] == discid: title = release["title"] metadata.releaseTitle = title if "disambiguation" in release: title += " (%s)" % release["disambiguation"] count = len(release["medium-list"]) if count > 1: title += " (Disc %d of %d)" % (int(medium["position"]), count) if "title" in medium: title += ": %s" % medium["title"] metadata.title = title for t in medium["track-list"]: track = TrackMetadata() credit = t["recording"]["artist-credit"] if len(credit) > 1: log.debug("musicbrainzngs", "artist-credit more than 1: %r", credit) # credit is of the form [dict, str, dict, ... ] for i, c in enumerate(credit): if isinstance(c, dict): credit[i] = c.get("name", c["artist"].get("name", None)) trackArtistName = "".join(credit) if not artist: track.artist = metadata.artist track.sortName = metadata.sortName track.mbidArtist = metadata.mbidArtist else: # various artists discs can have tracks with no artist track.artist = trackArtistName track.sortName = artist["sort-name"] track.mbidArtist = artist["id"] track.title = t["recording"]["title"] track.mbid = t["recording"]["id"] # FIXME: unit of duration ? track.duration = int(t["recording"].get("length", 0)) if not track.duration: log.warning("getMetadata", "track %r (%r) does not have duration" % (track.title, track.mbid)) tainted = True else: duration += track.duration metadata.tracks.append(track) if not tainted: metadata.duration = duration else: metadata.duration = 0 return metadata