# 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
# r = readcd.Readcd()
# c = Cdplayer(r.gettrackinfo())
#
# 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'

class Cdplayer:
	def __init__(self, tracklist):
		import string
		self.artist = ''
		self.title = ''
		if type(tracklist) == type(''):
			t = []
			for i in range(2, len(tracklist), 4):
				t.append((None, \
					  (int(tracklist[i:i+2]), \
					   int(tracklist[i+2:i+4]))))
			tracklist = t
		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:
			return
		import re
		reg = re.compile(r'^([^:]*):\t(.*)')
		s = self.id + '.'
		l = len(s)
		while 1:
			line = f.readline()
			if line == '':
				break
			if line[:l] == s:
				line = line[l:]
				match = reg.match(line)
				if not match:
					print 'syntax error in ~/' + cdplayerrc
					continue
				name, value = match.group(1, 2)
				if name == 'title':
					self.title = value
				elif name == 'artist':
					self.artist = value
				elif name[:5] == 'track':
					trackno = int(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
			if line[:l] != s:
				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)
