#!/bin/bash


# SCRIPT radios.sh
# Utilisation: "./radios.sh [adresse directe du flux radio]"
# Script proposant d'écouter des stations radio via mplayer
# Travail et idée originale de "Jotenakis"

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


#------------------------------------------------------------------------------#
# Initialisation des variables "utilisateur"                                   #
#------------------------------------------------------------------------------#

DB_FILENAME="radios.csv"; # nom du fichier local par défaut contenant les adresses des radios
DB_URL="http://ludomatic.fr/index.php/dlm/1/6"; # lien vers le fichier public des adresses de stations radio
SCRIPT_PAGEWEB="http://ubunteros.tuxfamily.org/"; # site du projet
SCRIPT_DATADIR=".radios";
SCRIPT_HISTORY="
0.73d (2007-02-21) lexdu <lexdu@free.fr>
	- le zapping de radio (merci Jean-Marie RENOUARD ;) )
	- l'enregistrement daté et titré du flux
	- l'enregistrement d'un flux pendant l'écoute d'un autre
	- l'arrêt de l'enregistrement sans arrêter l'écoute
	- modification de l'affichage (affichage en bas de liste de la radio en cours d'écoute, si il y en a une et de la radio en cours d'enregistrement, si il y en a une)

0.73c (2007-02-18) lexdu <lexdu@free.fr>
      - Re-affichage de la liste des radios à l'interruption de l'écoute de la radio en cours

0.73b (2007-02-18) lexdu <lexdu@free.fr>
      - Affichage du nom de la station plutôt que de l'url du flux

0.73  (2007-02-18) Ludomatic <ludomatic@leonux.net>
      - Suite à la découverte de problèmes de droits lors de l'enregistrement du
        fichier des radios, déplacement de \"radios.csv\" vers le dossier .radios
	du dossier \$HOME.

0.72  (2007-02-17) Ludomatic <ludomatic@leonux.net>
      - Essai de correction d'un \"bug\" : fermeture intempestive du script lors
        de son exécution dans un terminal. Ajout d'une pause à la sortie du
	script si la variable d'environnement DEBUGME existe.

0.71  (2007-01-31) Balkoth
      - Légère optimisation du code
      - Téléchargement automatique du fichier des radios si il n'est pas trouvé
      (2007-01-31) Ludomatic <ludomatic@leonux.net>
      - Fonction demandant l'autorisation de télécharger le fichier des radios
      - Correction d'un bug empêchant la lecture de l'adresse par défaut (repéré
        par Balkoth!)

0.70  (2007-01-30) Ludomatic <ludomatic@leonux.net>
      Grosse modification structurelle pour cette version 0.7 : séparation
      entre la liste des adresses des radios et le 'moteur' de lecture.
      Le nom du fichier des radios est 'radios.csv' et sera cherché dans
      l'ordre aux emplacements suivants :
      - dossier courant du script 'radios.sh'
      - dossier de l'utilisateur exécutant le script

0.6d  (2007-01-30) Ludomatic <ludomatic@leonux.net>
      Ajout de 27 stations (!) grace à Mail1
      Merci à Fran pour la découverte de CanalB!

0.6c  (2007-01-29) Ludomatic <ludomatic@leonux.net>
      Correction de l'adresse du flux OuiFM (merci à Mail1)
      Ajout des stations RTL2 et W3 Blues Radio sur proposition de Fran

0.6b- Ludomatic <ludomatic@leonux.net> (22/11/2006)
      Correction d'un bug concernant le fond d'écran uni (merci à Léonux et
      Eupythal)
      Ajout de la fonction 'PlusBlancQueBlanc()' qui nettoie tout à la fermeture

0.6 - Ludomatic <ludomatic@leonux.net> (21/11/2006)
      Merci à Eupythal pour l'ajout des stations RTL et OuiFM, et ses idées
      mises en pratique :
      > Suppression des messages mplayer lors de la lecture
      > Rester dans une 'boucle' pour proposer continuellement les stations

0.5 - Ludomatic <ludomatic@leonux.net> (19/11/2006)
      Débugage des affichages colorés,
      Optimisation de quelques parties du code,
      Nettoyage du code.

0.4 - Zarer <????@gmail.com>
      Tests et ajout de stations radio

0.3 - Ludomatic <ludomatic@leonux.net>
      Quelques mises en Fonctions et création de Variables grace aux documents
      suivants :
      > http://www.c-sait.net/cours/scripts.php
      > http://www.linuxcommand.org/wss0120.php
      > http://www.arachnoid.com/linux/shell_programming.html

