我正在尝试使用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文件的自定义标签?
答案 0 :(得分:1)
重要的事情:代码中唯一的问题是从string
到bytearray
的转换。查看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
异常。