HTS Tvheadend sur Debian Stretch ARM avec programme TV, logos, et derrière un reverse-proxy

L’objectif est de pouvoir regarder la TNT depuis n’importe quel ordinateur de la maison, et depuis un mediacenter Kodi.

J’utilise pour cela HTS Tvheadend depuis déjà plusieurs années. Je le fais tourner sur mes petits serveurs ARM (Sheevaplug ou Olinuxino A20). Cette architecture complique un peu l’installation.

Et il y a quelques trucs à connaître pour la configuration des programmes TV, des logos des chaînes, et pour le faire fonctionner derrière un reverse-proxy.

Sommaire

Driver et firmware de la clé USB TNT

En premier lieu, il faut un appareil pour recevoir la TNT. J’utilise une vieille clé USB TNT de modèle AVerMedia AVerTV Volar Black HD. Elle est supportée par le kernel depuis longtemps, mais nécessite également un firmware propriétaire, qu’il faut déposer soit même dans /lib/firmware : /lib/firmware/dvb-usb-af9015.fw

Je ne sais plus où j’avais trouvé ce fichier initialement. On peut apparemment le trouver dans https://github.com/OpenELEC/dvb-firmware/tree/master/firmware. Ou au pire en dézippant le paquet https://packages.ubuntu.com/trusty-updates/linux-firmware-nonfree.

De manière générale, il faut suivre les instructions correspondant à votre appareil dans https://www.linuxtv.org/wiki/index.php/DVB-T_USB_Devices, et s’assurer qu’il est bien reconnu par le kernel (si le firmware n’est pas trouvé, cela affiche un message d’erreur dans les logs du kernel).

Installation sur un serveur ARM sous Debian Stretch

La difficulté, c’est que le projet ne fournit plus de paquets debian pour l’architecture ARM.

Sur Raspberry Pi

Je n’ai pas d’appareil de ce type, mais le projet tvheadend fournit des paquets tout prêts pour raspbian (de manière pas-encore-officielle, si j’ai bien compris) : cf la fin de https://tvheadend.org/projects/tvheadend/wiki/AptRepository.

Sur Olinuxino A20

Cet appareil utilise l’architecture armhf, comme les générations récentes de Raspberry Pi.

Par chance, dans le même dépôt qui fournit des paquets pour raspbian, ils fournissent également des paquets pour ubuntu en armf. J’ai testé : ils fonctionnent également sous Debian Stretch.

Il faut d’abord installer les dépendances :

sudo apt install libpcre2-8-0 dvb-apps

Puis installer le package depuis https://bintray.com/tvheadend. J’ai utilisé https://dl.bintray.com/tvheadend/deb/pool/t/tvheadend/tvheadend_4.3-1051~gade772d~xenial_armhf.deb. NB : à l’heure où j’écris ces lignes, il y a une bizarrerie dans les liens si on parcourt le répertoire https://dl.bintray.com/tvheadend/deb/pool/t/tvheadend/, qui rajoute un signe deux-points devant le nom du fichier. Il faut enlever ce signe de l’URL pour pouvoir télécharger le paquet avec wget (je l’ai fait dans le lien ci-dessus).

Sur Sheevaplug

L’architecture est armel. On ne peut pas utiliser les paquets armhf (car le processeur n’a pas d’unité de calcul en virgule flottante). Donc pas d’autre solution que de le compiler à la main

Compilation

sudo apt-get install build-essential pkg-config libssl-dev libssl1.1 libavahi-client-dev libcurl3-gnutls git realpath cmake gettext
git clone https://github.com/tvheadend/tvheadend.git
cd tvheadend
./configure --cpu=armv4t --enable-bundle
make

Attention, la compilation prend plusieurs heures sur la sheevaplug… et plante lamentablement à la fin car les 512Mo de mémoire vive ne suffisent pas.

Pour contourner le problème, il suffit d’activer du swap (temporairement), si vous n’en avez pas :

dd if=/dev/zeros of=tmpswapfile.swp bs=1M count=1000
sudo mkswap tmpswapfile.swp
sudo swapon tmpswapfile.swp

(ce swap disparaîtra au prochain reboot, et le fichier tmpswapfile.swp pourra être supprimé)

