Vous n'êtes pas identifié(e).

#1 2011-02-04 22:51:04

wlourf
wlourfeur
Inscription : 2010-09-11
Messages : 1 018

Chaines de la freebox dans un pipe-menu

Hello, je me permets d'extraire ce script du topic des pipe-menus comme ça je posterai les mises à jour directement ici lorsque le script évoluera !

Il s'agit donc d'un "gros" script python pour afficher les chaines TV et/ou radio du multiposte de free dans un pipe-menu wink

Une capture de la version 1 :
42cc5f77141e01f4c6106e6824f8dtt.jpg
1er menu = menu radio non filtré
2ème menu = menu radio filtré sur FIP, France, Mouv, Nova avec exlusion de Bleu, Vivace (donc ça n'affiche pas France Bleu et France Vivace)
3ème menu = menu TV filtré sur HD

Une capture de la version 1.1 : les chaines peuvent maintenant être regroupées par leur lettre initiale :
f-capture4d4c649c0008bf75.png


le script ob-freebox.py :

#! /usr/bin/env python
# -*- coding: utf-8 -*-

#ob-freebox.py par wlourf 04/02/2011 v1.2
#génère un pipe-menu openbox pour le multiposte de la freebox
#
#06/01/2011 : v1.0
#04/02/2011 : v1.1 ajout de l'option -g pour regourper les chaines
#24/07/2011 : v1.2 correction bug nom avec &
#                  correction mauvaise sélection pistes audio des radios

from urllib2 import urlopen
from optparse import OptionParser, OptionGroup
from urlparse import urlparse
import os


def get_playlist(pl):
    try:
        f = urlopen(pl)
    except:
        print ("Erreur à l'ouverture de la playlist " + playlist)
        return False
    return f

def init_group(f, first_letter,Groupe):
    if first_letter.isdigit():
        first_letter="0-1" 
    if first_letter != Groupe:
        if Groupe != "":
            if f==None:
                print ("</menu>\n")
            else:                
                f.write("</menu>\n")
        Groupe = first_letter                                    
        str_menu = "\n<menu id=\"freebox-"+Groupe+"\" label=\"_" + Groupe + "\">\n" 
        if f==None:
            print (str_menu)
        else:
            f.write(str_menu)
    return Groupe  
    
def write_chaine(media,f,x):
    str1="\t<item label=\"" + x[1].replace("HD HD","HD").replace("&","&amp;") + "\">\n"
    str2="\t\t<action name=\"Execute\">\n"
    if media=="rad":
        str3="\t\t<execute>"+options.player+" "+options.player_arg+" '"+x[2].replace("&","&amp;")+"' --audio-track="+str(x[3])+"</execute>\n"
    else:
        str3="\t\t<execute>"+options.player+" "+options.player_arg+" "+x[2].replace("&","&amp;")+"</execute>    \n"
    str4="\t\t</action>\n"
    str5="\t</item>\n"
    if f==None:
        print str1+str2+str3+str4+str5
    else:
        f.write(str1+str2+str3+str4+str5)
    
def write_ob_menu(m,s):
    if s=="b": #begin
        m.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
        m.write("<openbox_menu xmlns=\"http://openbox.org/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://openbox.org/                 file:///usr/share/openbox/menu.xsd\">\n")
        m.write("<menu id=\"root-menu\" label=\"Openbox 3\">\n")
    if s=="e": #end
        m.write("</menu>\n</openbox_menu>")
            
def parse_playlist_radios(pl):
    tabChaines=[]
    for line in pl:
        if line[:8] == "#EXTINF:" :
            line1=pl.readline()
            if line1[:4]!="rtsp": #necessaire quand passage liste tv à liste radio
                line2=pl.readline()
                line3=pl.readline()
                if line3[:25]=="#EXTVLCOPT:audio-track-id":
                    flux=line3[26:-1]
                    sep=line.find(" - ")
                    chaine=line[sep+3:-1]
                    url=pl.readline()[:-1]
                    tabChaines.append([chaine.lower(),chaine,url,  int(flux)-1001])
                
    if options.filter :
        tabChaines=filtrer_chaines(tabChaines)

    if options.sortalpha or options.group:
        tabChaines.sort()
        
    Groupe=""
    if options.menu:
        f=open(menu_radio,"w")
        write_ob_menu(f,"b")
        for x in tabChaines:
            if options.group:
                Groupe = init_group (f,x[0][:1].upper(),Groupe)
            write_chaine("rad",f,x)
        if options.group:
            f.write("</menu>\n")
        write_ob_menu(f,"e")
        f.close()
    else:
        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        print "<openbox_pipe_menu>"
        for x in tabChaines:
            if options.group:
                Groupe = init_group (None,x[0][:1].upper(),Groupe)
            write_chaine("rad",None,x)
        if options.group:
            print("</menu>\n")            
        print "</openbox_pipe_menu>"    

def parse_playlist_tv(pl):
    tabChaines=[]
    for line in pl:
        if line[:8] == "#EXTINF:" :
            line1=pl.readline()
            fmt=line1[-3:-1]
            if line1[:4]=="rtsp" and (fmt==ld or fmt==sd or fmt==hd):
                sep=line.find(" - ")
                chaine=line[sep+3:-1]
                url=line1[:-1]
                tabChaines.append([chaine.lower(),chaine,url])

    if options.filter:
        tabChaines=filtrer_chaines(tabChaines)

    if options.sortalpha or options.group:
        tabChaines.sort()
        
    Groupe=""
    if options.menu:
        f=open(menu_tv,"w")
        write_ob_menu(f,"b")
        for x in tabChaines:
            if options.group:
                Groupe = init_group (f,x[0][:1].upper(),Groupe)        
            write_chaine("rad",f,x)
        if options.group:
            f.write("</menu>\n")             
        write_ob_menu(f,"e")
        f.close()
        
    else:
        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        print "<openbox_pipe_menu>"
        for x in tabChaines:
            if options.group:
                Groupe = init_group (None,x[0][:1].upper(),Groupe)        
            write_chaine("tv",None,x)
        if options.group:
            print("</menu>\n")             
        print "</openbox_pipe_menu>"
    

def filtrer_chaines(tabChaines):
    if options.radios:
        filter_file='radio.txt'
    else:
        filter_file='tv.txt'
        
    filter_path=os.path.join(path_init,filter_file)
    tabChaines2=[]
    if os.path.isfile(filter_path):
        ff = open(filter_path)
        for linef in ff:
             for x in range(len(tabChaines),0,-1):
                if len(linef)>1 and tabChaines[x-1][0].find(linef[:-1].lower())>-1:
                    tabChaines2.append(tabChaines[x-1])
        ff.seek(0)       
        for linef in ff:
            if linef[0]=="-":
                 for x in range(len(tabChaines2),0,-1):
                    if tabChaines2[x-1][0].find(linef[1:-1].lower())>-1:
                        tabChaines2.pop(x-1)
        tabChaines2                        
        ff.close()

    return tabChaines2
        
        
if __name__ == "__main__":
    parser = OptionParser(usage=u"génère un pipe-menu openbox pour les chaines du multiposte freebox")
    defGroup = OptionGroup(parser, "TV : choix du/des formats(s), choisir au moins un mode")
    playerGroup = OptionGroup(parser, "Choix du lecteur")

    defGroup.add_option("--ld",
                  action="store_true", dest="ld", default=False,
                  help=u"Affichage des chaînes bas débit (low-definition)")
    defGroup.add_option("--sd",
                  action="store_true", dest="sd", default=False,
                  help=u"Affichage des chaînes standard (standard definition)")
    defGroup.add_option("--hd",
                  action="store_true", dest="hd", default=False,
                  help=u"Affichage des chaînes HD (high definition)")

    playerGroup.add_option("-l", "--lecteur", dest="player",
                  help=u"Nom du lecteur (vlc par défaut)", metavar="LECTEUR")
    playerGroup.add_option("--params", dest="player_arg",
                  help=u"Paramètres à envoyer au lecteur",  metavar="PARAMETRES" )

    parser.add_option("-g","--groupe",
                  action="store_true", dest="group", default=False,
                  help=u"Groupe les chaines par lettre initiale (défaut=faux)")
                  
    parser.add_option("-t","--tri",
                  action="store_true", dest="sortalpha", default=False,
                  help=u"Active le tri alphabétique des chaînes (défaut=faux)\n" \
                    u"Activé automatiquement avec l'option -g")

    parser.add_option("-r","--radio",
                  action="store_true", dest="radios", default=False,
                  help=u"Affichage des radios à la place des tv")

                  
    parser.add_option("-f","--filter",
                  action="store_true", dest="filter",
                  help=u"Exclure/inclure les chaines du fichier $HOME/.freebox/tv.txt" \
                    + " ou $HOME/.freebox/radio.txt", metavar="FICHIER")

    parser.add_option("-m","--menu",
                  action="store_true", dest="menu",
                  help=u"Génère un menu openbox complet au lieu du pipe menu :" \
                    + " $HOME/.freebox/menu-tv.xml ou " \
                    + " $HOME/.freebox/menu-radio.xml ")
                  
    parser.add_option_group(defGroup)
    parser.add_option_group(playerGroup)
    
    (options, args) = parser.parse_args()
    
    playlist_url  = "http://mafreebox.freebox.fr/freeboxtv/playlist.m3u"
    playlist_file = get_playlist(playlist_url)
    path_init=os.path.join(os.environ['HOME'],".freebox")
    
    if options.menu and not os.path.exists(path_init):
        os.mkdir (path_init)
        
    if options.menu:
        menu_tv=os.path.join(path_init, "menu-tv.xml")
        menu_radio=os.path.join(path_init, "menu-radio.xml")
        
    if options.player==None:
        options.player = "vlc"
        
    if options.player_arg==None:
        options.player_arg = ""

    ld,sd,hd="","",""
    if options.radios :
        parse_playlist_radios(playlist_file)
        exit()

    if (not options.ld and not options.sd and not options.hd) :
        print "Choisissez au moins un des modes ld, sd ou hd... essayez l'option -h"
        exit()

    if options.ld:
        ld="ld"
    if options.sd:
        sd="sd"
    if options.hd:
        hd="hd"
    
    parse_playlist_tv(playlist_file)

(dans les commandes ci-dessous, j'ai placé le script dans /usr/bin après l'avoir rendu exécutable mais ça fonctionne aussi avec python /chemin ...)

les paramètres disponibles (pour le player, je n'ai fait des essais qu'avec vlc) :

 $ ob-freebox.py -h
Usage: génère un pipe-menu openbox pour les chaines du multiposte freebox

Options:
  -h, --help            show this help message and exit
  -g, --groupe          Groupe les chaines par lettre initiale (défaut=faux)
  -t, --tri             Active le tri alphabétique des chaînes (défaut=faux)
                        Activé automatiquement avec l'option -g
  -r, --radio           Affichage des radios à la place des tv
  -f, --filter          Exclure/inclure les chaines du fichier
                        $HOME/.freebox/tv.txt ou $HOME/.freebox/radio.txt
  -m, --menu            Génère un menu openbox complet au lieu du pipe menu :
                        $HOME/.freebox/menu-tv.xml ou  $HOME/.freebox/menu-
                        radio.xml

  TV : choix du/des formats(s), choisir au moins un mode:
    --ld                Affichage des chaînes bas débit (low-definition)
    --sd                Affichage des chaînes standard (standard definition)
    --hd                Affichage des chaînes HD (high definition)

  Choix du lecteur:
    -l LECTEUR, --lecteur=LECTEUR
                        Nom du lecteur (vlc par défaut)
    --params=PARAMETRES
                        Paramètres à envoyer au lecteur

Exemples de commandes :
radio avec filtre

ob-freebox.py -r -t --filter --params=--no-video

tv en mode SD avec filtre et regroupement par Initiale

ob-freebox.py --sd --filter -t -g


format du filtre, comme pour l'exemple 2 ci-dessus (fichier $HOME/.freebox/radio.txt):

fip
mouv
nova
france
-vivace
-bleu

Personnelement, je lance le script au lancement d'openbox pour stocker le menu dans un fichier puis j'affiche ce fichier avec le pipe-menu, c'est plus rapide :

autostart.sh :

ob-freebox.py --sd -f -t -g > ~/.cache/freebox/freebox_tv.xml &
ob-freebox.py -r -f -t -g > ~/.cache/freebox/freebox_radio.xml &

menu.xml

<menu id="freebox_tv" label="T_V"    execute="cat ~/.cache/freebox/freebox_tv.xml" />
<menu id="freebox_ra" label="R_adio" execute="cat ~/.cache/freebox/freebox_radio.xml" />

Et voilà tongue Si ce n'est pas clair (ce qui est fort possible) , n'hésitez pas à demander !

Hors ligne

#2 2011-02-09 16:49:54

Artemis
Classified
Lieu : Bordeaux
Inscription : 2010-10-25
Messages : 351

Re : Chaines de la freebox dans un pipe-menu

Bonjour Wlourf,

je viens de rentrer ton script, seulement les fichiers xml du .freebox restent vides (après exécution de ob-freebox bien sûr).
Si t'as une idée..
Merci

Art.


Jabber : leonartemis@jabber.fr

Hors ligne

#3 2011-02-09 18:56:10

wlourf
wlourfeur
Inscription : 2010-09-11
Messages : 1 018

Re : Chaines de la freebox dans un pipe-menu

pas de soucis, lance dans un terminal la commande utilisée et le retour (tu as peut-être oublié de le rendre executable par exemple : chmod +x)

Hors ligne

#4 2011-02-09 19:37:32

Artemis
Classified
Lieu : Bordeaux
Inscription : 2010-10-25
Messages : 351

Re : Chaines de la freebox dans un pipe-menu

[fred@yoda bin]$ ob-freebox.py --sd -f -t -g
<?xml version="1.0" encoding="UTF-8"?>
<openbox_pipe_menu>
</menu>

</openbox_pipe_menu>

Je pense que tu voulais ça

Dernière modification par Artemis (2011-02-09 19:38:14)


Jabber : leonartemis@jabber.fr

Hors ligne

#5 2011-02-09 20:07:41

wlourf
wlourfeur
Inscription : 2010-09-11
Messages : 1 018

Re : Chaines de la freebox dans un pipe-menu

essaye juste ça, sans le filtre :

$ ob-freebox.py --sd -t -g

Le fichier du filtre se trouve dans ~/.freebox/tv.txt, le créer si besoin,
Par exemple, pour n'avoir que les chaînes contenant France mais pas France 24, le fichier tv.txt ressemblera à celui-ci

France
-24

C'est sûr, qu'en cas d'absence de filtre tout devrait s'afficher, je reverrai ce point !

Hors ligne

#6 2011-02-10 15:51:08

Artemis
Classified
Lieu : Bordeaux
Inscription : 2010-10-25
Messages : 351

Re : Chaines de la freebox dans un pipe-menu

En effet je n'avais pas créé de fichier de filtre, tout roule désormais.

Merci !


Jabber : leonartemis@jabber.fr

Hors ligne

#7 2011-02-10 16:12:58

Fenouille84
#! Lover
Inscription : 2011-02-05
Messages : 332

Re : Chaines de la freebox dans un pipe-menu

Aaah super wlourf !!
J'ai hâte de rentrer chez moi ce weekend pour essayer ce script !! smile


Conky est ton ami ^^ : Ma galerie
Ma page Deviant Art : conky inside wink

-- Dropbox (online backup) : 2Go + 250 Mo pour vous et moi par parrainage --

Hors ligne

#8 2011-07-24 18:47:59

wlourf
wlourfeur
Inscription : 2010-09-11
Messages : 1 018

Re : Chaines de la freebox dans un pipe-menu

petit up suite à mise à jour (version 1.2)

Hors ligne

#9 2011-07-25 10:45:24

Meier Link
aka Lucian von Ruthven
Inscription : 2011-02-18
Messages : 1 839
Site Web

Re : Chaines de la freebox dans un pipe-menu

Yees ! Merci Wlourf smile
Je test ça ce soir en rentrant chez moi tongue


Serveur : Livarp 0.4.0
PC fixe : CrunchBang BPO 10 OpenBox
PC portable : CrunchBang 11 OpenBox
PC boulot : Crunchbang 10 OpenBox

Hors ligne

Pied de page des forums