0.2 - Leonux <leonux@leonux.net>
      Refonte du script et publication sur le \"Guide de survie de l'ubuntiste
      débutant\".

0.1 - Jotenakis
      Idée et script original pour Suse Linux.
";


#------------------------------------------------------------------------------#
# Initialisation des variables internes "automatiques"                         #
#------------------------------------------------------------------------------#

SCRIPT_VERSION=$( echo $SCRIPT_HISTORY | cut -d " " -f1 ); # version courante
SCRIPT_NAME=$( basename $0 ); # nom du script courant
SCRIPT_PATH=$( dirname $0 ); # chemin vers le script courant
MPLAYER_PATH=$( which mplayer ); # emplacement de l'exécutable mplayer
MPLAYER="$MPLAYER_PATH -msglevel all=-1 "; # paramètres à fournir à mplayer
MENCODER_PATH=$( which mencoder ); # emplacement de l'exécutable mencoder
MENCODER="$MPLAYER_PATH "; # paramètres à fournir à mencoder
HOME_PATH=$HOME; # dossier de l'utilisateur
DATA_PATH="$HOME/$SCRIPT_DATADIR"; # dossier de travail de l'application
PID_FILE=/tmp/pid_mplayer_radio # fichier contenant le PID du mplayer lecteur de radio
PID_REC_FILE=/tmp/pid_rec_radio # fichier contenant le PID du mplayer enregistreur de radio
DIR_REC_RADIO="$HOME/$SCRIPT_DATADIR"; # répertoire par défaut d'enregistrement des radios


#------------------------------------------------------------------------------#
# Tests initiaux et lecture des paramètres                                     #
#------------------------------------------------------------------------------#

if [ -z "$MPLAYER_PATH" ]
then
    # MPlayer n'est pas installé ou ne peux pas être trouvé : on sort
    echo "Vous devez installer le lecteur \"mplayer\" avant de continuer. \n";
    echo "";
    exit 1;
fi

if [ ! -d "$DATA_PATH" ]
then
    # Le dossier de travail du script n'existe pas, on le créé
    mkdir -p $DATA_PATH;
fi

if [ -n "$1" ]
then
    # l'utilisateur a envoyé un paramètre, si il n'est pas reconnu comme une des options alors le considérer comme une adresse à ouvrir ("./radios.sh url_du_flux")
    case "$1" in
    --help|-h ) # option d'aide
      echo "Usage: $SCRIPT_NAME [url du flux radio]";
      echo "Ce script permet d'écouter des radios en ligne en ne vous servant que de votre console. MPlayer sera exécuté en tâche de fond.";
      echo "La dernière version est disponible depuis le site $SCRIPT_PAGEWEB";
      echo "";
      echo "$SCRIPT_NAME --help               Aide et options disponibles.";
      echo "$SCRIPT_NAME                      Lance le menu de lecture";
      echo "$SCRIPT_NAME url_radio            Ecoute la radio à l'adresse 'url_radio'";
      echo "$SCRIPT_NAME --file nom_fichier   Charge la liste du fichier 'nom_fichier'";
      echo "$SCRIPT_NAME --version            Version courante et l'historique.";
      echo "";
      exit 1;
    ;;
    --version|-v ) # option de version
      echo "$SCRIPT_NAME version $SCRIPT_VERSION :";
      echo "$SCRIPT_HISTORY";
      echo "Tapez $SCRIPT_NAME --help pour obtenir l'aide complète.";
      echo "";
      exit 1;
    ;;
    --file|-f ) # paramètre : fichier des adresses radios à charger
      PARAM_FILENAME="$2";
    ;;
    * ) # pas une option, considérer comme une url de flux radio et passer à la suite
      URL=$1
    ;;
    esac
fi


#------------------------------------------------------------------------------#
# Déclaration des Fonctions                                                    #
#------------------------------------------------------------------------------#

MrPropre () {
# cette fonction permet de ré-initialiser les couleurs du terminal
    tput sgr0; # supprime les couleurs
}
PlusBlancQueBlanc () {
# cette fonction nettoie tout le terminal
    if [ $DEBUGME ]; then
        read -n 1;
    else
        MrPropre;
        clear;
    fi    
}

AfficheStations () {
# cette fonction permet d'afficher la liste des stations
    if [ -e "$FILE_CSV" ]
    then
        echo -e '\E[36;40m'; # hop, on change de couleur
        cat -n $FILE_CSV | cut -d ";" -f1;
        MrPropre; # supprime les couleurs
    else
        echo "Aucune liste de radios n'a été trouvée!";
    fi
}

