#!/usr/bin/env python def checksum(n): ret = 0 while n > 0: n, m = divmod(n, 10) ret += m return ret def discid(tracks): '''Pass in a list of tuples. Each tuple must contain (minutes, seconds) of the track. The last tuple in the list should contain the start of lead out.''' last = len(tracks) - 1 tracksms = map(lambda x: x[0] * 60 + x[1], tracks) n = sum(map(checksum, tracksms[:-1])) t = tracksms[-1] - tracksms[0] discid = (long(n) % 0xff) << 24 | t << 8 | last ret = [ discid, last ] try: tracksframes = map(lambda x: x[0] * 60 * 75 + x[1] * 75 + x[2], tracks) ret.extend(tracksframes[:-1]) ret.append(tracksms[-1]) except IndexError: tracksframes = map(lambda x: x[0] * 60 * 75 + x[1] * 75, tracks) ret.extend(tracksframes[:-1]) ret.append(tracksms[-1]) return ret if __name__ == '__main__': tracks = [ (0, 3, 71), (5, 44, 0) ] tracksdiskinfo = [ 0x03015501, 1, 296, 344 ] diskinfo = discid(tracks) assert diskinfo == tracksdiskinfo print '%08x' % diskinfo[0], print ' '.join(map(str, diskinfo[1:]))