def from_tracks(cls, tracks): """given a sorted list of AudioFile objects, returns DiscID for those tracks as if they were a CD""" from audiotools import has_pre_gap_track from audiotools.freedb import DiscID as FDiscID if not has_pre_gap_track(tracks): offsets = [0] for track in tracks[0:-1]: offsets.append(offsets[-1] + track.cd_frames()) return cls(track_numbers=range(1, len(tracks) + 1), track_offsets=offsets, lead_out_offset=sum(t.cd_frames() for t in tracks), freedb_disc_id=FDiscID.from_tracks(tracks)) else: offsets = [tracks[0].cd_frames()] for track in tracks[1:-1]: offsets.append(offsets[-1] + track.cd_frames()) return cls(track_numbers=range(1, len(tracks)), track_offsets=offsets, lead_out_offset=sum(t.cd_frames() for t in tracks), freedb_disc_id=FDiscID.from_tracks(tracks))
def from_cddareader(cls, cddareader): """given a CDDAReader object, returns a DiscID for that object""" from audiotools.freedb import DiscID as FDiscID offsets = cddareader.track_offsets return cls(track_numbers=list(sorted(offsets.keys())), track_offsets=[(offsets[k] // 588) for k in sorted(offsets.keys())], lead_out_offset=cddareader.last_sector + 1, freedb_disc_id=FDiscID.from_cddareader(cddareader))
def freedb_disc_id(self): """returns a FreeDB DiscID object""" from audiotools.freedb import DiscID PTS_PER_FRAME = DVDAudio.PTS_PER_SECOND // 75 offsets = [150] for track in self.tracks[0:-1]: offsets.append(offsets[-1] + (track.pts_length // PTS_PER_FRAME)) return DiscID(offsets=offsets, total_length=self.pts_length // DVDAudio.PTS_PER_SECOND, track_count=len(self))
def from_sheet(cls, sheet, total_pcm_frames, sample_rate): """given a Sheet object length of the album in PCM frames and sample rate of the disc, returns a DiscID for that CD""" from audiotools.freedb import DiscID as FDiscID return cls(track_numbers=range(1, len(sheet) + 1), track_offsets=[(int(t.index(1).offset() * 75)) for t in sheet], lead_out_offset=total_pcm_frames * 75 // sample_rate, freedb_disc_id=FDiscID.from_sheet(sheet, total_pcm_frames, sample_rate))
def musicbrainz_disc_id(self): """returns a MusicBrainz DiscID object""" from audiotools.musicbrainz import DiscID PTS_PER_FRAME = DVDAudio.PTS_PER_SECOND // 75 offsets = [150] for track in self.tracks[0:-1]: offsets.append(offsets[-1] + (track.pts_length // PTS_PER_FRAME)) return DiscID(first_track_number=1, last_track_number=len(self), lead_out_offset=self.pts_length // PTS_PER_FRAME, offsets=offsets)