Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/06/2007, à 16:52

jaywax

[How To] Multiposte free, lirc & playlist personnalisée

Bonjour à tous !

Pourquoi ce tuto ?
Ma Freebox (v4) étant dans une autre pièce et ayant dans mon salon une boite à chaussure me servant de media center (wifi only, sans clavier ni souris, lirc & une télécommande, DISPLAY= ma télé), j'utilisais le multiposte via vlc pour regarder comme tout le monde les programmes de la freebox. On se heurte trés vite aux incovénients suivants :
- On a tous les flux, y compris ceux auxquels on est pas abonné (ecran noir à la place...)
- On ne peut naviguer seulement qu'avec les touches suivantes/précedentes (lorsque vlc est configuré avec lirc).
Bref, ca devient tout de suite trés fastidieux et pas intuitif... Je me suis donc crée un ensemble de scripts rendant la navigation un peu plus facile et permettant de choisir une playlist personnalisée.

Fonctionnement
1. Au boot, lirc & irexec sont lancés, la playlist est téléchargée et traitée.
2. Si l'on souhaite on execute le script de choix des chaines (via ssh dans mon cas).
3. Lors du lancement de vlc_multiposte, la playlist modifiée est lancée, ainsi que l'interface rc de vlc pour naviguer dans celle-ci (Port tcp à configurer dans ~/.vlc/vlcrc). Les commandes sont passées grace à netcat.
4. On navigue dans la playlist en appelant directement le n° des chaines puis en validant, ou grâce aux boutons suivants et précédents.
5. On peut enregistrer la chaine courrante. Pour ceux qui ont un "gros tuyau" il doit être possible de regarder une autre chaine.

Prérequis
- Lirc : Pilotage de votre télécommande (doit être fonctionnel)
- Dialog : Interface utilisée pour choisir les chaînes désirées.
- Vlc : Pour lire les flux rtsp et charger notre playlist.
- Gnome-osd-client : Permet d'afficher des infos sur les touches appuyées, le titre de la chaine en cours...

Les scripts
I..lircrc
Le fichier chargé par "irexec -d" lors du boot de votre machine.

...
# Lancement de vlc multiposte
begin
	prog = irexec
	button = live 
	config = sh /home/tvuser/scripts/lircrc/vlc.sh
	mode = vlc &
end
...
# Inclusion des autres fichiers .lircrc
include ~/.lircrc.vlc

II..lircrc.vlc
Fichier complèmentaire chargé depuis le principal

begin
     prog = irexec 
     button = ch+
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh next 
end
begin
     prog = irexec 
     button = ch-
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh prev 
end
...
begin
     prog = irexec 
     button = 1 
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 1
end
begin
     prog = irexec
     button = 2
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 2
end
begin
     prog = irexec
     button = 3
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 3
end
begin
     prog = irexec
     button = 4
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 4
end
begin
     prog = irexec
     button = 5
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 5
end
begin
     prog = irexec
     button = 6
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 6
end
begin
     prog = irexec
     button = 7
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 7
end
begin
     prog = irexec
     button = 8
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 8
end
begin
     prog = irexec
     button = 9
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 9
end
begin
     prog = irexec
     button = 0
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh 0
end
begin
     prog = irexec
     button = clear 
     config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh clear
end
begin
    prog = irexec 
    button = enter
    config = sh /home/tvuser/scripts/lircrc/changement_chaine.sh enter 
end
begin
    prog = irexec
    button = rec
    config = sh /home/tvuser/scripts/lircrc/enregistrement.sh
end

III.variables.sh
Script initialisant différentes variables, reprises dans les autres scripts par l'appel à la commande source

#!/bin/sh

########################################################################################################################
# script        : variables.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Script source qui set toutes les variables utilisees
########################################################################################################################

