Дано: связка file+cuesheet, являющаяся lossless (или lossy - тут уж без разницы) рипом какого-нибудь аудио компакт-диска.
Задача: разбить этот рип на отдельные трэки.
Решение:
Поскольку задача сформулирована в общем плане, придадим ей немного конкретики удобства ради. Альбомы, пожатые в lossy-формат (всякие ogg, mp3, aac, wma и им подобные) в один файл в сопровождении cue-списка, мне ни разу не попадались, да и кому такой изврат нужен? А вот в lossless (например, flac, ape, wavpack) такое - сплошь и рядом. Поэтому будем изначально ориентироваться на выходные файлы в формате FLAC, как на идеологически правильные и широкоподдерживаемые на всех платформах. А вот поступать к нам будут файлы разных форматов, но скорее всего - ape/wavpack/flac. Поэтому во время установки необходимых пакетов будем исходить из заданных условий.
Теперь непосредственно к решению задачи. У нас есть два пути: использовать bchunk, предварительно раскодировав файл в wav и получив на выходе wav-файлы, которые потом надо будет кодировать в нужный формат, или не тратить наше драгоценное время и работать с файлом напрямую с помощью shntools. Поразмыслив, можно придти к выводу, что второй вариант куда удобнее. Им мы и воспользуемся.
Для начала установим все необходимое. Если хотим подружить систему с Monkey's Audio, то в /etc/apt/sources.list добавляем следующую строку:
deb http://morgoth.free.fr/ubuntu feisty-backports main
И ставим необходимые кодеки и софт:
$ sudo aptitude update
$ sudo aptitude install flac wavpack monkeys-audio shntool cuetools
Теперь - самое интересное. Будем кромсать файл. Допустим, имеются у нас некоторые filename.ape и filename.cue. Натянем резиновые перчатки и возьмем в руки скальпель... Хорошо, а теперь:
$ cuebreakpoints filename.cue | shnsplit -o flac filename.ape
Начнется процесс в итоге, в каталоге, в котором мы проводим эти жуткие эксперименты, получим следующее: подопытные файлы остались нетронутыми, а кроме них в этой папке лежат n файлов, которые называются 'split-track001.flac', 'split-track002.flac', 'split-track003.flac'... 'split-trackn.flac'. Вот они-то и есть результат нашей беспощадной деятельности. Итак, файлы мы разрезали, пробуем открыть - да, друзья мои, еще не все. Свеженарезанные файлы не имеют заголовков. Займемся ими. На этот случай у нас припасен скрипт cuetag.
$ cuetag filename.cue split-track001.flac split-track002.flac ... split-trackn.flac
Неудобно? Тогда поступим проще:
$ cuetag filename.cue `ls split-track*.flac`
Он пожалуется на несколько ошибок из-за специфики заголовков FLAC (–remove-vc-all и –import-vc-from). Проверяем, и - вуаля! - все свеженарезанные файлы обзавелись заголовками в соответствии с cue-файлом.
Надо бы упростить задачу, а то приходится производить слишком много лишних телодвижений, вы не находите? Перефразируя одно известное высказывание: "Линуксоид - человек ленивый. Он обязательно приложит максимум усилий чтобы в последствии не напрягаться." Тогда приступим к написанию скрипта. После нескольких попыток, у меня получилось таки создать нечто похожее. :)
$ sudo vim /usr/local/bin/cue2flac.sh
#!/bin/sh
cuebreakpoints "$1" | shnsplit -o flac "$2"
cp "$1" tmp.cue
cuetag tmp.cue `ls split-track*.flac`
rm tmp.cue
$ sudo chmod 755 /usr/local/bin/cue2flac.sh
Здесь следует отметить, что хоть и создание временной копии cuesheet'а совершенно необязательно (команды cp "$2" tmp.cue и rm tmp.cue), ее все равно лучше сделать. Почему-то скрипт cuetag не работает с пробелами в названиях файлов, даже если название этого файла заключено в кавычки. По этой же причине я бы не рекомендовал использовать при генерации отдельных файлов префикс, содержащий пробел или другие спецсимволы. После того, как вы сделаете этот скрипт, команда
$ cue2flac.sh "filename.cue" "filename.ape"
сделает все за вас - вам следует только не перепутать cue и файл с записью местами и "откинуться на спинку стула". Если вы хотите изменить префикс файлов на выходе или задать им папку - всегда пожалуйста. Для этого почитайте маны и поправьте скрипт по своему вкусу.
К сожалению, я так и не нашел способа автоматизировать процесс переименования готовых файлов исходя из их тегов. Поэтому предлагаю делать это ручками. По крайней мере, команда
$ grep TITLE filename.cue
хоть немного поможет вам в этом.
Спасибо за внимание. Статья была написана на основе статьи aidanjm под названием Split lossless audio (ape, flac, wv, wav) by cue file in Ubuntu.
26 комментариев:
Круто, мне не так давно такое требовалось. И, может быть, ещё пригодится. Унёс в скрапы, и закладочку унёс :-)
Спасибо, Андрей!
Спасибо.
Да я, в общем-то, и сам написал потому что мне это понадобилось. :) Я, конечно, знал про bchunk, но было крайне лениво переливать "из пустого в порожнее", тем более, что FLAC - не самый быстрый в плане кодировки (хорошо хоть декодируется очень быстро). Жаль только, что переименовывать сами файлы приходится ручками.
Спасибо, про cuetag не знал, пригодится
если файл в mp3 - есть прога mp3splt
mp3splt (а особенно mp3splt-gtk) - классная штука, возможно о ней напишу, правда позже. Гонял как дурак wine+mp3DirectCut вместо того, чтобы поискать достойный аналог. %)
спасибо, хорошая статья :)
Лови:
http://paste.org.ru/?hgthqi
Забыл добавить: готовое решение - скрипт конвертит ape,wv,flac в flac и затем режет его на части попутно прописывая теги из cue-файла
Спасибо автору, полезная статья. В одном он не прав - в линуксе можно проигрывать image+cue напрямую. По крайней мере audacious это умеет
Я тут покопался во FLAC, нашел metaflac из стандартного комплекта, так вот он (версия 1.2.1) может встраивать в flac изображения (covers например). А вот как встроить cue с именами треков я не понял. Мне, например, удобно хранить каждый альбом в одном файле flac. В него встроить всю метаинформацию и cover. Что еще нужно для счастья? :)
Я тут покопался во FLAC, нашел metaflac из стандартного комплекта, так вот он (версия 1.2.1) может встраивать в flac изображения (covers например). А вот как встроить cue с именами треков я не понял. Мне, например, удобно хранить каждый альбом в одном файле flac. В него встроить всю метаинформацию и cover. Что еще нужно для счастья? :)
все гораздо проше.
shnsplit -f test.cue -o flac -t %n-%t test.ape
порежет аре на файлы flac и присвоит имена
формата номер-название.flac прочитав данные из cue
Большое спасибо! давно хотел такое :) и описание понятное и решение простое :)
не помню, откуда я брал похожий скрипт, но переименовывает треки он таким образом:
let a=1;
for b in split*.flac; do
mv "$b" "$(printf '%.2d - %s\n' "$(cueprint -t %n -n $a *.cue )" \
"$(cueprint -t %t -n $a *.cue)").flac";
let a=$a+1;
done;
gCue2tracks:
http://trac2.assembla.com/gCue2tracks/wiki/
При обновлении репозитория требует ключ, где его достать?
Я для преобразования flac+cue в набор mp3 с нарезкой на трэки использую такой скрипт:
#!/bin/sh
QUALITY=1
FILE=`basename "$1"`
NAME=${FILE%.*}
cd `dirname "$1"`
flac -c -d "$FILE" | lame -s 44.1 -V${QUALITY} -B 320 - "${NAME}.mp3"
mp3splt -2 -a -c "${FILE}.cue" -o "cd2 @n @a - @t" "${NAME}.mp3"
rm "${NAME}.mp3"
собстна, это из man-а практисски...
режем толстый флак на куски:
cuebreakpoints "$cue" | shnsplit -o flac "$flac"
режем толстый аре на флаки:
cuebreakpoints "$cue" | shnsplit -o flac "$ape"
трэки будут поименованы в
split-trackNN.flac
Могу поделиться перловым скриптом для переноса тэгов из cue в нарезанные флаки (стандартный способ у меня почему-то не работает), скрипт легко модифицируется для попутного переименования
имея тэги, EasyTAG переименует все трэки по шаблону в момент (или - наоборот, из имён заполнит теги по шаблону)
--
GrayCat
Ну раз уж пошла такая пьянка — делитесь, буду очень благодарен, да и не я один, думается мне. Всем спасибо за комментарии, отфильтрую, осознаю, опробую и дополню пост. :)
отправил на гмыло хозяину блога (хотел выложить прямо тут - но движок обиделся на перловые угловые скобки)
со всех заинтересованных - тестинг
%-)
ногами не пиннать - всё делалось в перлучебно-удобственных целях
из известных недочётов - таг "TOTALTRACKS"... э-э-э... "не получился"
зато "удались" REPLYGAIN-ы
%-)))
Хороший способ, но shntool всё-таки делает downgrade в качестве; это хорошо видно по общему размеру треков против размера образа CD. gcue2tracks вообще не заботится о сохранении качества, оно тупо перекидывает в wav,потом в выбранный кодек, без каких-либо настроек.
Есть ли качественный метод перекодировки с наименьшими потерями?
Вообще-то FLAC даёт ужатие: образ CD может составлять 650 МБ, при этом FLAC с него будет занимать не более 400. Для того, чтобы делать подобные выводы, надо сравнивать графики анализа частот. К сожалению, я не в курсе, чем эти графики можно сделать. Если кто-то из читателей умеет — буду благодарен. Сам неаудиофил, с дешёвой аппаратурой, поэтому разницы на слух не отличаю. :)
В тексте поста используются два разных имени скрипта
/usr/local/bin/cut2flac.sh
/usr/local/bin/cue2flac.sh
Спасибо, исправил. :)
>cp "$2" tmp.cue
И ещё теперь $1 :)
Вот решил внести свою лепту. Во-первых cuetag некорректно работает, если в cue файле есть русские символы, во-вторых lame некорректно работает если в названии файла есть пробел. Моя версия скрипта избавляет от этих неприятных моментов:
#!/bin/sh
iconv -f WINDOWS-1251 -t UTF-8 "$1" -o tmp.cue
cuebreakpoints tmp.cue | shnsplit -f tmp.cue -o flac -t %n.%p-%t "$2"
cuetag tmp.cue *.flac
mv "$2" "$2".tmp
for file in *.flac;
do mv "$file" `echo $file | sed -e 's/ */_/g' -e 's/_-_/-/g'`;
done
for f in *.flac;
do lame --cbr -m s -b 320 -q 0 --nohist "$f" "${f%.flac}.mp3";
done
rm *.flac
rm tmp.cue
mv "$2".tmp "$2"
Отправить комментарий