LINUX.ORG.RU

Перекодирование тегов id3 из cp1251 в юникод (плохой путь)

 , ,


0

1

Карантин-вирус-все дела. Короче, решил я таки разобраться с домашней коллекцией^W свалкой музыки и хотя бы навести порядок в id3 тегах. Что-то готовое «нажал на одну кнопку и всё готово» я не нашел (да и не наш это метод) - поэтому поставил python-mutagen и написал скриптик на баше.

Главное - чтобы он не перекодировал то, что и так уже в юникоде. Проверил на нескольких файлах - вроде нормально отработал. Если кому-нибудь понадобится - можете НА СВОЙ СТРАХ И РИСК его попробовать :) - можно даже в режиме дебага запустить - для этого надо раскомментировать строку # mid3iconv -e cp1251 -d -p «$1» и закоментировать следующую за ней - тогда увидите в консоли «будущие теги» перекодируемого файла.

#!/bin/bash
FILE="$1"
ALL_TAGS=`mid3v2 -l "$1" | grep -e TIT2= -e TPE1= | awk '-F=' '{ print $2 }'`
REENCODE=`echo -n -- $ALL_TAGS | iconv -f utf-8 -t utf-16 | hexdump -d | awk 'BEGIN {RS=" "} {if ($1==$1+0 && $1 > 128 && $1!=65279 && $1<1000)print $1}' | sed ':a;N;$!ba;s/\n/ /g' | sed 's/[ \n]*//g;'`
if [ ! -z "$REENCODE" ]; then
	echo Reencode: "$1"
	# debug 
	# mid3iconv -e cp1251 -d -p "$1" 
	mid3iconv -e cp1251 -d -p "$1"
fi

сохранить под именем recheck.sh и запустить следующей командой: find /path/to/the/music/ -iname '*.mp3' -print0 | xargs -0 -n 1 ./recheck.sh

Не забывайте про бекапы ну или скрестите пальцы перед запуском ;)

P.S. Почему в Development? Потому что такого «ада» я в баше ещё не писал - может кто-нибудь напишет, как можно было попроще в строке определить наличие «юникодного символа А-с-крышечкой и других ему подобных» ([$REENCODE =~ $'.*\u00C0-\u01FF.*'] даёт ложные срабатывания на латинские символы)

UPDATE - убрал перекодирование, так как в таком виде программа портит теги для европейских языков вроде французского и испанского (где эти символы в порядке вещей).


Главное - чтобы он не перекодировал то, что и так уже в юникоде

ID3v1 не имеет поддержки юникода в стандарте, а ID3v2 наоборот, не поддерживает не-юникода. Поэтому проверка совершенно излишня, простого

find "$1" -iname '*.mp3' -print0 | xargs -0 mid3iconv -eCP1251 --remove-v1
вполне достаточно (если, конечно, ты не саахрикту и у тебя теги не в кои8).

gremlin_the_red ★★★★ ()
Ответ на: комментарий от gremlin_the_red

Ну у меня ситуация была совсем плохая - когда-то давно я по всем файлам сделал перевод id3 из первой версии во вторую или хрень какую-то другую - короче простой iconv прогонять уже нельзя было. Фишка именно в том - что надо было на части файлов только это делать, иначе полная хрень получалась.

Qasta ()
Ответ на: комментарий от grem

Ну это «руками» - не наш метод :)

Спасибо всем откликнувшимся. В качестве решения - декодировать чарсет с помощью enca - имхо самый годный вариант. Надо будет ковырнуть на досуге :)

Qasta ()