]>
diplodocus.org Git - flac-archive/blob - rewrite-tags
6 from errno
import EEXIST
8 from flac_archive
.tags
import Tags
10 class SubprocessError(Exception):
11 def __init__(self
, status
, command
=None, stderr
=None):
15 command_msg
= ': ' + ' '.join(command
)
17 msg
= 'exited due to signal %d%s'
19 msg
= 'exit status %d%s'
20 Exception.__init
__(self
, msg
% (abs(status
), command_msg
))
22 self
.command
= command
23 self
.stderr
= ''.join(stderr
)
28 command
= ['metaflac', '--no-utf8-convert', '--export-tags-to=-', fn
]
29 p
= subprocess
.Popen(command
, stdout
=subprocess
.PIPE
,
30 stderr
=subprocess
.STDOUT
)
35 raise SubprocessError(status
, command
=command
, stderr
=p
.stdout
)
39 def rewrite_track_tags(track
, tags
, fn
, tmp
):
40 tmp
.write('\n'.join(tags
.track(track
)) + '\n')
42 command
= ['metaflac', '--no-utf8-convert', '--dont-use-padding',
43 '--remove-all-tags', '--import-tags-from', tmp
.name
, fn
]
44 p
= subprocess
.Popen(command
, stdout
=subprocess
.PIPE
,
45 stderr
=subprocess
.STDOUT
)
48 raise SubprocessError(status
, command
=command
, stderr
=p
.stdout
)
50 def do_read(filenames
):
51 # Use this mapping of tag names to sets of tag values to detect global tags.
53 # Build the collated result in this Tags object.
55 # XXX The Tags interface is horrible. It's gotta be almost 10 years since
56 # I wrote it, so not surprising...
59 track_tags
= tags
.get('TRACKNUMBER')
60 # this check belongs in Tags
61 if len(track_tags
) != 1:
62 sys
.stderr
.write('bogus TRACKNUMBER %s: %s\n' % (track_tags
, fn
))
64 track
= int(track_tags
[0])
65 for tag
, values
in tags
._global
.iteritems():
66 # Makes no sense to save TRACKNUMBER in coll_tags.
67 if tag
== 'TRACKNUMBER':
71 all_tags
[tag
].add(value
)
73 all_tags
[tag
] = set([value
])
74 coll_tags
.set(tag
, value
, track
)
75 for tag
, values
in all_tags
.iteritems():
77 # Only one value for this tag, so add it to global tags.
78 coll_tags
.set(tag
, list(values
)[0])
79 # And now remove it from each track tags.
80 for track
, tags
in coll_tags
._tracks
.iteritems():
82 print '\n'.join(coll_tags
.all())
87 tags
.load(open(args
.pop(0)))
88 if len(args
) != len(tags
):
89 sys
.stderr
.write('expected %d flac files, got %d\n'
90 % (len(tags
), len(args
)))
92 artist
= tags
.get_path_safe('ARTIST')
93 album
= tags
.get_path_safe('ALBUM')
99 album_path
= artist
+ '/' + album
103 if e
.errno
!= EEXIST
:
105 for i
, old_fn
in enumerate(args
):
107 fn
= '%s/%s/%s.flac' % (artist
, album
, tags
.make_filename(track
))
109 os
.rename(old_fn
, fn
)
110 tmp
= tempfile
.NamedTemporaryFile(delete
=False)
112 rewrite_track_tags(track
, tags
, fn
, tmp
)
123 if args
[1] == 'read':
124 return do_read(args
[2:])
125 if args
[1] == 'write':
126 return do_write(args
[2:])
132 if __name__
== '__main__':
133 sys
.exit(main(sys
.argv
))