Max Sinelnikov wrote: > Решил перейти с xmms на amorok. Больно уж красив и фичаст:) Но пришлось > вспомнить о давно застрявшей проблеме с кодировками тагов в мп3.
Аналогично пришлось решать проблему при переходе на Rhythmbox. > 2) можно все таги из id3v1 перевести в id3v2.3 или в id3v2.4. В какую > лучше переводить и в какой кодировке в таком случае надо писать > русские таги? Лучше и удобнее под линуксом использовать кодировку UTF-8, а она появилась только в id3v2.4 > И общий вопрос .. есть какой-нибудь готовый инструмент для массовой > переконвертации тагов? Наверняка не у меня одного эта проблема, может > кто-нибудь уже написал нужные скрипты? Я написал скриптик на питоне (см. вложение; использует python-id3lib), который сканирует .mp3 файлы в текущем каталоге и выводит набор шеловских команд с вызовом eyeD3. Довольно сырой, но работает. Обычно перед перекодировкой я всё что нужно правлю в EasyTag'e и сохраняю тэги в кодировке 1251. > Напоследок, скажу, что совместимость с виндовс- и железными > mp3-плеерами меня при этом нисколько не волнует. Если у меня будет все > по стандарту, то это их проблемы. Под виндой есть foobar2000, он может правильно показывать UTF-8 тэги из id3v2.4; с винампом не боролся. -- С уважением, Игорь.
#!/usr/bin/python import os, pyid3lib frameids = { 'TIT2': '-t', 'TPE1': '-a', 'TALB': '-A', 'TYER': '-Y' } notneeded = ('TLEN') # TRCK: -n[/-N] # TCON: (-G) entries = os.listdir('.') files = [] for entry in entries: if entry[-4:] == '.mp3': files.append(entry) files.sort() for file in files: cmdline = 'eyeD3' tags = pyid3lib.tag(file) for tag in tags: frameid = tag['frameid'] if frameid in frameids.keys(): cmdline = '%s %s "%s"' \ % (cmdline, frameids[frameid], tag['text'].decode('cp1251').encode('utf-8')) elif frameid == 'TRCK': text = tag['text'] if '/' in text: n = text.index('/') cmdline = '%s -n %s -N %s' % (cmdline, text[:n], text[n+1:]) else: cmdline = '%s -n %s' % (cmdline, text) elif frameid == 'TCON': cmdline = '%s -G %s' % (cmdline, tag['text'][1:-1]) elif tag.has_key('text') and frameid not in notneeded: cmdline = '%s --set-text-frame="%s:%s"' \ % (cmdline, frameid, tag['text'].decode('cp1251').encode('utf-8')) print 'eyeD3 --remove-all "%s"' % file , print '&&' , print '%s --set-encoding=utf8 "%s"' % (cmdline, file)