Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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)