TelechargeFichier () {
# cette fonction gère le téléchargement du fichier des radios
    
    USER_ANSWER="?";
    while [ "x$USER_ANSWER" != "xn" -a "x$USER_ANSWER" != "xN" -a "x$USER_ANSWER" != "xo" -a "x$USER_ANSWER" != "xO" ] ; do
        echo -n "Voulez-vous lancer le téléchargement automatique du fichier ? [o/n] "
        read -n 1 USER_ANSWER
        echo "";
    done
    if [ "x$USER_ANSWER" == "xo" -o "x$USER_ANSWER" == "xO" ] ; then
        wget --user-agent="$SCRIPT_NAME" -nv "$DB_URL" -O "$DATA_PATH/$DB_FILENAME";
    fi
    if [ -e "$DATA_PATH/$DB_FILENAME" ] ; then
        echo "Le fichier a été récupéré avec succès!";
    else
        echo "Le fichier n'a pas pu être récupéré, vous pouvez vous renseigner sur $SCRIPT_PAGEWEB.";
    fi
}

LectureRadio () {
# cette fonction lance la lecture de la radio sélectionnée ou passée en argument
	REC_URL=$URL # on sauve l'URL des fois que l'utilisateur veuille l'enregistrer
	echo "Connexion à la radio : $RADIO";
	$MPLAYER $URL 1>/dev/null 2>/dev/null &
	sleep 2s
	TueLectureRadio;
	sleep 1s
	InitLectureRadio;
}

TueLectureRadio() {
	if [ -f "$PID_FILE" ]
	then
		kill -9 `cat $PID_FILE` 2>&1 1>/dev/null
	fi		
	rm -f $PID_FILE
}

InitLectureRadio(){
	if [ -f "$PID_FILE" ]
	then
		#echo "Existing mplayer instance ? ?"
		rm -f $PID_FILE
	fi
	#echo `pidof mplayer` > $PID_FILE
	echo $! > $PID_FILE
}

EnregitreRadio () {
# cette fonction enregistre la radio sélectionnée ou passée en argument
	REC_RADIO=$RADIO;
	echo "Demande d'enregistrement de la radio : $REC_RADIO";
	$MPLAYER -dumpstream -dumpfile $DIR_REC_RADIO/`date +%F_%H:%M:%S`_"$REC_RADIO" -nocache $REC_URL &
	sleep 2s
	TueEnregRadio;
	sleep 1s
	InitEnregRadio;
}

TueEnregRadio() {
	if [ -f "$PID_REC_FILE" ]
	then
		echo "Arrêt d'enregistrement demandé !";
		sleep 2s
		kill -9 `cat $PID_REC_FILE` 2>&1 1>/dev/null
	fi		
	rm -f $PID_REC_FILE
}

InitEnregRadio(){
	if [ -f "$PID_REC_FILE" ]
	then
		#echo "Existing mplayer instance ? ?"
		rm -f $PID_REC_FILE
	fi
	#echo `pidof mplayer` > $PID_REC_FILE	
	echo $! > $PID_REC_FILE
}



#------------------------------------------------------------------------------#
# Affichage de la liste et lecture du choix si une URL n'est pas fournie       #
#------------------------------------------------------------------------------#

trap "PlusBlancQueBlanc" 0; # commande qui exécute la fonction 'PlusBlancQueBlanc()' lors de la sortie du programme (réception du signal '0')
    
clear;
echo "Bienvenue sur $SCRIPT_NAME (v$SCRIPT_VERSION), le lecteur de stations radio sur internet via mplayer.";

if [ $PARAM_FILENAME ]
then
    # un fichier de flux a été forcé en parametre !
    if [ -e "$PARAM_FILENAME" ]
    then
        # un fichier de flux est fourni en parametre, le charger par défaut
        FILE_CSV=$PARAM_FILENAME;
    else
        # aïe, le fichier demandé n'a été trouvé... on quitte de suite
        echo "Le fichier spécifié n'a pas été trouvé!";
        echo "Vous pouvez directement spécifier une adresse de radio en paramètre";
        echo "ou obtenir une liste prédéfinie à l'adresse suivante :";
        echo "$DB_URL";
        echo "";
        echo "Tapez $SCRIPT_NAME --help pour obtenir l'aide complète.";
        echo "";
        exit 1;
    fi
