7

为了处理 mutagen、.ogg、.apev2、.wma、flac、mp4 和 asf 接受的每种文件类型,我需要做什么?(我排除了 mp3,因为它有最多的文档)

如果知道这是如何完成的人可以提供一些伪代码来解释所使用的技术,我将不胜感激。我想要提取的主要标签是文件的标题、艺术家、专辑(如果有)。

从哪儿开始?

4

1 回答 1

11

每种标签类型都有不同的字段名称,而且它们的映射并不完美。

如果您只需要少数最重要的字段,Mutagen 为 ID3v2 和 MP4/ITMF 提供了“简单”的包装器。因此,例如,您可以这样做:

>>> m = mutagen.File(path, easy=True)
>>> m['title']
[u'Sunshine Smile']
>>> m['artist']
[u'Adorable']
>>> m['album']
[u'Against Perfection']

但这仅适用于这两种文件格式。Vorbis、Metaflac、APEv2 和 WMT 标签本质上是自由格式的键:值或键:[值列表] 映射。Vorbis 确实有一组常用注释字段的推荐名称,WM 有一组由 WMP GUI 和 .NET API 映射的字段,但 Metaflac 和 APEv2 甚至没有。事实上,在 Metaflac 评论中同时看到来自旧 ID3v1 字段名称的“艺术家”和来自 Vorbis 的“艺术家”是很常见的。

即使对于 ID3v2,映射也不完美——iTunes 将“TPE1”帧显示为“艺术家”,“TPE2”显示为“专辑艺术家”,而 Foobar2000 将 TPE2 显示为“艺术家”,TXXX:ALBUM ARTIST 显示为“专辑艺术家” ”。

因此,要正确执行此操作,您必须查看iTMFVorbiscommentID3v2(或参见Wikipedia)和WMT,然后查看您拥有的文件并添加一些启发式方法来决定如何从文件中获取您想要的内容你有。

例如,您可以尝试这样的事情:

>>> m = mutagen.File(path)
>>> for tag in ('TPE1', 'TPE2', u'©ART', 'Author', 'Artist', 'ARTIST',
...             'TRACK ARTIST', 'TRACKARTIST', 'TrackArtist', 'Track Artist'):
...     try:
...         artist = unicode(m[tag][0])
...         break
...     except KeyError:
...         pass

更好的解决方案是打开标签类型,只尝试格式的适当字段。

幸运的是,其他人已经为您完成了这项工作。您可以在Hydrogen Audio论坛和 wiki上找到人们收集到的关于不同播放器/标记器如何将值映射到每种格式的几乎所有信息,并且各种其他项目已将这些信息转换为简单的标记映射表,您可以直接获取和借用你的代码,比如MusicBrainz 的这个MusicBrainz Picard甚至有一个围绕 Mutagen 的包装器,可让您使用一组一致的元数据名称(此处描述的名称)与所有标签类型。

于 2013-10-05T22:01:39.257 回答