Pull to refresh

Скрипт для разбиения образов музыкальных CD на треки и конвертации в формат FLAC

Reading time6 min
Views1.2K
Здравствуйте, сообщество!

Так уж сложилось, что на просторах сети можно найти массу музыки в lossless-форматах (FLAC, Monkey`s Audio, Wavpack). Лично мне частенько доставляли неудобства две вещи: во-первых, некоторые альбомы встречаются в качестве образа целого диска, а хранить целый альбом ради одной любимой композиции не хочется; во-вторых, в целях единообразия, хочется привести все композиции к одному формату. Я выбрал для себя FLAC. Не буду глубоко вдаваться в причины выбора, отмечу лишь, что этот формат выгодно отличается от Monkey`s Audio тем, что он открытый; отличие же от формата Wavpack в его значительно более широкой поддержке в портативных плеерах.

Для решения озвученных задач, был составлен скрипт, который и хочу представить. Надеюсь, кому-нибудь пригодится. С радостью учту пожелания в случае таковых.

#!/bin/sh

# Скрипт для разбиения образа аудиодиска в форматах ape, flac, wv c использованием файла cue и переконвертацией треков в формат flac. Скрипт записывает информацию в тэги созданных треков.
# ВНИМАНИЕ! Для работы данного скрипта необходимы установленные пакеты cuetools,shntool,mac. Если данные пакеты не стоят, скрипт предложит их установку.
# Поместите данный скрипт в директорию, в которой находятся файл-образ и CUE-файл и запустите его.

clear # очистка экрана

######################################################################################################################
_chk_pkg_ape () # Проверка наличия/установка пакетов для конвертации из APE, которые необходимы для нормальной работы скрипта
{
N="" # очищаем переменную N
P1=cuetag
P2=shnsplit
P3=flac
P4=mac

which $P1 >/dev/null
if [ "$?" -ne 0 ]
then
N="cuetools"
fi

which $P2 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N shntool"
fi

which $P3 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N $P3"
fi

which $P4 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N $P4"
fi
}
######################################################################################################################
_chk_pkg_flac () # Проверка наличия/установка пакетов для конвертации из FLAC, которые необходимы для нормальной работы скрипта
{
N="" # очищаем переменную N
P1=cuetag
P2=shnsplit
P3=flac

which $P1 >/dev/null
if [ "$?" -ne 0 ]
then
N="cuetools"
fi

which $P2 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N shntool"
fi

which $P3 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N $P3"
fi
}
######################################################################################################################
_chk_pkg_wv () # Проверка наличия/установка пакетов для конвертации из WavPack, которые необходимы для нормальной работы скрипта
{
N="" # очищаем переменную N
P1=cuetag
P2=shnsplit
P3=flac
P4=wavpack

which $P1 >/dev/null
if [ "$?" -ne 0 ]
then
N="cuetools"
fi

which $P2 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N shntool"
fi

which $P3 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N $P3"
fi

which $P4 >/dev/null
if [ "$?" -ne 0 ]
then
N="$N $P4"
fi
}
######################################################################################################################
_pkg_inst () # Принятие решения об установке отсутствующих пакетов, необходимых для работы скрипта
{
[ "$N" ]
if [ $? -eq 0 ]
then
echo "Для работы скрипта необходимо установить пакеты: $N. Вы хотите установить их? (y/n)"
read reply1
case "$reply1" in
"Y" | "y" )
sudo apt-get install $N
;;
* )
echo "Не хотите, как хотите, скрипт завершает работу!"
exit 1
;;

