X-Git-Url: https://diplodocus.org/git/flac-archive/blobdiff_plain/133da6c50208be8ce2f111387aeb8de5969be73b..7eae8b437dc78929d4dd6ed521f62e7330e8d9d3:/rewrite-tags diff --git a/rewrite-tags b/rewrite-tags index a5c69f7..1d4b412 100755 --- a/rewrite-tags +++ b/rewrite-tags @@ -1,7 +1,9 @@ #! /usr/bin/python -import sys -from subprocess import Popen, PIPE +import os, sys +import subprocess +import tempfile +from errno import EEXIST from flac_archive.tags import Tags @@ -18,21 +20,33 @@ class SubprocessError(Exception): Exception.__init__(self, msg % (abs(status), command_msg)) self.status = status self.command = command - self.stderr = stderr + self.stderr = ''.join(stderr) def get_tags(fn): tags = Tags() command = ['metaflac', '--no-utf8-convert', '--export-tags-to=-', fn] - p = Popen(command, stdout=PIPE) + p = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) tags.load(p.stdout) status = p.wait() if status != 0: - raise SubprocessError(status, command=command, stderr=p.stderr) + raise SubprocessError(status, command=command, stderr=p.stdout) return tags +def rewrite_track_tags(track, tags, fn, tmp): + tmp.write('\n'.join(tags.track(track)) + '\n') + tmp.close() + command = ['metaflac', '--no-utf8-convert', '--dont-use-padding', + '--remove-all-tags', '--import-tags-from', tmp.name, fn] + p = subprocess.Popen(command, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + status = p.wait() + if status != 0: + raise SubprocessError(status, command=command, stderr=p.stdout) + def do_read(filenames): # Use this mapping of tag names to sets of tag values to detect global tags. all_tags = {} @@ -43,11 +57,15 @@ def do_read(filenames): for fn in filenames: tags = get_tags(fn) track_tags = tags.get('TRACKNUMBER') + # this check belongs in Tags if len(track_tags) != 1: sys.stderr.write('bogus TRACKNUMBER %s: %s\n' % (track_tags, fn)) - return 3 + return 4 track = int(track_tags[0]) for tag, values in tags._global.iteritems(): + # Makes no sense to save TRACKNUMBER in coll_tags. + if tag == 'TRACKNUMBER': + continue for value in values: if tag in all_tags: all_tags[tag].add(value) @@ -70,9 +88,9 @@ def do_write(args): if len(args) != len(tags): sys.stderr.write('expected %d flac files, got %d\n' % (len(tags), len(args))) - return 4 + return 2 artist = tags.get_path_safe('ARTIST') - album = tags.get_path_safe('ALBUM'), + album = tags.get_path_safe('ALBUM') try: os.mkdir(artist) except OSError, e: @@ -88,15 +106,28 @@ def do_write(args): track = i + 1 fn = '%s/%s/%s.flac' % (artist, album, tags.make_filename(track)) if fn != old_fn: - #os.rename(old_fn, fn) + os.rename(old_fn, fn) + tmp = tempfile.NamedTemporaryFile(delete=False) + try: + rewrite_track_tags(track, tags, fn, tmp) + finally: + try: + os.unlink(tmp.name) + except: + pass + return 0 def main(args): if len(args) < 3: return usage() - if args[1] == 'read': - return do_read(args[2:]) - if args[1] == 'write': - return do_write(args[2:]) + try: + if args[1] == 'read': + return do_read(args[2:]) + if args[1] == 'write': + return do_write(args[2:]) + except SubprocessError, e: + sys.stderr.write('%s\n%s\n' % (e.stderr, e)) + return 3 return usage() def usage():