Мне нужна была именно эта вещь, и я также быстро понял, что мутаген - не достаточно отдаленная абстракция, чтобы делать подобные вещи. К счастью, авторам мутагена это понадобилось для их медиаплеера QuodLibet .
Мне пришлось копаться в источнике QuodLibet, чтобы узнать, как его использовать, но как только я понял это, я написал утилиту под названием sequitur , предназначенную для командной строки, эквивалентную ExFalso (компонент тегов QuodLibet). Он использует этот механизм абстракции и обеспечивает некоторую дополнительную абстракцию и функциональность.
Если вы хотите проверить источник, вот ссылка на последний архив . Пакет на самом деле представляет собой набор из трех сценариев командной строки и модуля для взаимодействия с QL. Если вы хотите установить все это, вы можете использовать:
easy_install QLCLI
Одна вещь, которую следует помнить об exfalso / quodlibet (и, следовательно, sequitur), заключается в том, что они на самом деле должным образом реализуют аудио-метаданные, что означает, что все теги поддерживают несколько значений (если только тип файла не запрещает их, что не так много делать). Итак, делаем что-то вроде:
print qllib.AudioFile('foo.mp3')['artist']
Не будет выводить одну строку, но выведет список строк, таких как:
[u'The First Artist', u'The Second Artist']
То, как вы можете использовать его для копирования тегов, будет примерно таким:
import os.path
import qllib # this is the module that comes with QLCLI
def update_tags(mp3_fn, flac_fn):
mp3 = qllib.AudioFile(mp3_fn)
flac = qllib.AudioFile(flac_fn)
# you can iterate over the tag names
# they will be the same for all file types
for tag_name in mp3:
flac[tag_name] = mp3[tag_name]
flac.write()
mp3_filenames = ['foo.mp3', 'bar.mp3', 'baz.mp3']
for mp3_fn in mp3_filenames:
flac_fn = os.path.splitext(mp3_fn)[0] + '.flac'
if os.path.getmtime(mp3_fn) != os.path.getmtime(flac_fn):
update_tags(mp3_fn, flac_fn)