FLAC Tagging Helper
Here is a small Python script that helps with tagging FLAC files. It relies on the external "metaflac" tool to do this.
The idea with this script, is to combine it with a album template file that contains all the information that should be tagged for set of files in a specific directory. Since the "--no-utf8-convert" flag is used, the album file should use UTF-8 for any non-ASCII character. Each line represents a tag, and if a line is prefixed with a number and colon, the tag will only be applied for that track number. The script expects to find files that start with the track number and a dash to identify which files to tag in the directory.
Here is an example of a album template file:
ALBUM=Foo
DATE=2001
GENRE=Rock
01:TRACKNUMBER=1
01:ARTIST=Bar
01:TITLE=Baz
02:TRACKNUMBER=2
02:ARTIST=Bar
02:TITLE=Baaaaz
Here is the Python script itself:
#!/usr/bin/python
import re
import os
class FLACTagger(object):
def __init__(self, flac_directory, album_file, cover_image):
self._flac_directory = flac_directory
self._album_file = album_file
self._cover_image = cover_image
self._global_tags = list()
self._track_tags = dict()
def read_album_file(self):
fh = open(self._album_file, "r")
for line in fh:
match = re.match(r"^(\d+):(\w+=.*)$", line)
if match:
if not match.group(1) in self._track_tags:
self._track_tags[match.group(1)] = list()
self._track_tags[match.group(1)].append(match.group(2))
match = re.match(r"^(\w+=.*)$", line)
if match:
self._global_tags.append(match.group(1))
fh.close()
def make_flactags_files(self):
for track_no in self._track_tags.keys():
fh = open("/tmp/%s.flactags" % (track_no), "w")
for tags in self._global_tags:
fh.write(tags)
fh.write("\n")
for tags in self._track_tags[track_no]:
fh.write(tags)
fh.write("\n")
fh.close()
def _quote(self, filename):
return "'" + filename.replace("'", "'\\''") + "'"
def apply_tags(self):
for filename in os.listdir(self._flac_directory):
match = re.match(r"^(\d+) - ", filename)
full_path = self._quote(self._flac_directory + "/" + filename)
if match:
print full_path
os.system("metaflac --remove-all %s" % (full_path))
os.system("metaflac --no-utf8-convert --import-tags-from=/tmp/%s.flactags %s" % (match.group(1), full_path))
os.system("metaflac --import-picture-from=%s %s" % (self._quote(self._cover_image), full_path))
if __name__ == "__main__":
import sys
if len(sys.argv) < 4:
print "Usage: %s <FLAC directory> <album file> <cover image>" % (sys.argv[0])
sys.exit(1)
if not os.path.isdir(sys.argv[1]):
print "Error: Invalid file directory"
sys.exit(1)
if not os.path.isfile(sys.argv[2]):
print "Error: Invalid album file"
sys.exit(1)
if not os.path.isfile(sys.argv[3]):
print "Error: Invalid cover image"
sys.exit(1)
ftm = FLACTagger(sys.argv[1], sys.argv[2], sys.argv[3])
ftm.read_album_file()
ftm.make_flactags_files()
ftm.apply_tags()