Русские тэги MP3

Материал из Xgu.ru

Перейти к: навигация, поиск

Автор: Игорь Чубин

Русские тэги MP3 во многих Linux программах отображаются неверно. Например, популярный MP3-плеер Amarok показывает вместо русских названий "непонятные значки", что делает его использование для проигрывания песен с русскими названиями очень неудобным.

Проблема связана с тем, что во многих MP3-файлах русские тэги записаны в кодировке CP1251, использующейся в операционных системах MS Windows, а плееры Linux и FreeBSD предполагают (не всегда, но часто), что тэги записаны в универсальной кодировке UTF-8. Таким образом, проблема решается путём преобразования тэгов из одной кодировки в другую.

В этой статье представлен скрипт, а также детально описывается его работа, который предназначен для преобразования кодировки тэгов MP3.

Содержание

[править] Скрипт для преобразования кодировки тэгов

Представленная функция конвертирует текст в тэгах MP3 из кодировки CP1251 в кодировку UTF-8. Обрабатываются все файлы, имена которых переданы в качестве аргументов функици. Функция использует для перекодировки программы id3ed (пакет id3ed) для тэгов V1 и id3v2 (пакет id3v2) для тэгов V2.

id3conv() 
{
    for mp3file 
    do
    eval id3ed -q $(id3ed -i "$mp3file" | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ ') \"$mp3file\"
    eval id3v2 $(id3v2 -l "$mp3file" | iconv -f CP1251 -t UTF8 | sed '1,/^id3v2/d' | sed 's/\ \(.*\):\ / "/; s/$/"/; s/^/--/;') \"$mp3file\" 
    done
}

Для описания функции, её нужно просто скопировать в командную строку. Если функция будет использоваться часто, стоит записать ей в файл, а затем подключить его к настроечному файлу ~/.bashrc (или другому файлу настройки вашего командного интерпретатора), добавив строку в этот файл:

. ~/.id3conv-function

(предполагается, что описание функции находится в файле ~/.id3conv-function)

[править] Примеры использования скрипта

Ниже показаны типовые примеры использования функции.

Для того чтобы сконвертировать тэги для всех файлов в текущем каталоге:

%$ id3conv *.mp3

Для того чтобы сконвертировать все файлы в каталоге и его подкаталогах, обойдя каталог рекурсивно:

%$ find /data/Music -iname \*.mp3 | while read mp3file
   do
   id3conv "$mp3file"
   done

[править] Подробности

Этот раздел нужен только тем, кто хочет понять детали работы скрипта. В нём описывается процесс создания скрипта с нуля.


%$ id3ed
id3ed v1.10.4 - mpeg layer 3 file information editor
Usage: id3ed [-s songname] [-n artist] [-a album] [-y year] [-c comment]
             [-k tracknum] [-g genre] [-q] [-SNAYCKG] [-l/-L] [-r]
             [-i] <mp3files> [-v]

  -q                    no line interface; only set tags specified on command
                        line. Use twice to suppress all output except errors.
  -SNAYCKG              prompt to edit the specified tags only
                        Other tags can still be set with the -[snaycg] options.
  -l/-L                 display list of genres
  -r                    remove id3 tag from files
  -i                    show current id3 tag only, don't edit
  -v                    output program version/license

Программа предназначена для просмотра и редактирования тэгов в MP3-файлах.

Просмотрим тэги из файла 02.mp3:

%$ id3ed -i 02.mp3
02.mp3: (tag v1.1?)
songname: �������
artist: �������� ���
album: ������
year: 2006
comment: electromusic
tracknum: 0
genre: Pop(13)

Тэги написаны в кодировке CP1251, а на нашей консоли используется кодировка UTF-8, поэтому они отобразились некорректно.

Преобразуем тэги при выводе из одной кодировки в другую:

%$ id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8
02.mp3: (tag v1.1?)
songname: Отпусти
artist: Савичева Юля
album: Магнит
year: 2006
comment: electromusic
tracknum: 0
genre: Pop(13)

Сейчас всё в порядке.

Нам нужно записать полученные, сконвертированные тэги обратно. Для этого потребуется немного преобразовать данные и записать их обратно в файл с помощью тойже программы id3ed.

Оставляем только нужные тэги:

%$ id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)'
songname: Отпусти
artist: Савичева Юля
album: Магнит

Заменяем названия тэгов на соответствующие ключи с помощью программы sed.

%$ id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/^songname:/-s/; '
-s Отпусти
artist: Савичева Юля
album: Магнит

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

%$ id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/^songname: /-s "/; '
-s "Отпусти
artist: Савичева Юля
album: Магнит

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

%$ id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ '
-s "Отпусти"
-n "Савичева Юля"
-a "Магнит"

Теперь выводим результат в одну строку. Используем командную подстановку и echo

