Карантин-вирус-все дела. Короче, решил я таки разобраться с домашней коллекцией^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 - убрал перекодирование, так как в таком виде программа портит теги для европейских языков вроде французского и испанского (где эти символы в порядке вещей).