Monday, July 23, 2007

Массовая конвертация ID3v1 и ID3v2 тэгов

Вопрос возник после заинтересованности в Music Player Daemon. Большинство музыки у меня в кодировке koi8-r и тем самым при добавлению в базе выходили кракозябры вместо русских названий песен и исполнителей.
Для конвертации понадобилось Java приложение ID3iconv. Скачать его можно отсюда.
Использовать её нужно командой:
java -jar путь/до/jar_файла путь_к_фалйам

Но что делать если нужно это сделать массово? Предположим что у нас есть в районе 100 файлов раскинутых ну к примеру по 50 папкам. Нужно делать рекурсию. Сначала расскажу об несокльких неудачных попытках.
1. Идея состояла в том чтобы список файлов передавать как /*/*.mp3 - Т.е. заходя в любую папку и меняя там все файлы...Но по запросу можно понять что мы можем зайти только в 1 директорию, т.е. Music/a/ в случае же если попробовать зайти через рекурсию в /Music/a/b то java машина может выдать ошибку о том, что аргумент слишком длинный.
2. Связка ID3iconv и find - По своету vonderer'a решил попробовать промутить скрипт, который бы перекодировал бы все найденные файлы в результате поискового запроса.
java -jar /home/id3iconv-0.2.1.jar -e cp1251 `find /D/Music/Russian/Ария/ -name *mp3`
Идея была убита тем что в результате выполения скрипта каждый пробел означал переход на новый файл. Т.е. файл 01 - Track01.mp3 Расценивался как 3 файла. Есстественно не обработанными оказывались все файлы.
3. Идея. Выполение скрипта на найденные файлы. Казалось бы всё что сделано просто поменяли местами предыдщуий алгоритм.
find /D/Music/ -name '*.mp3' -exec java -jar /home/id3iconv-0.2.1.jar -e cp1251 {} \;
Такую идею я позаимствовал у сообщества любителей MacOS ( http://www.macfaq.ru/index.php/Русские_Теги_в_iTunes ) Как ни странно но данный способ сработал. Все файлы были
переконвертированы в нормальный вид:-) При моей библиотеке в 70 Гб, данная функция оказалась просто необходимой при добавлении в базу mpd

12 comments:

vonderer@darkstar said...

Интересная статья, спасибо, только согласуй кодировку: в первой строке у тебя koi8-r, а потом ты перегоняешь из cp1251. :)

valeho said...

Бррр....я что то совсем запутался)) Исправлю%)

virens said...

Спасибо, осваиваю MOC, он приниципиально не жуёт ничего из кои и ср. Будем переводить.

valeho said...

С MOC'om можешь к vonderer'у обратится;) Он в принципе с ним работал :-)

ru_linuxtalk said...

Есть еще более интересный и правильный метод:

find /D/Music/ -name '*.mp3' -print0 | xargs -0 java -jar /home/id3iconv-0.2.1.jar -e cp1251

Выигрыш в том, что xargs сконструирует список аргументов для программы (в нашем случае - id3iconv), тем самым сократив количество ее запусков, что положительно скажется на производительности.

Опция '-print0' у find заставляет его заканчивать строки символом \0 вместо стандартного перевода строки \n. Опция '-0' у xargs, соответственно, дает знать xargs, что строки будут завершаться нулями.

valeho said...

Есть еще более интересный и правильный метод:

find /D/Music/ -name '*.mp3' -print0 | xargs -0 java -jar /home/id3iconv-0.2.1.jar -e cp1251

Спасибо за более правильный метод и за комментарии:-) Поправлю пост ;-)

vonderer@darkstar said...

Пользователей (k/x/ed)ubuntu прошу обратить внимание на следующее: gij (GNU Java), поставляющийся с системой в умолчательной сборке для этих целей не подходит. Поясню, почему: первые буквы заголовков стабильно выпадают, и в итоге вместо "Ария - Игра с огнем" (исполнитель - название) получим "рия - гра с огнем". Поэтому необходимо установить sun-java6-jre.

vonderer@darkstar said...

А еще небольшой баг в статье. %) Не IDv3, а ID3v1 и ID3v2. ;)

Муха said...

еще есть mid3iconv - версия на python. я пользовался ей, так как муз. файлы находились на ntfs разделе и почему-то id3iconv решительно не принимал кодировку файловой системы.

adm-fil said...

Долго искал - нашел, попробовал, помогло.
Спасибо. И слава великому Юниксу! Пытался в винде сделать через разные программки с красывым интерфейсом, конечно безуспешно.
А в Никсе одной командой!(правда нужна джава, но сейчас трудно представить себе никс без джавовых библиотек...).
В общем спасибо Автору, Никсу, и CSH :)

Eternal Stranger said...

Можно сделать и без явы
find -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1

Pretorean said...

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