FreeBSD

Cкрипт для перекодировки FLAC в ogg

Cкрипт для перекодировки Lossless музыки в формате FLAC и Monkey’s Audio Codecs в ogg

#/bin/bash

# This script is intended to convert ape or flac + cue files to
# ogg vorbis files, setting the tags to the correct value,
# obtained from the cue file.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
# USA

tmp_dir=$(mktemp -d)
trap trap_func INT EXIT
red='e[31;01m'
normal='e[0m'
soft=(
"mac"
"oggenc"
"mp3splt"
"flac"
)

trap_func() {
rm_temp_func &&
return 0;
}

rm_temp_func() {
rm -rf "${tmp_dir}" &&
return 0;
}

check_soft(){
for soft in "${soft[@]}"; do
( command -v "$soft" > /dev/null ) ||
 { echo -e "${red}you do not have essential soft installed. ${soft} not found.${normal}" ; exit 1; }
done
return 0;
}

check_soft

if [ "$1" = "--help" -o "$1" = "-h" ]
then cat <<'EOF'
############################################################################
# Использование: script.sh [директория1] [директория2] [число]
# Директория1- каталог, который будет обработан, директория2-
# каталог, в котором будут сохраняться выходные файлы. Число-
# требуемое качество ogg файлов. 1-min, 10-max. По умолчанию 6.
# При запуске без параметров обрабатывается текущая директория.
############################################################################
EOF
exit
fi

[ "$#" -eq 0 ] && src="$PWD" || src="$1"
[ "$#" -lt 2 ] && save="$PWD" || save="$2"
[ "$#" -lt 3 ] && quality=6 || quality="$3"

# Список flac и ape файлов.

music_file=()
while read -r ; do
music_file+=("$REPLY")
done < <(find "$src" ( -iname "*.ape" -o -iname "*.flac" ))

# Список cue файлов.

cue_file=()
while read -r ; do
cue_file+=("$REPLY")
done < <(find "$src" -iname "*.cue")

# Эта функция писана для того, чтобы mkdir съедал пробелы в названиях.
# Не осилил, как сделать более кошерный вариант.

ifs_func() {
OLD_IFS="$IFS";
IFS=$'n';
}

dirname_func() {
dirname "${music}"
}

ifelse_func() {
 [ "$?" -eq "0" ]
}

basename_func() {
basename "${music}"
}

# Быдлокодер, хуле.

bbasename_func() {
basename $(dirname_func)
}

for music in "${music_file[@]}"; do
ifs_func;
mkdir -p "${tmp_dir}"$(dirname_func);
mkdir -p "$save"/$(bbasename_func);
IFS="$OLD_IFS";
echo "${music}" | grep -i ".flac$";
if ifelse_func; then
# oggenc может быть как с поддержкой flac-а, так и без неё.
oggenc -q "${quality}" -o "${tmp_dir}${music}".ogg "${music}" ||
# Перегоняем flac в wav, если oggenc собран без поддержки flac.
flac -d "${music}" -o "${tmp_dir}${music}".wav
else
mac "${music}" "${tmp_dir}${music}".wav -d
fi
done

# Кодируем wav в ogg

for music in "${music_file[@]}"; do
oggenc -q "${quality}" -o "${tmp_dir}${music}".ogg "${tmp_dir}${music}".wav
done

# Правим кодировку. For ubunu users. Оставил кодировку исходных cue файлов.

for cue in "${cue_file[@]}"; do
if file "${cue}" | egrep -qi 'iso|cp1251'; then
iconv -f cp1251 < "${cue}" > "${tmp_dir}${cue}";
else
cp "${cue}" "${tmp_dir}${cue}"
fi
done

# Эта конструкция ищет cue файл с описанием обрабатываемого ogg файла.
# Сделано исключительно из-за того, что некоторые вендузятники кладут
# по 2 cue файла на 1 flac.

for music in "${music_file[@]}"; do
for filecue in "${tmp_dir}${cue_file[@]}"; do
ifs_func;
grep $(basename_func) "${filecue}";
if ifelse_func; then
mp3splt -c "${filecue}" -o "@n+-+@t" "${tmp_dir}${music}".ogg -d "${save}"/$(bbasename_func) ||
{ echo -e "${red}fail${normal}" ; exit 1; }
IFS="$OLD_IFS";
fi
done
done

# Если у вас flac и cue файлы лежат попарно, можете раскоментировать
# эту секцию, и закоментировать предыдущую.

# for ((music=0; music<${#music_file[@]}; music++)); do
# ifs_func;
# mp3splt -c ${cue_file["$music"]} -o "@n+-+@t" ${tmp_dir}${music_file["$music"]}.ogg -d "${save}"/$(bbasename_func);
# IFS="$OLD_IFS";

exit 0

Оставить комментарий