feedBox (doc "ultra
béta" par manatlan)
Serveur de contenu pour freebox. C'est un programme, qui une fois
lancée sur un ordinateur permet de fournir du contenu
(html/audio/video/images) à une freebox, à
travers l'interface freeplayer
de cette dernière.
FeedBox est modulaire, et il est simple de lui ajouter des plugins,
pour peu qu'on s'y connaisse en python, sinon c'est par là .
Techniquement :
Programmé en python, et sous licence GPL V2. Il devrait
fonctionner sur toutes les plateformes compatible python. C'est un serveur http, qui
permet d'envoyer des page "HTML 3.2 spéciales" à la freebox et de
piloter le serveur de contenu audio/video qu'est VLC. Ce
dernier devant être installé sur le poste.
Développer un plugin
Un plugin est un répertoire contenant le code et le contenu. Il
doit être placé dans le répertoire "plugins/" de
feedbox.
Le code minimaliste du plugin pourrait être celui-ci :
Dans un répertoire "plugins/test", un fichier "__init__.py" qui
contient le code :
__title__="Test"
__order__=10000
class main:
def
index(self):
return "hello world"
remarque
- le nom du fichier python principal du plugin (__init__.py) peut
sembler barbare, mais c'est juste histoire de respecter des conventions
python.
- le "nom technique" du plugin est le nom du répertoire
contenant le plugin.
- __title__ et __order__ sont des attributs du module qui
définissent, respectivement, le nom du module et son ordre
d'apparition dans le menu principale de feedBox (le
plugin spéciale "home")
- la class définissant le core du plugin doit se nommer
"main".
- la méthode "index" correspond à la page web
"http://127.0.0.1/<nom du repertoire du plugin>/index", page
appelé par le menu de la feedBox quand on selectionne le plugin
en question.
- Cette page/méthode affichera simplement "hello world" sur
la freebox.
- si on ne veut pas exposer une méthode dans feedBox, il
suffit de la préfixer par "__" (convention python), en la
rendant privée à la classe.
- un constructeur de classe peut être mis dans la
classe(__init__), il est appelé dès le lancement de la
feedBox.
Noter également que cette page "index" peut être
appelé n'importe comment, à partir du moment où
son nom est de la forme "index.*". Ainsi, les urls suivantes appelles
la même page :
http://127.0.0.1/<nom du repertoire du plugin>/index
http://127.0.0.1/<nom du repertoire du plugin>/index.html
http://127.0.0.1/<nom du repertoire du plugin>/index.gif
http://127.0.0.1/<nom du repertoire du plugin>/index.toto
Améliorons notre plugin, rajoutons des pages/méthodes :
__title__="Test"
__order__=10000
class main:
def
index(self):
return """
<a href="aff?val=1">aff
1</a> <br>
<a href="aff?val=2">aff
2</a> <br>
<a href="aff">aff rien
</a>
"""
def aff(self,val=""):
return "Affiche "+val
Nous avons rajouté une page/méthode "aff" qui peut
recevoir un paramètre nommé "val" ou non . Il est
donc très simple d'ajouter des pages aisément.
feedBox vient avec un ensemble de libraries prête à
l'emploi, ne demandant que d'être utilisé. Vous les
trouverez dans le répertoire "common/".
Ainsi, un moteur de template est également disponible
(basé sur cheerytemplate).
Ce dernier sert principalement à séparer le code
fonctionnel du rendu de présentation, afin de ne pas
mélanger code python et code html.
Voici un exemple d'utilisation :
from common.template import
Template
__title__="Test"
__order__=10000
class main:
def
index(self):
msg = "hello world"
t_title = "Affichage d'un texte"
t_back = "/index"
return Template()
Remarque:
- notez la présence de l'inclusion de la ligne from/import
pour importer le moteur de template
- la méthode ne renvoi plus directement du code html, mais
"Template()". Ce dernier va alors vérifier qu'il existe une page
"index.html" dans le repertoire "templates/" du plugin. Il va prendre
ce template (page html), et substitué les commandes de
templating en utilisant les variables appartenant à la
méthode appelante. (dans ce cas précis : msg, t_title et
t_back)
- si pour des besoins spécifiques on ne veut pas utiliser un
template "index.html" dans une methode "index", il est possible de
spécifier un nom de fichier différent dans Template (ex :
Template("autre.html"), "autre.html", devant se trouver dans le
répertoire "template/" du plugin)
la page de template (index.html) devrait ressembler à ceci :
<py-eval="BF_HEADER">
Salut le monde ou en anglais :
<py-eval="msg">
<py-eval="BF_FOOTER">
Remarque :
- <py-eval="msg"> sera remplacé par le contenu de
"msg" défini dans l'index.
- les py-eval BF_HEADER et BF_FOOTER permettent au framework de
mettre un header et un footer, pour encadrer le contenu de la page, et
lui donner une allure au sein de feedBox. (ces 2 là, sont
également des templates que vous pouvez consulter dans
"/common/templates")
- t_title est utilisé dans le header pour définir le
nom de la page à afficher dans feedBox (cf header.html)
- t_back est l'url vers laquelle vous voulez revenir en appuyant
sur le bouton "rouge" (cf footer.html), si ce dernier est renseigner,
un affichage explicatif apparait en haut à droite sur la page en
question.
- il existe encore t_head, pour l'instant, qui permet de
définir des "headers" entre les balises <head> de la page
feedBox, pour des besoins spécifiques (cf plugin media, page
empty/index)
Le plugin
spécial "home"
Ce dernier est un plugin presque comme les autres, et doit être
présent pour le bon fonctionnement de la feedBox. C'est lui qui
affiche la liste des autres plugins. et est appelable à tout
moment (dans les pages feedBox) en pressant la touche "home" de la
telecommande de la freebox.
Les seuls différences avec les autres :
- il a un attribut d'instance "liste" qui est renseigné par
le framework au démarrage. Il contient une liste de tuple
(nom,url), qui sert à générer le menu (cf
plugins/home/templates/index.html)
- il réponds directement à la racine du host (aux
urls suivantes : http://127.0.0.1/, http://127.0.0.1/index, http://127.0.0.1/index.toto,
...)
Renvoyer un flux
il est également possible de renvoyer un flux http à la
demande, en utilisant les generateur de python (commande yield).
Ci-dessous un exemple :
__title__="Test"
__order__=10000
class main:
def
index(self):
yield "text/html"
yield "hello"
yield " "
yield "world"
Remarque :
- le premier yield doit
renvoyé le content-type du flux. Ici, il indique qu'il va
renvoyer de l'html.
- les autres appel de yield renvoi le contenu au fur et à
mesure
- avec cette technique, il est très simple de renvoyer du
flux gif (image/gif), et ainsi de construire des images à la
volées. D'autant plus que cette page peut être
appelé comme "index.gif". (on peut même passer des
paramètres)
Les fichiers statics
- les fichiers statics commun ou necessaire au framework feedbox se
trouvent dans /common/static. Ils sont appelables directement à
la racine du site. (ex: http://127.0.0.1/settings.html)
- Mais un plugin peut aussi utiliser des "fichiers statics", ces
derniers doivent être contenu dans sa sous-arborescence (cf
plugin meteo). Ils sont appelables directement à la racine du
plugin (ex: http://127.0.0.1/<nom du repertoire du
plugin>/image.gif)