def test(self, tracknum, file):
		#print "file",file
		(trackname, artist, puid) = self.calcpuid(file)
		if puid is None:
			return
		self.puid = puid
		#print "puid",puid,"trackname",trackname,"dur",(dur/1000)
		track = lookups.get_track_by_id(self.release.tracks[tracknum].id)
		#print "track len",(track.duration/1000)
		#print "puids",track.puids

		puidtracks = lookups.get_tracks_by_puid(puid)
		releaseToTrack = {}
		for pt in puidtracks:
			relId = pt.releases[0].id
			if relId not in releaseToTrack:
				releaseToTrack[relId] = [pt.id]
			else:
				releaseToTrack[relId].append(pt.id)
		if self.release.id not in releaseToTrack:
			self.l.write("puid http://musicbrainz.org/show/puid/?puid=%s is not on track %s.html Might just have not been submitted" % (puid, track.id))
		elif len(releaseToTrack[self.release.id]) > 1:
			self.l.write("Track %d (%s.html)" % (tracknum+1, track.id))
			self.l.write("Puid http://musicbrainz.org/show/puid/?puid=%s" % puid)
			self.l.write("    This puid links to more than 1 track on the same release")
			for t in releaseToTrack[self.release.id]:
				if t != track.id:
					self.crossref(t)
		elif len(releaseToTrack[self.release.id]) == 1:
			relTrack = os.path.basename(releaseToTrack[self.release.id][0])
			tagTrack = self.fileTags[tracknum][tag.TRACK_ID]
			if relTrack != tagTrack:
				self.l.write("Track %d (%s.html)" % (tracknum+1, track.id))
				self.l.write("    Based on the puid, this should be track %s, but it's %s" % (relTrack, tagTrack))
Example #2
0
	def getTracks(self):
		"Return the tracks"
		if self.tracks is None:
			if self.getPUID() is None:
				return []
			self.tracks = lookups.get_tracks_by_puid(self.getPUID())
		return self.tracks
Example #3
0
def find_more_tracks(tracks):
	# There is a n:n mapping of puid's to tracks.
	# All puid's that match a track should be the same song.
	# Thus if PUIDa maps to TrackA, which also has PUIDb
	# and PUIDb maps to TrackB too, then PUIDa should map to
	# TrackB too...
	tracks=tracks[:]
	donetracks=[]
	donepuids=[]
	donetrackids=[]
	paths={}

	while tracks!=[]:
		t=tracks.pop()
		donetracks.append(t)
		yield t
		newt = lookups.get_track_by_id(t.id)
		for p in newt.puids:
			if p in donepuids:
				continue
			donepuids.append(p)
			ts = lookups.get_tracks_by_puid(p)
			for u in ts:
				if u.id in donetrackids:
					continue
				tracks.append(u)
				donetrackids.append(u.id)
				#print u.id,[y.title for y in u.releases]
				if t.id in paths:
					path=paths[t.id]
				else:
					path=[]
				path=path+[u.releases[0].title]
				#print path
				paths[u.id]=path
Example #4
0
 def getTracks(self):
     "Return the tracks"
     if self.tracks is None:
         if self.getPUID() is None:
             return []
         self.tracks = lookups.get_tracks_by_puid(self.getPUID())
     return self.tracks
