def find_artist_and_title(puid): q = Query() try: f = TrackFilter(puid=sys.argv[1]) results = q.getTracks(f) except WebServiceError, e: print 'Error:', e sys.exit(1)
def lookup_puid(self,_puid): q = Query() f = TrackFilter(puid=_puid) try : r = q.getTracks(f) track = r[0].track return track except: print 'MusicBrainz::lookup_puid: Error finding track metadata.' # raise AssertionError('MusicBrainz::lookup_puid: Error finding track metadata.') return None
def lookup_puid(self, _puid): q = Query() f = TrackFilter(puid=_puid) try: r = q.getTracks(f) track = r[0].track return track except: print 'MusicBrainz::lookup_puid: Error finding track metadata.' # raise AssertionError('MusicBrainz::lookup_puid: Error finding track metadata.') return None
def getTracks(self,filter=filter) : p = md5.new(pickle.dumps(filter)).hexdigest() cache_file = os.path.join(CACHE_DIR,'track_q',p) if os.path.exists(cache_file) : instream = open(cache_file,"r") toret = pickle.loads(instream.read()) instream.close() return toret else : self.throttle() toret = Query.getTracks(self,filter=filter) outstream = open(cache_file,"w") outstream.write(pickle.dumps(toret)) outstream.close() return toret
def getTracks(self, filter=filter): p = md5.new(pickle.dumps(filter)).hexdigest() cache_file = os.path.join('cache', 'track_q', p) if os.path.exists(cache_file): instream = open(cache_file, "r") toret = pickle.loads(instream.read()) instream.close() return toret else: self.throttle() toret = Query.getTracks(self, filter=filter) outstream = open(cache_file, "w") outstream.write(pickle.dumps(toret)) outstream.close() return toret
def find_releases(puid): """Given a track's puid, return a list of (track-no, track, release) for each release that the song appeared on on.""" query = Query() trackfilter = TrackFilter(puid=puid) results = query.getTracks(trackfilter) out = [] for result in results: track = result.track rels = track.getReleases() assert len(rels) == 1 rel = rels[0] out.append((rel.getTracksOffset()+1, track, rel)) return out
def find_releases(puid): """ Given a track's puid, return a list of (track-no, track, release) for each release that the song appeared on on. """ service = get_service() q = Query(service) f = TrackFilter(puid=puid) results = None while results == None: try: results = q.getTracks(f) except WebServiceError, e: print "!! WebServiceError: ", e print "!! Retry in 5 seconds..." time.sleep(5)
def find_album_name( track_details ): """Find album name via Musicbrainz API Arguments: track_details -- dict containing 'Title' and 'Artist' Returns album name, empty string if unsuccessful. """ album = "" # Musicbrainz limits API calls to one per second from a specific IP time.sleep(1.1) query = Query() # Loop through at most 9 times as the webservice is occasionally busy. # Results will not be None if is successful i = 1 results = None while (results == None) and (i < 10): try: tracks = TrackFilter(title=track_details['Title'], artistName=track_details['Artist']) results = query.getTracks(tracks) except (AuthenticationError, ConnectionError, RequestError, ResponseError, ResourceNotFoundError, WebServiceError) as error: print('Error:', error, 'waiting', i*10, 'seconds') time.sleep(i*10) i += 1 results = None if (results != None) and (len(results) != 0): album = find_preferred_album( results ) return album
def get_puid_tags(puid): """Returns a list of `TagGroup` elements, matching the song's puid""" global _lastServerCall # wait at least a second while True: currentTime = time.time() if currentTime >= _lastServerCall+1: _lastServerCall = currentTime break time.sleep(0.05) q = Query() res = [] try: f = TrackFilter(puid=puid) results = q.getTracks(f) except WebServiceError, e: print e return None
def sanitize_with_musicBrainz(self): titleName = self['title'] artistName = self['artist'] albumName = self['album'] q = Query() try: logging.debug("Querying with title:{},artist:{},album:{}" .format(titleName, artistName, albumName)) f = TrackFilter(title=titleName, artistName=artistName, releaseTitle=albumName, limit=2) results = q.getTracks(f) logging.debug("results are " + str(results)) except WebServiceError as e: logging.error("Failed to contact musicbrainz server.") if str(e)[:15]=="HTTP Error 503:": logging.info("Pausing for a moment, \ the musicbrainz server doesn't handle too much request") sleep(60) return self.sanitize_with_musicBrainz() self.treat_musicbrainz_result(results)
class MusicBrainzTrackSearch: """ Searches MusicBrainz database for Suggestions based on a Track """ def __init__(self): self.query = Query() def _build_musicbrainz_query(self, track): """ Build a query string in Lucene Format. track: The Track object wich values will be used to build the query """ tags = { 'release': 'album', 'artist': 'artist', 'tnum': 'tracknumber', 'track': 'title' } query_params = [] for musicbrainz_tag, exaile_tag in tags.iteritems(): tag_value = track.get_tag(exaile_tag) if tag_value: query_params.append(musicbrainz_tag + ":("+ tag_value[0] +")") query = ' '.join(query_params) return query def get_tracks_suggestions(self, track): """ Fetch track suggestions from Musicbrainz WebService track: The Track object wich values will be used in the query """ query = self._build_musicbrainz_query(track) filter = TrackFilter(query = query) tracks_result = self.query.getTracks(filter) return tracks_result
if len(sys.argv) < 2: print "Usage: findtrack.py 'track name' ['artist name']" sys.exit(1) if len(sys.argv) > 2: artistName = sys.argv[2] else: artistName = None q = Query() try: f = TrackFilter(title=sys.argv[1], artistName=artistName) results = q.getTracks(f) except WebServiceError, e: print 'Error:', e sys.exit(1) for result in results: track = result.track print "Score :", result.score print "Id :", track.id print "Title :", track.title print "Artist :", track.artist.name print # EOF
def getSongInfo( plays ): detailed_plays = collections.OrderedDict() for k,v in plays.items(): q = Query() time.sleep(1.1) found = False i = 1 while not found and i < 10: try: f = TrackFilter(title=v[1], artistName=v[0]) results = q.getTracks(f) found = True except (AuthenticationError, ConnectionError, RequestError, ResponseError, ResourceNotFoundError, WebServiceError) as error: detailed_plays[k] = (v[0], v[1], "") print('Error:', error, 'waiting', i*10, 'seconds') results = None time.sleep(i*10) i += 1 if (results != None) and (len(results) != 0): found_release = None release_type = None release = None for result in results: track = result.track title = track.title artist = track.artist.name # Prefer: album, single, live, anything else for release in track.releases: if Release.TYPE_ALBUM in release.getTypes(): found_release = release release_type = Release.TYPE_ALBUM break elif Release.TYPE_SINGLE in release.getTypes(): if release_type != Release.TYPE_ALBUM: found_release = release release_type = Release.TYPE_SINGLE elif Release.TYPE_LIVE in release.getTypes(): if release_type != Release.TYPE_ALBUM and \ release_type != Release.TYPE_SINGLE: found_release = release release_type = Release.TYPE_LIVE else: if release_type != Release.TYPE_ALBUM and \ release_type != Release.TYPE_SINGLE and \ release_type != Release.TYPE_LIVE: found_release = release if release_type == Release.TYPE_ALBUM: break if found_release == None: album = "" else: album = release.title detailed_plays[k] = (artist, title, album) else: detailed_plays[k] = (v[0], v[1], "") return detailed_plays
tp.remove(fileId) tr = None if tr: tp.releaseTrack(tr) if status == tunepimp.eError: print ("%s:\n\tError: %s\n" % (fileName, tp.getError())).encode('ascii', 'ignore') tp.remove(fileId) if addPUID: try: fileName, puid, trackId = addPUID print ("%s:\n\t%s - %s" % (fileName, puid, trackId)).encode('ascii', 'ignore') flt = TrackFilter(puid=puid) result = q.getTracks(flt) found = False for res in result: if extractUuid(res.track.id, 'track') == trackId: found = True if not found: toSubmit[trackId] = puid print else: print "\tAlready in MB, skipping.\n" except: print "EXCEPTION THROWN LOOKING UP TRACK ID" tp.remove(fileId) if len(toSubmit) >= batchSize or (tp.getNumFiles() == 0 and len(toSubmit) > 0): print "Submitting %d PUIDs to MusicBrainz...\n" % (len(toSubmit),)
import logging from musicbrainz2.webservice import Query, TrackFilter, WebServiceError logging.basicConfig() logger = logging.getLogger() logger.setLevel(logging.DEBUG) if len(sys.argv) < 1: print "Usage: findtrack.py 'puid'" sys.exit(1) q = Query() try: f = TrackFilter(puid=sys.argv[1]) results = q.getTracks(f) except WebServiceError, e: print 'Error:', e sys.exit(1) for result in results: track = result.track print "Score :", result.score print "Id :", track.id print "Title :", track.title print "Artist :", track.artist.name print # EOF