转储 ID3 标签结构的程序

转储 ID3 标签结构的程序

是否有一个程序可以转储 ID3v2 标签的完整结构?

不仅仅是帧名称和值,还有完整的信息,例如帧顺序、文本编码、描述编码(对于 TXXX 帧)、是否存在不同步、是否存在多个标签......

背景:我很好奇为什么有些文件与某些程序不兼容。例如,Winamp 无法读取 foobar2000 编写的一些 ID3v2.4 标签;使用 Mutagen 编辑可以修复这些问题,但使用 foobar2000 编辑又会出错。这不是版本或数据编码的问题——大多数其他 v2.4 UTF-16 标签都可以正常工作……但是,如果我使用 foobar2000 将标签转换为 v2.3,然后再转换回 v2.4,它们就会在 Winamp 中正常工作——最后一点就是不任何感觉。

编辑:Linux 或/和 Windows。

答案1

mp3诊断在 Windows 上应该既检查已知错误,又让您查看原始标签 - 它列出了已知错误,但您也可以查看原始标签。我似乎找不到将其转储到文本文件的方法。标签数量有限,它适合检查和批量修复标签。

在此处输入图片描述

答案2

外置工具可以提供很多信息:

exiftool -v3 -l 文件名.mp3

答案3

Mutagen python 库包含一个名为 mid3v2 的实用程序,它提供了非常干净和彻底的转储/导出功能,适合进行前/后差异比较。

如果您从未设置过 python 脚本,那么也许 exiftools 值得了解,但我发现 mid3v2 更容易。

metamp3 是为此而设计的,但在我看来有点过时,显示一些非常常见的事实上的标准(阅读:iTunes)字段为“未定义”。

ID3RawTagViewer 和 ID3TagBackup 也是相当古老的工具,但您可能也会发现它们很有用。

MP3Tags 有一个“全局导出”插件,但在某些情况下,它使用其内部“映射”字段名称“隐藏”真实的框架名称,因此它们在不同的格式(例如 FLAC 和 MP3)中是相同的。

离题了,但 Ex Falso 是 Mutagen/Quod Libet 家族的另一个成员,它可以很好地为 FLAC 实现这一点,但由于某种原因,它“隐藏”了 ID3 的所有非 QL 自定义 TXXX 标签。

顺便说一句,许多人只是使用他们最喜欢的十六进制编辑器。。。

答案4

我为这个任务写了一个 Python 脚本(需要诱变剂):

import pathlib
import sys

import mutagen.id3

DATA_SEARCH_STR = "data=b'"

if __name__ == '__main__':
    errorval = 0
    try:
        filearg = sys.argv[1]
    except IndexError:
        errorval = 1
        print('ERROR: No file argument.')
    else:
        fp = pathlib.Path(filearg)
        if not fp.is_file():
            errorval = 2
            print('ERROR: Not a file.')
        else:
            try:
                I = mutagen.id3.ID3(fp)
            except mutagen.id3.ID3NoHeaderError:
                errorval = 3
                print('ERROR: File has no ID3 tag.')

    if errorval:
        print('USAGE: python id3report.py myfile')
        sys.exit(errorval)

    L = [str(fp)]
    print(L[-1])
    L.append('ID3 version: ' + '.'.join(str(x) for x in I.version) + '\n')
    print(L[-1])

    for key in sorted(set(I.keys())):
        L.append(f'key: "{key}"')
        print(L[-1])
        if hasattr(I[key], 'data'):
            s0 = repr(I[key])
            i0 = s0.find(DATA_SEARCH_STR)
            i1 = s0.find("'", i0 + len(DATA_SEARCH_STR))
            while s0[i1-1] == '\\':
                i1 = s0.find("'", i1+1)
            s1 = s0[:i0].rstrip(" ,") + s0[i1+1:]
            L.append(f'value: {s1}')
            print(L[-1])
            L.append(f'data: {len(I[key].data)} bytes')
            print(L[-1])
        else:
            L.append(f'value: {I[key]!r}')
            print(L[-1])
        L.append('')
        print(L[-1])

    outfile = fp.parent / f"{fp.stem}.id3report"
    with outfile.open('w', encoding='utf-8') as _f:
        _f.write('\n'.join(L))

该脚本将报告打印到屏幕上并将其保存到带有扩展名的目标文件旁边.idreport

示例输出:

Trinity's Breakfast - The Punk .mp3
ID3 version: 2.3.0

key: "GEOB:SfMarkers"
value: GEOB(encoding=<Encoding.LATIN1: 0>, mime='', filename='', desc='SfMarkers')
data: 12 bytes

key: "TCOM"
value: TCOM(encoding=<Encoding.UTF16: 1>, text=['Zoltán Maxi Marton'])

key: "TCON"
value: TCON(encoding=<Encoding.LATIN1: 0>, text=['Electronic'])

key: "TDRC"
value: TDRC(encoding=<Encoding.LATIN1: 0>, text=['2020'])

key: "TIT2"
value: TIT2(encoding=<Encoding.LATIN1: 0>, text=['The Punk'])

key: "TPE1"
value: TPE1(encoding=<Encoding.LATIN1: 0>, text=["Trinity's Breakfast"])

如您所见,脚本修剪数据以防止终端泛滥。您可以通过删除条件轻松制作完整的报告版本hasattr

相关内容