понедельник, 23 августа 2010 г.

flac & cue в mp3

Иногда попадаются рипы компакт-дисков, сделанные аудиофилами. Аудиофилам обычно очень важно, чтобы рип представлял собой точную копию компакт-диска, поэтому они часто делают рипы всего диска в виде одного файла формате flac, который они сопровождают ещё и файлом со списком дорожек в формате cue.

Чтобы закачать такую музыку на аудио-плеер, умеющий воспроизводить только mp3 или ogg, приходится разбивать flac на отдельные mp3-треки.

Кроме разбивки flac-файла на отдельные файлы и преобразования каждого из файлов в формат mp3 полезно также перенести всю полезную информацию из cue-файла в теги mp3-файла. Для этого нам понадобятся следующие пакеты: shntool, cuetools, lame, enca. Установим их:
# apt-get install shntool cuetools lame enca
shntool потребуется для того, чтобы разбить flac-файл на отдельные wav-файлы, cuetools понадобится для извлечения полезной информации из cue-файла, lame - для кодирования wav-файлов в формат mp3 и простановки тегов, enca используется для автоматического определения кодировки текста в cue-файле (поскольку cue-файл мог быть создан как в Windows, так и в Linux и может иметь символы самых разных алфавитов).

Теперь можно попытаться соединить всё это в единый скрипт:
#!/bin/sh

FROMCP=`enca -e *.cue`
iconv -f $FROMCP -t UTF-8 *.cue > /tmp/list.cue

DATE=`grep "REM DATE" /tmp/list.cue | sed -e 's/REM DATE \(.*\)/\1/g'`
GENRE=`grep "REM GENRE" /tmp/list.cue | sed -e 's/REM GENRE \(.*\)/\1/g'`
COMMENT=`grep "REM COMMENT" /tmp/list.cue | sed -e 's/REM COMMENT \(.*\)/\1/g'`
NUMBER=`cueprint -d "%N" /tmp/list.cue`

shntool split -f /tmp/list.cue *.flac -t %n

for((I=1;I<=NUMBER;I++));
do
  cueprint -n $I -t "ARTIST=\"%p\"\nALBUM=\"%T\"\nTRACKNUMBER=\"%n\"\nTITLE=\"%t\"\n" /tmp/list.cue > /tmp/tags
  . /tmp/tags
  J=`printf "%02d" $I`
  lame -b 192 --cbr \
    --ty "$DATE" \
    --tg "$GENRE" \
    --tc "$COMMENT" \
    --ta "$ARTIST" \
    --tl "$ALBUM" \
    --tn "$TRACKNUMBER" \
    --tt "$TITLE" \
    --add-id3v2 \
    --id3v2-only \
    $J.wav $J.mp3
  rm $J.wav
done

rm /tmp/list.cue /tmp/tags
Скрипт рассчитан на то, что в текущем каталоге имеется только один cue-файл и один flac-файл.

Иногда вместо flac используется ape, который с лицензионной стороны намного хуже flac'а. В частности, существовавший когда-то на просторах опенсорса проект mac (Monkey's Audio Codec), исчез именно из-за лицензионных проблем. Не смотря на это, кое-где ещё можно найти как исходники, так и deb-пакет. После установки пакета shntool можно использовать прежним образом, единственное отличие будет заключаться лишь в том, что вместо flac-файла нужно будет указать ape-файл.

Обновлено 3 сентября 2010 года. При обновлении этой заметки и скрипта был использован комментарий к моей старой заметке Конвертируем FLAC в MP3 под Debian.

20 комментариев:

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

http://opendesktop.org/content/show.php/Flacon?content=113388

http://opendesktop.org/content/show.php/gCue2tracks?content=80703

Alex Berg комментирует...

Зачем все так сложно, есть ведь специальные проги, которые сами все разбивают и тебе остается только имя исполнителя написать

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

А нет таких специальных прог, чтобы ложку ко рту подносили и отгоняли мух?

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

Вместо "for((I=1;I<NUMBER;I++));" должно быть "for((I=1;I <= NUMBER;I++));",иначе последний трек не конвертит.

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

Спасибо за поправку. Возможно скрипт на компьютере я исправил, а тут не обновил.

