21 июля 2007 г.

file+cuesheet, практичное решение

Согласитесь, один альбом в связке файл+cuesheet - штука крайне неудобная. Нет, конечно для нарезания на болванку разницы нету. Но в каждодневной эксплуатации такая связка неудобна по двум причинам: отдельный трэк невозможно добавить в плейлист - надо добавлять сначала весь альбом, а потом убирать из плейлиста ненужные трэки. Это в целом. А вот у пользователей Linux есть вторая, не менее серьезная причина - в Linux в принципе нету проигрывателя, способного использовать связку file+cuesheet. Значит, гораздо удобнее будет разбить один целый файл на несколько маленьких - отдельных трэков. Чем мы и займемся. Итак:

Дано: связка 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 комментариев:

virens комментирует...

Круто, мне не так давно такое требовалось. И, может быть, ещё пригодится. Унёс в скрапы, и закладочку унёс :-)

Спасибо, Андрей!

Von_old комментирует...

Спасибо.
Да я, в общем-то, и сам написал потому что мне это понадобилось. :) Я, конечно, знал про bchunk, но было крайне лениво переливать "из пустого в порожнее", тем более, что FLAC - не самый быстрый в плане кодировки (хорошо хоть декодируется очень быстро). Жаль только, что переименовывать сами файлы приходится ручками.

Ramaloke комментирует...

Спасибо, про cuetag не знал, пригодится

lokias2 комментирует...

если файл в mp3 - есть прога mp3splt

Von_old комментирует...

mp3splt (а особенно mp3splt-gtk) - классная штука, возможно о ней напишу, правда позже. Гонял как дурак wine+mp3DirectCut вместо того, чтобы поискать достойный аналог. %)

ulmen комментирует...

спасибо, хорошая статья :)

Анонимный комментирует...

Лови:

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

Pavel Omelchenko комментирует...

Большое спасибо! давно хотел такое :) и описание понятное и решение простое :)

Анонимный комментирует...

не помню, откуда я брал похожий скрипт, но переименовывает треки он таким образом:

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

Von_old комментирует...

Ну раз уж пошла такая пьянка — делитесь, буду очень благодарен, да и не я один, думается мне. Всем спасибо за комментарии, отфильтрую, осознаю, опробую и дополню пост. :)

GrayCat комментирует...

отправил на гмыло хозяину блога (хотел выложить прямо тут - но движок обиделся на перловые угловые скобки)
со всех заинтересованных - тестинг
%-)

ногами не пиннать - всё делалось в перлучебно-удобственных целях
из известных недочётов - таг "TOTALTRACKS"... э-э-э... "не получился"
зато "удались" REPLYGAIN-ы
%-)))

Oreolek комментирует...

Хороший способ, но shntool всё-таки делает downgrade в качестве; это хорошо видно по общему размеру треков против размера образа CD. gcue2tracks вообще не заботится о сохранении качества, оно тупо перекидывает в wav,потом в выбранный кодек, без каких-либо настроек.
Есть ли качественный метод перекодировки с наименьшими потерями?

Von_old комментирует...

Вообще-то FLAC даёт ужатие: образ CD может составлять 650 МБ, при этом FLAC с него будет занимать не более 400. Для того, чтобы делать подобные выводы, надо сравнивать графики анализа частот. К сожалению, я не в курсе, чем эти графики можно сделать. Если кто-то из читателей умеет — буду благодарен. Сам неаудиофил, с дешёвой аппаратурой, поэтому разницы на слух не отличаю. :)

Анонимный комментирует...

В тексте поста используются два разных имени скрипта

/usr/local/bin/cut2flac.sh
/usr/local/bin/cue2flac.sh

Von_old комментирует...

Спасибо, исправил. :)

Анонимный комментирует...

>cp "$2" tmp.cue
И ещё теперь $1 :)

aaltopiiri комментирует...

Вот решил внести свою лепту. Во-первых 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"

Отправить комментарий