14

我正在寻找一种在 python 或 bash 中易于使用的资源,例如,mp3 文件 X 和 m4a 文件 Y 并说“将 X 的标签复制到 Y”。

Python 的“诱变剂”模块通常非常适合处理标签,但没有跨越不同类型标签的“艺术家领域”的抽象概念;我想要一个处理所有繁琐位并知道字段名等价的库。对于并非所有标签系统都可以表达的东西,我可以接受信息丢失或最佳猜测。

(用例:我将无损文件编码为 mp3,然后使用 mp3 进行收听。每个月左右,我希望能够使用我对 mp3 所做的任何标签更改来更新“主”无损文件。我我厌倦了在格式之间的实现差异上踌躇不前。)

4

5 回答 5

9

我需要这个确切的东西,我也很快意识到诱变剂不是一个足够遥远的抽象来做这种事情。幸运的是,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)
于 2009-03-30T22:04:09.823 回答
2

这是一些示例代码,我编写的一个脚本,用于使用 Quod Libet 的音乐格式类(不是诱变剂的!)在文件之间复制标签。要运行它,只需执行copytags.py src1 dest1 src2 dest2 src3 dest3,它会将 sec1 中的标签复制到 dest1(在删除 dest1 上的任何现有标签之后!),依此类推。请注意黑名单,您应该根据自己的喜好对其进行调整。黑名单不仅可以防止某些标签被复制,还可以防止它们在目标文件中被破坏。

需要明确的是,Quod Libet 的与格式无关的标记不是诱变剂的功能;它是在诱变剂之上实现的。因此,如果您想要与格式无关的标记,则需要使用quodlibet.formats.MusicFile来打开文件而不是mutagen.File.

现在可以在这里找到代码:https ://github.com/DarwinAwardWinner/copytags

如果您还想同时进行转码,请使用:https ://github.com/DarwinAwardWinner/transfercoder

对我来说一个关键的细节是 Quod Libet 的音乐格式类期望 QL 的配置被加载,因此config.init我的脚本中的行。没有它,我在加载或保存文件时会遇到各种错误。

我已经用“标准”标签和任意标签测试了这个脚本在 flac、ogg 和 mp3 之间进行复制。到目前为止,它运行良好。

至于我没有使用 QLLib 的原因,它对我不起作用。我怀疑它遇到了和我一样的配置相关错误,但是默默地忽略了它们,只是没有写标签。

于 2009-11-03T07:42:52.620 回答
2

我有一个 bash 脚本可以做到这一点,atwat-tagger。它支持 flac、mp3、ogg 和 mp4 文件。

usage: `atwat-tagger.sh inputfile.mp3 outputfile.ogg`

我知道您的项目已经完成,但是通过搜索引擎找到此页面的人可能会发现它很有用。

于 2011-08-16T21:00:29.290 回答
0

您可以编写一个简单的应用程序,将每种格式的每个标签名称映射到“抽象标签”类型,然后很容易从一种转换到另一种。您甚至不必知道所有可用的类型 - 只需知道您感兴趣的那些。

在我看来,这像是周末项目类型的时间投资,可能更少。玩得开心,我不介意看看你的实现,甚至使用它——如果你当然不介意发布它:-)。

于 2009-03-30T17:42:59.263 回答
0

还有tagpy,它似乎运作良好。

于 2009-04-11T21:38:10.393 回答