LINUX.ORG.RU

Ломаные кодировки в тэгах музыкальных файлов


0

1

Прочитав мануал к enca, я вспомнил о сабже и был удивлён выводом:

Universal transformation format 8 bits; UTF-8
  Doubly-encoded to UTF-8 from ISO-8859-5

Раскодировав недавно эту «кодировку», я приступил к стандартизации...

И набыдлокодил:

#!/bin/bash

# Скрипт находит все ogg файлы в pwd-директории и перепиливает теги из поломаной 
# кодировки типа Doubly-encoded to UTF-8 from ISO-8859-5 (enca) в юникод.
# vorbis-tools сами ставите

find . -type f -iname '*.ogg'|while read vorbisfile #Заряжаем цикл
do
        vorbiscomment -Rl "$vorbisfile" > tmp
        sed -e 's/\ /_/g' tmp > tnp # так я обхожу проблему с пробелами
        noutf=0
        for string in `cat tnp`
        do
                
                tagval=${string#*=}
                tag=${string%%=*}

                if [[ 1 -eq `echo $tagval|enca|grep "Doubly-encoded to UTF-8 from ISO-8859-5"|wc -l` ]] 
                #разведка тэгов на наличие неполиткоррекных кодировок
                then
                        newtagval=`echo $tagval|iconv -f utf8 -t latin1|iconv -f cp1251`
                        #  Да! Без оффтопа не обошлось
                        if [[ ${#newtagval} -ne 0 ]] # Если случай не клинический
                        then
                                noutf=1
                                sed -e "s/$tagval/$newtagval/" tnp > tmp
                                cp tmp tnp
                        fi
                fi
        done

        if (( $noutf )) #без надобности файл трогать не будем
        then
                for tag in `cat tnp`
                do
                        tag=`echo $tag|sed -e 's/_/\ /g'`
                        if (( $noutf )) # сначала теги переписываются, а потом добавляются
                        then
                                vorbiscomment -Rw "$vorbisfile" -t "$tag" 
                                noutf=0 
                        else
                                vorbiscomment -Ra "$vorbisfile" -t "$tag"
                        fi
                done
        fi
done
rm tmp tnp

Я уже скрипт запустил у себя и стало гораздо лучше, но без косяков не обошлось. Ещё мне неначем стало скрипт тестировать. Поэтому и публикую.

★★★★★

Ответ на: комментарий от backbone

а мне больше нравится работать с переменными, вместо tmp/tnp... только когда уж слишком большой поток данных, тогда в файл и построчный read

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

Чорт! Я сначала убрал пробелы, а потом стал обходить проблему с пробелами в цикле с побощью cat.

ados ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.