Перекодирование одиночного lossless аудиофайла во FLAC по CUE-таблице: различия между версиями
Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
Rain (обсуждение | вклад) |
Rain (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
Скрипт для преобразования одиночного файла, представляющего собой копию диска в отдельные FLAC-файлы с заполнением тегов и именованием файлов в соответствии с CUE-таблицой | Скрипт для преобразования одиночного файла, представляющего собой копию диска в отдельные FLAC-файлы с заполнением тегов и именованием файлов в соответствии с CUE-таблицой | ||
* Работает с файлами в формате APE, WavPack, FLAC, WAV | * Работает с файлами в формате APE, WavPack, FLAC, WAV, ALAC | ||
* В случае отсутствия CUE-файла просто конвертирует входной файл во FLAC | * В случае отсутствия CUE-файла просто конвертирует входной файл во FLAC | ||
* Конвертирует CUE с национальными символами в utf-8 с использованием enca (автоматически определяет кодировку) | * Конвертирует CUE с национальными символами в utf-8 с использованием enca (автоматически определяет кодировку) | ||
Строка 16: | Строка 16: | ||
#!/bin/bash | #!/bin/bash | ||
# By Rain ;) | # By Rain ;) | ||
# Usage: | # Usage: cueape2flac "AUDIO FILE.ape" "TEXT FILE.cue" | ||
# Depends on flac, if needed - shntool, cuetools, enca, monkeys-audio, wavpack | # Depends on flac, if needed - shntool, cuetools, enca, monkeys-audio, wavpack, alac | ||
outdir='output' | outdir='output' | ||
Строка 28: | Строка 28: | ||
test $(which flac) || error "Error: FLAC convertor not found" 1 | 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 | if [ ! -z "${2}" ]; then | ||
Строка 35: | Строка 64: | ||
cuefile="${2}" | cuefile="${2}" | ||
else | else | ||
if | if [ "${fileformat}" == 'FLAC' ]; then | ||
if [ "$(metaflac --list "${1}" | grep -qi cuesheet && echo 1)" ]; then | if [ "$(metaflac --list "${1}" | grep -qi cuesheet && echo 1)" ]; then | ||
echo "Founded build-in CUE-sheet, extracting..." | echo "Founded build-in CUE-sheet, extracting..." | ||
Строка 45: | Строка 74: | ||
fi | fi | ||
fi | fi | ||
fi | fi | ||
Строка 58: | Строка 81: | ||
if [ "${direct}" == '0' ]; then | if [ "${direct}" == '0' ]; then | ||
case "${filetype}" in | |||
APE) | |||
echo "Converting "$1" from APE to WAV-format" | echo "Converting "$1" from APE to WAV-format" | ||
mac "$1" "${outdir}/${tempfile}.wav" -d | 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" | echo "Converting "$1" from FLAC to WAV-format" | ||
flac -d "${1}" -o "${outdir}/${tempfile}.wav" | flac -d "${1}" -o "${outdir}/${tempfile}.wav" | ||
;; | |||
WAV) | |||
echo "Ok, ${1} ready to splitting, linking to ${outdir}" | echo "Ok, ${1} ready to splitting, linking to ${outdir}" | ||
ln "${1}" "${outdir}/${tempfile}.wav" | ln "${1}" "${outdir}/${tempfile}.wav" | ||
;; | |||
echo "Converting "$1" from WavPack to WAV-format" | WV) | ||
echo "Converting "$1" from WavPack to WAV-format" | |||
wvunpack -m "${1}" | |||
mv "${1%.*}.wav" "${outdir}/${tempfile}.wav" | |||
;; | |||
esac | |||
else | else | ||
case "${fileformat}" in | |||
echo "Converting "$1" from WavPack to WAV-format" | WV) | ||
echo "Converting "$1" from WavPack to WAV-format" | |||
wvunpack -m "${1}" | |||
mv "${1%.*}.wav" "${outdir}/${tempfile}.wav" | |||
ln "${1}" "${outdir}/${tempfile}.${1##*.}" | ;; | ||
ALAC) | |||
echo "Converting "$1" from ALAC to WAV-format" | |||
alac -f "${outdir}/${tempfile}.wav" "$1" | |||
;; | |||
*) | |||
ln "${1}" "${outdir}/${tempfile}.${1##*.}" | |||
;; | |||
esac | |||
fi | fi | ||
Версия 13:50, 4 июля 2009
Скрипт для преобразования одиночного файла, представляющего собой копию диска в отдельные 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 сделать сохранение тегов