| 
									
										
										
										
											1997-01-15 19:19:19 +00:00
										 |  |  | # 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, \ | 
					
						
							|  |  |  | 					  (string.atoi(tracklist[i:i+2]), \ | 
					
						
							|  |  |  | 					   string.atoi(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 | 
					
						
							| 
									
										
										
										
											1997-10-22 21:00:49 +00:00
										 |  |  | 		import re | 
					
						
							|  |  |  | 		reg = re.compile(r'^([^:]*):\t(.*)') | 
					
						
							| 
									
										
										
										
											1997-01-15 19:19:19 +00:00
										 |  |  | 		s = self.id + '.' | 
					
						
							|  |  |  | 		l = len(s) | 
					
						
							|  |  |  | 		while 1: | 
					
						
							|  |  |  | 			line = f.readline() | 
					
						
							|  |  |  | 			if line == '': | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 			if line[:l] == s: | 
					
						
							|  |  |  | 				line = line[l:] | 
					
						
							| 
									
										
										
										
											1997-10-22 21:00:49 +00:00
										 |  |  | 				match = reg.match(line) | 
					
						
							|  |  |  | 				if not match: | 
					
						
							| 
									
										
										
										
											1997-01-15 19:19:19 +00:00
										 |  |  | 					print 'syntax error in ~/' + cdplayerrc | 
					
						
							|  |  |  | 					continue | 
					
						
							| 
									
										
										
										
											2000-07-16 11:57:20 +00:00
										 |  |  | 				name, value = match.group(1, 2) | 
					
						
							| 
									
										
										
										
											1997-01-15 19:19:19 +00:00
										 |  |  | 				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 | 
					
						
							|  |  |  | 			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) |