#!/usr/bin/env python # Burn a set of audio files to CD, generating appropriate CD-Text information. # Adam Sampson import sys, os, re, subprocess to_remove = [] class BurnException(Exception): pass def die(*s): raise BurnException("".join(map(str, s))) def burn(files): files = [os.path.abspath(fn) for fn in files] if len(files) == 0: die("Usage: burn-audio [FILE...]") sheetname = "burn-audio-%d.sis" % os.getpid() to_remove.append(sheetname) f = open(sheetname, "w") f.write("Text Code = 8859\n") f.write("Language Code = English\n") dir = os.path.basename(os.path.dirname(files[0])) m = re.match(r'^(.*) - (.*)$', dir) if m is None: f.write("Album Title = %s\n" % dir) else: f.write("Album Title = %s\n" % m.group(1)) f.write("Artist Name = %s\n" % m.group(2)) wavfiles = [] for fn in files: if fn.endswith(".flac"): wav = fn[:-5] + ".wav" cmd = ["flac", "-d", "-o", wav, fn] if subprocess.call(cmd) != 0: die("flac failed") to_remove.append(wav) fn = wav elif not fn.endswith(".wav"): die("File in unknown format: ", fn) label = "Track %02d" % (len(wavfiles) + 1) 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("%s Title = %s\n" % (label, track)) else: f.write("%s Title = %s\n" % (label, m.group(1))) f.write("%s Artist = %s\n" % (label, m.group(2))) wavfiles.append(fn) f.write("First Track Number = 1\n") f.write("Last Track Number = %d\n" % len(wavfiles)) f.close() sys.stdout.write(open(sheetname).read()) cmd = [ "cdrskin", "dev=/dev/cdrw", "-eject", "-sao", "-audio", "input_sheet_v07t=" + sheetname, ] + wavfiles print ">> %s" % " ".join(cmd) if subprocess.call(cmd) != 0: die("cdrdao failed") if __name__ == "__main__": rc = 0 try: burn(sys.argv[1:]) except BurnException, s: print >>sys.stderr, s rc = 1 finally: for fn in to_remove: os.unlink(fn) sys.exit(rc)