Geek Malve комментирует...

lame -b 192 --cbr \
Почему бы не 320 кбит/с сделать?

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

А почему именно 320?

Однажды я тестировал разные битрейты, пережимая музыку FLAC в MP3. Для меня всё, что было выше 128, на моём оборудовании, звучало одинаково. Следующий стандартный битрейт - это 160, но более распространён - 192, поэтому я стал сжимать всегда именно с этим битрейтом. Оптимальное соотношение объём/качество. Для меня.

Geek Malve комментирует...

ну это уже дело вкуса)

запустил скрипт, вывод такой:

enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.
iconv: conversion from `-t' is not supported
Try `iconv --help' or `iconv --usage' for more information.
1: syntax error
/tmp/list.cue: input file error
shntool [split]: error: no split points given -- nothing to do
rm: cannot remove `/tmp/tags': No such file or directory

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

Добавьте в строку с enca параметр "-L russian". На момент создания скрипта всё работало нормально, возможно новая версия enca требует обязательного указания языка распознаваемой кодировки.

Geek Malve комментирует...

iconv: conversion from `UTF-8/CRLF' is not supported
Try `iconv --help' or `iconv --usage' for more information.
1: syntax error
/tmp/list.cue: input file error
shntool [split]: error: no split points given -- nothing to do
rm: cannot remove `/tmp/tags': No such file or directory

iconv по-прежнему ругается

Geek Malve комментирует...

Версия enca 1.12
Откуда берется этот /CRLF ?

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

Параметр -e в enca указать не забыли?

Geek Malve комментирует...

Нет.

FROMCP=`enca -e -L russian *.cue`
iconv -f $FROMCP -t UTF-8 *.cue > /tmp/list.cue

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

Предлагаю поставить пакет tofrodos и перед первой командой скрипта прописать fromdos *.cue

Geek Malve комментирует...

Спасибо... Все перекодировал...
Только есть маленькая проблемка с японскими тегами. пруфпик

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

Мой вариант см. http://pastebin.com/ptVaVUZW
Во-первых, новая enca избавляет от необходимости плясок с iconv, во-вторых, мне не понравилось именование 01.mp3, 02.mp3 etc, тогда как shntool позволяет легко скроить имя типа NN_Performer-Title.mp3
Но в данном варианте теги не сохраняются.
Дойдут руки -- допилю. А может кто предложит свое решение.
Владимиру -- спасибо.

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

>Но в данном варианте теги не сохраняются.

Ради чего и устраивались танцы с бубном. Дальше, имея теги, можно с помощью exfalso легко назвать файл как хочется и положить куда нужно. А не пытаться выковырять эту информацию из очередного оригинального способа именования файлов.

Я, например, использую в exfalso такой шаблон:
/home/music/<artist>/<date>-<album>/<tracknumber>-<title>

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

маленькая косметика
6,22d4
< IFS='
< '
< if [ "$1" != "" ]
< then
< echo $1
< echo "transform " $1
< echo "please enter a name for flac-file"
< read FLAC_NAME
< ffmpeg -i $1 $FLAC_NAME.flac
< ls -alh *.flac
< fi
<
< if [ "$(ls *.flac 2> /dev/null)" = "" ]
< then echo " cannot find any flac-file"
< echo " please select a file for transformation"
< exit
< fi
24c6
< FROMCP=`enca -r *.cue`
---
> FROMCP=`enca -e *.cue`
32,33c14
< shntool split -f /tmp/list.cue *.flac -t %n-%t
< mkdir mp3
---
> shntool split -f /tmp/list.cue *.flac -t %n
35c16
< for I in $( ls *.wav | sort | sed 's/.wav$//' )
---
> #for((I=1;I<=NUMBER;I++));
39c20
< # J=`printf "%02d" $I`
---
> J=`printf "%02d" $I`
50,51c31,32
< $I.wav mp3/$I.mp3
< # rm $J.wav
---
> $J.wav $J.mp3
> rm $J.wav

Ilya Romanov комментирует...

CRLF конец строки

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

CRLF - это CR и LF. Возврат каретки и перевод строки. Однако, что вы посоветуете человеку, чтобы решить его проблему? Воспользоваться dos2unix?