esac
fi
}
#####################################################################################################################
_conv_ape () # Функция для перекодировки из формата APE
{
mv *.ape qiwitemp.ape # переименовываем найденный файл ape
cuebreakpoints "myutf8.cue" | shnsplit -o flac "qiwitemp.ape" # нарезаем образ на дорожки
cuetag "myutf8.cue" split-track*.flac # проставляем теги
mv qiwitemp.ape qiwitemp.ape~ # на всякий случай создаем бэкап исходного образа ape
}
######################################################################################################################
_conv_flac () # Функция для перекодировки из формата FLAC
{
mv *.flac qiwitemp.flac # переименовываем найденный файл flac
cuebreakpoints "myutf8.cue" | shnsplit -o flac "qiwitemp.flac" # нарезаем образ на дорожки
cuetag "myutf8.cue" split-track*.flac # проставляем теги
mv qiwitemp.flac qiwitemp.flac~ # на всякий случай создаем бэкап исходного образа flac
}
######################################################################################################################
_conv_wv () # Функция для перекодировки из формата WavPack (работает в обход, т.к. стандартный метод не работает)
{
mv *.wv qiwitemp.wv # переименовываем найденный файл WV
wvunpack -cc qiwitemp.wv # разделяем файл WV на файлы WAV и CUE
mv *.wav qiwitemp.wav # переименовываем получившийся файл WAV
mv qiwitemp.wv qiwitemp.wv~ # переименовываем файл WV, чтобы не мешал
flac qiwitemp.wav # Кодируем WAV во FLAC
mv *.cue qiwitemp.cue # переименовываем файл cue
iconv --from-code=CP1251 --to-code=UTF-8 --output=myutf8.cue "qiwitemp.cue" && rm qiwitemp.cue # перекодируем теги из кодировки CP1251 в UTF-8, после чего удаляем временный файл
echo " " >>myutf8.cue # дописвыем (на всякий случай) в конец файла пустую строку, чтобы cuebreakpoints не заругался
_conv_flac # кодируем FLAC стандартной функцией
}
######################################################################################################################
_chk_files () # Блок проверки наличия необходимых входных файлов
{
Q_APE=$(ls | tr 'A-Z' 'a-z' | grep '.ape' | wc -l) # подсчитываем количеcтво файлов ape в текущей директории
Q_FLAC=$(ls | tr 'A-Z' 'a-z' | grep '.flac' | wc -l) # подсчитываем количеcтво файлов flac в текущей директории
Q_WV=$(ls | tr 'A-Z' 'a-z' | grep '.wv' | wc -l) # подсчитываем количеcтво файлов wv в текущей директории
Q_CUE=$(ls | tr 'A-Z' 'a-z' | grep '.cue' | wc -l) # подсчитываем количеcтво файлов cue в текущей директории

if [ "$Q_CUE" -ne 1 ] # Проверяем наличие необходимого количества файлов cue в директории
then
if [ "$Q_WV" -ne 1 ]
then # проверяем наличие в каталоге есть хотя бы одного файла WV, из которого можно будет извлечь CUE
echo "Необходимо, чтобы в директории был всего один файл CUE , а у вас их: "$Q_CUE". Выполните данное условие и перезапустите скрипт"
exit 1
fi
else
rename 'y/A-Z/a-z/' * # преобразуем заглавные символы в именах файлов в прописные
mv *.cue qiwitemp.cue # переименовываем найденный файл cue
iconv --from-code=CP1251 --to-code=UTF-8 --output=myutf8.cue "qiwitemp.cue" && rm qiwitemp.cue # перекодируем теги из кодировки CP1251 в UTF-8, после чего удаляем временный файл
echo " " >>myutf8.cue # дописвыем (на всякий случай) в конец файла пустую строку, чтобы cuebreakpoints не заругался

fi

Q_ALL=`expr $Q_APE + $Q_FLAC + $Q_WV` # Проверяем наличие необходимого количества файлов-образов в директории
if [ "$Q_ALL" -ne 1 ]
then
echo "ВНИМАНИЕ!!! Необходимо, чтобы в директории был всего один файл-образ (APE, FLAC, WavPack), а у Вас их: "$Q_ALL". Выполните данное условие и перезапустите скрипт"
exit 1
fi

if [ "$Q_APE" -ne 1 ] # Выясняем, в каком формате находится файл-образ и, если установлены все необходимые утилиты, запускаем опреденный алгоритм перекодировки
then
if [ "$Q_FLAC" -ne 1 ]
then
_chk_pkg_wv
_pkg_inst
_conv_wv
else
_chk_pkg_flac
_pkg_inst
_conv_flac
fi
else
_chk_pkg_ape
_pkg_inst
_conv_ape
fi
}
######################################################################################################################
_over () # Проводим завершающие операции
{
mkdir CONVERTED && mv *.flac ./CONVERTED # Перемещаем сконвертированные файлы и лог-файл в отдельную директорию
cd ./CONVERTED
which easytag >/dev/null
if [ "$?" -ne 0 ]
then
echo "Очень жаль, но у Вас не установлена удобная программа "easytag" для окончательной правки тэгов аудиотреков. Скрипт завершил свою работу."
exit 0
else
easytag "$(pwd)"
exit 0
fi
}

#*********************************************************************************************************************#
#*********************************************************************************************************************#
_chk_files
_over
Tags:
Hubs:
+4
Comments12

Articles

Change theme settings