Как изменить кодировку тега с модулем eye3D на iso-8859-5?

Файл может иметь cp1251 а также utf-8 кодировок. Я должен:

  1. удалить теги id3 v2
  2. изменить кодировку тегов id3 v1 на iso-8859-5

Я делаю следующее:

def getTagStr (tagUnicStr):
    # gets the 1byte 8bits string, as written in the tag, from the unicode, returned by tag.get*
    # taken from tag2utf-0.16 by Kopats Andrei
    ls = []
    for i in range(0,len(tagUnicStr)):
        if (ord(tagUnicStr[i]) in range(256)):
            ls.append(chr(ord(tagUnicStr[i])))
        else:
            ls.append(tagUnicStr[i])
    Str8 = ''.join(ls)
    return Str8

trackInfo = eyeD3.Mp3AudioFile(path)
tag = trackInfo.getTag()
tag.link(path)
mp3artist = tag.getArtist() # contains Russian characters
mp3artist = getTagStr(mp3artist)
mp3encoding = 'utf-8'
try:
    # pseudo utf-8 encoding
    mp3artist = mp3artist.decode('utf-8')
except UnicodeDecodeError, err:
    # cp1251
    mp3artist = mp3artist.decode('cp1251')
    mp3encoding = 'cp1251'
except UnicodeEncodeError, err:
    # utf-8
    pass

tag.setArtist(mp3artist.encode('iso-8859-5'))
tag.update()

и это терпит неудачу со следующей ошибкой в ​​последней строке:

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 1-5: ordinal not in range(256)

Что не так с моим кодом?

1 ответ

В документации очень неясно об этом, но кажется, что eyeD3 принимает только теги, которые либо 1/ Unicode, либо 2/ байты, закодированные с кодировкой вашей текущей локали (которая затем используется для преобразования тега обратно в Unicode в любом случае).

Следовательно, я не думаю, что ваш подход может работать вообще. По сути, вы не можете передавать произвольно закодированные данные в eyeD3, как вы пытаетесь это сделать в последней строке вашего скрипта.

Кажется, что eyeD3 предоставляет средства, связанные с кодированием:

tag.setTextEncoding(encoding)

Однако после прочтения кода этой функции спецификация ID3 допускает только несколько определенных кодировок, и iso-8859-5 среди них нет.

Таким образом, спецификация ID3 просто не позволяет вам делать то, что вы пытаетесь сделать. Если то, что вы пытаетесь сделать здесь, это обойти эту спецификацию, то eyeD3, которая следует за ней, вряд ли поможет, я боюсь.

Возможно, вы захотите перефразировать ваш вопрос с точки зрения того, чего именно вы пытаетесь достичь, играя с кодировками тегов? Тогда могут быть предложены другие решения.

Другие вопросы по тегам