Utilisateur:VincentAlex

Un article de neufbox 4.

Sommaire

Serveur de contenu multimédia pour le mediacenter

Avant propos

Je tiens à préciser que :

  • d'une part, aucun support ne peut être effectué par N9uf Cégétel sur tout dysfonctionnement du Mediacenter avec le serveur de contenu multimédia de la NB4 proposé ci dessous,
  • d'autre part, la mise en oeuvre du serveur de contenu multimédia de la NB4 est destiné à des personnes ayant de fortes connaissances en programmation, technologies web et sur Linux et savant avant tout ce qu'elles font.

Fonctionnement du Mediacenter

Le logiciel mediacenter lancé sur le PC est en fait un serveur web (Apache dans le version fournie par N9uf) avec des pages PHP, configuré sur le port 26180 de manière à répondre à des requettes http du décodeur NeufTV HD.

Sur réception de ces requettes, le serveur web va répondre soit par des fichiers xml ou soit par les médias eux mêmes.


Au démarrage, le décodeur envoit deux requettes. L'une retourne une page html de status, l'autre (?cmd=toplist) un fichier xml contenant la liste des partages disponible. Ces deux requettes semblent être utlisées par le décodeur N9ufTV pour détecter la présence d'un ordinateur.

Le décodeur N9ufTV attend une réponse de type html :

<html xmlns='http://www.w3.org/1999/xhtml'>
  <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     <meta hostname="NeufBox" />
     <meta os="linux" />
     <meta version="1.00" />
     <meta interface="http://172.16.255.254:26180/interface/prototype" name="prototype" />
     <Title>MediaCenter - Neuf TV HD</title>
  </head>
  <body>
  </body>
</html>

Visiblement, le décodeur est attentif aux meta-données suivantes : hostname, os, version et interface. Le body de la page html peut rester vide.


Le décodeur N9ufTV attend une réponse de type xml :

<?xml version="1.0" encoding="utf-8"?>
<browse>
    <childDevices>
    </childDevices>
    <folders>
        <folder>
            <name>usb</name> 
            <path>1</path> 
        </folder>
    </folders>
</browse>

Ici, un seul partage est disponible.


Ensuite, pour parcourir l'arborescence de chaque partage, le décodeur envoit des requettes (?cmd=browse&...) pour obtenir la liste des médias présent ainsi que les sous-dossiers.


Le décodeur N9ufTV attend une réponse de type xmlt :

<?xml version="1.0" encoding="utf-8" ?>
<browse>
    <parentPath>.</parentPath> 
    <folders>
    </folders>
    <medias>
	<media type="1" >
	    <name>24H SAISON1 01</name>
	    <url type="http">http://127.0.0.1:26180/__mp9ctl_share_2/24H_SAISON1_01.avi</url>
	</media>
    </medias>
</browse>

Un média de type 1 (video) est partageable.


La lecture d'un média se fait par un simple téléchargement du média vers le décodeur N9ufTV HD.

Développements

Constat

Le soft mediacenter, fourni par N9uf utilise Apache et PHP. Or il n'y a ni l'un ni l'autre dans le NB4. Plusieurs possibilités se présentent :

  • installation d'Apache et PHP dans la NB4,
  • installation de PHP et utilisation du serveur web de la NB4 (lighttpd),
  • utilisation du serveur web de la NB4 (lighttpd) et création d'un fastcgi remplaçant les scripts PHP.

Choix

Etant donné que je doute de la puissance de la NB4, qui ne permet certainement pas le fonctionnement d'Apache et/ou PHP, la dernière solution est envisagée. Et ce sera certainement la plus light pour la NB4. C'est à dire lancer une nouvelle instance de lighttpd pour le médiacenter et créer un fastcgi remplaçant les scripts PHP.

Configuration de lighttpd

La configuration d'une nouvelle instance de lighttpd n'est pas compliqué. Le point de partage sera fixe et correspondra à /var/mnt le point de montage des périphériques (clef disque dur externes USB) montés sur les ports USB. Pour plus d'information sur lighhtpd, se reporter au site : http://www.lighttpd.net/ Fichier de configuration lighttpd.conf :

server.document-root = "/mp9/www/"
server.errorlog      = "/var/log/mp9lhd.log"
server.pid-file      = "/var/run/mp9lhd.pid"

server.port = 26180

mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain",
".jpg" => "image/jpeg",
".png" => "image/png",
)

