def add_new_track(release, possible_releases, fileid, track, trackinfo, impossible_releases): releaseid = release.id found_tracknumber = lookups.track_number(release.tracks, track) if releaseid in possible_releases: assert found_tracknumber not in possible_releases[releaseid] assert fileid not in possible_releases[releaseid].values(), ( fileid, possible_releases[releaseid]) possible_releases[releaseid][found_tracknumber] = fileid print "Found track", found_tracknumber, "(", release.tracks[ found_tracknumber - 1].title, ")", "of", release.title, ":", os.path.basename( fileid), "(tracks found: %s)\x1b[K" % (util.output_list( possible_releases[releaseid].keys())) return else: possible_releases[releaseid] = {found_tracknumber: fileid} util.update_progress( "Considering new %s - %s (found track %d)" % (release.artist.name, release.title, found_tracknumber)) # Right, lets see if we can find some other tracks quick smart for trackind in range(len(release.tracks)): # Don't waste time on things we've already found if (trackind + 1) in possible_releases[releaseid]: continue track = lookups.get_track_by_id(release.tracks[trackind].id) for fileid in trackinfo: if fileid in possible_releases[releaseid].values(): continue if trackinfo[fileid].getPUID() in track.puids: # yay, found one. if verify_track(release, possible_releases, impossible_releases, trackinfo, fileid, track): possible_releases[releaseid][trackind + 1] = fileid util.update_progress( " Also found track %02d: %s" % (trackind + 1, release.tracks[trackind].title)) break print " Found tracks: %s" % (util.output_list( possible_releases[releaseid].keys())), if util.list_difference(range(1, len(release.tracks) + 1), possible_releases[releaseid].keys()): print " Missing tracks: %s" % (util.output_list( util.list_difference(range(1, len(release.tracks) + 1), possible_releases[releaseid].keys()))) else: print
def add_new_track(release, possible_releases, fileid, track, trackinfo, impossible_releases): releaseid = release.id found_tracknumber=lookups.track_number(release.tracks, track) if releaseid in possible_releases: assert found_tracknumber not in possible_releases[releaseid] assert fileid not in possible_releases[releaseid].values(),(fileid,possible_releases[releaseid]) possible_releases[releaseid][found_tracknumber]=fileid print "Found track",found_tracknumber,"(",release.tracks[found_tracknumber-1].title,")","of",release.title,":",os.path.basename(fileid),"(tracks found: %s)\x1b[K" % (util.output_list(possible_releases[releaseid].keys())) return else: possible_releases[releaseid]={found_tracknumber:fileid} util.update_progress("Considering new %s - %s (found track %d)" % ( release.artist.name, release.title, found_tracknumber)) # Right, lets see if we can find some other tracks quick smart for trackind in range(len(release.tracks)): # Don't waste time on things we've already found if (trackind+1) in possible_releases[releaseid]: continue track = lookups.get_track_by_id(release.tracks[trackind].id) for fileid in trackinfo: if fileid in possible_releases[releaseid].values(): continue if trackinfo[fileid].getPUID() in track.puids: # yay, found one. if verify_track(release, possible_releases, impossible_releases, trackinfo, fileid, track): possible_releases[releaseid][trackind+1]=fileid util.update_progress(" Also found track %02d: %s" % (trackind+1,release.tracks[trackind].title)) break print " Found tracks: %s" % ( util.output_list(possible_releases[releaseid].keys())), if util.list_difference(range(1,len(release.tracks)+1), possible_releases[releaseid].keys()): print " Missing tracks: %s"% ( util.output_list( util.list_difference(range(1,len(release.tracks)+1), possible_releases[releaseid].keys()))) else: print
def verify_track(release, possible_releases, impossible_releases, trackinfo, fileid, track): # Step One: Has this file already been found on this release? releaseid = release.id if releaseid in possible_releases and fileid in possible_releases[releaseid].values(): util.update_progress("Already found on this release:" + fileid ) return False # Step Two: Check for the right number of tracks if len(release.tracks) != len(trackinfo): # Ignore release -- wrong number of tracks util.update_progress(release.title.encode("ascii","ignore")[:40]+": wrong number of tracks (%d not %d)" % (len(release.tracks),len(trackinfo))) impossible_releases.append(releaseid) return False # Step Three: Have we found a file for this track on this release? tracknum = lookups.track_number(release.tracks, track) if releaseid in possible_releases and tracknum in possible_releases[releaseid]: util.update_progress("Already found a file for track %02d: %s" % (tracknum,possible_releases[releaseid][tracknum])) return False # Step Four: (optionally) Check that track 'n' maps to file 'n'. if FORCE_ORDER: found_tracknumber=lookups.track_number(release.tracks, track) file_ids = trackinfo.keys() file_ids = sort.sorted_list(file_ids) if found_tracknumber != file_ids.index(fileid)+1: util.update_progress(release.title[:40]+": track at wrong position") return False # Step Five: Make sure if there is another mapping on this album # that we don't accept this one. if trackinfo[fileid].getPUID() in get_puids_for_release(releaseid): if trackinfo[fileid].getPUID() not in lookups.get_track_by_id(track.id).puids: print "Track exists elsewhere on this release" print "",fileid print "",track.title for ntrackind,ntrack in enumerate(release.tracks): ntrack = lookups.get_track_by_id(ntrack.id) if trackinfo[fileid].getPUID() in ntrack.puids: print " should be:",ntrack.title return False # Step Six: Make sure the song is within 10% of the length of the # track we expect it to be. track = lookups.get_track_by_id(track.id) if track.getDuration() is not None: dur_ratio = track.getDuration() * 1.0 / trackinfo[fileid].getDuration() if dur_ratio < .9 or dur_ratio > 1.1: print "Track lengths differ" print " (%s) %s" % ( duration_to_string(trackinfo[fileid].getDuration()), trackinfo[fileid].getFilename(), ) print " (%s) %s" % ( duration_to_string(track.getDuration()), track.title, ) return False # Well, after passing through that gauntlet, we might consider this track! return True
def verify_track(release, possible_releases, impossible_releases, trackinfo, fileid, track): # Step One: Has this file already been found on this release? releaseid = release.id if releaseid in possible_releases and fileid in possible_releases[ releaseid].values(): util.update_progress("Already found on this release:" + fileid) return False # Step Two: Check for the right number of tracks if len(release.tracks) != len(trackinfo): # Ignore release -- wrong number of tracks util.update_progress( release.title.encode("ascii", "ignore")[:40] + ": wrong number of tracks (%d not %d)" % (len(release.tracks), len(trackinfo))) impossible_releases.append(releaseid) return False # Step Three: Have we found a file for this track on this release? tracknum = lookups.track_number(release.tracks, track) if releaseid in possible_releases and tracknum in possible_releases[ releaseid]: util.update_progress( "Already found a file for track %02d: %s" % (tracknum, possible_releases[releaseid][tracknum])) return False # Step Four: (optionally) Check that track 'n' maps to file 'n'. if FORCE_ORDER: found_tracknumber = lookups.track_number(release.tracks, track) file_ids = trackinfo.keys() file_ids = sort.sorted_list(file_ids) if found_tracknumber != file_ids.index(fileid) + 1: util.update_progress(release.title[:40] + ": track at wrong position") return False # Step Five: Make sure if there is another mapping on this album # that we don't accept this one. if trackinfo[fileid].getPUID() in get_puids_for_release(releaseid): if trackinfo[fileid].getPUID() not in lookups.get_track_by_id( track.id).puids: print "Track exists elsewhere on this release" print "", fileid print "", track.title for ntrackind, ntrack in enumerate(release.tracks): ntrack = lookups.get_track_by_id(ntrack.id) if trackinfo[fileid].getPUID() in ntrack.puids: print " should be:", ntrack.title return False # Step Six: Make sure the song is within 10% of the length of the # track we expect it to be. track = lookups.get_track_by_id(track.id) if track.getDuration() is not None and trackinfo[fileid].getDuration(): dur_ratio = track.getDuration() * 1.0 / trackinfo[fileid].getDuration() if dur_ratio < .9 or dur_ratio > 1.1: print "Track lengths differ" print " (%s) %s" % ( duration_to_string(trackinfo[fileid].getDuration()), trackinfo[fileid].getFilename(), ) print " (%s) %s" % ( duration_to_string(track.getDuration()), track.title, ) return False # Well, after passing through that gauntlet, we might consider this track! return True
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)