Проблема с использованием мутагена для установки пользовательских тегов для файла MP4 - PullRequest
2 голосов
/ 19 июня 2019

Я пытаюсь установить пользовательские теги ID3 для файлов MP4, используя Python и Mutagen.До сих пор мне удавалось создавать собственные теги для файлов MP3 без каких-либо проблем, но MP4, похоже, является еще одной проблемой в целом.

Первоначальное сообщение об ошибке, которое я получил, было TypeError, в котором говорилось, что «не может быть указанбайт».Поэтому вместо подачи в программу строки я закодировал ее как байт-массив UTF-8, но он выдал следующее сообщение об ошибке:

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

Эта ошибка на самом деле происходит внутри самого Мутагена.

Вотcode:

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, все, что они указывают, - это общая настройка значения: name: key.Кому-нибудь еще удавалось успешно реализовать пользовательские теги для файлов MP4?

1 Ответ

1 голос
/ 19 июня 2019

Важные вещи в первую очередь: единственная проблема в вашем коде - это преобразование из 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.

...