Перекодирование одиночного lossless аудиофайла во FLAC по CUE-таблице

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Скрипт для преобразования одиночного файла, представляющего собой копию диска в отдельные FLAC-файлы с заполнением тегов и именованием файлов в соответствии с CUE-таблицой

  • Работает с файлами в формате APE, WavPack, FLAC, WAV, ALAC
  • В случае отсутствия CUE-файла просто конвертирует входной файл во FLAC
  • Конвертирует CUE с национальными символами в utf-8 с использованием enca (автоматически определяет кодировку)
  • Заполняет теги в выходных файлах из CUE
  • Умеет экспортировать CUE, встроенный во FLAC-файл, после чего делает нарезку/заполнение тегов по этому CUE (если принудительно не указан внешний файл)
  • Автоматически определяет тип файла по MIME-type
  • Может обрабатывать входной файл двумя способами - стандартными утилитами для каждого формата (опция direct=0) с последующей нарезкой и напрямую средствами shnsplit (кроме формата WavPack, он в любом случае сначала конвертируется в WAV).
Использование
anycue2flac "AUDIO FILE.ape" "TEXT FILE.cue"
Зависимости
flac, shntool, cuetools, enca, monkeys-audio, wavpack (в зависимости от того, с какими файлами надо будет работать)

#!/bin/bash
# By Rain ;)
# Usage: cueape2flac "AUDIO FILE.ape" "TEXT FILE.cue"
# Depends on flac, if needed - shntool, cuetools, enca, monkeys-audio, wavpack, alac

outdir='output'
direct='1'

error() {
echo -e "\e[31m${1}\e[0m"
exit $2
}

test $(which flac) || error "Error: FLAC convertor not found" 1

if 	[[ "$(file -b "${1}")" =~ "Monkey's Audio" ]]; then
		test $(which mac)	|| error "Error: Monkey Audio convertor not found" 1
		fileformat='APE'
		echo "File format is Monkey's Audio"
elif	[[ "$(file -b "${1}")" =~ "iTunes AAC-LC" ]]; then
		test $(which alac)	|| error "Error: Apple Lossless Decoder not found" 1
		if [ "$(alac -t "${1}" 2>/dev/null)" == 'file type: alac' ]; then
			fileformat='ALAC'
			echo "File format is Apple Lossless Audio Codec"
		else
			error "File format is M4A, but not ALAC, aborting..." 1
		fi

elif	[[ "$(file -b "${1}")" =~ "FLAC audio" ]]; then
		fileformat='FLAC'
		echo "File format is Free Lossless Audio Codec"

elif	[[ "$(file -b "${1}")" =~ "WAVE audio" ]]; then
		fileformat='WAV'
		echo "File format is Wave"

elif	[ "${1##*.}" == 'wv' ]; then
		test $(which wvunpack)	|| error "Error: WavPack decompressor not found" 1
		fileformat='WV'
		echo "File format is probably WavPack"
else
	error "Can't recognize input file format" 1
fi

if [ ! -z "${2}" ]; then
	test $(which shnsplit)	|| error "Please, install shntool first" 1
	test $(which enconv)	|| error "Please, install enca first" 1
	test $(which cuetag)	|| error "Please, install cuetools first" 1
	cuefile="${2}"
else
	if [ "${fileformat}" == 'FLAC' ]; then
		if [ "$(metaflac --list "${1}" | grep -qi cuesheet && echo 1)" ]; then
			echo "Founded build-in CUE-sheet, extracting..."
			metaflac "${1}" --export-tags-to=- | sed -e 's/CUESHEET=//g' -n -e '/^ *$/,//!p' > "${1%.*}.cue"
			cuefile="${1%.*}.cue"
		else
			echo "CUE-sheet not specified, so we simply convert ${1} to FLAC format"
			direct='0'
		fi
	fi
fi

[ -e $outdir ] && echo "Warning: $outdir already exist" || echo "Creating output directory"
mkdir -p "$outdir"
tempfile="$(date +tempfile.%s)"

if [ "${direct}" == '0' ]; then
	case "${filetype}" in
		APE)
			echo "Converting "$1" from APE to WAV-format"
			mac "$1" "${outdir}/${tempfile}.wav" -d
		;;
		ALAC)
			echo "Converting "$1" from ALAC to WAV-format"
			alac -f "${outdir}/${tempfile}.wav" "$1"
		;;
		FLAC)
			echo "Converting "$1" from FLAC to WAV-format"
			flac -d "${1}" -o "${outdir}/${tempfile}.wav"
		;;
		WAV)
			echo "Ok, ${1} ready to splitting, linking to ${outdir}"
			ln "${1}" "${outdir}/${tempfile}.wav"
		;;
		WV)
			echo "Converting "$1" from WavPack to WAV-format"
			wvunpack -m "${1}"
			mv "${1%.*}.wav" "${outdir}/${tempfile}.wav"
		;;
	esac
else
	case "${fileformat}" in
		WV)
			echo "Converting "$1" from WavPack to WAV-format"
			wvunpack -m "${1}"
			mv "${1%.*}.wav" "${outdir}/${tempfile}.wav"
		;;
		ALAC)
			echo "Converting "$1" from ALAC to WAV-format"
			alac -f "${outdir}/${tempfile}.wav" "$1"
		;;
		*)
			ln "${1}" "${outdir}/${tempfile}.${1##*.}"
		;;
	esac
fi

cd "${outdir}"

if [ -z "${cuefile}" ]; then
	echo "Converting "${1}" to FLAC"
	flac --delete-input-file --best -V "${tempfile}.wav" -o "${1%.*}.flac"
else
	# Converting CUE-sheet
	cat ../"${cuefile}" | enconv > "${cuefile}"
	
	echo "Splitting "${1}" to multiple FLAC files"
	cat "${cuefile}" | shnsplit -o 'flac ext=flac flac --best -V - -o %f' -t %n-%p-%a-%t "${tempfile}"*
	rm -f "${tempfile}"*
	echo "Tagging files"
	cuetag "${cuefile}" *.flac
fi

exit 0

ToDo: для варианта FLAC->FLAC без CUE сделать сохранение тегов