Example #5
0
    def test(self, tracknum, file):
        #print "file",file
        (trackname, artist, puid) = self.calcpuid(file)
        if puid is None:
            return
        self.puid = puid
        #print "puid",puid,"trackname",trackname,"dur",(dur/1000)
        track = lookups.get_track_by_id(self.release.tracks[tracknum].id)
        #print "track len",(track.duration/1000)
        #print "puids",track.puids

        puidtracks = lookups.get_tracks_by_puid(puid)
        releaseToTrack = {}
        for pt in puidtracks:
            relId = pt.releases[0].id
            if relId not in releaseToTrack:
                releaseToTrack[relId] = [pt.id]
            else:
                releaseToTrack[relId].append(pt.id)
        if self.release.id not in releaseToTrack:
            self.l.write(
                "puid http://musicbrainz.org/show/puid/?puid=%s is not on track %s.html Might just have not been submitted"
                % (puid, track.id))
        elif len(releaseToTrack[self.release.id]) > 1:
            self.l.write("Track %d (%s.html)" % (tracknum + 1, track.id))
            self.l.write("Puid http://musicbrainz.org/show/puid/?puid=%s" %
                         puid)
            self.l.write(
                "    This puid links to more than 1 track on the same release")
            for t in releaseToTrack[self.release.id]:
                if t != track.id:
                    self.crossref(t)
        elif len(releaseToTrack[self.release.id]) == 1:
            relTrack = os.path.basename(releaseToTrack[self.release.id][0])
            tagTrack = self.fileTags[tracknum][tag.TRACK_ID]
            if relTrack != tagTrack:
                self.l.write("Track %d (%s.html)" % (tracknum + 1, track.id))
                self.l.write(
                    "    Based on the puid, this should be track %s, but it's %s"
                    % (relTrack, tagTrack))
Example #6
0
def generate_track_puid_possibilities(tracks):
	"""Return all track ids with matching the tracks.

	Args:
		track: A list of tracks to match against.
	
	Yields:
		All releated track_ids. There is a n:n mapping of puid's to tracks.
		Therefore all puid's that match a track should be the same song.
		Thus if PUIDa maps to TrackA, which also has PUIDb
		and PUIDb maps to TrackB too, then PUIDa should map to
		TrackB too...
	"""
	tracks = tracks[:]
	done_track_ids = set()
	done_puids=set()

	# Don't return the tracks that were passed in.
	for track in tracks:
		done_track_ids.add(track.id)

	while tracks:
		t = tracks.pop()
		#print "Looking for any tracks related to %s" % t.title
		if not t.puids:
			track = lookups.get_track_by_id(t.id)
		for puid in track.puids:
			if puid in done_puids:
				continue
			done_puids.add(puid)
			tracks2 = lookups.get_tracks_by_puid(puid)
			for t2 in tracks2:
				if t2.id in done_track_ids:
					continue
				done_track_ids.add(t2.id)
				yield t2
				tracks.append(t2)
Example #7
0
def get_file_info(fname):
	print "identifying",fname
	#sys.stdout.write("identifying "+os.path.basename(fname)+"\r\x1B[K")
	#sys.stdout.flush()
	fhash = md5.md5(open(fname,"r").read()).hexdigest()
	if fhash in fileinfocache:
		return fileinfocache[fhash]
	# While testing this uses a fixed name in /tmp
	# and checks if it exists, and doesn't decode if it does.
	# This is for speed while debugging, should be changed with
	# tmpname later
	toname=os.path.join("/tmp/fingerprint.wav")
	if not os.path.exists(toname):
		sys.stdout.write("decoding"+os.path.basename(fname)+"\r\x1B[K")
		sys.stdout.flush()
		decode(fname,toname)
	sys.stdout.write("Generating fingerprint\r")
	sys.stdout.flush()
	(fp, dur) = fingerprint.fingerprint(toname)
	os.unlink(toname)

	sys.stdout.write("Fetching fingerprint info\r")
	sys.stdout.flush()
	(trackname, artist, puid) = musicdns.lookup_fingerprint(fp, dur, key)
	print "***",`artist`,`trackname`,puid
	if puid is None:
		raise FingerprintFailed()
	sys.stdout.write("Looking up PUID\r")
	sys.stdout.flush()
	tracks = lookups.get_tracks_by_puid(puid)
	data=(fname,artist,trackname,dur,tracks,puid)
	if tracks!=[]:
		fileinfocache[fhash]=data
	else:
		print "Musicbrainz doesn't know about this track, not caching"
	return data