%$ echo $(id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ ')
-s "Отпусти" -n "Савичева Юля" -a "Магнит"

Тоже самое, но уже с названием команды:

%$ echo id3ed $(id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ ') 02.mp3 
id3ed -s "Отпусти" -n "Савичева Юля" -a "Магнит" 02.mp3

Нам нужно не просто вывести команду на экран, но и выполнить её. Поэтому заменяем echo на eval:

%$ eval id3ed $(id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ ') 02.mp3 

File 02.mp3: (tag v1.1)
songname[max:30]: Отпусти

id3ed не хочет менять тэги молча! Он просит у нас поправить каждый тэг. Нам это не нужно, поэтому воспользуемся ключом -q

%$ id3ed
id3ed v1.10.4 - mpeg layer 3 file information editor
Usage: id3ed [-s songname] [-n artist] [-a album] [-y year] [-c comment]
             [-k tracknum] [-g genre] [-q] [-SNAYCKG] [-l/-L] [-r]
             [-i] <mp3files> [-v]

<b>  -q                    no line interface; only set tags specified on command
                        line. Use twice to suppress all output except errors.</b>
  -SNAYCKG              prompt to edit the specified tags only
                        Other tags can still be set with the -[snaycg] options.
  -l/-L                 display list of genres
  -r                    remove id3 tag from files
  -i                    show current id3 tag only, don't edit
  -v                    output program version/license


Итак, окончательная версия командной строки для конвертирования тэгов из CP1251 в UTF-8 выглядит так:

%$ eval id3ed -q $(id3ed -i 02.mp3 | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ ') 02.mp3 

File 02.mp3: (tag v1.1)

Проверка:

%$ id3ed -i 02.mp3
02.mp3: (tag v1.1?)
songname: Отпусти
artist: Савичева Юля
album: Магнит
year: 2006
comment: electromusic
tracknum: 0
genre: Pop(13)


Всё в порядке. Можно оформить полученную строку в виду функции командного интерпретатора:

id3conv() 
{
    for mp3file 
    do
    eval id3ed -q $(id3ed -i "$mp3file" | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ ') "$mp3file"
    done
}

Аналогичным образом поступаем с тэгами v2. Для работы с тэгами v2 используем программу id3v2.

Сейчас нас интересуэт тэги второй версии. Просматриваем тэги, конвертируем и проверям:

%$ id3v2 -l 02.mp3 
id3v1 tag info for 02.mp3:
Title  : �������                         Artist: �������� ���                  
Album  : ������                          Year: 2006, Genre: Pop (13)
Comment: electromusic                    Track: 0
id3v2 tag info for 02.mp3:
TPE2 (Band/orchestra/accompaniment): �������� ���
TYER (Year): 2006
TALB (Album/Movie/Show title): ������
TCON (Content type): Pop (13)
TIT2 (Title/songname/content description): �������
TPE1 (Lead performer(s)/Soloist(s)): �������� ���
TENC (Encoded by): http://electromusic.infostore.org
WXXX (User defined URL link): (): http://electromusic.infostore.org
TXXX (User defined text information): (Engineer): ����� Myzzz
COMM (Comments): ()[eng]: electromusic
GEOB (General encapsulated object): (SfAcidChunk)[]: , 24 bytes
%$ eval id3v2 `id3v2 -l 02.mp3 | iconv -f CP1251 -t UTF8 | sed '1,/^id3v2/d' | sed 's/\ \(.*\):\ / "/; s/$/"/; s/^/--/;'` 02.mp3 
(): 
%$ id3v2 -l 02.mp3 
id3v1 tag info for 02.mp3:
Title  : Отпусти                  Artist: Савичева Юля       
Album  : Магнит                    Year: 2006, Genre: Unknown (255)
Comment: electromusic                    Track: 0
id3v2 tag info for 02.mp3:
WXXX (User defined URL link): (): http://electromusic.infostore.org
COMM (Comments): ()[eng]: electromusic
GEOB (General encapsulated object): (SfAcidChunk)[]: , 24 bytes
COMM (Comments): (ID3v1 Comment)[XXX]: electromusic
TPE2 (Band/orchestra/accompaniment): Савичева Юля
TYER (Year): 2006
TALB (Album/Movie/Show title): Магнит
TCON (Content type): Pop (13) (255)
TIT2 (Title/songname/content description): Отпусти
TPE1 (Lead performer(s)/Soloist(s)): Савичева Юля
TENC (Encoded by): http://electromusic.infostore.org
TXXX (User defined text information): (): Звуки Myzzz
COMM (Comments): ()[]: electromusic

Преобразование успешно выполнено.

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

Итоговый вид функции, которая выполняет преобразование тэгов v1 и v2 в MP3-файлах:

id3conv() 
{
    for mp3file 
    do
    eval id3ed -q $(id3ed -i "$mp3file" | iconv -f CP1251 -t UTF-8 | egrep '^(song|artist|album)' | sed 's/$/"/; s/^songname: /-s "/; s/^artist: /-n "/; s/^album: /-a "/ ') "$mp3file"
    eval id3v2 `id3v2 -l "$mp3file" | iconv -f CP1251 -t UTF8 | sed '1,/^id3v2/d' | sed 's/\ \(.*\):\ / "/; s/$/"/; s/^/--/;'` "$mp3file" 
    done
}

[править] См. на xgu.ru

Информация об использовавшихся программах и командах:

[править] Дополнительная информация