diff --git a/Lib/irix5/cddb.py b/Lib/irix5/cddb.py
index 0dee709..68d26c0 100755
--- a/Lib/irix5/cddb.py
+++ b/Lib/irix5/cddb.py
@@ -14,7 +14,7 @@
 # You can then use c.write() to write out the changed values to the
 # .cdplayerrc file.
 
-import string, posix
+import string, posix, os
 
 _cddbrc = '.cddb'
 _DB_ID_NTRACKS = 5
@@ -56,15 +56,87 @@
 	
 class Cddb:
 	def __init__(self, tracklist):
-		if posix.environ.has_key('CDDB_PATH'):
-			path = posix.environ['CDDB_PATH']
+		if os.environ.has_key('CDDB_PATH'):
+			path = os.environ['CDDB_PATH']
 			cddb_path = string.splitfields(path, ',')
 		else:
-			home = posix.environ['HOME']
+			home = os.environ['HOME']
 			cddb_path = [home + '/' + _cddbrc]
+
+		self._get_id(tracklist)
+
+		for dir in cddb_path:
+			file = dir + '/' + self.id + '.rdb'
+			try:
+				f = open(file, 'r')
+				self.file = file
+				break
+			except IOError:
+				pass
+		ntracks = string.atoi(self.id[:2], 16)
 		self.artist = ''
 		self.title = ''
+		self.track = [None] + [''] * ntracks
+		if not hasattr(self, 'file'):
+			return
+		import regex
+		reg = regex.compile('^\\([^.]*\\)\\.\\([^:]*\\):\t\\(.*\\)')
+		while 1:
+			line = f.readline()
+			if not line:
+				break
+			if reg.match(line) == -1:
+				print 'syntax error in ' + file
+				continue
+			name1 = line[reg.regs[1][0]:reg.regs[1][1]]
+			name2 = line[reg.regs[2][0]:reg.regs[2][1]]
+			value = line[reg.regs[3][0]:reg.regs[3][1]]
+			if name1 == 'album':
+				if name2 == 'artist':
+					self.artist = value
+				elif name2 == 'title':
+					self.title = value
+				elif name2 == 'toc':
+					if not self.toc:
+						self.toc = value
+					if self.toc != value:
+						print 'toc\'s don\'t match'
+			elif name1[:5] == 'track':
+				try:
+					trackno = string.atoi(name1[5:])
+				except strings.atoi_error:
+					print 'syntax error in ' + file
+					continue
+				if trackno > ntracks:
+					print 'track number ' + `trackno` + \
+						  ' in file ' + file + \
+						  ' out of range'
+					continue
+				self.track[trackno] = value
+		f.close()
+		for i in range(2, len(self.track)):
+			track = self.track[i]
+			# if track title starts with `,', use initial part
+			# of previous track's title
+			if track and track[0] == ',':
+				try:
+					off = string.index(self.track[i - 1],
+							   ',')
+				except string.index_error:
+					pass
+				else:
+					self.track[i] = self.track[i-1][:off] \
+							+ track
+
+	def _get_id(self, tracklist):
+		# fill in self.id and self.toc.
+		# if the argument is a string ending in .rdb, the part
+		# upto the suffix is taken as the id.
 		if type(tracklist) == type(''):
+			if tracklist[-4:] == '.rdb':
+				self.id = tracklist[:-4]
+				self.toc = ''
+				return
 			t = []
 			for i in range(2, len(tracklist), 4):
 				t.append((None, \
@@ -72,7 +144,6 @@
 					   string.atoi(tracklist[i+2:i+4]))))
 			tracklist = t
 		ntracks = len(tracklist)
-		self.track = [None] + [''] * ntracks
 		self.id = _dbid((ntracks >> 4) & 0xF) + _dbid(ntracks & 0xF)
 		if ntracks <= _DB_ID_NTRACKS:
 			nidtracks = ntracks
@@ -95,69 +166,13 @@
 			start, length = track
 			self.toc = self.toc + string.zfill(length[0], 2) + \
 				  string.zfill(length[1], 2)