Déclaration du service

Une fois la compilation terminée, on a un exécutable, mais on veut le faire lancer automatiquement au démarrage, le faire tourner avec un compte spécifique etc.

La solution la plus simple que j’ai trouvée est d’utiliser un paquet .deb existant (prévu pour une autre architecture comme armhf, comme par exemple https://dl.bintray.com/mpmc/deb/pool/t/tvheadend/tvheadend_4.3-1039~gd1c9d1f~raspbianjessie_armhf.deb ) pour qu’il prépare tout le nécessaire : création du user hts, du répertoire de paramétrage /home/hts/.hts avec les bons droits etc. Puis le désinstaller et remettre uniquement le strict nécessaire.

Pour installer ce .deb, il faut quelques dépendances, et forcer dpkg à accepter l’architecture :

sudo apt install libavahi-client3 libavahi-common3 libc6 libdbus-1-3 libpcre3 libssl1.0.0 liburiparser1 zlib1g
sudo dpkg -i --force-architecture --force-depends tvheadend_4.3-1039~gd1c9d1f~raspbianjessie_armhf.deb

Sauvegarder les fichiers nécessaires à la configuration du service :

sudo cp /etc/default/tvheadend /etc/default/tvheadend.bak
sudo cp /lib/systemd/system/tvheadend /lib/systemd/system/tvheadend.bak

Puis supprimer le paquet (sans mettre le paramètre –purge, de sorte qu’il ne supprime pas le répertoire /home/hts) :

sudo apt remove tvheadend

Remettre les fichiers sauvegardés :

sudo mv /etc/default/tvheadend.bak /etc/default/tvheadend
sudo mv /lib/systemd/system/tvheadend.bak /lib/systemd/system/tvheadend

Puis mettre un lien symbolique vers le binaire (en remplaçant ci-dessous le répertoire par celui où vous avez fait la compilation) :

sudo ln -s /home/monuser/tvheadend/build.linux/tvheadend /usr/bin/tvheadend

(pour faire plus propre, il serait mieux de déplacer cet exécutable ailleurs : dans /var/lib/tvheadend, par exemple)

Puis activer le service :

sudo systemctl restart tvheadend
sudo systemctl enable tvheadend

Configuration

Au premier lancement (http://serveur:9981), l’assistant propose par défaut de scanner les chaînes. Il faut cocher l’option pour les mapper sur des services.

S’il ne détecte pas l’adaptateur TNT (et ne propose que de l’IPTV), retour à la case configuration du driver.

Programmes TV

En standard, tvheadend est capable de récupérer les programmes TV diffusés par la TNT. Ça marche très bien pour voir les quelques émissions qui vont suivre, mais on n’a pas le programme des jours suivants, par exemple.

Pour cela, on peut utiliser XMLTV, et un « grabber ». Historiquement, j’utilisais le tv_grab_fr mais il consomme énormément de CPU sur une sheevaplug. tv_grab_fr_kazer est bien moins gourmand.

Il faut se créer un compte sur http://kazer.org/, choisir ses chaînes, et noter son « userhash ».

sudo apt-get install xmltv-util
tv_grab_fr_kazer --configure

Cela génère un fichier ~/.xmltv/tv_grab_fr_kazer.conf . A titre d’exemple, voici le mien (pour la plupart des chaînes françaises) :

userhash=xxxxxxxxx
channel=ART1.kazer.org
channel=BFM1.kazer.org
channel=EUR2.kazer.org
channel=FRA2.kazer.org
channel=FRA3.kazer.org
channel=FRA31.kazer.org
channel=FRA4.kazer.org
channel=FRA5.kazer.org
channel=ITL1.kazer.org
channel=LAC1.kazer.org
channel=M61.kazer.org
channel=NRJ1.kazer.org
channel=NT11.kazer.org
channel=RTL2.kazer.org
channel=TF11.kazer.org
channel=W91.kazer.org
channel=GUL1.kazer.org
channel=TLM2.kazer.org
channel=FRA1.kazer.org
channel=TMC1.kazer.org
channel=DIR1.kazer.org
channel=CAN2.kazer.org
channel=LCI1.kazer.org
channel=6TER.kazer.org
channel=HD1.kazer.org
channel=LEQ1.kazer.org
channel=NOL1.kazer.org
channel=NU23.kazer.org
channel=RMC2.kazer.org

Il faut ensuite copier ce répertoire .xmltv dans /home/hts (pour que le compte hts y ait accès).

Hélas, le site kazer.org n’a quasiment plus de programmes TV depuis plusieurs mois (à part France Television).

D’ici que ce soit résolu, j’ai mis en place un contournement pour avoir au moins le programme TV du moment : demander à Kodi de le récupérer plus fréquemment depuis la TNT (une fois par heure). Dans Configuration -> Channel/EPG -> EPG Grabber -> Over-the-air grabbers, mettre le cron suivant :

# Default config (02:04 and 14:04 everyday)
# 4 2 * * *
# 4 14 * * *
# En attendant que le grabber Kazer (XMLTV) marche mieux
10 * * * *

Icônes des chaînes TV

Générer les picons en suivant les instructions de https://github.com/picons/picons-source. Il y a deux options possibles :

  • « Service Reference » va générer des fichiers dont le nom correspond à la référence TNT de la chaîne (et donc tvheadend devrait les reconnaître automatiquement)
  • « Service Name » va générer des fichiers avec des noms compréhensibles par un être humain (et il faudra les mapper manuellement avec les chaînes correspondantes)

A l’époque où j’avais généré les icônes, TvHeaded ne reconnaissait par les fichiers de type « Service Reference », donc j’avais utilise « Service Name ». Mais il est possible que ça soit réglé depuis, notamment en utilisant la valeur « Force service type to 1 » de l’option « Picon name scheme ».

Placer les icônes générés dans /home/hts/picons (par exemple)

Dans la configuration de tvheadend, dans General->Base, mettre comme picon path : file:///home/hts/picons

Si vous avez utilisé des picons de type « Service Name », il faut configurer les picons pour chaque chaîne TV, en spécifiant le nom du fichier en picon:// (ex: picon://arte.png, qui doit correspondre à un fichier /home/hts/picons/arte.png)

Dans Configuration->Channel/EPG->EPG Grabber, vérifier que « Update channel icon » n’est pas coché.

Accès derrière un reverse-proxy

L’utilisation de websockets dans tvheadend est apparue quelque part entre les versions 4.0.8 et 4.3 (avant, il faisait du polling). Si vous mettez votre tvheadend derrière un reverse-proxy, il faut le configurer pour qu’il sache faire du reverse-proxy sur les websockets de tvheadend.

Dans mon cas, c’est Apache qui fait ce reverse-proxy.

sudo a2enmod proxy_wstunnel

Et, dans la configuration du site Apache :

ProxyPass /comet/ws ws://serveur:9981/comet/ws
ProxyPassReverse /comet/ws ws://serveur:9981/comet/ws
ProxyPass / http://serveur:9981/
ProxyPassReverse / http://serveur:9981/

A la fin, il faut redémarrer Apache :

sudo systemctl restart apache2

Utilisation depuis Kodi

Il faut installer le paquet kodi-pvr-hts, puis le configurer depuis l’IHM de Kodi.

La doc officielle : http://kodi.wiki/view/Tvheadend_PVR#Connecting_Kodi_to_Tvheadend.

Utilisation depuis un navigateur web

Le bouton « Watch TV » ne fonctionne pas, probablement parce que mes serveurs n’ont pas assez de puissance pour transcoder le flux dans un format que les navigateurs savent lire (webm par exemple).

Par contre, on peut demander de regarder une chaîne, en téléchargeant un fichier .m3u. Il vaut mieux l’ouvrir avec VLC, car Totem affiche par défaut (et mal) les sous-titres.

Utilisation depuis VLC

Plutôt que de télécharger un fichier .m3u pour chaque chaîne, on peut les donner toutes d’un coup à VLC, à partir duquel on peut ensuite zapper. Il suffit de lui demander d’ouvrir un flux réseau à l’adresse http://serveur:9981/playlist/channels.

Une réflexion sur « HTS Tvheadend sur Debian Stretch ARM avec programme TV, logos, et derrière un reverse-proxy »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *