cdplayer.py 2.95 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 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    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
        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 = string.atoi(name[6:])
                    self.track[trackno] = value
        f.close()
Guido van Rossum's avatar
Guido van Rossum committed
65

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    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('%s.track.%r:\t%s\n' % (self.id, i, self.track[i]))
        old.close()
        new.close()
        posix.rename(filename + '.new', filename)