Contexte: XBMC me sert à lire différents medias stockés sur un serveur (CentOS 6). La librairie XBMC est également centralisée sur la base de donnée MySQL de ce même serveur. Je voulais que la librairie intègre les nouveaux medias dés leur arrivé.
En effet, les deux moyens de mise à jour de la librairie inclus dans XBMC sont :
– Au démarrage d’XBMC, ce qui ne me convient pas quand ce dernier est déjà allumé.
– En tâche planifiée (via l’add-on XBMC updater, ou un simple tâche cron). J’ai utilisé une tâche cron (toutes les 5 minutes) pendant longtemps, et cela fonctionne très bien, mais je voulais aller plus loin, et mettre à jour la médiathèque dés l’arrivé d’un nouveau media.
Pour ce faire, j’ai pensé à incron, qui permet d’exécuter des actions selon des évènements intervenant sur le système de fichiers en s’appuyant sur inotify, intégré aux noyaux Linux depuis la version 2.6.13. Parfait… Sauf que ce dernier ‘est pas récursif. Je me suis donc rabattu sur Watcher, un daemon écrit Python qui fait la même chose, mais en récursif. Pour être précis, j’ai utilisé un fork du Watcher original, car l’original s’appuie sur des fichiers de configuration YAML, alors que Python sait parser des fichiers de conf. Et je suis d’accord avec l’auteur du fork: pourquoi installer des dépendances quand c’est inutile?!
http://www.splitbrain.org/blog/2011-01/07-watcher_a_recursive_incron_alternative
J’ai donc installé tout ce qu’il faut sur ma Red Hat CentOS 6 (il faut les dépôt DAG ou EPEL pour la suite).
yum install python python-inotify python-argparse
téléchargez ensuite Watcher, puis copiez le fichier watcher.py où vous le souhaitez (/usr/bin dans mon cas), et le fichier watcher.ini dans /etc.
Donnez les droits en exécution au fichier watcher.py
chmod +x /usr/bin/watcher.py
configurez en renseignant le fichier watcher.ini:
[DEFAULT] logfile=/var/log/watcher.log pidfile=/var/run/watcher.pid [job1] watch=/home/medias/Series events=create,delete,modify recursive=true autoadd=true command=/scripts/XBMC/update_library_video.sh [job2] watch=/home/medias/Music events=create,delete,modify recursive=true autoadd=true command=/scripts/XBMC/update_library_music.sh |
Sur les actions create, delete ou modify dans les répertoires définis, les scripts update_library_music.sh ou update_library_video.sh sont lancés. Ceux-ci envoient une requête de mise à jour de la librairie à XBMC.
update_library_music.sh
#!/bin/bash xbmc_host_1=192.168.10.20 while [ -n "$(ping -c 1 $xbmc_host_1|grep 100%)" ] do exit done curl -v http://$xbmc_host_1:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn\(UpdateLibrary\(music\)\) |
update_library_video.sh
#!/bin/bash xbmc_host_1=192.168.10.20 while [ -n "$(ping -c 1 $xbmc_host_1|grep 100%)" ] do exit done curl -v http://$xbmc_host_1:8080/xbmcCmds/xbmcHttp?command=ExecBuiltIn\(UpdateLibrary\(video\)\) |
Démarrez le daemon en exécutant:
/usr/bin/watcher.py start