cdplayer.py 2.36 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2 3 4 5 6
# This file implements a class which forms an interface to the .cdplayerrc
# file that is maintained by SGI's cdplayer program.
#
# Usage is as follows:
#
# import readcd
7 8
# r = readcd.Readcd()
# c = Cdplayer(r.gettrackinfo())
Guido van Rossum's avatar
Guido van Rossum committed
9 10 11 12 13 14 15 16 17 18
#
# Now you can use c.artist, c.title and c.track[trackno] (where trackno
# starts at 1).  When the CD is not recognized, all values will be the empty
# string.
# It is also possible to set the above mentioned variables to new values.
# You can then use c.write() to write out the changed values to the
# .cdplayerrc file.

cdplayerrc = '.cdplayerrc'

19
class Cdplayer:
20
	def __init__(self, tracklist):
Guido van Rossum's avatar
Guido van Rossum committed
21 22 23
		import string
		self.artist = ''
		self.title = ''
24 25 26 27 28 29 30
		if type(tracklist) == type(''):
			t = []
			for i in range(2, len(tracklist), 4):
				t.append((None, \
					  (string.atoi(tracklist[i:i+2]), \
					   string.atoi(tracklist[i+2:i+4]))))
			tracklist = t
Guido van Rossum's avatar
Guido van Rossum committed
31 32 33 34 35 36 37 38 39 40
		self.track = [None] + [''] * len(tracklist)
		self.id = 'd' + string.zfill(len(tracklist), 2)
		for track in tracklist:
			start, length = track
			self.id = self.id + string.zfill(length[0], 2) + \
				  string.zfill(length[1], 2)
		try:
			import posix
			f = open(posix.environ['HOME'] + '/' + cdplayerrc, 'r')
		except IOError:
41
			return
42 43
		import re
		reg = re.compile(r'^([^:]*):\t(.*)')
Guido van Rossum's avatar
Guido van Rossum committed
44 45 46 47 48 49 50 51
		s = self.id + '.'
		l = len(s)
		while 1:
			line = f.readline()
			if line == '':
				break
			if line[:l] == s:
				line = line[l:]
52 53
				match = reg.match(line)
				if not match:
Guido van Rossum's avatar
Guido van Rossum committed
54 55
					print 'syntax error in ~/' + cdplayerrc
					continue
56
				name, value = match.group(1, 2)
Guido van Rossum's avatar
Guido van Rossum committed
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
				if name == 'title':
					self.title = value
				elif name == 'artist':
					self.artist = value
				elif name[:5] == 'track':
					trackno = string.atoi(name[6:])
					self.track[trackno] = value
		f.close()

	def write(self):
		import posix
		filename = posix.environ['HOME'] + '/' + cdplayerrc
		try:
			old = open(filename, 'r')
		except IOError:
			old = open('/dev/null', 'r')
		new = open(filename + '.new', 'w')
		s = self.id + '.'
		l = len(s)
		while 1:
			line = old.readline()
			if line == '':
				break
80
			if line[:l] != s:
Guido van Rossum's avatar
Guido van Rossum committed
81 82 83 84 85 86 87 88 89
				new.write(line)
		new.write(self.id + '.title:\t' + self.title + '\n')
		new.write(self.id + '.artist:\t' + self.artist + '\n')
		for i in range(1, len(self.track)):
			new.write(self.id + '.track.' + `i` + ':\t' + \
				  self.track[i] + '\n')
		old.close()
		new.close()
		posix.rename(filename + '.new', filename)