#!/usr/bin/env python import sys, os, re # Supported tag information: title album tracknumber artist def die(s): print s sys.exit(1) def cmd(cs): print "running", repr(cs) if os.spawnlp(os.P_WAIT, cs[0], *cs) != 0: die("command failed: " + repr(cs)) def tag_mp3(name, tags): mapping = {"title" : "song", "album" : "album", "tracknumber" : "track", "artist" : "artist"} c = ["id3tag"] for t in tags.keys(): c += ["--" + mapping[t] + "=" + tags[t]] c += [name] cmd(c) def tag_ogg(name, tags): c = ["vorbiscomment", "-w"] for t in tags.keys(): c += ["-t", t.upper() + "=" + tags[t]] c += [name, name + "_"] cmd(c) cmd(["mv", name + "_", name]) taggers = { "ogg" : tag_ogg, "mp3" : tag_mp3 } def tag_file(name): m = re.match(r'(.*/)?([^/]*)/([0-9-]+ )?([^/]*)\.([^/\.]+)', name) if m is None: die("can't match " + name) (album, num, ta, ext) = m.group(2, 3, 4, 5) i = ta.rfind(" - ") if i == -1: title = ta artist = None else: title = ta[:i] artist = ta[i + 3:] ext = ext.lower() if num is not None: num = num.replace("-", "") num = str(int(num)) m = re.match(r'(.*) - (.*)', album) if m is not None: album = m.group(1) if artist is None: artist = m.group(2) tags = {"title" : title, "album" : album, "tracknumber" : num, "artist" : artist} for t in tags.keys(): if tags[t] is None: del tags[t] if not taggers.has_key(ext): die("unknown extension " + name) taggers[ext](name, tags) if __name__ == "__main__": for x in sys.argv[1:]: tag_file(x)