我继承了大约 2000 个 MP3 文件。其中大多数文件ID3标签显示乱码在 Amarok 中。我需要一个软件,它可以将 ID3 标签升级到 v2.4 类型$03
(即 UTF-8 编码),删除所有 v1 标签,并且还可以根据具体情况智能地找出原始编码(最有可能是 Windows-1252、无 BOM 的 UTF-16 或 GB18030 之一)。
在我开始基于 TagLib 自行编程之前,是否已经有一个完整的解决方案可供使用?
不推荐 Musicbrainz – 它严重偏向于美国出版的音乐,对我来说几乎没用。不推荐通用 ID3 标记软件,除非先根据我的要求对其进行测试 – 大多数
- 不支持 v2.4
- 坦白说,我对字符编码的想法很迟钝
- 没有自动化功能(我不想花时间手动编辑)。
我(目前)对标签清理、批量重命名或分类软件不感兴趣;我首先必须执行前面提到的规范化步骤。
答案1
您需要 Ex Falso,其中包含的标签编辑器自由之地项目。Picard(MusicBrainz 标记器)可能使用相同的标记库,但是 QL 是它的起源。
特别是,你想要诱变剂标记库,它支持 id3v2.4(我说的“支持”是指“强制”……军事上……)。它还具有出色的字符编码功能,并包含一个基本的可编写脚本的命令行标记器(mid3v2
)。至于您的规范化步骤,Mutagen仅有的在 ID3v2.4 中保存标签。它当然能够将所有文本转换为 UTF-8,但您可能需要自己编写脚本(我相信该mid3v2
工具的默认设置是尽可能保留当前编码,我不知道是否可以告诉它以特定编码保存所有内容)。Mutagen 是用 Python 编写的。
Ex Falso 是一款漂亮、简洁的 GUI,支持您所期望的大多数主要重新标记多个文件功能。我认为它在互联网查找方面没有多大用处,我不知道它在专辑封面方面如何——Quod Libet 可能支持这一点;Ex Falso能用插件来实现,如果存在插件的话,尽管可能不存在。我从来不需要这个功能——我使用 EF 和mid3v2
in concert 来处理我的重新标记需求。
答案2
我认为您不会找到一个独立的应用程序来修复您所选的错误标记编码。混合使用 cp1252、UTF-16 和 GB-18030 的情况很罕见,我认为现有软件无法自动解决该问题。
所以我会下载诱变剂并编写自定义 Python 脚本来自动决定如何修复未知编码。例如:
musicroot= ur'C:\music\wonky'
tryencodings= 'gb18030', 'cp1252'
import os
import mutagen.id3
def findMP3s(path):
for child in os.listdir(path):
child= os.path.join(path, child)
if os.path.isdir(child):
for mp3 in findMP3s(child):
yield mp3
elif child.lower().endswith(u'.mp3'):
yield child
for path in findMP3s(musicroot):
id3= mutagen.id3.ID3(path)
for key, value in id3.items():
if value.encoding!=3 and isinstance(getattr(value, 'text', [None])[0], unicode):
if value.encoding==0:
bytes= '\n'.join(value.text).encode('iso-8859-1')
for encoding in tryencodings:
try:
bytes.decode(encoding)
except UnicodeError:
pass
else:
break
else:
raise ValueError('None of the tryencodings work for %r key %r' % (path, key))
for i in range(len(value.text)):
value.text[i]= value.text[i].encode('iso-8859-1').decode(encoding)
value.encoding= 3
id3.save()
上述脚本做了一些假设:
只有标记为编码 0 的标签是错误的。(表面上编码 0 是 ISO-8859-1,但实际上它通常是 Windows 默认代码页。)
如果标签被标记为 UTF-8 或 UTF-16 编码,则假定它是正确的,如果尚未正确,则简单地转换为 UTF-8。就我个人而言,我以前从未见过错误地将 ID3 标记为 UTF(编码 1-3)。幸运的是,编码 0 很容易恢复为其原始字节,因为 ISO-8859-1 是序数字节值的 1 对 1 直接映射。
当遇到编码 0 标签时,脚本首先尝试将其重新转换为 GB18030,然后如果无效则返回到代码页 1252。像 cp1252 这样的单字节编码往往会匹配大多数字节序列,因此最好将它们放在要尝试的编码列表的末尾。
如果您有其他编码(如 cp1251 西里尔文),或者许多 cp1252 文件名中连续包含多个重音字符,而这些字符会被误认为是 GB18030,那么您将需要某种更聪明的猜测算法。也许可以通过查看文件名来猜测可能存在哪种字符?
答案3
答案4
还有易达标
EasyTAG 是一款用于查看和编辑 MP3、MP2、MP4/AAC、FLAC、Ogg Vorbis、MusePack、Monkey's Audio 和 WavPack 文件标签的实用程序。其简洁美观的 GTK+ 界面使在 GNU/Linux 或 Windows 下添加标签更加容易。
您可能还想知道 id3v2.3 通常是首选格式,因为 Windows Media Player 不支持 2.4