我需要这个确切的东西,我也很快意识到诱变剂不是一个足够遥远的抽象来做这种事情。幸运的是,mutagen 的作者在他们的媒体播放器QuodLibet中需要它。
我不得不深入研究 QuodLibet 的源代码以了解如何使用它,但是一旦我理解了它,我就编写了一个名为sequitur的实用程序,它旨在成为一个等效于ExFalso(QuodLibet 的标记组件)的命令行。它使用这种抽象机制并提供一些附加的抽象和功能。
如果您想查看源代码,这里是最新 tarball 的链接。该包实际上是一组三个命令行脚本和一个用于与 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)