抽象id3标签、m4a标签、flac标签之间的转换
Posted
技术标签:
【中文标题】抽象id3标签、m4a标签、flac标签之间的转换【英文标题】:abstracting the conversion between id3 tags, m4a tags, flac tags 【发布时间】:2010-10-16 09:57:45 【问题描述】:我正在寻找一种在 python 或 bash 中易于获取的资源,例如,mp3 文件 X 和 m4a 文件 Y 并说“将 X 的标签复制到 Y”。
Python 的“诱变剂”模块通常非常适合处理标签,但没有跨越不同类型标签的“艺术家领域”的抽象概念;我想要一个处理所有繁琐位并知道字段名等价的库。对于并非所有标签系统都可以表达的事情,我可以接受信息丢失或最佳猜测。
(用例:我将无损文件编码为 mp3,然后使用 mp3 进行收听。每个月左右,我希望能够使用我对mp3s。我已经厌倦了对格式之间的实现差异保持警惕。)
【问题讨论】:
你总是可以使用已经很容易做这些事情的播放器,比如 foobar2000。无论格式如何,它的“复制标签”功能都可以做到这一点。 【参考方案1】:您可以编写一个简单的应用程序,将每种格式的每个标签名称映射到“抽象标签”类型,然后很容易从一种转换到另一种。您甚至不必知道所有可用类型 - 只需了解您感兴趣的类型即可。
在我看来,这是一种周末项目类型的时间投资,可能更少。玩得开心,我不介意看看你的实现,甚至使用它——如果你当然不介意发布它:-)。
【讨论】:
【参考方案2】:我需要这个确切的东西,我也很快意识到诱变剂不是一个足够遥远的抽象来做这种事情。幸运的是,mutagen 的作者在他们的媒体播放器QuodLibet 中需要它。
我不得不深入研究 QuodLibet 的源代码以了解如何使用它,但是一旦我理解了它,我就编写了一个名为 sequitur 的实用程序,它旨在成为一个相当于 的命令行>ExFalso(QuodLibet 的标记组件)。它使用这种抽象机制并提供一些附加的抽象和功能。
如果您想查看源代码,here's a link to the latest 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)
【讨论】:
Jeremy Cantrell 的 quod-cli 库现已在 Github 上提供:github.com/jmcantrell/quodlibet-cli【参考方案3】:还有tagpy,好像效果不错。
【讨论】:
【参考方案4】:这是一些示例代码,我编写的用于在
使用 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 的原因,它对我不起作用。我怀疑它遇到了和我一样的配置相关错误,但是默默地忽略了它们,只是没有写标签。
【讨论】:
而且,正如墨菲定律所预测的那样,QLLib 在我写完这个脚本后就开始完美地为我工作。 在我尝试过的众多解决方案中,这对我有用。谢谢!【参考方案5】:我有一个 bash 脚本可以做到这一点,atwat-tagger。它支持flac、mp3、ogg和mp4文件。
usage: `atwat-tagger.sh inputfile.mp3 outputfile.ogg`
我知道您的项目已经完成,但是通过搜索引擎找到此页面的人可能会觉得它很有用。
【讨论】:
以上是关于抽象id3标签、m4a标签、flac标签之间的转换的主要内容,如果未能解决你的问题,请参考以下文章
寻找用于编辑 AAC 元数据(M4A 文件)的开源库 [关闭]