Sjoerd Mullender | 4fff13f | 1992-12-14 13:16:55 +0000 | [diff] [blame] | 1 | # This file implements a class which forms an interface to the .cddb |
| 2 | # directory that is maintained by SGI's cdman program. |
| 3 | # |
| 4 | # Usage is as follows: |
| 5 | # |
| 6 | # import readcd |
| 7 | # r = readcd.Readcd().init() |
| 8 | # c = Cddb().init(r.gettrackinfo()) |
| 9 | # |
| 10 | # Now you can use c.artist, c.title and c.track[trackno] (where trackno |
| 11 | # starts at 1). When the CD is not recognized, all values will be the empty |
| 12 | # string. |
| 13 | # It is also possible to set the above mentioned variables to new values. |
| 14 | # You can then use c.write() to write out the changed values to the |
| 15 | # .cdplayerrc file. |
| 16 | |
| 17 | import string |
| 18 | |
| 19 | _cddbrc = '.cddb/' |
| 20 | _DB_ID_NTRACKS = 5 |
| 21 | _dbid_map = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ@_=+abcdefghijklmnopqrstuvwxyz' |
| 22 | def _dbid(v): |
| 23 | if v >= len(_dbid_map): |
| 24 | return string.zfill(v, 2) |
| 25 | else: |
| 26 | return _dbid_map[v] |
| 27 | |
| 28 | class Cddb(): |
| 29 | def init(self, tracklist): |
| 30 | self.artist = '' |
| 31 | self.title = '' |
| 32 | if type(tracklist) == type(''): |
| 33 | t = [] |
| 34 | for i in range(2, len(tracklist), 4): |
| 35 | t.append((None, \ |
| 36 | (string.atoi(tracklist[i:i+2]), \ |
| 37 | string.atoi(tracklist[i+2:i+4])))) |
| 38 | tracklist = t |
| 39 | ntracks = len(tracklist) |
| 40 | self.track = [None] + [''] * ntracks |
| 41 | self.id = _dbid((ntracks >> 4) & 0xF) + _dbid(ntracks & 0xF) |
| 42 | if ntracks <= _DB_ID_NTRACKS: |
| 43 | nidtracks = ntracks |
| 44 | else: |
| 45 | nidtracks = _DB_ID_NTRACKS - 1 |
| 46 | min = 0 |
| 47 | sec = 0 |
| 48 | for track in tracklist: |
| 49 | start, length = track |
| 50 | min = min + length[0] |
| 51 | sec = sec + length[1] |
| 52 | min = min + sec / 60 |
| 53 | sec = sec % 60 |
| 54 | self.id = self.id + _dbid(min) + _dbid(sec) |
| 55 | for i in range(nidtracks): |
| 56 | start, length = tracklist[i] |
| 57 | self.id = self.id + _dbid(length[0]) + _dbid(length[1]) |
| 58 | self.toc = string.zfill(ntracks, 2) |
| 59 | for track in tracklist: |
| 60 | start, length = track |
| 61 | self.toc = self.toc + string.zfill(length[0], 2) + \ |
| 62 | string.zfill(length[1], 2) |
| 63 | try: |
| 64 | import posix |
| 65 | file = posix.environ['HOME'] + '/' + _cddbrc + self.id + '.rdb' |
| 66 | f = open(file, 'r') |
| 67 | except IOError: |
| 68 | return self |
| 69 | import regex |
| 70 | reg = regex.compile('^\\([^.]*\\)\\.\\([^:]*\\):\t\\(.*\\)') |
| 71 | while 1: |
| 72 | line = f.readline() |
| 73 | if not line: |
| 74 | break |
| 75 | if reg.match(line) == -1: |
| 76 | print 'syntax error in ' + file |
| 77 | continue |
| 78 | name1 = line[reg.regs[1][0]:reg.regs[1][1]] |
| 79 | name2 = line[reg.regs[2][0]:reg.regs[2][1]] |
| 80 | value = line[reg.regs[3][0]:reg.regs[3][1]] |
| 81 | if name1 == 'album': |
| 82 | if name2 == 'artist': |
| 83 | self.artist = value |
| 84 | elif name2 == 'title': |
| 85 | self.title = value |
| 86 | elif name2 == 'toc': |
| 87 | if self.toc != value: |
| 88 | print 'toc\'s don\'t match' |
| 89 | elif name1[:5] == 'track': |
Sjoerd Mullender | 8562c4c | 1993-03-29 10:49:59 +0000 | [diff] [blame^] | 90 | try: |
| 91 | trackno = string.atoi(name1[5:]) |
| 92 | except strings.atoi_error: |
| 93 | print 'syntax error in ' + file |
| 94 | continue |
| 95 | if trackno > ntracks: |
| 96 | print 'track number ' + trackno + \ |
| 97 | ' in file ' + file + \ |
| 98 | ' out of range' |
| 99 | continue |
Sjoerd Mullender | 4fff13f | 1992-12-14 13:16:55 +0000 | [diff] [blame] | 100 | self.track[trackno] = value |
| 101 | f.close() |
| 102 | return self |
| 103 | |
| 104 | def write(self): |
| 105 | import posix |
| 106 | file = posix.environ['HOME'] + '/' + _cddbrc + self.id + '.rdb' |
| 107 | f = open(file, 'w') |
| 108 | f.write('album.title:\t' + self.title + '\n') |
| 109 | f.write('album.artist:\t' + self.artist + '\n') |
| 110 | f.write('album.toc:\t' + self.toc + '\n') |
| 111 | for i in range(1, len(self.track)): |
| 112 | f.write('track' + `i` + '.title:\t' + self.track[i] + '\n') |
| 113 | f.close() |