Редактирование данных тегов для файлов .aiff с помощью Mutagen с ошибками «TypeError: не экземпляр фрейма» и «ID3NoHeaderError: не начинается с тега ID3»

#python #id3 #mutagen #aiff

#python #id3 #мутаген #aiff

Вопрос:

я пытаюсь записать теги в файл tables .aif с помощью mutagen. пока не добился большого успеха…

из кода в документации по mutagen я пытаюсь:

 
from mutagen.aiff import AIFF

audio = AIFF(“example.aif”)
audio["title"] = u"An example"
audio.save()
  

это то, чего я пытаюсь достичь на базовом уровне, однако я получаю следующее:

 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/_file.py", line 75, in __setitem__
    self.tags[key] = value
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/id3/_tags.py", line 343, in __setitem__
    raise TypeError("%r not a Frame instance" % tag)
TypeError: u'An example' not a Frame instance
  

не могу разобраться в экземплярах фреймов, поэтому я ищу другие способы сделать это, например, класс ID3, как показано ниже:

 

from mutagen.id3 import ID3

    tags = ID3()

tags.save("song.mp3")
  

ошибок не возвращает, однако файл .aif возвращается поврежденным.

затем я смотрю на загрузку файлов ID3 из .aif прямо вверх — это не удается, потому что не существует тегов ID3…

 

from mutagen.id3 import ID3, TIT2

    audio = ID3("example.aif”)

    audio.add(TIT2(encoding=3, text=u"An example"))

    audio.save()
  

audio = ID3(«example.aif») выдает:

 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/id3/_file.py", line 77, in __init__
    super(ID3, self).__init__(*args, **kwargs)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/id3/_tags.py", line 177, in __init__
    super(ID3Tags, self).__init__(*args, **kwargs)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/_util.py", line 533, in __init__
    super(DictProxy, self).__init__(*args, **kwargs)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/_tags.py", line 111, in __init__
    self.load(*args, **kwargs)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/_util.py", line 169, in wrapper
    return func(*args, **kwargs)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/_util.py", line 140, in wrapper
    return func(self, h, *args, **kwargs)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/id3/_file.py", line 154, in load
    self._header = ID3Header(fileobj)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/_util.py", line 169, in wrapper
    return func(*args, **kwargs)
  File "/Users/ef/anaconda2/lib/python2.7/site-packages/mutagen/id3/_tags.py", line 66, in __init__
    raise ID3NoHeaderError("%r doesn't start with an ID3 tag" % fn)
mutagen.id3._util.ID3NoHeaderError: 'example.aif' doesn't start with an ID3 tag


  

Ответ №1:

Когда вы делаете это:

 audio["title"] = u"An example"
  

вы присваиваете тегу строку. Но Mutagen ожидает текстовый фрейм (как ясно из сообщения об ошибке), который определяется следующим образом:

 mutagen.id3.TextFrame(encoding=<Encoding.UTF16: 1>, text=[])
  

Итак, сделайте

 audio["title"] = mutagen.id3.TextFrame(encoding=3, text=[u"An example"])
  

Комментарии:

1. Спасибо, я думаю, что теперь я понимаю текстовые фреймы. Однако в audio.save() метаданные не сохраняются в файле .aif, но я уверен, что это еще одна проблема.

Ответ №2:

В Python 3 строковый тип использует стандарт Unicode для представления символов:

https://docs.python.org/3/howto/unicode.html

Таким образом, вам не придется указывать u перед строкой, если вы не используете Python 2.

Здесь указаны классы фреймов ID3v2.3/4:

https://mutagen.readthedocs.io/en/latest/api/id3_frames.html ?выделите = текстовый фрейм #id3v2-3-4- рамки

 #!/usr/bin/env python3

from mutagen.aiff import AIFF
from mutagen.id3 import TIT2

aiff_path = "/path/to/audio_file.aiff"
audio = AIFF(aiff_path)
audio["TIT2"] = TIT2(text="Track Title")
print(audio.pprint())
audio.save()