LINUX.ORG.RU

Помогите доработать скриптик


0

0

Недавно вопрос про CD-граббер поднимался. Навыков особых в bash у меня нет, потому буратиню понемногу.
Есть скрипт использующий lame и cdparanoia:

#!/bin/sh

mkdir /tmp/cd-grabber >/dev/null 2>&1
cd /tmp/cd-grabber
rm /tmp/cd-grabber/* >/dev/null 2>&1

TR_COUNT=`cdparanoia -d /dev/cdrom -Q 2>&1 | awk 'BEGIN {FS="."; num = 0} {if($1 ~ /^ +[0-9]+$/) num++} END {printf("%d", num)}'`

echo "`expr $TR_COUNT` tracks on CD"
echo "Старт..."
echo

i=0
while [ $i -lt $TR_COUNT ]
do
        i=`expr $i + 1`
        cdparanoia "`expr $i`" >/dev/null 2>&1
        lame --preset standard cdda.wav track_`expr $i`.mp3  >/dev/null 2>&1
        echo "Трек `expr $i` готов"
        rm ./cdda.wav
done

echo
echo "Диск сграблен в директорию /tmp/cd-grabber/"


Но работает он не так как хотелось бы. Сначала сдирается трек, потом преобразуется в mp3. А хотелось бы, что бы было 2 параллельных процесса - сдирание CDDA-WAV и преобразование WAV->mp3 по мере того, как появлялся бы готовый WAV, в следствии чего экономилось бы время.
Как такое организовать?
anonymous

Вот мой вариант такого скрипта. Скрипт грабит и энкодит на лету,
прописывает тэги, русские тэги конвертирует в cp1251.

# --- start ---

#!/bin/sh

grabber="cdparanoia"
encoder="lame"
convert="iconv -f koi8-r -t windows-1251"

destdir="."
srcdev="/dev/dvd"

grabopts="-d $srcdev -w"
encopts="-m s -q 0 -V 0 -b 128 -B 320 --vbr-new"

if [ ! "$3" ]; then
	echo "usage: $0 firstN lastN file"
	exit
fi

if [ ! -e "$3" ]; then
	echo "file $3 doesn't exist..." 
	exit
fi

artist=`grep ^artist= $3 | sed s/.*=//`
album=`grep ^album= $3 | sed s/.*=//`
year=`grep ^year= $3 | sed s/.*=//`
genre=`grep ^genre= $3 | sed s/.*=//`
comment=`grep ^comment= $3 | sed s/.*=//`

if [ ! "$artist" ]; then
	destdir="$destdir/$genre/$album"
else
	destdir="$destdir/$genre/$artist"
fi

echo -n "destination directory $destdir "
if [ -d "$destdir" ]; then
	echo "exists"
else
	echo "doesn't exists. creating..."
	mkdir -p "$destdir"
fi

echo -e "artist:\t\t$artist"
echo -e "album:\t\t$album"
echo -e "year:\t\t$year"
echo -e "genre:\t\t$genre"

# hdparm -E 1 $srcdev

for (( i=$1; i<=$2; i++ )); do
	if [ ${#i} == 2 ]; then
		tn="$i"
	else
		tn="0$i"
	fi

	track=`grep ^track$tn= $3 | sed s/.*=//`
	if [ ! "$track" ]; then
		track="Track $tn"
	fi
	
	track_artist=`grep ^track$tn.artist= $3 | sed s/.*=//`
	if [ ! "$track_artist" ]; then
		track_artist=$artist
	fi

	track_album=`grep ^track$tn.album= $3 | sed s/.*=//`
	if [ ! "$track_album" ]; then
		track_album=$album
	fi

	track_year=`grep ^track$tn.year= $3 | sed s/.*=//`
	if [ ! "$track_year" ]; then
		track_year=$year
	fi

	track_genre=`grep ^track$tn.genre= $3 | sed s/.*=//`
	if [ ! "$track_genre" ]; then
		track_genre=$genre
	fi

	if [ "$track_artist" ]; then
		fn="$tn - $track_artist - $track.mp3"
	elif [ "$track_album" ]; then
		fn="$tn - $track_album - $track.mp3"
	else
		fn="$tn - $track.mp3"
	fi

	echo "ripping track $i --> \"$fn\"..."
	
	track=`echo $track | $convert`
	track_artist=`echo $track_artist | $convert`
	track_album=`echo $track_album | $convert`

	$grabber $grabopts $i - | $encoder $encopts \
		--add-id3v2 \
		--tt "$track" \
		--ta "$track_artist" \
		--tl "$track_album" \
		--tg "$track_genre" \
		--ty "$track_year" \
		--tn "$i" \
		--tc "$comment" \
		- \
		"$destdir/$fn"
done

# --- end ---

Информация о названиях берётся из текстового файла такого формата:

album=Secondhand Sounds CD1
year=2002
genre=Electronic
track01.artist=Nils Petter Molvaer
track01=Merciful (Herbert's we mix)
track02.artist=Motorbass
track02=Ezio (Herbert remix)
track03.artist=Two Banks Of Four
track03=Street Lullaby (Herbert's gutter dub)
. . . . .

Запускается командой ./grabcd x y filename, где x и y - номера первого и последнего трека,
filename - файл с тэгами.

theSoul ★★★
()
Ответ на: комментарий от sdio

Такая конструкция не работает. дело в том, что только начинает wav перекодироваться в mp3, как сразу же происходит переход на новый цикл, cdda.wav перезатирается, и перекодирование обрывается.
Необходимо что бы было именно 2 незавсимых процесса:
1) сдирание + переименование файлов (можно правда cdparanoia - B, но лучше отдельно, мало ли чего ещё добавить захочитя)
2) перекодирование созданых файлов по мере того как они появляются + удаление обработанных wav

anonymous
()
Ответ на: комментарий от theSoul

э... спасибо.. щас, попробую разобраться что тут понаписано :)

anonymous
()
Ответ на: комментарий от anonymous

cdparanoia "$i" - | lame - track_$i.mp3
Это не работает?
cdparanoia должна на stdout выдавать, а не в файл, а lame из sdtin брать

sdio ★★★★★
()
Ответ на: комментарий от sdio

>cdparanoia "$i" - | lame - track_$i.mp3
>Это не работает?
>cdparanoia должна на stdout выдавать, а не в файл, а lame из sdtin брать

Да, действитетельно работает - я невнимательно посмотрел то, что написано было... дефисы не заметил.
Так в общем и сделал.

Спасиб, то, что хотелось в общем :)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.