-#!/usr/bin/python
+#!/usr/bin/python2
#
# Changes mp3 ID3 tags to match the file names.
dry_run = False
verbose = False
self_test = False
+audiobook = False
# globals
total_albums = 0
print "ERROR: can't find id3v2_wrapper.sh: " + str(e)
sys.exit(1)
+# Verifies that a given program is installed.
+def verify_program_installed(prog):
+ try:
+ proc = subprocess.Popen(prog, stdout=subprocess.PIPE)
+ line = proc.stdout.readline()
+ return True
+ except Exception, e:
+ print "failed to execute " + str(prog)
+ return False
+
# Regular expressions for parsing file names--
# which is, after all, what this program is all about
music_file_re = re.compile(".*\.mp3$")
music_file_name_re = re.compile(".*/" +
"(?P<dir_name>[^/]*)/" +
- "(?P<track_number>[0123456789][0123456789]) - " +
+ "(?P<track_number>[0123456789][0123456789]*) - " +
"(?P<track_name>[^/]*)" +
"\.[a-zA-Z0123456789]*$")
+audiobook_file_name_re = re.compile(".*/" +
+ "(?P<dir_name>[^/]*)/" +
+ "(?P<track_number>[0123456789][0123456789]*)");
+
dir_name_re = re.compile("(.*/)?" +
"(?P<artist>[0-9A-Za-z _.\-]*?) - " +
"(?P<album>[0-9A-Za-z _(),'.\-\+]*)" +
self.track_number = int(track_number)
def from_filename(filename):
- match = music_file_name_re.match(filename)
+ if (audiobook):
+ match = audiobook_file_name_re.match(filename)
+ track_name = match.group('track_number')
+ else:
+ match = music_file_name_re.match(filename)
+ track_name = match.group('track_name')
if (not match):
raise MusicFileErr("can't parse music file name \"" +
filename + "\"")
album = Album.from_dirname(match.group('dir_name'))
return MusicFile(filename, album,
- match.group('track_name'),
+ track_name,
match.group('track_number'))
from_filename = staticmethod(from_filename)
break
# CODE
+## Make sure that id3v2 is installed
+if not verify_program_installed(["id3v2", "--version"]):
+ print "You must install the id3v2 program to run this script."
+ sys.exit(1)
+
## Find id3v2_wrapper.sh
id3v2_wrapper = find_companion_script('id3v2_wrapper.sh')
print "-h: this help message"
print "-d: dry-run mode"
print "-s: self-test"
+ print "-A: audiobook mode"
print "dirs: directories to search for albums."
print "This program skips dirs with \"[LL]\" in the name."
sys.exit(1)
try:
- optlist, dirs = getopt.getopt(sys.argv[1:], ':dhi:sv')
+ optlist, dirs = getopt.getopt(sys.argv[1:], ':dhi:svA')
except getopt.GetoptError:
Usage()
verbose = True
if opt[0] == '-s':
self_test = True
+ if opt[0] == '-A':
+ audiobook = True
if (self_test):
run_self_test()