#!/usr/bin/python # Burn a set of audio files to CD, generating appropriate CD-Text information. # Adam Sampson import sys, os, re def die(*s): print >>sys.stderr, "".join(map(str, s)) sys.exit(1) def burn(files): files = [os.path.abspath(fn) for fn in files] if len(files) == 0: die("Usage: burn-audio [FILE...]") tocname = "/tmp/burn-audio-%d.toc" % os.getpid() f = open(tocname, "w") f.write('''CD_DA CD_TEXT { LANGUAGE_MAP { 0 : EN } LANGUAGE 0 { ''') dir = os.path.basename(os.path.dirname(files[0])) m = re.match(r'^(.*) - (.*)$', dir) if m is None: f.write(' TITLE "%s"\n' % dir) else: f.write(' TITLE "%s"\n' % m.group(1)) f.write(' PERFORMER "%s"\n' % m.group(2)) f.write(''' } } ''') for fn in files: f.write('\n') if not fn.endswith(".wav"): die("File must be in wav format: ", fn) f.write('TRACK AUDIO\n') f.write(' COPY\n') f.write(' CD_TEXT {\n') f.write(' LANGUAGE 0 {\n') track = os.path.basename(fn) track = re.sub(r'\.wav$', '', track) # FIXME: this'll break on "99 Red Balloons.wav" track = re.sub(r'^([0-9-]*) ', '', track) m = re.match(r'^(.*) - (.*)$', track) if m is None: f.write(' TITLE "%s"\n' % track) else: f.write(' TITLE "%s"\n' % m.group(1)) f.write(' PERFORMER "%s"\n' % m.group(2)) f.write(' }\n') f.write(' }\n') f.write(' FILE "%s" 0\n' % fn) f.close() sys.stdout.write(open(tocname).read()) cmd = [ "cdrdao", "write", "--eject", "--device", "/dev/cdrw", "-v", "2", "-n", tocname, ] print ">> %s" % " ".join(cmd) if os.spawnvp(os.P_WAIT, cmd[0], cmd) != 0: die("Command failed") os.unlink(tocname) if __name__ == "__main__": burn(sys.argv[1:])