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