# Variables
# Le rep de base pour les scripts
bin_dir="/home/tvuser/scripts/lircrc"
# Le rep des fichiers variables
fic_dir="$bin_dir/fichiers"
# Le rep des pids
pid_dir="$bin_dir/pids"
# L'adresse de la playlist commune
a_recuperer="http://mafreebox.freebox.fr/freeboxtv/playlist.m3u"
# Des fichiers tempo
tempo="$fic_dir/tempo"
tempo2="$fic_dir/tempo2"
# Le fichier de description de la playlist totale (n° de chaine#titre de la chaine#flux rtsp correspondant)
video="$fic_dir/video_totale"
# La playlist
playlist="$fic_dir/playlist_totale.m3u"
# Fichier temporaire pour les choix de chaines
choix="$fic_dir/choix"
# La playlist correspondants a nos choix
playlist_ok="$fic_dir/playlist.m3u"
# Le fichier de description de la playlist choisie (n° dans la playlist#n° de chaine#titre de la chaine#flux rtsp correspondant)
video_ok="$fic_dir/video"
# Le fichier correspondant aux touches appuyees
appui_touche="$fic_dir/appui_touche"
# Le fichier dans lequel on note la chaine en cours
chaine_en_cours="$fic_dir/chaine_en_cours"
# Le port d'ecoute pour l'interface rc de vlc
vlc_tcp="5656"
# Les fichiers pid
pidfile_vlc_multi="$pid_dir/vlc_multi.pid"
pidfile_vlc_rec="$pid_dir/vlc_rec.pid"
# Le repertoire d'enregistrement du flux
rec_dir="/home/tvuser/mov/enregistrements_freebox

# Fonction d'affichage via gnome osd avec comme param :
# $1 : Le temps d'affichage
# $2 : Les texte a afficher
function afficher(){
	gnome-osd-client -f "<message id='lirc' osd_fake_translucent_bg='off' osd_vposition='top' \
          animations='off' hide_timeout='$1' osd_halignment='right'>"$2"</message>"
          }"

IV.traitement_playlist.sh
Ce script est à executé lors de chaque démarrage. (Par exemple dans le script de lancement de irexec). Il télécharge la playlist et la remet en forme pour l'exploiter plus facilement

#!/bin/sh

########################################################################################################################
# script        : traitement_playlist.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Recupere la playlist depuis http://mafreebox.freebox.fr/freeboxtv/playlist.m3u  et la remet en forme
########################################################################################################################

# On source le fichier de variables
. $(dirname $0)/variables.sh
# Methode wget silencieuse pour recuperer la playlist brute
wget -qnv $a_recuperer -O $tempo
# On trie un premier fichier pour affichier toutes les chaines comme suit : $numero_chaine#$titre_chaine#flux_rtsp
awk -F',' 'BEGIN{RS="#"}{print ("|",$2)}' $tempo |awk 'BEGIN{RS="|"}{printf ($1"#")}{printf ($3)}{for(i=4;i<NF;i++){printf ($i)}}                                                {print ("#"$NF)}' | grep -v "##" |grep -v ^$ > $tempo2
rm -f $tempo
# On ne prend que les chaines inferieures a 900
awk -F"#" '{if($1<900) print($0)}' $tempo2 > $video
rm -f $tempo2
# On cree la playlist avec tous les flux rtsp de toutes les chaines
awk -F"#" '{print ($3)}' $video > $playlist
exit 0

V.menu_choix_chaines.sh
Le script a executer pour choisir les différentes chaînes que l'on souhaite dans notre playlist.

#!/bin/sh

########################################################################################################################
# script        : menu_choix_chaines.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Affiche un menu DIALOG pour le choix des chaines que l'on veut dans notre playlist 
########################################################################################################################

