Pull to refresh

«Пилим» FLAC

Reading time6 min
Views3.6K
На одном большом всем известном трекере люди стали частенько делиться своими копиями дисков, в формате flac/ape/wavepack(wv) с файлом-cue.
На деле — всё гладко. Действительно, есть и плееры, поддерживающие всё это дело, и действительно это всё работает. НО.
Мои увлечения связаны с электронной клубной музыкой, соответственно ради одного-двух треков целиком диски нарезать перед вечеринкой не хочется(лучше сделать свои грамотные сборники), плюс еще хотелось чтобы привести все файлы к одному формату, а именно FLAC — т.к. новые прогрессивные программы(Ableton Live) и плееры(ipod (с особой прошивкой, либо тач с софтом/cowon) его поддерживают.

Итак, еще раз, задача — имеются diskname.flac + diskname.cue, из них нужно получить много треков с тэгами и внятными названиями файла(Название артиста, номер трека, название трека) + плейлист.

Для примера я взял дистрибутив debian lenny (5.0). Видимо, для пользователей *buntu и других, основанных на debian дистрибутивах команды тоже будут верны.

Что нам понадобится:

sudo aptitude install build-essential — gcc и необходимый стафф для сборки поддержки формата ape.
sudo aptitude install cuetools — для работы с cue-файлом.
sudo aptitude install shntool — набор утилит для нарезания аудиофайлов и не только.
sudo aptitude install wavpack — кодер и декодер для формата wavpack
sudo aptitude install flac — кодер и декодер для flac

Качаем исходники mac-а (для работы с ape)
wget supermmx.org/resources/linux/mac/mac-3.99-u4-b5.tar.gz
Распаковываем и заходим в директорию для сборки:
tar xvzf mac-3.99-u4-b5.tar.gz
cd mac-3.99-u4-b5
make
если всё прошло без проблем — sudo make install.

Так, всё готово!
А теперь нужно написать свой скрипт для автоматизации всего процесса. Но постойте, я уже кое-что набросал ;)
Итак, у нас будет три скрипта.

Скрипт для разрезания оригинала на отдельные треки и последующего их тэгирования.

cuesplit

#!/bin/bash 
if [ "$1" == "" ];
then
    echo "Usage: $0 flac/apefile cuesheetname"
    exit
else
cuebreakpoints $2 | shnsplit -o flac -O always $1
cuetag $2 split-track*.flac
fi


Скрипт для переименования полученных треков:
cuerename

#!/bin/bash 

TRACKNAME=split-track
ENDNAME=".flac"
PLAYLISTNAME="!playlist.m3u"

rm $PLAYLISTNAME 2>/dev/null

for i in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66; do

	if [ -f $TRACKNAME$i$ENDNAME ];
		then
		echo -n
		else
		exit
	fi

	PERFORMER=`cueprint -t '%p_\n' -n $i $2 | tr [:blank:] '_' | tr ':' '_' | tr '*' '_'`
	TRACK=`cueprint -t '_%t\n' -n $i $2 | tr [:blank:] '_' | tr ':' '_' | tr '*' '_'`
	echo "$PERFORMER$i$TRACK$ENDNAME" >> $PLAYLISTNAME
	echo "$PERFORMER$i$TRACK$ENDNAME"
	mv $TRACKNAME$i$ENDNAME $PERFORMER$i$TRACK$ENDNAME

done;

Пояснение про цикл. Мне нужно было чтобы треки назывались 01, 02, 03, для правильной сортировки, а не 1, 2, 3. На одном из дисков оказалось 66 треков(мексиканцы мои любимые):)

Скрипт, который выполняет первый и второй скрипт по-очереди ;)
cuemagic
#!/bin/bash 
if [ "$2" == "" ];
then
    echo "Usage: $0 flac/apefile cuesheet-file"
    exit
else
cuesplit $1 $2
cuerename $1 $2
fi


По статистике, большинство людей нормальные windows-пользователи, соответственно в файлах присутствуют пробелы.
Я, к сожалению, программист плохой (по образованию — горный инженер). Поэтому для порядка и чтобы вообще мои скрипты работали, я написал еще один маленький примитивный скрипт чтобы заменять пробелы в имени файла на подчеркивания. Надеюсь, в комментариях мне подскажут более изящный путь.

Скрипт для массового переименования файлов с пробелами в названии.
mrnm
#!/bin/bash. 
find . -depth|rename 's/\ /_/g'