-		for dir in cddb_path:
-			file = dir + '/' + self.id + '.rdb'
-			try:
-				f = open(file, 'r')
-				self.file = file
-				break
-			except IOError:
-				pass
-		if not hasattr(self, 'file'):
-			return
-		import regex
-		reg = regex.compile('^\\([^.]*\\)\\.\\([^:]*\\):\t\\(.*\\)')
-		while 1:
-			line = f.readline()
-			if not line:
-				break
-			if reg.match(line) == -1:
-				print 'syntax error in ' + file
-				continue
-			name1 = line[reg.regs[1][0]:reg.regs[1][1]]
-			name2 = line[reg.regs[2][0]:reg.regs[2][1]]
-			value = line[reg.regs[3][0]:reg.regs[3][1]]
-			if name1 == 'album':
-				if name2 == 'artist':
-					self.artist = value
-				elif name2 == 'title':
-					self.title = value
-				elif name2 == 'toc':
-					if self.toc != value:
-						print 'toc\'s don\'t match'
-			elif name1[:5] == 'track':
-				try:
-					trackno = string.atoi(name1[5:])
-				except strings.atoi_error:
-					print 'syntax error in ' + file
-					continue
-				if trackno > ntracks:
-					print 'track number ' + `trackno` + \
-						  ' in file ' + file + \
-						  ' out of range'
-					continue
-				self.track[trackno] = value
-		f.close()
-		for i in range(2, len(self.track)):
-			track = self.track[i]
-			# if track title starts with `,', use initial part
-			# of previous track's title
-			if track[0] == ',':
-				try:
-					off = string.index(self.track[i - 1],
-							   ',')
-				except string.index_error:
-					pass
-				else:
-					self.track[i] = self.track[i-1][:off] \
-							+ track
 
 	def write(self):
 		import posixpath
-		if posix.environ.has_key('CDDB_WRITE_DIR'):
-			dir = posix.environ['CDDB_WRITE_DIR']
+		if os.environ.has_key('CDDB_WRITE_DIR'):
+			dir = os.environ['CDDB_WRITE_DIR']
 		else:
-			dir = posix.environ['HOME'] + '/' + _cddbrc
+			dir = os.environ['HOME'] + '/' + _cddbrc
 		file = dir + '/' + self.id + '.rdb'
 		if posixpath.exists(file):
 			# make backup copy
diff --git a/Lib/plat-irix5/cddb.py b/Lib/plat-irix5/cddb.py
index 0dee709..68d26c0 100755
--- a/Lib/plat-irix5/cddb.py
+++ b/Lib/plat-irix5/cddb.py
@@ -14,7 +14,7 @@
 # You can then use c.write() to write out the changed values to the
 # .cdplayerrc file.
 
-import string, posix
+import string, posix, os
 
 _cddbrc = '.cddb'
 _DB_ID_NTRACKS = 5
@@ -56,15 +56,87 @@
 	
 class Cddb:
 	def __init__(self, tracklist):
-		if posix.environ.has_key('CDDB_PATH'):
-			path = posix.environ['CDDB_PATH']
+		if os.environ.has_key('CDDB_PATH'):
+			path = os.environ['CDDB_PATH']
 			cddb_path = string.splitfields(path, ',')
 		else:
-			home = posix.environ['HOME']
+			home = os.environ['HOME']
 			cddb_path = [home + '/' + _cddbrc]
+
+		self._get_id(tracklist)
+
+		for dir in cddb_path:
+			file = dir + '/' + self.id + '.rdb'
+			try:
+				f = open(file, 'r')
+				self.file = file
+				break
+			except IOError:
+				pass
+		ntracks = string.atoi(self.id[:2], 16)
 		self.artist = ''
 		self.title = ''
