def get_musicbrainz_release(disc): """ Given a Disc object, try a bunch of methods to look up the release in musicbrainz. If a releaseid is specified, use this, otherwise search by discid, then search by CD-TEXT and finally search by audio-fingerprinting. """ if disc.discid is None and disc.releaseid is None: raise Exception("Specify at least one of discid or releaseid") # If a release id has been specified, that takes precedence if disc.releaseid is not None: return lookups.get_release_by_releaseid(disc.releaseid) # Otherwise, lookup the releaseid using the discid as a key results = lookups.get_releases_by_discid(disc.discid) if len(results) > 1: for result in results: print result.release.id + ".html" print "Ambiguous DiscID, trying fingerprint matching" return get_release_by_fingerprints(disc) # We have an exact match, use this. if len(results) == 1: releaseid = results[0].release.id return lookups.get_release_by_releaseid(results[0].release.id) # Otherwise, use CD-TEXT if present to guess the release if disc.performer is not None and disc.title is not None: print "Trying to look up release via CD-TEXT" print "Performer: " + disc.performer print "Title : " + disc.title results = lookups.get_releases_by_cdtext( performer=disc.performer, title=disc.title, num_tracks=len(disc.tracks) ) if len(results) == 1: print "Got result via CD-TEXT lookup!" print "Suggest submitting TOC and discID to musicbrainz:" print "Release URL: " + results[0].release.id + ".html" print "Submit URL : " + submit.musicbrainz_submission_url(disc) return lookups.get_release_by_releaseid(results[0].release.id) elif len(results) > 1: for result in results: print result.release.id + ".html" print "Ambiguous CD-TEXT" else: print "No results from CD-TEXT lookup." # Last resort, fingerprinting print "Trying fingerprint search" return get_release_by_fingerprints(disc)
def end_of_track(possible_releases, impossible_releases, track_generator, trackinfo, fileid): # If there are no more tracks for this # skip it and try more. del track_generator[fileid] util.report("All possibilities for file %s exhausted" % fileid) util.report("filename: %s" % trackinfo[fileid].getFilename()) util.report("Metadata Title: %s" % (trackinfo[fileid].getMDTrackTitle())) util.report("puid: %s" % trackinfo[fileid].getPUID()) removed_releases = {} util.report("Current possible releases:") for i in possible_releases.keys(): # Ignore any release that doesn't have this # track, since we can no longer find it. if fileid not in possible_releases[i].values(): removed_releases[i] = possible_releases[i] del possible_releases[i] impossible_releases.append(i) if possible_releases == {}: giving_up(removed_releases, fileid) return for i in possible_releases: util.report(" %s (tracks found: %s)" % (lookups.get_release_by_releaseid(i).title, util.output_list(possible_releases[i].keys())))
def generate_track_name_possibilities(file, fileid, possible_releases): """Return all track ids matching the tracks. Args: fname: The file containing the track in question. track: A list of tracks to match against. possible_releases: Dictionary containing releases under consideration. Yields: All releated track_ids. Looks at all track names in the releases under consideration and case insensitively compares the tracks, returning any matches. """ ftrackname = file.getMDTrackTitle() for (rid, v) in possible_releases.items(): release = lookups.get_release_by_releaseid(rid) for trackind in range(len(release.tracks)): rtrackname = release.tracks[trackind].title # Don't bother if we've already found this track! if trackind + 1 in v: continue if any(util.combinations(util.comp_name, rtrackname, ftrackname)): print "Using text based comparison for track", trackind + 1, ` rtrackname `, "(", repr( ftrackname), ")" yield lookups.get_track_by_id(release.tracks[trackind].id)
def get_puids_for_release(releaseid): puids=[] release = lookups.get_release_by_releaseid(releaseid) for track in release.tracks: track = lookups.get_track_by_id(track.id) puids = puids + track.puids return puids
def generate_from_metadata(file, num_tracks): """Return track id's by looking up the name on music brainz Args: fname: The file containing the track in question. Yields: A set of track_id, by querying based on id3 tags """ album = file.getMDAlbumTitle() title = file.getMDTrackTitle() artist = file.getMDTrackArtist() if album is None or title is None or artist is None: return # Can't get metadata util.update_progress("Searching albums by text lookup: "+`album`+" "+`artist`) for i in flatten(util.combinations(lookups.get_releases_by_cdtext,album, artist, num_tracks)): release = lookups.get_release_by_releaseid(i.release.id) util.update_progress("Trying "+release.title+" by text lookup") for trackind in range(len(release.tracks)): rtrackname = release.tracks[trackind].title if type(title) != type([]): title=[title] for t in title: if util.comp_name(rtrackname,t): print "Using album based text comparison for",artist.strip(),album.strip(),"'s track",trackind+1,`rtrackname` yield lookups.get_track_by_id(release.tracks[trackind].id) else: print "Failed text lookup for %s" % t
def giving_up(removed_releases, fileid): if not removed_releases: util.report("No possible releases left") return util.report("Possible releases:") for releaseid in removed_releases: # If this release only has one track that we found, # and we have other possible releases, ignore this one. # # TODO: Actually, we should just display the top 2 # releases, by number of tracks found on it. if len(removed_releases[releaseid])<2 \ and len(removed_releases)>1: continue release = lookups.get_release_by_releaseid(releaseid) util.report("%s - %s (%s.html)" % (release.artist.name, release.title, releaseid)) for trackind in range(len(release.tracks)): if (trackind + 1) in removed_releases[releaseid]: continue util.report(" #%02d %s.html %s" % (trackind + 1, release.tracks[trackind].id, release.tracks[trackind].title)) util.report(" %s" % (util.output_list(removed_releases[releaseid].keys())))
def generate_track_name_possibilities(file, fileid, possible_releases): """Return all track ids matching the tracks. Args: fname: The file containing the track in question. track: A list of tracks to match against. possible_releases: Dictionary containing releases under consideration. Yields: All releated track_ids. Looks at all track names in the releases under consideration and case insensitively compares the tracks, returning any matches. """ ftrackname = file.getMDTrackTitle() for (rid,v) in possible_releases.items(): release = lookups.get_release_by_releaseid(rid) for trackind in range(len(release.tracks)): rtrackname = release.tracks[trackind].title # Don't bother if we've already found this track! if trackind+1 in v: continue if any(util.combinations(util.comp_name, rtrackname, ftrackname)): print "Using text based comparison for track",trackind+1,`rtrackname`,"(",repr(ftrackname),")" yield lookups.get_track_by_id(release.tracks[trackind].id)
def generate_from_metadata(file, num_tracks): """Return track id's by looking up the name on music brainz Args: fname: The file containing the track in question. Yields: A set of track_id, by querying based on id3 tags """ album = file.getMDAlbumTitle() title = file.getMDTrackTitle() artist = file.getMDTrackArtist() if album is None or title is None or artist is None: return # Can't get metadata util.update_progress("Searching albums by text lookup: " + ` album ` + " " + ` artist `) for i in flatten( util.combinations(lookups.get_releases_by_cdtext, album, artist, num_tracks)): release = lookups.get_release_by_releaseid(i.release.id) util.update_progress("Trying " + release.title + " by text lookup") for trackind in range(len(release.tracks)): rtrackname = release.tracks[trackind].title if type(title) != type([]): title = [title] for t in title: if util.comp_name(rtrackname, t): print "Using album based text comparison for", artist.strip( ), album.strip(), "'s track", trackind + 1, ` rtrackname ` yield lookups.get_track_by_id(release.tracks[trackind].id) else: print "Failed text lookup for %s" % t
def giving_up(removed_releases,fileid): if not removed_releases: util.report("No possible releases left") return util.report("Possible releases:") for releaseid in removed_releases: # If this release only has one track that we found, # and we have other possible releases, ignore this one. # # TODO: Actually, we should just display the top 2 # releases, by number of tracks found on it. if len(removed_releases[releaseid])<2 \ and len(removed_releases)>1: continue release = lookups.get_release_by_releaseid(releaseid) util.report("%s - %s (%s.html)" % ( release.artist.name, release.title, releaseid)) for trackind in range(len(release.tracks)): if (trackind+1) in removed_releases[releaseid]: continue util.report(" #%02d %s.html %s" % ( trackind+1, release.tracks[trackind].id, release.tracks[trackind].title)) util.report(" %s" % ( util.output_list(removed_releases[releaseid].keys()) ))
def process(self): print "dir",self.dirname self.files = sort.sorted_dir(self.dirname) i = 1 for file in self.files: tags = tag.read_tags(os.path.join(self.dirname,file)) self.fileTags.append(tags) trck = tags[tag.TRACK_NUMBER] if "/" in trck: trck = trck.split("/")[0] trck = int(trck) if trck != i: print "%s Missing an expected track. Expected %d but got %d" % (dir, i, trck) fp = open(os.path.expanduser("~/musicproblems"), "a") fp.write("%s Missing an expected track. Expected %d but got %d" % (dir, i, trck)) fp.close() return releaseid = u"http://musicbrainz.org/release/"+tags[tag.ALBUM_ID] i+=1 self.l = Logger(self.dirname, releaseid) self.release = lookups.get_release_by_releaseid(releaseid) if len(self.files) != len(self.release.tracks): self.l.write("Fewer files than the release says (release: %d files %d)" % (len(self.release.tracks), len(self.files))) self.l.close() return i=0 for file in self.files: self.test(i, os.path.join(self.dirname, file)) i+=1 self.l.close()
def get_puids_for_release(releaseid): puids = [] release = lookups.get_release_by_releaseid(releaseid) for track in release.tracks: track = lookups.get_track_by_id(track.id) puids = puids + track.puids return puids
def find_even_more_tracks(fname,tracknum,possible_releases): gotone = False if fname.lower().endswith(".flac"): return mp3data = parsemp3.parsemp3(fname) if "TIT2" not in mp3data["v2"]: return ftrackname = mp3data["v2"]["TIT2"] for (rid,v) in possible_releases.items(): release = lookups.get_release_by_releaseid(rid) rtrackname = release.tracks[tracknum-1].title if rtrackname.lower() == ftrackname.lower(): yield release.tracks[tracknum-1]
def guess_album(trackinfo): for rid,trackmap in guess_album2(trackinfo): release = lookups.get_release_by_releaseid(rid) albumartist=release.artist if musicbrainz2.model.Release.TYPE_SOUNDTRACK in release.types: directoryname = "Soundtrack" else: directoryname = albumartist.name releaseevents=release.getReleaseEvents() tracks=release.getTracks() trackdata=[] for tracknum,fileid in trackmap.items(): trk=tracks[tracknum-1] musicfile = trackinfo[fileid] if trk.artist is None: artist=albumartist.name sortartist=albumartist.sortName artistid=albumartist.id else: artist=trk.artist.name sortartist=trk.artist.sortName artistid=trk.artist.id trackdata.append(( tracknum, artist, sortartist, trk.title, musicfile.getDuration(), musicfile.getFilename(), artistid, trk.id)) asin = lookups.get_asin_from_release(release) albuminfo = ( directoryname, release.title, rid+".html", [x.date for x in releaseevents], asin, trackdata, albumartist, release.id, ) yield albuminfo
def guess_album(trackinfo): releasedata={} for rid in guess_album2(trackinfo): release = lookups.get_release_by_releaseid(rid) albumartist=release.artist if musicbrainz2.model.Release.TYPE_SOUNDTRACK in release.types: directoryname = "Soundtrack" else: directoryname = albumartist.name #print albumartist.name,":",release.title+" ("+rid+".html)" releaseevents=release.getReleaseEvents() #print "Release dates:" #for ev in releaseevents: # print " ",ev.date #print "Track:" tracks=release.getTracks() trackdata=[] for tracknum in range(len(tracks)): trk=tracks[tracknum] (fname,artist,trackname,dur,trackprints,puid) = trackinfo[tracknum+1] if trk.artist is None: artist=albumartist.name sortartist=albumartist.sortName artistid=albumartist.id else: artist=trk.artist.name sortartist=trk.artist.sortName artistid=trk.artist.id #print " ",tracknum+1,"-",artist,"-",trk.title,"%2d:%06.3f" % (int(dur/60000),(dur%6000)/1000),`fname` trackdata.append((tracknum+1,artist,sortartist,trk.title,dur,fname,artistid,trk.id)) asin = lookups.get_asin_from_release(release) albuminfo = ( directoryname, release.title, rid+".html", [x.date for x in releaseevents], asin, trackdata, albumartist, release.id, ) yield albuminfo
def process(self): print "dir", self.dirname self.files = sort.sorted_dir(self.dirname) i = 1 for file in self.files: tags = tag.read_tags(os.path.join(self.dirname, file)) self.fileTags.append(tags) trck = tags[tag.TRACK_NUMBER] if "/" in trck: trck = trck.split("/")[0] trck = int(trck) if trck != i: print "%s Missing an expected track. Expected %d but got %d" % ( dir, i, trck) fp = open(os.path.expanduser("~/musicproblems"), "a") fp.write( "%s Missing an expected track. Expected %d but got %d" % (dir, i, trck)) fp.close() return releaseid = u"http://musicbrainz.org/release/" + tags[tag.ALBUM_ID] i += 1 self.l = Logger(self.dirname, releaseid) self.release = lookups.get_release_by_releaseid(releaseid) if len(self.files) != len(self.release.tracks): self.l.write( "Fewer files than the release says (release: %d files %d)" % (len(self.release.tracks), len(self.files))) self.l.close() return i = 0 for file in self.files: self.test(i, os.path.join(self.dirname, file)) i += 1 self.l.close()
def end_of_track(possible_releases,impossible_releases,track_generator,trackinfo,fileid): # If there are no more tracks for this # skip it and try more. del track_generator[fileid] util.report("All possibilities for file %s exhausted" % fileid) util.report("filename: %s" % trackinfo[fileid].getFilename()) util.report("Metadata Title: %s" % (trackinfo[fileid].getMDTrackTitle())) util.report("puid: %s" % trackinfo[fileid].getPUID()) removed_releases={} util.report("Current possible releases:") for i in possible_releases.keys(): # Ignore any release that doesn't have this # track, since we can no longer find it. if fileid not in possible_releases[i].values(): removed_releases[i]=possible_releases[i] del possible_releases[i] impossible_releases.append(i) if possible_releases=={}: giving_up(removed_releases, fileid) return for i in possible_releases: util.report(" %s (tracks found: %s)" % (lookups.get_release_by_releaseid(i).title,util.output_list(possible_releases[i].keys())))
def end_of_track(possible_releases,impossible_releases,track_generator,trackinfo,fileid): # If there are no more tracks for this # skip it and try more. del track_generator[fileid] print "All possibilities for file",fileid,"exhausted\x1b[K" print "filename",trackinfo[fileid].getFilename() print "Metadata Title:",trackinfo[fileid].getMDTrackTitle() print "puid:",trackinfo[fileid].getPUID() removed_releases={} print "Current possible releases:" for i in possible_releases.keys(): # Ignore any release that doesn't have this # track, since we can no longer find it. if fileid not in possible_releases[i].values(): removed_releases[i]=possible_releases[i] del possible_releases[i] impossible_releases.append(i) if possible_releases=={}: giving_up(removed_releases, fileid) return for i in possible_releases: print "",lookups.get_release_by_releaseid(i).title,"(tracks found: %s)" % (util.output_list(possible_releases[i].keys()))
def guess_album(trackinfo): for rid, trackmap in guess_album2(trackinfo): release = lookups.get_release_by_releaseid(rid) albumartist = release.artist if musicbrainz2.model.Release.TYPE_SOUNDTRACK in release.types: directoryname = "Soundtrack" else: directoryname = albumartist.name releaseevents = release.getReleaseEvents() tracks = release.getTracks() trackdata = [] for tracknum, fileid in trackmap.items(): trk = tracks[tracknum - 1] musicfile = trackinfo[fileid] if trk.artist is None: artist = albumartist.name sortartist = albumartist.sortName artistid = albumartist.id else: artist = trk.artist.name sortartist = trk.artist.sortName artistid = trk.artist.id trackdata.append((tracknum, artist, sortartist, trk.title, musicfile.getDuration(), musicfile.getFilename(), artistid, trk.id)) asin = lookups.get_asin_from_release(release) albuminfo = ( directoryname, release.title, rid + ".html", [x.date for x in releaseevents], asin, trackdata, albumartist, release.id, ) yield albuminfo
def guess_album2(trackinfo): # trackinfo is # <tracknum> => (fname,artist,trackname,dur,[mbtrackids]) # # returns a list of possible release id's # # This version works by trying a breadth first search of releases to try # and avoid wasting a lot of time finding releases which are going to # be ignored. # # This function returns a list of release id's possible_releases={} failed_releases={} impossible_releases=[] track_generator={} completed_releases=[] for (tracknum,(fname,artist,trackname,dur,trackids,puid)) in trackinfo.iteritems(): track_generator[tracknum]=itertools.chain( (track for track in trackids), find_more_tracks([ track for track in trackids]), find_even_more_tracks(fname, tracknum, possible_releases) ) track_counts={} track_prob={} for i in range(len(trackinfo)): track_counts[i+1]=0 track_prob[i+1]=0 old_possible_releases=None total=0 if track_generator=={}: print "No tracks to identify?" return while track_generator!={}: if 1 or old_possible_releases!=possible_releases: total=0 track_prob={} for i in range(len(trackinfo)): if (i+1) not in track_generator: continue track_prob[i+1]=1 total=total+1 for j in possible_releases: if (i+1) not in possible_releases[j]: track_prob[i+1]+=len(possible_releases[j]) total+=len(possible_releases[j]) old_possible_releases=possible_releases.copy() r=random.random()*total tot=0 for tracknum in track_prob: if tracknum not in track_generator: continue tot+=track_prob[tracknum] if tot>=r: if tot>=r: break try: track = track_generator[tracknum].next() except StopIteration, si: # If there are no more tracks for this # skip it and try more. del track_generator[tracknum] print print "All possibilities for track",tracknum,"exhausted" print "puid:",trackinfo[tracknum][5]#[0].puids removed_releases={} for i in possible_releases.keys(): # Ignore any release that doesn't have this # track, since we can no longer find it. if tracknum not in possible_releases[i]: removed_releases[i]=possible_releases[i] del possible_releases[i] if possible_releases=={}: print "No possible releases left" if removed_releases: print "Possible releases:" for releaseid in removed_releases: release = lookups.get_release_by_releaseid(releaseid) print release.artist.name,"-",release.title print "",release.tracks[tracknum-1].id print "",output_list(removed_releases[releaseid]) return #return continue for releaseid in (x.id for x in track.releases): #releaseid = track.releases[0].id if releaseid in impossible_releases: continue release = lookups.get_release_by_releaseid(releaseid) if len(release.tracks) != len(trackinfo): # Ignore release -- wrong number of tracks sys.stdout.write(release.title.encode("ascii","ignore")[:40]+": wrong number of tracks (%d not %d)\x1B[K\r" % (len(release.tracks),len(trackinfo))) sys.stdout.flush() impossible_releases.append(releaseid) continue found_tracknumber=lookups.track_number(release.tracks, track) if found_tracknumber != tracknum: #impossible_releases.append(releaseid) # Ignore release -- Wrong track position if releaseid in failed_releases: failed_releases[releaseid]= \ failed_releases[releaseid]+1 else: failed_releases[releaseid]=1 if releaseid in possible_releases: #print "No longer considering",release.title,": doesn't have track at the right position (",tracknum,"expected at",found_tracknumber,")" #for i in possible_releases[releaseid]: # track_counts[i]=track_counts[i]-1 #del possible_releases[releaseid] pass else: sys.stdout.write(release.title.encode("ascii","ignore")[:40]+" (track at wrong position)\x1b[K\r") sys.stdout.flush() continue if releaseid in possible_releases: if tracknum not in possible_releases[releaseid]: possible_releases[releaseid].append(tracknum) track_counts[tracknum]=track_counts[tracknum]+1 print "Found track",tracknum,"on",release.title,"(tracks found: %s)\x1b[K" % (output_list(possible_releases[releaseid])) else: possible_releases[releaseid]=[tracknum] track_counts[tracknum]=track_counts[tracknum]+1 print "Considering",release.title,"\x1b[K" if possible_releases!={}: print "Currently Considering:" for i in possible_releases: print "",lookups.get_release_by_releaseid(i).title,"(tracks found: %s)" % (output_list(possible_releases[i])),failed_releases.get(i,0) print if len(possible_releases[releaseid])==len(trackinfo) and releaseid not in completed_releases: print release.title,"seems ok\x1b[K" yield releaseid completed_releases.append(releaseid)
print " provide a date where one is missing" print " -n Don't actually tag and rename files" def get_release_by_fingerprints(disc): """ Do a fingerprint based search for a matching release. """ dirinfo = albumidentify.get_dir_info(disc.dirname) data = albumidentify.guess_album(dirinfo) try: (directoryname, albumname, rid, events, asin, trackdata, albumartist, releaseid) = data.next() except StopIteration, si: raise Exception("Can't find release via fingerprint search. Giving up") release = lookups.get_release_by_releaseid(releaseid) print "Got result via audio fingerprinting!" print "Suggest submitting TOC and discID to musicbrainz:" print "Release URL: " + release.id + ".html" print "Submit URL : " + submit.musicbrainz_submission_url(disc) return release def get_musicbrainz_release(disc): """ Given a Disc object, try a bunch of methods to look up the release in musicbrainz. If a releaseid is specified, use this, otherwise search by discid, then search by CD-TEXT and finally search by audio-fingerprinting. """ if disc.discid is None and disc.releaseid is None: raise Exception("Specify at least one of discid or releaseid")
def guess_album2(trackinfo): # trackinfo is # <fname> => <musicfile.MusicFile> # # returns a list of possible release id's # # This version works by trying a breadth first search of releases to try # and avoid wasting a lot of time finding releases which are going to # be ignored. # # This function returns a list of release id's possible_releases = {} impossible_releases = [] track_generator = {} completed_releases = [] start_time = time.time() if trackinfo == {}: print "No tracks to identify?" return for (fileid, file) in trackinfo.iteritems(): track_generator[fileid] = itertools.chain( file.getTracks(), strat_musicbrainzid.generate_from_metadata(file), strat_transitive.generate_track_puid_possibilities( file.getTracks()), strat_metadata.generate_from_metadata(file, len(trackinfo)), strat_trackname.generate_track_name_possibilities( file, fileid, possible_releases)) while track_generator != {}: timelimit = albumidentifyconfig.config.getint("albumidentify", "timelimit") if timelimit > 0 and time.time() - start_time > timelimit: print "TIMEOUT EXCEEDED, GIVING UP" break fileid = choose_track(possible_releases, track_generator, trackinfo) try: track = track_generator[fileid].next() except StopIteration: end_of_track(possible_releases, impossible_releases, track_generator, trackinfo, fileid) # If we have no more possible releases for the track # we're giving up on, we can't # get any more. # So give up now. if possible_releases == {}: return continue for releaseid in (x.id for x in track.releases): # Skip releases we've already seen before. if releaseid in impossible_releases: continue util.update_progress("Considering %s" % (musicbrainz2.utils.extractUuid(releaseid))) try: release = lookups.get_release_by_releaseid(releaseid) except Exception, e: util.report("WARNING: Unexpected exception looking for " + musicbrainz2.utils.extractUuid(releaseid) + ": " + str(e)) continue # Is the track usable? if not verify_track(release, possible_releases, impossible_releases, trackinfo, fileid, track): continue add_new_track(release, possible_releases, fileid, track, trackinfo, impossible_releases) if len(possible_releases[releaseid])==len(trackinfo) \ and releaseid not in completed_releases: print release.title, "seems ok\x1b[K" print "Musicbrainz Release Id: %s.html" % release.id yield releaseid, possible_releases[releaseid] completed_releases.append(releaseid)
def guess_album2(trackinfo): # trackinfo is # <fname> => <musicfile.MusicFile> # # returns a list of possible release id's # # This version works by trying a breadth first search of releases to try # and avoid wasting a lot of time finding releases which are going to # be ignored. # # This function returns a list of release id's possible_releases={} impossible_releases=[] track_generator={} completed_releases=[] start_time = time.time() if trackinfo=={}: print "No tracks to identify?" return for (fileid,file) in trackinfo.iteritems(): track_generator[fileid]=itertools.chain( file.getTracks(), strat_musicbrainzid.generate_from_metadata(file), strat_transitive.generate_track_puid_possibilities( file.getTracks()), strat_metadata.generate_from_metadata( file, len(trackinfo)), strat_trackname.generate_track_name_possibilities( file, fileid, possible_releases) ) while track_generator!={}: timelimit = albumidentifyconfig.config.getint("albumidentify","timelimit") if timelimit > 0 and time.time() - start_time > timelimit: print "TIMEOUT EXCEEDED, GIVING UP" break fileid = choose_track( possible_releases, track_generator, trackinfo) try: track = track_generator[fileid].next() except StopIteration: end_of_track( possible_releases, impossible_releases, track_generator, trackinfo, fileid) # If we have no more possible releases for the track # we're giving up on, we can't # get any more. # So give up now. if possible_releases == {}: return continue for releaseid in (x.id for x in track.releases): # Skip releases we've already seen before. if releaseid in impossible_releases: continue util.update_progress("Considering %s" % ( musicbrainz2.utils.extractUuid(releaseid))) try: release = lookups.get_release_by_releaseid(releaseid) except Exception,e: util.report("WARNING: Unexpected exception looking for "+musicbrainz2.utils.extractUuid(releaseid)+": "+str(e)) continue # Is the track usable? if not verify_track(release, possible_releases, impossible_releases, trackinfo, fileid, track): continue add_new_track(release, possible_releases, fileid, track, trackinfo, impossible_releases) if len(possible_releases[releaseid])==len(trackinfo) \ and releaseid not in completed_releases: print release.title,"seems ok\x1b[K" print "Musicbrainz Release Id: %s.html" % release.id yield releaseid, possible_releases[releaseid] completed_releases.append(releaseid)