Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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())))
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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())))
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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())
			))
Ejemplo n.º 10
0
	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()
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
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]
Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
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
Ejemplo n.º 15
0
    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()
Ejemplo n.º 16
0
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())))
Ejemplo n.º 17
0
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()))
Ejemplo n.º 18
0
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
Ejemplo n.º 19
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)
Ejemplo n.º 20
0
    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")
Ejemplo n.º 21
0
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)
Ejemplo n.º 22
0
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)