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

时间:2019-06-19 04:41:40

标签: 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文件的自定义标签?

1 个答案:

答案 0 :(得分:1)

重要的事情:代码中唯一的问题是从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异常。