python - 使用诱变剂为 MP4 文件设置自定义标签时出现问题

标签 python python-3.x mutagen

我正在尝试使用 Python 和 Mutagen 在 MP4 文件上设置自定义 ID3 标签。到目前为止,我已经能够毫无问题地为 MP3 文件创建自定义标签,但 MP4 似乎完全是另一个问题。

我收到的初始错误消息是 TypeError,指出“无法将 str 连接到字节”。因此,我没有向程序提供字符串,而是将其编码为 UTF-8 字节数组,但它给出了以下错误消息:

TypeError: object of type 'int' has no len()

这个错误实际上发生在 Mutagen 本身。

代码如下:

from mutagen.id3 import ID3
from mutagen.mp4 import MP4

def set_isbn(filename, isbn):
    if(filename.lower().endswith(".mp3")):
        tags = ID3(filename)
        tags.add(TXXX(encoding=3, desc=u'ISBN', text=str(isbn)))
        tags.save(filename)
    else:
        tags = MP4(filename)
        tags["----:TXXX:ISBN"] = bytearray(isbn, 'UTF-8')
        tags.save(filename)

Mutagen 文档大多非常好,但是当涉及到自定义 MP4 标签时,它只说明了 mean:name:key 的一般设置。有没有其他人能够成功地为 MP4 文件实现自定义标签?

最佳答案

重要的事情放在首位:您的代码中唯一的问题是从 stringbytearray 的转换。看一下mutagen的源代码,在专门针对mp4文件类型的部分,有一行是这样的:

    ...
    if isinstance(x, bytes):
        x = [x]
        ...

其中 x 是您提供的值。当满足上述条件时,您提供的值将插入到 list 中,该列表具有“dunder len”方法,因此可以作为 的参数len 函数,当用作参数时,它又不会引发 TypeError

您只应通过将转换为 bytearray 的转换替换为转换为 bytes 来编辑您的代码,如下所示:

from mutagen.id3 import ID3
from mutagen.mp4 import MP4

def set_isbn(filename, isbn):
    if(filename.lower().endswith(".mp3")):
        tags = ID3(filename)
        tags.add(TXXX(encoding=3, desc=u'ISBN', text=str(isbn)))
        tags.save(filename)
    else:
        tags = MP4(filename)
        tags["----:TXXX:ISBN"] = bytes(isbn, 'UTF-8')
        tags.save(filename)

然后您将避免上述 TypeError 异常。

关于python - 使用诱变剂为 MP4 文件设置自定义标签时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56660170/

相关文章:

python - 使用 eyeD3 从 Python 中的 mp3 文件中检索歌词

Python 诱变剂未正确保存

python - 满足多个条件的 Pandas ;连接结果以创建新列

python - 混合参数化测试和标记

python - 使用 pandas 根据日期范围返回多列

python - 根据索引从矩阵中删除一些元素

python-3.x - 使用 python 3.x 如何将 Tree 对象从 ete3 传递到 DendroPy 而不写入文件

python - 如何使用 mutagen.py 清除 mp3 元数据?

python - 在实用程序函数中使用 Django request.session

python - 递归调用的问题