Русские тэги 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
Информация об использовавшихся программах и командах:
[править] Дополнительная информация
- Russian and Unicode ID3 tags - Михаил Якшин о проблемах русских кодировок в тэгах MP3