А теперь пример работы!
grinder:/home/massiv/LOSSLESS/Terminal Choice - Navigator [1998]# ls -la
total 411841
drwxrwxrwx 1 root root         0 2009-06-04 00:26 .
drwxrwxrwx 1 root root         0 2009-06-04 02:56 ..
-rwxrwSrwx 1 root root       260 2009-06-04 09:12 audiochecker.log
drwxrwxrwx 1 root root         0 2009-06-03 21:02 Covers
-rwxrwSrwx 1 root root      1951 2009-06-04 09:12 Terminal Choice - Navigator.cue
-rwxrwSrwx 1 root root 421561038 2009-06-04 09:13 Terminal Choice - Navigator.flac
-rwxrwSrwx 1 root root      3331 2009-06-03 23:21 Terminal Choice - Navigator.log
grinder:/home/massiv/LOSSLESS/Terminal Choice - Navigator [1998]# mrnm
grinder:/home/massiv/LOSSLESS/Terminal Choice - Navigator [1998]# ls -la
total 411841
drwxrwxrwx 1 root root         0 2009-06-29 20:13 .
drwxrwxrwx 1 root root         0 2009-06-04 02:56 ..
-rwxrwSrwx 1 root root       260 2009-06-04 09:12 audiochecker.log
drwxrwxrwx 1 root root         0 2009-06-03 21:02 Covers
-rwxrwSrwx 1 root root      1951 2009-06-04 09:12 Terminal_Choice_-_Navigator.cue
-rwxrwSrwx 1 root root 421561038 2009-06-04 09:13 Terminal_Choice_-_Navigator.flac
-rwxrwSrwx 1 root root      3331 2009-06-03 23:21 Terminal_Choice_-_Navigator.log
grinder:/home/massiv/LOSSLESS/Terminal Choice - Navigator [1998]# cuemagic Terminal_Choice_-_Navigator.flac Terminal_Choice_-_Navigator.cue
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track01.flac] (3:07.70) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track02.flac] (5:05.02) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track03.flac] (6:03.03) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track04.flac] (3:49.72) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track05.flac] (1:51.05) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track06.flac] (5:55.52) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track07.flac] (4:40.68) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track08.flac] (5:46.30) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track09.flac] (5:00.20) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track10.flac] (1:11.63) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track11.flac] (6:06.00) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track12.flac] (6:07.35) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track13.flac] (4:17.70) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track14.flac] (1:48.35) : 100% OK
Splitting [Terminal_Choice_-_Navigator.flac] (64:21.10) --> [split-track15.flac] (3:29.10) : 100% OK
Terminal_Choice_01_(Intro)_Actual_Reality?.flac
Terminal_Choice_02_Without_Warning.flac
Terminal_Choice_03_Victim_Of_Life.flac
Terminal_Choice_04_Someone.flac
Terminal_Choice_05_Navigator_I.flac
Terminal_Choice_06_Der_Tod.flac
Terminal_Choice_07_House_Of_Evil.flac
Terminal_Choice_08_No_Escape.flac
Terminal_Choice_09_The_Sons_Of_Doom.flac
Terminal_Choice_10_Tenderness.flac
Terminal_Choice_11_Navigator_II.flac
Terminal_Choice_12_The_Eternal_Evil.flac
Terminal_Choice_13_Kaltes_Herz.flac
Terminal_Choice_14_Navigator_III.flac
Terminal_Choice_15_Navigator_IV_(Version).flac
grinder:/home/massiv/LOSSLESS/Terminal Choice - Navigator [1998]# ls -la
total 828610
drwxrwxrwx 1 root root         0 2009-06-29 20:17 .
drwxrwxrwx 1 root root         0 2009-06-04 02:56 ..
-rwxrwSrwx 1 root root       260 2009-06-04 09:12 audiochecker.log
drwxrwxrwx 1 root root         0 2009-06-03 21:02 Covers
-rwxrwSrwx 1 root root       574 2009-06-29 20:17 !playlist.m3u
-rwxrwSrwx 1 root root  17370275 2009-06-29 20:17 Terminal_Choice_01_(Intro)_Actual_Reality.flac
-rwxrwSrwx 1 root root  37622950 2009-06-29 20:17 Terminal_Choice_02_Without_Warning.flac
-rwxrwSrwx 1 root root  38571483 2009-06-29 20:17 Terminal_Choice_03_Victim_Of_Life.flac
-rwxrwSrwx 1 root root  25643068 2009-06-29 20:17 Terminal_Choice_04_Someone.flac
-rwxrwSrwx 1 root root  11619094 2009-06-29 20:17 Terminal_Choice_05_Navigator_I.flac
-rwxrwSrwx 1 root root  41084081 2009-06-29 20:17 Terminal_Choice_06_Der_Tod.flac
-rwxrwSrwx 1 root root  32317355 2009-06-29 20:17 Terminal_Choice_07_House_Of_Evil.flac
-rwxrwSrwx 1 root root  39866544 2009-06-29 20:17 Terminal_Choice_08_No_Escape.flac
-rwxrwSrwx 1 root root  35956407 2009-06-29 20:17 Terminal_Choice_09_The_Sons_Of_Doom.flac
-rwxrwSrwx 1 root root   6399212 2009-06-29 20:17 Terminal_Choice_10_Tenderness.flac
-rwxrwSrwx 1 root root  30924941 2009-06-29 20:17 Terminal_Choice_11_Navigator_II.flac
-rwxrwSrwx 1 root root  46413377 2009-06-29 20:17 Terminal_Choice_12_The_Eternal_Evil.flac
-rwxrwSrwx 1 root root  30521201 2009-06-29 20:17 Terminal_Choice_13_Kaltes_Herz.flac
-rwxrwSrwx 1 root root  10079967 2009-06-29 20:17 Terminal_Choice_14_Navigator_III.flac
-rwxrwSrwx 1 root root  21843539 2009-06-29 20:17 Terminal_Choice_15_Navigator_IV_(Version).flac
-rwxrwSrwx 1 root root      1951 2009-06-04 09:12 Terminal_Choice_-_Navigator.cue
-rwxrwSrwx 1 root root 421561038 2009-06-04 09:13 Terminal_Choice_-_Navigator.flac
-rwxrwSrwx 1 root root      3331 2009-06-03 23:21 Terminal_Choice_-_Navigator.log
grinder:/home/massiv/LOSSLESS/Terminal Choice - Navigator [1998]# rm Terminal_Choice_-_*
grinder:/home/massiv/LOSSLESS/Terminal Choice - Navigator [1998]#


Если остались вопросы, задавайте, пожалуйста. Особенно приветствуются рацпредложения и мысли по-поводу элегантного решения проблемы с пробелами и прочими спецсимволами :)

ps Когда я уже закончил статью, я обратил внимание, что такие тэги уже кем-то указывались, поискал по этим меткам, всё так и оказалось — человек уже писал о подобном, но у него были немного другие цели. В любом случае, этот пример может быть хорошим примером того, как не надо программировать или как программируют любители ;)
Tags:
Hubs:
+14
Comments32

Articles