Exemple #1
0
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)
Exemple #2
0
	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
Exemple #3
0
 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
Exemple #4
0
	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
Exemple #5
0
 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
Exemple #6
0
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
Exemple #7
0
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
Exemple #9
0
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
Exemple #10
0
 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
Exemple #14
0
            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),)
Exemple #15
0
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