blob: d07a63e2a5c00e156ef6721520abeb24682af234 [file] [log] [blame]
Sjoerd Mullender4fff13f1992-12-14 13:16:55 +00001# 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
17import string
18
19_cddbrc = '.cddb/'
20_DB_ID_NTRACKS = 5
21_dbid_map = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ@_=+abcdefghijklmnopqrstuvwxyz'
22def _dbid(v):
23 if v >= len(_dbid_map):
24 return string.zfill(v, 2)
25 else:
26 return _dbid_map[v]
27
28class 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 Mullender8562c4c1993-03-29 10:49:59 +000090 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 Mullender4fff13f1992-12-14 13:16:55 +0000100 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()