使用诱变剂为 MP4 文件设置自定义标签时出现问题
Problem using mutagen to set custom tags for MP4 file
我正在尝试使用 Python 和 Mutagen 在 MP4 文件上设置自定义 ID3 标签。到目前为止,我已经能够毫无问题地为 MP3 文件创建自定义标签,但 MP4 似乎完全是另一个问题。
我收到的初始错误消息是 TypeError,指出 "can't concat str to bytes"。因此,我没有向程序提供字符串,而是将其编码为 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 文件实现自定义标签?
重要的事情放在首位:您的代码中唯一的问题是从 string
到 bytearray
的转换。查看 mutagen
的源代码,在具体涉及 mp4
文件类型的部分,有一行看起来像这样:
...
if isinstance(x, bytes):
x = [x]
...
其中 x
是您提供的值。当满足上述条件时,你给的值被插入到一个list
中,它有一个“dunder len”方法,因此可以是[=18的参数=] 函数,当用作参数时,它又不会引发 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 和 Mutagen 在 MP4 文件上设置自定义 ID3 标签。到目前为止,我已经能够毫无问题地为 MP3 文件创建自定义标签,但 MP4 似乎完全是另一个问题。
我收到的初始错误消息是 TypeError,指出 "can't concat str to bytes"。因此,我没有向程序提供字符串,而是将其编码为 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 文件实现自定义标签?
重要的事情放在首位:您的代码中唯一的问题是从 string
到 bytearray
的转换。查看 mutagen
的源代码,在具体涉及 mp4
文件类型的部分,有一行看起来像这样:
...
if isinstance(x, bytes):
x = [x]
...
其中 x
是您提供的值。当满足上述条件时,你给的值被插入到一个list
中,它有一个“dunder len”方法,因此可以是[=18的参数=] 函数,当用作参数时,它又不会引发 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
异常。