dax*_*xim 15 linux mp3 id3 tags
我继承了大约 2000 个 MP3 文件。对于大多数人来说,他们的ID3 标签在 Amarok 中显示为乱码。我需要一个软件将 ID3 标签升级到 v2.4 类型$03(即 UTF-8 编码),删除任何 v1 标签,并且还可以根据具体情况计算出原始编码(很可能是其中之一) Windows-1252、无 BOM 的 UTF-16 或 GB18030)。
在我开始在 TagLib 上自己编程之前,是否已经有我可以使用的完整解决方案?
不推荐 Musicbrainz——它严重偏向美国出版的音乐,对我来说几乎没用。不要在没有根据我的要求进行测试的情况下推荐通用的 ID3 标记软件——大多数是
我也(还)不只对标签清理、批量重命名或分类软件感兴趣;我首先做了上述归一化步骤。
您需要 Ex Falso,Quod Libet项目中包含的标签编辑器。Picard(MusicBrainz 标记器)可能使用相同的标记库,但 QL 源自它。
特别是,您需要Mutagen 标记库,它支持 id3v2.4(“支持”我的意思是“强制”......军事......)。它在字符编码方面也非常出色,并且包括一个基本的可编写脚本的命令行标记器 ( mid3v2)。就您的规范化步骤而言,Mutagen仅将标签保存在 ID3v2.4 中。它当然能够将所有文本转换为 UTF-8,但您可能需要自己编写脚本(我相信该mid3v2工具的默认设置是尽可能保留当前编码,我不知道是否可以告诉它保存特定编码中的所有内容)。Mutagen 是用 Python 编写的。
Ex Falso 是一个漂亮、干净的 GUI ,并支持您期望的大多数主要重新标记多个文件功能。我认为它在互联网查找方面没有多大作用,我不知道专辑插图如何——Quod Libet 可能支持这一点;Ex Falso可以用一个插件来做到这一点,如果一个插件存在,虽然一个可能不存在。我从来不需要那个功能——我使用 EF 并mid3v2协同处理我的重新标记需求。
我不认为您会找到一个独立的应用程序来修复您选择的错误标记编码的特定选择。混合使用 cp1252、UTF-16 和 GB-18030 是很不寻常的,我认为现有的软件无法自动解决这个问题。
所以我会下载 Mutagen并编写一个自定义的 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()
Run Code Online (Sandbox Code Playgroud)
上面的脚本做了一些假设:
只有标记为编码 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 Cyrillic,或许多 cp1252 文件名连续多个重音字符,会被误认为 GB18030,则您需要某种更聪明的猜测算法。也许看一下文件名来猜测可能存在什么样的字符?
| 归档时间: |
|
| 查看次数: |
12990 次 |
| 最近记录: |