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))
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
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
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))
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)
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