else
    if [ -z $URL ]
    then
        # pas de fichier en paramètre ni d'url à charger : chercher le fichier dans le dossier courant
        if [ -e "$SCRIPT_PATH/$DB_FILENAME" ]
        then
            # un fichier de flux existe par défaut dans le dossier courant
            FILE_CSV="$SCRIPT_PATH/$DB_FILENAME";
        else
            if [ -e "$DATA_PATH/$DB_FILENAME" ]
            then
                # un fichier de flux existe par défaut dans le dossier de l'utilisateur
                FILE_CSV="$DATA_PATH/$DB_FILENAME";
            else
                # aucun fichier n'a été trouvé...
                echo "Aucune liste de radios n'a été trouvée!";
                # on télécharge le fichier par défaut
                TelechargeFichier;
                if [ -e "$DATA_PATH/$DB_FILENAME" ] ; then
                    FILE_CSV="$DATA_PATH/$DB_FILENAME";
                else
                    echo "Aucune adresse n'a été fournie et aucun fichier d'adresses n'a été trouvé.";
                    echo "";
                    exit 1;
                fi
            fi
        fi
    fi
fi
# à ce stade, on dispose d'une URL ($URL) ou d'un fichier d'URLs ($FILE_CSV)

while true; do # on boucle

    AfficheStations; # on affiche la liste des stations
    if [ -f "$PID_FILE" ]
	then	
		echo -en '\E[37;40m'; # oui, on aime les couleurs par ici :)
	        echo -en "\nLa radio en cours d'écoute est : ";
		echo -en '\E[36;40m'; # hop, on change de couleur pour le nom de la radio ;)
		echo -e "$RADIO"
    fi
    if [ -f "$PID_REC_FILE" ]
	then	
		echo -en '\E[37;40m'; # oui, on aime les couleurs par ici :)
	        echo -en "\nUne radio est en cours d'enregistrement :"
		echo -en '\E[36;40m'; # hop, on change de couleur pour le nom de la radio ;)
		echo -e "$REC_RADIO"
    fi
        # bon, si on arrive à cette ligne c'est que mplayer est installé et que nous disposons d'une adresse considérée comme valide : on le lit ce flux?

    echo -e '\E[37;40m'; # on change de couleur et on efface l'écran pour uniformiser le fond (merci à Leonux pour le screenshot ;)
    echo "Faites votre choix :"
    echo "\"q\" pour quitter à tout moment"
    echo "\"l\" pour afficher la liste"
    echo "\"r\" pour enregistrer la radio en cours d'écoute"
    echo "\"qr\" pour quitter l'enregistrement de la radio"
    echo -e '\E[33;40m'; # on change à nouveau de couleur pour demander d'entrer un choix
    echo -en 'Quelle radio écouter [defaut : France Info = 3] ?> ';
    read NUMSTATION; # on enregistre le choix saisi
    MrPropre; # supprime les couleurs

    if [ -z "$NUMSTATION" ]
    then
        # le choix par défaut est appliqué si la réponse est vide
        NUMSTATION="3";
    fi
    case $NUMSTATION in
        "q"|"Q" ) # l'utilisateur a demandé de sortir
	    echo "Sortie sur demande utilisateur"
	    TueLectureRadio;
	    TueEnregRadio;
            break;
        ;;
        "l"|"L" ) # l'utilisateur souhaite voir la liste des stations
            AfficheStations;
        ;;
	"r"|"R" ) # l'utilisateur souhaite enregistrer la radio en cours
	    EnregitreRadio;
	;;        
        "qr"|"QR" ) # l'utilisateur souhaite arrêter l'enregistrement en cours
	    TueEnregRadio;
	;;
	* ) # un numéro a été saisi ?
            nodigits="$(echo $NUMSTATION | sed 's/[[:digit:]]//g')"
            if [ -z "$nodigits" ] ;
	    then
                if [ -n $FILE_CSV ] # la variable $FILE_CSV n'est pas nulle et on a bien reçu un numéro de ligne
                then
                    # on récupère la ligne correspondant à la station demandée
                    line=$(sed -n ${NUMSTATION}p $FILE_CSV)
                    if [ -n "$line" ]
                    then
                        # on a un choix valide, on mémorise l'adresse (partie située après le point-virgule)
                        URL=$( echo $line | cut -d ";" -f2 );
			# on récupère le nom de la radio
			RADIO=$( echo $line | cut -d ";" -f1 );
                    else
                        # le choix est hors limites !
                        echo "Veuillez choisir un numéro valide dans la liste (laisser vide pour la radio par défaut ou tapez \"l\")";
                    fi
                fi
            else
                # le choix est invalide !
                echo "Veuillez choisir un numéro valide dans la liste (laisser vide pour la radio par défaut ou tapez \"l\")";
            fi
        ;;
    esac;

    if [ -n "$URL" ]; then        
	LectureRadio; # on écoute la radio choisie ou passée en argument
    fi

    URL="";
done

exit $?; # On quitte avec le code de sortie de la dernière comande (mplayer). That's all folks!