#!/bin/sh
# Mode d'emploi en -d:
# Modifier ~/.cmus/config et autosave ainsi:
#   bind common A shell n="0`cat /tmp/cmus-view`" ; cmus-remote -C "view `echo $n - 1 | bc | tee /tmp/cmus-view`"
#   bind common Z shell n="0`cat /tmp/cmus-view`" ; cmus-remote -C "view `echo $n + 1 | bc | tee /tmp/cmus-view`"
#   bind common 0 shell $HOME/src/scripts/musique/etoile 0
#   bind common 1 shell $HOME/src/scripts/musique/etoile 1
#   bind common 2 shell $HOME/src/scripts/musique/etoile 2
#   bind common 3 shell $HOME/src/scripts/musique/etoile 3
#   bind common 4 shell $HOME/src/scripts/musique/etoile 4
#   bind common 5 shell $HOME/src/scripts/musique/etoile 5
# Lancer la totale ainsi:
#   $HOME/src/scripts/musique/etoile -d & cmus

convertisseur=cat
case `uname` in
	Darwin)
		convertisseur="/usr/bin/iconv -f UTF8-MAC"
		;;
	FreeBSD)
		# Si la musique est servie depuis un montage SMB, en FBSD 10, mount_smbfs plante avec un -E UTF-8:CP850
		# À FAIRE: vérifier aussi qu'on est depuis un montage SMB.
		if [ `uname -r | sed -e 's/[^0-9].*//'` -lt 11 ]
		then
			convertisseur="iconv -f CP850"
		fi
		;;
esac

mode=i

menage()
{
	rm -f /tmp/temp.$$.etoile /tmp/temp.etoile
	if [ "$mode" = i ]
	then
	stty echo -raw
	else
		afficherMoniteur "-"
	fi
	echo
}

etoilerNote()
{
	n=100
	etoiles=
	while [ $n -gt 0 ]
	do
		if [ $1 -ge $n ]
		then
			etoile="*"
		elif [ $1 -ge `expr $n - 10` ]
		then
			etoile="½"
		else
			etoile=" "
		fi
		etoiles="$etoiles$etoile"
		n="`expr "$n" - 20`"
	done
}

courant()
{
	fichier="`cmus-remote -Q | grep ^file | sed -e 's/file *//' | $convertisseur`"
	fichier="`echo "$fichier" | sed -e 's#.*/\([^/]*/[^/]*\)$#\1#'`"
	echo "$fichier"
}

etoilerNoteCourant()
{
	fichier="`courant`"
	note="0`grep "^[0-9]*	$fichier$" < $HOME/.cmus/classement.pl | head -1 | awk '{print$1}'`"
	etoilerNote "$note"
}

afficher()
{
	etoilerNoteCourant
	if [ "$mode" = i ]
	then
	colonnes="`tput cols`"
	printf "\r%$colonnes.${colonnes}s\r  %s %s\r" "" "$etoiles" "$fichier"
	else
		afficherMoniteur "`printf "[$etoiles]"`"
	fi
}

boucler()
{
	while [ -e /tmp/temp.$$.etoile ] && cmus-remote -Q > /dev/null 2>&1
	do
		afficher
		sleep 3
	done
	sleep 2
	if [ -p /tmp/temp.etoile ]
	then
		echo q > /tmp/temp.etoile
	fi
}

rentrer()
{
	maintenant="`date +%s`"

	ajout=0
	[ "$maintenant" -le "$valableJusquA" ] && ajout=10
	val="`expr $1 \* 20 + $ajout`"

	fichier="`courant`"
	(
		echo "$val	$fichier"
		grep -v "^[0-9]*	$fichier$" < $HOME/.cmus/classement.pl
	) > $HOME/.cmus/classement.pl.temp && mv $HOME/.cmus/classement.pl.temp $HOME/.cmus/classement.pl
	
	valableJusquA="`expr $maintenant + 1`"
}

interfacer()
{
valableJusquA=0
trap menage EXIT

touch /tmp/temp.$$.etoile
	# Les étoiles n'apparaissent qu'une fois la nuit entamée: tout le monde au sleep!
	# En vrai de vrai: si on se lance en tâche de fond, il est probable que cmus soit lancé simultanément. Or si etoile se trouve prêt avant cmus, il se barre immédiatement (ne voyant pas de cmus, il le croit terminé). On laisse donc à cmus un répit pour initialiser au moins sa socket (oui car notre étoile se branche sur le secteur).
	sleep 1 # Pour attendre un éventuel cmus en cours de démarrage.
boucler &

	if [ "$mode" = i ]
	then
		stty -echo raw
	else
		if ! mkfifo /tmp/temp.etoile
		then
			echo "# Impossible de créer /tmp/temp.etoile. Une autre instance tourne probablement." >&2
			exit 1
		fi
		exec < /tmp/temp.etoile
	fi
	
while true
do
	car="`dd bs=1 count=1 2> /dev/null | tr '\003' q`"
	case "$car" in
		x|q) break ;;
		[0-5]) rentrer "$car" ; afficher ;;
	esac
done
}

afficherMoniteur()
{
	if [ -z "$TMUX_PANE" ]
	then
		echo "]2;$1" > /dev/tty
	else
		tmux rename-window -t "$TMUX_PANE" "$1"
	fi
}

balancer()
{
	echo "$1" > /tmp/temp.etoile
}

case "$1" in
	-d) mode=d ; interfacer < /dev/null > /dev/null ;;
	[012345]) balancer "$1" ;;
	*) interfacer ;;
esac
