ยปCore Development>Code coverage>Lib/plat-irix5/cddb.py

Python code coverage for Lib/plat-irix5/cddb.py

#countcontent
1n/a# This file implements a class which forms an interface to the .cddb
2n/a# directory that is maintained by SGI's cdman program.
3n/a#
4n/a# Usage is as follows:
5n/a#
6n/a# import readcd
7n/a# r = readcd.Readcd()
8n/a# c = Cddb(r.gettrackinfo())
9n/a#
10n/a# Now you can use c.artist, c.title and c.track[trackno] (where trackno
11n/a# starts at 1). When the CD is not recognized, all values will be the empty
12n/a# string.
13n/a# It is also possible to set the above mentioned variables to new values.
14n/a# You can then use c.write() to write out the changed values to the
15n/a# .cdplayerrc file.
16n/afrom warnings import warnpy3k
17n/awarnpy3k("the cddb module has been removed in Python 3.0", stacklevel=2)
18n/adel warnpy3k
19n/a
20n/aimport string, posix, os
21n/a
22n/a_cddbrc = '.cddb'
23n/a_DB_ID_NTRACKS = 5
24n/a_dbid_map = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ@_=+abcdefghijklmnopqrstuvwxyz'
25n/adef _dbid(v):
26n/a if v >= len(_dbid_map):
27n/a return string.zfill(v, 2)
28n/a else:
29n/a return _dbid_map[v]
30n/a
31n/adef tochash(toc):
32n/a if type(toc) == type(''):
33n/a tracklist = []
34n/a for i in range(2, len(toc), 4):
35n/a tracklist.append((None,
36n/a (int(toc[i:i+2]),
37n/a int(toc[i+2:i+4]))))
38n/a else:
39n/a tracklist = toc
40n/a ntracks = len(tracklist)
41n/a hash = _dbid((ntracks >> 4) & 0xF) + _dbid(ntracks & 0xF)
42n/a if ntracks <= _DB_ID_NTRACKS:
43n/a nidtracks = ntracks
44n/a else:
45n/a nidtracks = _DB_ID_NTRACKS - 1
46n/a min = 0
47n/a sec = 0
48n/a for track in tracklist:
49n/a start, length = track
50n/a min = min + length[0]
51n/a sec = sec + length[1]
52n/a min = min + sec / 60
53n/a sec = sec % 60
54n/a hash = hash + _dbid(min) + _dbid(sec)
55n/a for i in range(nidtracks):
56n/a start, length = tracklist[i]
57n/a hash = hash + _dbid(length[0]) + _dbid(length[1])
58n/a return hash
59n/a
60n/aclass Cddb:
61n/a def __init__(self, tracklist):
62n/a if os.environ.has_key('CDDB_PATH'):
63n/a path = os.environ['CDDB_PATH']
64n/a cddb_path = path.split(',')
65n/a else:
66n/a home = os.environ['HOME']
67n/a cddb_path = [home + '/' + _cddbrc]
68n/a
69n/a self._get_id(tracklist)
70n/a
71n/a for dir in cddb_path:
72n/a file = dir + '/' + self.id + '.rdb'
73n/a try:
74n/a f = open(file, 'r')
75n/a self.file = file
76n/a break
77n/a except IOError:
78n/a pass
79n/a ntracks = int(self.id[:2], 16)
80n/a self.artist = ''
81n/a self.title = ''
82n/a self.track = [None] + [''] * ntracks
83n/a self.trackartist = [None] + [''] * ntracks
84n/a self.notes = []
85n/a if not hasattr(self, 'file'):
86n/a return
87n/a import re
88n/a reg = re.compile(r'^([^.]*)\.([^:]*):[\t ]+(.*)')
89n/a while 1:
90n/a line = f.readline()
91n/a if not line:
92n/a break
93n/a match = reg.match(line)
94n/a if not match:
95n/a print 'syntax error in ' + file
96n/a continue
97n/a name1, name2, value = match.group(1, 2, 3)
98n/a if name1 == 'album':
99n/a if name2 == 'artist':
100n/a self.artist = value
101n/a elif name2 == 'title':
102n/a self.title = value
103n/a elif name2 == 'toc':
104n/a if not self.toc:
105n/a self.toc = value
106n/a if self.toc != value:
107n/a print 'toc\'s don\'t match'
108n/a elif name2 == 'notes':
109n/a self.notes.append(value)
110n/a elif name1[:5] == 'track':
111n/a try:
112n/a trackno = int(name1[5:])
113n/a except strings.atoi_error:
114n/a print 'syntax error in ' + file
115n/a continue
116n/a if trackno > ntracks:
117n/a print 'track number %r in file %r out of range' % (trackno, file)
118n/a continue
119n/a if name2 == 'title':
120n/a self.track[trackno] = value
121n/a elif name2 == 'artist':
122n/a self.trackartist[trackno] = value
123n/a f.close()
124n/a for i in range(2, len(self.track)):
125n/a track = self.track[i]
126n/a # if track title starts with `,', use initial part
127n/a # of previous track's title
128n/a if track and track[0] == ',':
129n/a try:
130n/a off = self.track[i - 1].index(',')
131n/a except ValueError:
132n/a pass
133n/a else:
134n/a self.track[i] = self.track[i-1][:off] \
135n/a + track
136n/a
137n/a def _get_id(self, tracklist):
138n/a # fill in self.id and self.toc.
139n/a # if the argument is a string ending in .rdb, the part
140n/a # upto the suffix is taken as the id.
141n/a if type(tracklist) == type(''):
142n/a if tracklist[-4:] == '.rdb':
143n/a self.id = tracklist[:-4]
144n/a self.toc = ''
145n/a return
146n/a t = []
147n/a for i in range(2, len(tracklist), 4):
148n/a t.append((None, \
149n/a (int(tracklist[i:i+2]), \
150n/a int(tracklist[i+2:i+4]))))
151n/a tracklist = t
152n/a ntracks = len(tracklist)
153n/a self.id = _dbid((ntracks >> 4) & 0xF) + _dbid(ntracks & 0xF)
154n/a if ntracks <= _DB_ID_NTRACKS:
155n/a nidtracks = ntracks
156n/a else:
157n/a nidtracks = _DB_ID_NTRACKS - 1
158n/a min = 0
159n/a sec = 0
160n/a for track in tracklist:
161n/a start, length = track
162n/a min = min + length[0]
163n/a sec = sec + length[1]
164n/a min = min + sec / 60
165n/a sec = sec % 60
166n/a self.id = self.id + _dbid(min) + _dbid(sec)
167n/a for i in range(nidtracks):
168n/a start, length = tracklist[i]
169n/a self.id = self.id + _dbid(length[0]) + _dbid(length[1])
170n/a self.toc = string.zfill(ntracks, 2)
171n/a for track in tracklist:
172n/a start, length = track
173n/a self.toc = self.toc + string.zfill(length[0], 2) + \
174n/a string.zfill(length[1], 2)
175n/a
176n/a def write(self):
177n/a import posixpath
178n/a if os.environ.has_key('CDDB_WRITE_DIR'):
179n/a dir = os.environ['CDDB_WRITE_DIR']
180n/a else:
181n/a dir = os.environ['HOME'] + '/' + _cddbrc
182n/a file = dir + '/' + self.id + '.rdb'
183n/a if posixpath.exists(file):
184n/a # make backup copy
185n/a posix.rename(file, file + '~')
186n/a f = open(file, 'w')
187n/a f.write('album.title:\t' + self.title + '\n')
188n/a f.write('album.artist:\t' + self.artist + '\n')
189n/a f.write('album.toc:\t' + self.toc + '\n')
190n/a for note in self.notes:
191n/a f.write('album.notes:\t' + note + '\n')
192n/a prevpref = None
193n/a for i in range(1, len(self.track)):
194n/a if self.trackartist[i]:
195n/a f.write('track%r.artist:\t%s\n' % (i, self.trackartist[i]))
196n/a track = self.track[i]
197n/a try:
198n/a off = track.index(',')
199n/a except ValuError:
200n/a prevpref = None
201n/a else:
202n/a if prevpref and track[:off] == prevpref:
203n/a track = track[off:]
204n/a else:
205n/a prevpref = track[:off]
206n/a f.write('track%r.title:\t%s\n' % (i, track))
207n/a f.close()