# On source le fichier de variables 
. $(dirname $0)/variables.sh
# On affiche toutes les chaines dans un menu dialog
dialog --backtitle "Playlist Freebox"  --title "Choix des chaà®nes" --cancel-label "Annuler" --ok-label "Ok" \
--checklist "\n Choix des chaines a inclure dans la playlist \n\n" 30 80 20 \
`awk -F"#" '{print ($1,$2,"off")}' $video` 2> $choix
# Si le choix a ete valide
if [ $? -eq 0 ];
then
	# On recupere les choix effectues 
	read liste < $choix
	# On vide les fichiers finaux
	> $playlist_ok 
	> $video_ok 
	# Pour chaque chaine choisie dans la liste
	for numero in $liste;
	do
		# On enleve les guillemets
		total=${#numero}
		nombre=$(($total-2))
        		chaine=`expr substr "${numero}" 2 $nombre`
		# On ajoute le flux rtsp a la playlist valide
        		awk -F"#" '{if($1=="'$chaine'"){print($3)}}' $video >> $playlist_ok
		# On ajoute les infos chaine#titre#flux_rtsp au fichier temporaire
        		awk -F"#" '{if($1=="'$chaine'"){print($0)}}' $video >> $tempo
	done
	rm -f $choix
	# Permet de rajouter la position dans la playlist des differentes chaines au fichier video valide
	awk 'BEGIN {OFS="#"}{print((NR-1),$0)}' $tempo > $video_ok
	rm -f $tempo
	clear
	echo "Playlist modifiee : [OK]"
	exit 0
else
	clear
	echo "Playlist non modifiee"
	exit 0
fi

VI.vlc.sh
Script de lancement ou d'arrêt de vlc

########################################################################################################################
# script        : vlc.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Script appelle par lirc lors du lancement de vlc multiposte 
########################################################################################################################

# On source le fichier de variables
. $(dirname $0)/variables.sh
# Vlc_multiposte tourne t-il (cf pidfile)?
if [ -f $pidfile_vlc_multi ]; then
	# Si oui, on kill le pid associe, et seulement lui
	for i in `cat $pidfile_vlc_multi`
	do
		kill -9 $i
	done
	# On efface le fichier
	rm -f $pidfile_vlc_multi
else
	# On exporte le display
	export DISPLAY=:0.0
	# On cree une console afin de raccrocher le rc de vlc
	screen -d -m -S myVLCscreen vlc -I rc --fullscreen $playlist_ok --volume=50 --aspect-ratio=16:9 &
	# On cree le vlc_multiposte pidfile
	echo `ps -ef |grep myVLCscreen|grep -v "grep"|awk '{print($2)}'`>>$pidfile_vlc_multi
	# On sleep le temps que l'interface soit lancee (sinon pas de retour vers la derniere chaine)
	sleep 0.5
	# On goto dans la playlist vers la derniere chaine visionnee et on affiche le detail
	num_playlist=`awk -F"#" '{print($1)}' $chaine_en_cours`
	echo "goto $num_playlist" | netcat localhost $vlc_tcp -q 1
	detail=`awk -F"#" '{print($3)}' $chaine_en_cours`
        	afficher 5500 $detail
fi
exit 0

VII.changement_chaine.sh
Script permettant de naviguer dans notre playlist.

#!/bin/sh

########################################################################################################################
# script        : changement_chaine.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Script appelle par irexec/lirc lors d'un appui sur l'une des touches de navigation
########################################################################################################################
# On source le fichier de variables
. $(dirname $0)/variables.sh
# Si vlc_multiposte tourne effectivement
if [ -f $pidfile_vlc_multi ]; then
	# Selon l'action choisie
	case "$1" in
		clear)
			# Si on efface le choix de la chaine effectue jusqu'a maintenant
                		> $appui_touche
		;;
		enter)
			# Si on a valide une chaine
                		a_afficher=$(tr -d '[:space:]' < $appui_touche)
                		# On recherche la position dans la playlist associee
                		num_playlist=`awk -F"#" '{if($2=="'$a_afficher'"){print($1)}}' $video_ok`
                              # Si la position dans la playlist est nulle (si aucune chaine n'a ete trouvee)
			if [ -z $num_playlist ]; then
				afficher 500 "$a_afficher : Pas de service"
                              else
				# On renseigne la chaine en cours dans le bon fichier
				echo `awk -F"#" '{if($2=="'$a_afficher'"){print($0)}}' $video_ok` > $chaine_en_cours
				detail=`awk -F"#" '{print($3)}' $chaine_en_cours`
				# On indique a vlc sur son interface d'ecoute (rc) d'aller jusqu'a l'element de la playlist indique
                			echo "goto $num_playlist" | netcat localhost $vlc_tcp -q 1
                			afficher 5500 $detail
                		fi
			> $appui_touche

		;;
		next|prev)
			num_playlist_en_cours=`awk -F"#" '{print($1)}' $chaine_en_cours`
			case "$1" in
				next)
		 			num_playlist_futur=$(($num_playlist_en_cours+1))
				;;
				prev)
					num_playlist_futur=$(($num_playlist_en_cours-1))
				;;
			esac
			echo "goto $num_playlist_futur" | netcat localhost $vlc_tcp -q 1
			detail=`awk -F"#" '{if($1=="'$num_playlist_futur'"){print($3)}}' $video_ok`
			a_afficher=`awk -F"#" '{if($1=="'$num_playlist_futur'"){print($0)}}' $video_ok`
			echo $a_afficher > $chaine_en_cours
			afficher 5500 $detail
		;;
		*)
			# Si on a appuye sur des chiffres
                		echo $1 >> $appui_touche
                		a_afficher=$(tr -d '[:space:]' < $appui_touche)
                		afficher 500 $a_afficher
		;;
	esac
else
	exit 0
fi
exit 0

VIII.enregistrement.sh
Script permettant d'enregistrer la chaine en cours de visionnage

########################################################################################################################
# script        : enregistrement.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Script enregistrant la chaine en cours (vlc_multiposte doit tourner au moins au debut)
########################################################################################################################

