#!/bin/bash

set -e
if type -p schedtool >/dev/null 2>&1 ; then
	SCHED="schedtool -B -n10 -e"
else
	SCHED=""
fi

if type -p shlock >/dev/null 2>&1 ; then
	LOCK=shlock
else
	LOCK=lockfile-create
fi

if test -e /dev/cdrom; then DEV="" ; else DEV=0; fi
if test $(echo -n "$1" | wc -c) = 1; then DEV="$1"; shift; fi
D=/dev/cdrom$DEV
if ! test -b $D ; then D=/dev/sr$DEV; fi

if ! $LOCK /var/lock/cdread$DEV ; then
	echo Locked. >&2
	exit 1
fi

if test -d /mnt/disk/sounds ; then
        X=/mnt/disk/sounds/cd
elif test -d /smurf/sounds ; then
        X=/smurf/sounds/cd
elif test -d /daten/sound ; then
        X=/daten/sound/cd
elif test -d /daten/Sound ; then
        X=/daten/Sound/cd
elif test -d ~/sound ; then
        X=~/sound/cd
else
        echo "kein sound-Verzeichnis?" >&2
        exit 1
fi

#Filesystem         1024-blocks      Used Available Capacity Mounted on
#/dev/mapper/kiste-root  12385456   9897128   1859208      85% /

cdcd -d $D close

f0=$(tempfile -p cdrd_)
f1=$(tempfile -p cdrd_)
f2=$(tempfile -p cdrd_)
f3=$(tempfile -p cdrd_)

trap 'rm -f $f0 $f1 $f2 $f3' 0 1 2 15
cat <<END >$f3
import sys

def checksum(sean='602498112083'):
	s1,check=sean[:-1],sean[-1]
	sum=0
	for i in range(len(s1)):
		if (len(s1)-i)%2:
			sum+=int(s1[i])*3
		else:
			sum+=int(s1[i])
	sum = (10-sum)%10
	if int(check) != sum:
		sys.exit(1)
	sys.exit(0)

checksum(raw_input())
END

while : ; do 
f=0
for d in /media/*/cd /var/cache/rip/cd /var/cache/cd /var/tmp /tmp ; do
	test -d $d || continue
	df=$(df -P $d|tail -1|while read a b c d e ; do echo $d; done)
	if [ $df -gt $f ] ; then
		T=$d
		f=$df
	fi
done
echo $T

cat <<END >$f0
import musicbrainz2.disc as md
import musicbrainz2.webservice as ws
import time,sys
a=open(sys.argv[1],"w")
b=open(sys.argv[2],"w")
while True:
	try:
		d = md.readDisc("$D")
		break
	except Exception,e:
		time.sleep(2)
print >>a, d.id, md.getSubmissionUrl(d)
q=ws.Query()
dly=2.0
while True:
	try:
		filter = ws.ReleaseFilter(discId=d.id)
		res = q.getReleases(filter)
		break
	except ws.WebServiceError,e:
		print "Error:", e
		time.sleep(dly)
		dly = dly * 1.6
if res and len(res)==1:
	res = res[0].release
	print >>b, (res.artist.name.replace("/","-") + "/" + res.title.replace("/"," - ")).encode("utf-8")
END

python $f0 $f1 $f2

read id url <$f1
read artist <$f2 || true
rm -f $f0 $f1
test -n "$id"

echo $id
if test -z "$artist" ; then
	echo "$id *** not found ***"
	# sensible-browser "$url" &
else
	echo $id === $artist
fi

cd $X
if test ! -d mb_$id ; then
mkdir -p mb_$id $T/$id
cd mb_$id
echo mbid $id > .id
echo mburl $url >> .id
if test -z "$artist" ; then
	echo -n "Artist: " ; read a ; test -z "$a" || echo artist $a >> .id
	echo -n "Title: " ; read t ; test -z "$t" || echo title $t >> .id
	while : ; do
		echo -n "Barcode: " ; read b ; test -n "$b" || break
		if echo $b | python $f3 ; then
			echo barcode $b >> .id
			break
		fi
		echo "*** Wrong barcode checksum ***"
	done
	echo $url
fi
cd $T/$id
echo $id ... reading
if ! cdparanoia -q -d $D -B ; then
	cd /
	rm -r $X/mb_$id $T/$id
	rm -r /var/lock/cdread$DEV
	exit 1
fi
echo $id ... encoding

# nice -15 lame --nogapout . --quiet --r3mix "$@" --nogap --nogaptags *.wav
( 
  while ! $LOCK /var/lock/cdreadenc$DEV ; do sleep 10; done
  for f in *.wav ; do 
	df="$X/mb_$id/$(basename $f .cdda.wav|sed -e s/track//).ogg"
    $SCHED oggenc -Q -q5 "$@" -o "$df" $f
	rm $f
  done
  cd $T
  rm -r $id /var/lock/cdreadenc$DEV
  echo $id . . done
) &
else
  echo $id . . known
fi

eject $D
cdcd -d $D open

done