index-file.names = ( "index.php" )

server.modules =(
"mod_fastcgi",
"mod_alias"
)

## PHP support
fastcgi.server = ( ".php" => ((
        "bin-path"      => "/mp9/fcgi/mp9fcgi",
        "host" => "127.0.0.1", 
        "port"  => 82,
        "min-procs" => 1,     
        "max-procs" => 2,
        "check-local" => "disable",
        "idle-timeout" => 20
)))

alias.url = ( "/__mp9ctl_share_1/" => "/var/mnt/" )

Il faut aussi ajouter la librairie mod_alias.so dans le rootfs de la NB4, répertoire /lib . Attention, il faut installer le mod_alias.so correspondant à la version 1.4.16 de lighttpd (ce n'est pas la dernière en date).

Création du fastcgi

La programmation d'un fastcgi est extrêmement simple. Pour plus d'information sur fastcgi, se reporter au site : http://www.fastcgi.com/. Le fastcgi que j'ai créé s'appelle mp9fcgi.

Le source mp9fcgi.c est disponible dans le dépot svn répertoire addon/mp9fcgi.

Modif NB4

  • Ouvrir le port 26180 sur br1 à l'aide iptables :
iptables -A ACLS_FILTER -p tcp -i br1 -s 172.16.255.253  --dport 26180 -j ACCEPT -m state --stat NEW
  • lancer le serveur de contenu par la commande
/sbin/lighttpd -f /mp9/lighttpd.conf


Pour que ce soit automatique,

  • il faut rajouter dans /etc/init.d/rc.firewall la règle supplémentaire iptables ci dessus,
  • rajouter le démarrage du serveur de contenu dans /etc/init.d/rcS

Installation

Actuellement, l'installation du serveur de contenu multimédia est assez contraignante...

Prérequis

  • Savoir flasher un nouveau firmware. C'est-à-dire que l'ensemble des étapes décrite sur [cette page] du wiki sont maitrisées.
  • Avoir mis en place et maîtriser la chaîne de compilation croisée. C'est détaillé sur [ce post] dans le forum.

Compilation

  • lighttpd : Il faut ajouter dans le rootfs la librairie mod_alias.so. Télécharger lighttpd version 1.4.16 et le recompiler
  • fastcgi : Télécharger fastcgi et le recompiler. Il faut placer les .h et lib de manière à ce qu'ils soient accessibles ensuite par la chaine de compilation croisée pour compiler mp9fcgi,
  • mp9gfci : Télécharger du dépot mp9fcgi.c et le Makefile et lancer la compilation (make). Normalement vous avez un binaire nommé mp9fcgi.

Modifications rootfs

  • Dans le rootfs, ajouter l'arborescence suivante :
/mp9/
/mp9/fcgi/
/mp9/www/mp9ctl/
  • Copier les fichiers suivant :
    • lighttpd.conf dans /mp9/
    • index.php dans /mp9/www/mp9ctl/
    • mod_alias.so dans /lib/
    • mp9fcgi dans /mp9/fcgi/

Les fichiers lighttpd.conf et index.php sont à récupérer dans le dépot. Les autres ont été précédement compilés par vos soins.

  • Flasher le rootfs ainsi modifié

Démarrage

  • Se loguer sur la NB4 (port 1287) en root ,
  • Ajouter la règle suivante dans les iptables (permettre l'accès au décodeur au port 26180) :
iptables -A ACLS_FILTER -p tcp -i br1 -s 172.16.255.253  --dport 26180 -j ACCEPT -m state --stat NEW
  • Lancer le serveur de contenu par la commande suivante
/sbin/lighttpd -f /mp9/lighttpd.conf


Utilisation

  • Connecter une clef USB dans un des ports de la NB4,
  • Aller sur le médiacenter (chaine 909),
  • Aller sur la page des réglages et ajouter l'adresse IP suivante 172.16.255.254 (elle correspond à l'adresse du port TV de la NB4)
  • Sauvegarder les paramètres
  • Ordinateur doit être maintenant accessible, il correspond à la NB4 !

Et après ?

  • Activer automatiquement le serveur de contenu sur présence d'une clef ou disque USB : Ajouter ce qu'il faut dans /etc/init.d/usb_up_down
  • Permettre l'activation ou la désactivation du serveur de contenu par une page web supplémentaire d'adminstration de la NB4,
  • Permetre le nontage en nfs d'un NAS afin de le rendre accessible pour le mediacenter.