# On source le fichier de variables
. $(dirname $0)/variables.sh
# Si vlc_multiposte tourne ou s'il y a un enregistrement en cours
if [[ -f $pidfile_vlc_multi || -f $pidfile_vlc_rec ]]; then
	# Si un enregistrement est en cours, on le kill
	if [ -f $pidfile_vlc_rec ]; then
        	for i in `cat $pidfile_vlc_rec`
        	do
                	kill -9 $i
        	done
        	# On efface le fichier pid vlc_rec
        	rm -f $pidfile_vlc_rec
	else
		# Sinon, on enregistre le flux rtsp de la chaine en cours
		flux_rtsp=`awk -F"#" '{print($4)}}' $chaine_en_cours`
		name_rec="$rec_dir/`echo $(date +%d.%m.%Y-%H:%M)`-`awk -F"#" '{print($3)}}' $chaine_en_cours`"
		vlc $flux_rtsp --vout-filter deinterlace:bob --sout "#std{access=file,mux=ts,url=$name_rec.mpg}" -I dummy &
		# On sauve le pid de l'enregistrement
		savepid=$!
		echo $savepid>>$pidfile_vlc_rec
	fi
fi
exit 0

Voila, ces scripts fonctionnent sous Edgy (et sur tout système linux je pense smile), ca marche bien (sûrement des ptits bugs) et ca me facilite grandement la vie.
J'attends biensûre vos remarques et vos améliorations !!
smile

Jay


O bé nan chui sotte c'est du souedois...

Hors ligne

#2 Le 11/06/2007, à 21:52

jaywax

Re : [How To] Multiposte free, lirc & playlist personnalisée

Une petite Maj s'impose.... big_smile

III.variables.sh
Désolé, j'apprends à faire des fonctions correctement smile

#!/bin/sh

########################################################################################################################
# script        : variables.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Script source qui set toutes les variables utilisees
########################################################################################################################

# Variables
# Le rep de base pour les scripts
bin_dir="/home/tvuser/scripts/lircrc"
# Le rep des fichiers variables
fic_dir="$bin_dir/fichiers"
# Le rep des pids
pid_dir="$bin_dir/pids"
# L'adresse de la playlist commune
a_recuperer="http://mafreebox.freebox.fr/freeboxtv/playlist.m3u"
# Des fichiers tempo
tempo="$fic_dir/tempo"
tempo2="$fic_dir/tempo2"
# Le fichier de description de la playlist totale (n° de chaine#titre de la chaine#flux rtsp correspondant)
video="$fic_dir/video_totale"
# La playlist
playlist="$fic_dir/playlist_totale.m3u"
# Fichier temporaire pour les choix de chaines
choix="$fic_dir/choix"
# La playlist correspondants a nos choix
playlist_ok="$fic_dir/playlist.m3u"
# Le fichier de description de la playlist choisie (n° dans la playlist#n° de chaine#titre de la chaine#flux rtsp correspondant)
video_ok="$fic_dir/video"
# Le fichier correspondant aux touches appuyees
appui_touche="$fic_dir/appui_touche"
# Le fichier dans lequel on note la chaine en cours
chaine_en_cours="$fic_dir/chaine_en_cours"
# Le port d'ecoute pour l'interface rc de vlc
vlc_tcp="5656"
# Les fichiers pid
pidfile_vlc_multi="$pid_dir/vlc_multi.pid"
pidfile_vlc_rec="$pid_dir/vlc_rec.pid"
# Le repertoire d'enregistrement du flux
rec_dir="/home/tvuser/mov/enregistrements_freebox"

# Fonction d'affichage via gnome osd avec comme param :
# $1 : Le temps d'affichage
# $2 : Les texte a afficher
afficher()
 {
        gnome-osd-client -f "<message id='lirc' osd_fake_translucent_bg='off' osd_vposition='top' \
          animations='off' hide_timeout='$1' osd_halignment='right'>"$2"</message>"
          }

VI.vlc.sh
Bon là c'est les espaces qui posaient problème...

#!/bin/sh

########################################################################################################################
# script        : changement_chaine.sh
# date          : 01/06/2007
# auteur        : jaywax@free.fr
# but           : Script appelle par irexec/lirc lors d'un appui sur l'une des touches de navigation
########################################################################################################################
# On source le fichier de variables
. $(dirname $0)/variables.sh
# Si vlc_multiposte tourne effectivement
if [ -f $pidfile_vlc_multi ]; then
        # Selon l'action choisie
        case "$1" in
                clear)
                        # Si on efface le choix de la chaine effectue jusqu'a maintenant
                        > $appui_touche
                ;;
                enter)
                        # Si on a valide une chaine
                        a_afficher=$(tr -d '[:space:]' < $appui_touche)
                        # On recherche la position dans la playlist associee
                        num_playlist=`awk -F"#" '{if($2=="'$a_afficher'"){print($1)}}' $video_ok`
                        # Si la position dans la playlist est nulle (si aucune chaine n'a ete trouvee)
                        if [ -z $num_playlist ]; then
                                IFS="
