#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 ), 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 !!
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....
III.variables.sh
Désolé, j'apprends à faire des fonctions correctement
#!/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 ?
Blogue : Libre et ouvert
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 ?
Blogue : Libre et ouvert
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
Blogue : Libre et ouvert
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...
A ++
Dernière modification par jaywax (Le 29/02/2008, à 10:16)
O bé nan chui sotte c'est du souedois...
Hors ligne