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.
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.
Merci pour la doc;
Ça donnerait presque envie de regarder la télé pour geeker ton tuto.
À bientôt