Шукати в цьому блозі

вівторок, 20 грудня 2016 р.

Як розбити flac по наявному cue у Linux?

Як виявилося тема ця не нова. Найпростіший шлях такий. Встановлюємо:
sudo aptitude install cuetools shntool flac
Далі, припустимо у нас є наступні файли:
$ ls -1 Океан\ Ельзи\ -\ Без\ меж.*
Океан Ельзи - Без меж.cue
Океан Ельзи - Без меж.flac
Тоді розбити оригінальний flac на окремі композиції можна так:
$ cuebreakpoints Океан\ Ельзи\ -\ Без\ меж.cue | \
  shnsplit -o flac Океан\ Ельзи\ -\ Без\ меж.flac
Після чого отримуємо наступний список файлів:
$ ls -1 split-track*
split-track01.flac
split-track02.flac
split-track03.flac
split-track04.flac
split-track05.flac
split-track06.flac
split-track07.flac
split-track08.flac
split-track09.flac
split-track10.flac
split-track11.flac
Окремий файл - окрема композиція.
Але є певна проблема, у отриманих файлах відсутня інформація про виконавця, альбом, тощо. Це не зовсім зручно, якщо збираємося додати ці файли у сучасні медіаплеєри, які вміють читати ці метадані.

Покроково.
Кількість композицій:
$ cueprint -d '%N' Океан\ Ельзи\ -\ Без\ меж.cue
11
Метадані по композиції №1:
$ cueprint -n 1 Океан\ Ельзи\ -\ Без\ меж.cue | iconv -f cp1251
Track 1 Information
arranger: 
composer: 
genre:  
ISRC:  
message: 
track number: 1
perfomer: Океан Ельзи
title:  Віддай мені (свою любов)
ISRC (CD-TEXT): 
або у заданому форматі:
$ cueprint -n 1 -t \
  'ARRANGER=%A\nCOMPOSER=%C\nGENRE=%G\nMESSAGE=%M\nTRACKNUMBER=%n\nARTIST=%p\nTITLE=%t\nALBUM=%T\n' \
  Океан\ Ельзи\ -\ Без\ меж.cue | \
  iconv -f cp1251
ARRANGER=
COMPOSER=
GENRE=
MESSAGE=
TRACKNUMBER=1
ARTIST=Океан Ельзи
TITLE=Віддай мені (свою любов)
ALBUM=Без меж

Всі ці моменти можна об'єднати у скрипт.
#!/bin/bash
#############################
# зависимости:
# media-sound/shntool
# app-cdr/cuetools
# media-libs/flac
# media-sound/mac
# media-sound/ttaenc
# media-sound/wavpack
#############################
while read cuefile
do
cue="${cuefile##*/}"
obj=${cue%.cue}
objdir="${cuefile%/*}"
pushd "$objdir"
if [ -f "$obj".flac ]; then
shntool split -i "flac" -o "flac" -f "$cue" -t %n "$obj".flac || echo "Не удалось разделить $obj.flac" \
exit 1
elif [ -f "$obj".ape ]; then
shntool split -i "ape" -o "flac" -f "$cue" -t %n "$obj".ape || echo "Не удалось разделить $obj.ape" \
exit 1
elif [ -f "$obj".tta ]; then
shntool split -i "tta" -o "flac" -f "$cue" -t %n "$obj".tta || echo "Не удалось разделить $obj.tta" \
exit 1
elif [ -f "$obj".wv ]; then
shntool split -i "wv" -o "flac" -f "$cue" -t %n "$obj".wv || echo "Не удалось разделить $obj.wv" \
exit 1
else
echo "Файл $obj не найден, выходим."
exit 1
fi
ln -s "$cue" tmp.cue
for (( i=1 ; i <= $(cueprint -d '%N' tmp.cue) ; ++i )); do
NN=$(printf '%02d' $i)
[ -s "$NN.flac" ] && {
cueprint -n $i -t \
'ARRANGER=%A\nCOMPOSER=%C\nGENRE=%G\nMESSAGE=%M\nTRACKNUMBER=%n\nARTIST=%p\nTITLE=%t\nALBUM=%T\n' \
tmp.cue | iconv -f cp1251 | egrep -v '=$' | metaflac --import-tags-from=- $NN.flac
mv $NN.flac "$NN - $(cueprint -n $i -t %t tmp.cue | iconv -f cp1251 | sed -e "s,/,,g").flac"
}
done
rm -f tmp.cue "$cue" "$obj".{flac,ape,tta} tags.tmp
popd
done < <(find . -type f -iname "*.cue")
view raw splitflac hosted with ❤ by GitHub
Проект можна завантажити звідси splitflac.

UPDATE:
Був отримав помилку:
shnsplit: error: m:ss.ff format can only be used with CD-quality files
Таблетка:
cuebreakpoints *.cue | sed s/$/0/ | shnsplit -t %n -o flac *.flac