[4] | 1 | #!/usr/bin/env python |
---|
| 2 | |
---|
| 3 | # Module for fetching information about an audio compact disc and |
---|
| 4 | # returning it in a format friendly to CDDB. |
---|
| 5 | |
---|
| 6 | # If called from the command line, will print out disc info in a |
---|
| 7 | # format identical to Robert Woodcock's 'cd-discid' program. |
---|
| 8 | |
---|
| 9 | # Written 17 Nov 1999 by Ben Gertzfield <che@debian.org> |
---|
| 10 | # This work is released under the GNU GPL, version 2 or later. |
---|
| 11 | |
---|
| 12 | # Release version 1.3 |
---|
| 13 | |
---|
| 14 | |
---|
| 15 | # changes for mmpython: |
---|
| 16 | # |
---|
| 17 | # $Log: DiscID.py,v $ |
---|
| 18 | # Revision 1.4 2004/11/14 19:26:38 dischi |
---|
| 19 | # fix future warning |
---|
| 20 | # |
---|
| 21 | # Revision 1.3 2003/06/23 19:26:16 dischi |
---|
| 22 | # Fixed bug in the cdrommodule that the file was not closed after usage. |
---|
| 23 | # The result was a drive you can't eject while the program (e.g. Freevo) |
---|
| 24 | # is running. Added cvs log for DiscID and cdrommodule to keep track of |
---|
| 25 | # all changes we did for mmpython. |
---|
| 26 | # |
---|
| 27 | # |
---|
| 28 | |
---|
| 29 | try: |
---|
| 30 | import cdrom, sys |
---|
| 31 | except ImportError: |
---|
| 32 | # Seems cdrom has either not been compiler or is not supported |
---|
| 33 | # on this System |
---|
| 34 | pass |
---|
| 35 | |
---|
| 36 | |
---|
| 37 | def cddb_sum(n): |
---|
| 38 | ret = 0 |
---|
| 39 | |
---|
| 40 | while n > 0: |
---|
| 41 | ret = ret + (n % 10) |
---|
| 42 | n = n / 10 |
---|
| 43 | |
---|
| 44 | return ret |
---|
| 45 | |
---|
| 46 | def disc_id(device): |
---|
| 47 | device = cdrom.open(device) |
---|
| 48 | (first, last) = cdrom.toc_header(device) |
---|
| 49 | |
---|
| 50 | track_frames = [] |
---|
| 51 | checksum = 0 |
---|
| 52 | |
---|
| 53 | for i in range(first, last + 1): |
---|
| 54 | (min, sec, frame) = cdrom.toc_entry(device, i) |
---|
| 55 | checksum = checksum + cddb_sum(min*60 + sec) |
---|
| 56 | track_frames.append(min*60*75 + sec*75 + frame) |
---|
| 57 | |
---|
| 58 | (min, sec, frame) = cdrom.leadout(device) |
---|
| 59 | track_frames.append(min*60*75 + sec*75 + frame) |
---|
| 60 | |
---|
| 61 | total_time = (track_frames[-1] / 75) - (track_frames[0] / 75) |
---|
| 62 | |
---|
| 63 | discid = ((long(checksum) % 0xff) << 24 | total_time << 8 | last) |
---|
| 64 | cdrom.close(device) |
---|
| 65 | return [discid, last] + track_frames[:-1] + [ track_frames[-1] / 75 ] |
---|
| 66 | |
---|
| 67 | if __name__ == '__main__': |
---|
| 68 | |
---|
| 69 | dev_name = None |
---|
| 70 | device = None |
---|
| 71 | |
---|
| 72 | if len(sys.argv) >= 2: |
---|
| 73 | dev_name = sys.argv[1] |
---|
| 74 | |
---|
| 75 | if dev_name: |
---|
| 76 | device = open(dev_name) |
---|
| 77 | else: |
---|
| 78 | device = open() |
---|
| 79 | |
---|
| 80 | disc_info = disc_id(device) |
---|
| 81 | |
---|
| 82 | print ('%08lx' % disc_info[0]), |
---|
| 83 | |
---|
| 84 | for i in disc_info[1:]: |
---|
| 85 | print ('%d' % i), |
---|