"
                                jaffiche="Canal $a_afficher : Pas de service"
                                afficher 1000 $jaffiche
                        else
                                # On renseigne la chaine en cours dans le bon fichier
                                echo `awk -F"#" '{if($2=="'$a_afficher'"){print($0)}}' $video_ok` > $chaine_en_cours
                                detail=`awk -F"#" '{print($3)}' $chaine_en_cours`
                                # On indique a vlc sur son interface d'ecoute (rc) d'aller jusqu'a l'element de la playlist indique
                                echo "goto $num_playlist" | netcat localhost $vlc_tcp -q 1
                                afficher 5500 $detail
                        fi
                        > $appui_touche

                ;;
                next|prev)
                        num_playlist_en_cours=`awk -F"#" '{print($1)}' $chaine_en_cours`
                        case "$1" in
                                next)
                                        num_playlist_futur=$(($num_playlist_en_cours+1))
                                ;;
                                prev)
                                        num_playlist_futur=$(($num_playlist_en_cours-1))
                                ;;
                        esac
                        echo "goto $num_playlist_futur" | netcat localhost $vlc_tcp -q 1
                        detail=`awk -F"#" '{if($1=="'$num_playlist_futur'"){print($3)}}' $video_ok`
                        a_afficher=`awk -F"#" '{if($1=="'$num_playlist_futur'"){print($0)}}' $video_ok`
                        echo $a_afficher > $chaine_en_cours
                        afficher 5500 $detail
                ;;
                *)
                        # Si on a appuye sur des chiffres
                                echo $1 >> $appui_touche
                                a_afficher=$(tr -d '[:space:]' < $appui_touche)
                                afficher 500 $a_afficher
                ;;
        esac
else
        exit 0
fi
exit 0

O bé nan chui sotte c'est du souedois...

Hors ligne

#3 Le 12/06/2007, à 18:02

antistress

Re : [How To] Multiposte free, lirc & playlist personnalisée

ce qui m'intéresserai ça serait un moyen simple d'enregistrer, sans avoir à se retaper toutes les options à chaque fois

c'est possible ?

Hors ligne

#4 Le 12/06/2007, à 18:49

jaywax

Re : [How To] Multiposte free, lirc & playlist personnalisée

Biensûre, on peut imaginer le script suivant :

#!/bin/sh

vlc $1 --vout-filter deinterlace:bob --sout "#std{access=file,mux=ts,url=$2}" -I dummy

Et tu l'appelles comme ceci
./ton_script.sh rtsp://la_chaine_que_tu_veux_enregister /le/nom/de/ton/fichier.mpg
Cntrl+C pour arrêter ton registrement.


O bé nan chui sotte c'est du souedois...

Hors ligne

#5 Le 12/06/2007, à 22:51

antistress

Re : [How To] Multiposte free, lirc & playlist personnalisée

merci, mais peux tu décrire à quoi correspondent ces options ?
retrouve t-on celles-ci ?

Hors ligne

#6 Le 13/06/2007, à 12:23

jaywax

Re : [How To] Multiposte free, lirc & playlist personnalisée

Pour les options propres à l'enregistrement, je te renvoi à cette url http://wiki.videolan.org/Documentation: … deo_filter.
Je pense cependant que ca doit être assez similaire. De toute facon tu n'as qu'à essayer et voir si le rendu te plait...
Le "-I dummy", c'est pour spécifier à vlc de ne pas lancer d'interface spécifique (un sorte de mode silencieux).


O bé nan chui sotte c'est du souedois...

Hors ligne

#7 Le 13/06/2007, à 14:50

antistress

Re : [How To] Multiposte free, lirc & playlist personnalisée

cool, je vais regarder ça merci bien

Hors ligne

#8 Le 26/06/2007, à 17:02

jaywax

Re : [How To] Multiposte free, lirc & playlist personnalisée

Salut,

Je mettrais à jour ce wiki d'orénavent...

http://jaywax.free.fr/?p=3

A ++

Dernière modification par jaywax (Le 29/02/2008, à 10:16)


O bé nan chui sotte c'est du souedois...

Hors ligne