+		self.track = [None] + [''] * ntracks
+		if not hasattr(self, 'file'):
+			return
+		import regex
+		reg = regex.compile('^\\([^.]*\\)\\.\\([^:]*\\):\t\\(.*\\)')
+		while 1:
+			line = f.readline()
+			if not line:
+				break
+			if reg.match(line) == -1:
+				print 'syntax error in ' + file
+				continue
+			name1 = line[reg.regs[1][0]:reg.regs[1][1]]
+			name2 = line[reg.regs[2][0]:reg.regs[2][1]]
+			value = line[reg.regs[3][0]:reg.regs[3][1]]
+			if name1 == 'album':
+				if name2 == 'artist':
+					self.artist = value
+				elif name2 == 'title':
+					self.title = value
+				elif name2 == 'toc':
+					if not self.toc:
+						self.toc = value
+					if self.toc != value:
+						print 'toc\'s don\'t match'
+			elif name1[:5] == 'track':
+				try:
+					trackno = string.atoi(name1[5:])
+				except strings.atoi_error:
+					print 'syntax error in ' + file
+					continue
+				if trackno > ntracks:
+					print 'track number ' + `trackno` + \
+						  ' in file ' + file + \
+						  ' out of range'
+					continue
+				self.track[trackno] = value
+		f.close()
+		for i in range(2, len(self.track)):
+			track = self.track[i]
+			# if track title starts with `,', use initial part
+			# of previous track's title
+			if track and track[0] == ',':
+				try:
+					off = string.index(self.track[i - 1],
+							   ',')
+				except string.index_error:
+					pass
+				else:
+					self.track[i] = self.track[i-1][:off] \
+							+ track
+
+	def _get_id(self, tracklist):
+		# fill in self.id and self.toc.
+		# if the argument is a string ending in .rdb, the part
+		# upto the suffix is taken as the id.
 		if type(tracklist) == type(''):
+			if tracklist[-4:] == '.rdb':
+				self.id = tracklist[:-4]
+				self.toc = ''
+				return
 			t = []
 			for i in range(2, len(tracklist), 4):
 				t.append((None, \
@@ -72,7 +144,6 @@
 					   string.atoi(tracklist[i+2:i+4]))))
 			tracklist = t
 		ntracks = len(tracklist)
-		self.track = [None] + [''] * ntracks
 		self.id = _dbid((ntracks >> 4) & 0xF) + _dbid(ntracks & 0xF)
 		if ntracks <= _DB_ID_NTRACKS:
 			nidtracks = ntracks
@@ -95,69 +166,13 @@
 			start, length = track
 			self.toc = self.toc + string.zfill(length[0], 2) + \
 				  string.zfill(length[1], 2)
-		for dir in cddb_path:
-			file = dir + '/' + self.id + '.rdb'
-			try:
-				f = open(file, 'r')
-				self.file = file
-				break
-			except IOError:
-				pass
-		if not hasattr(self, 'file'):
-			return
-		import regex
-		reg = regex.compile('^\\([^.]*\\)\\.\\([^:]*\\):\t\\(.*\\)')
-		while 1:
-			line = f.readline()
-			if not line:
-				break
-			if reg.match(line) == -1:
-				print 'syntax error in ' + file
-				continue
-			name1 = line[reg.regs[1][0]:reg.regs[1][1]]
-			name2 = line[reg.regs[2][0]:reg.regs[2][1]]
-			value = line[reg.regs[3][0]:reg.regs[3][1]]
-			if name1 == 'album':
-				if name2 == 'artist':
-					self.artist = value
-				elif name2 == 'title':
-					self.title = value
-				elif name2 == 'toc':
-					if self.toc != value:
-						print 'toc\'s don\'t match'
-			elif name1[:5] == 'track':
-				try:
-					trackno = string.atoi(name1[5:])
-				except strings.atoi_error:
-					print 'syntax error in ' + file
-					continue
-				if trackno > ntracks:
-					print 'track number ' + `trackno` + \
-						  ' in file ' + file + \
-						  ' out of range'
-					continue
-				self.track[trackno] = value
-		f.close()
-		for i in range(2, len(self.track)):
-			track = self.track[i]
-			# if track title starts with `,', use initial part
-			# of previous track's title
-			if track[0] == ',':
-				try:
-					off = string.index(self.track[i - 1],
-							   ',')
-				except string.index_error:
-					pass
-				else:
-					self.track[i] = self.track[i-1][:off] \
-							+ track
 
 	def write(self):
 		import posixpath
-		if posix.environ.has_key('CDDB_WRITE_DIR'):
-			dir = posix.environ['CDDB_WRITE_DIR']
+		if os.environ.has_key('CDDB_WRITE_DIR'):
+			dir = os.environ['CDDB_WRITE_DIR']
 		else:
-			dir = posix.environ['HOME'] + '/' + _cddbrc
+			dir = os.environ['HOME'] + '/' + _cddbrc
 		file = dir + '/' + self.id + '.rdb'
 		if posixpath.exists(file):
 			# make backup copy
