Un Raspberry Pi 2 en MediaCenter
Par makoto doushite le lundi, 15 août 2016, 16:21 - Raspberry Pi - Lien permanent
- Avec l’avènement du Raspberry Pi2, mon vieux médiacenter, lui-même PC recyclé (P4@2,66GHz) fait pas mal grise mine…
Incapable de lire des vidéo h264 qui dépasse le 720p, bruyant, énergivore (environ 80W), couplé à un vieux poste de télévision cathodique qui consomme aussi pas mal (environ 90Watt continu).
Utiliser un RpiPi2 (moins de 5W) donc me permettrait de laisser de côté tous ces inconvénients, cependant j'avais besoin d'une prise HDMI et c'est après avoir récupéré un vieux poste de télévision LCD (HD Ready, 720p et 1080i max, tuner mpeg2 obsolète, 50W en mode éco) que j'ai envisagé de changer mon système de médiacenter.
Entre temps, bonne nouvelle, plus besoin de bidouiller, ma clé wifi TP-Link est désormais reconnue par le kernel des derniers système GNU/Linux désigné pour RpiPi !
- Voici donc l'histoire d'une migration, ou plutôt d'une lente progression…
1 - Choix du système d'exploitation :
À ma connaissance il y a deux possibilités, utiliser Raspbian Lite et à la main installer le logiciel médiacenter Kodi et tout le reste; Ou alors utiliser une distribution dédiée telle que Openelec ou RaspBMC.
La première solution serait calquée sur ma démarche avec l'ancien médiacenter, mais puisqu'on me dit qu'Openelec offrirait de bien meilleures, j'ai donc choisis cette dernière…
Et après une semaine à m'échiner à faire fonctionner le truc, j'ai lâché l'affaire…
Pourtant j'avais réussis à tout faire fonctionner, télécommande, récup de la base, tout ça… sauf une chose, le partage réseau !
Avec ma config je n'ai pas le choix, je suis obligé de passer par un partage ssh, soit en sftp depuis l'interface de Kodi, qui s'évertue à monter ce partage en lecture seule…
Impossible de me rabattre sur le NFS, car mon stockage est chiffré, et NFS ne fonctionne donc pas.
Openelec étant verrouillée de partout, impossible d'installer un soft ou même d'écrire sur le disque, afin de monter un partage sshfs… Merci pour le temps perdu, au revoir !
Donc Raspbian Lite Ça je connais, et on va tout faire à la main, quoi de mieux que d'être servis par soit même !??
2 - Installer le Raspbian Lite :
- Télécharger Raspbian https://www.raspberrypi.org/downloads/raspbian/
Il existe actuellement 2016-05-10-raspbian-jessie-lite.zip, une version qui est entièrement en ligne de commande, sans environnement de bureau, donc très légère, idéale pour une petite carte SD (environ 800Mio une fois installé)
- Déployer l'image sur une carte SD depuis un système GNU/Linux, avec la commande DD
(attention, of=/dev/sdx à adapter pour la cible de votre carte SD, en cas d'erreur risque d'effacement d'un disque dur non désiré)
dd bs=4M if=2016-05-10-raspbian-jessie-lite.img of=/dev/sdx; sync
- Placer la carte SD dans le Raspberry, et le mettre sous tension.
Exécuter raspi-config, et configurer tous les trucs comme on veut, notamment les variables locales (time zone, clavier, etc), et très important, le mémory split pour allouer 512Mo au GPU, sans quoi impossible de lire de la HD 1080 !
raspi-config
Après le reboot, pour rappel :
Login : pi
Pass : raspberry
- Effectuer les mises à jour :
sudo apt-get install rpi-update sudo rpi-update sudo apt-get update sudo apt-get upgrade
- Mettre les fichiers temporaires en ram pour économiser sur la durée de vie la la carte SD.
sudo nano /etc/fstab
tmpfs /tmp tmpfs defaults,size=256M 0 0 tmpfs /var/tmp tmpfs defaults,size=256M 0 0 tmpfs /var/lock tmpfs defaults,size=256M 0 0
- Editer le fichier /etc/network/interfaces et modifier comme suit la section wlan0 :
auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-ssid "le nom du réseau wi-fi" wpa-psk "le mot de passe du réseau wi-fi"
- Relancer ensuite le réseau avec la commande :
service networking restart
3 - Installer Kodi :
sudo apt-get install kodi
Pour lancer Kodi il suffit de taper son nom depuis la console.
Si on veut que Kodi se lance au démarrage du RpiPi2, on peut éditer le fichier /etc/default/kodi, et le renseigner comme suit :
# Set this to 1 to enable startup ENABLED=1 # The user to run Kodi as USER=pi # Adjust niceness of Kodi (decrease for higher priority) NICE=-5
Sauf que… Pour une raison que j'ignore, une fois le RpiPi2 redémarré, Kodi doit se trouver dans un profil incomplet, car par exemple, son menu d'arrêt ne comporte qu'une seule entrée (exit), au lieu des 3 ou 4 habituelles (exit, reboot, shutdown…)
Ça c'est pas cool, surtout quand on constate qu'en lançant Kodi manuellement ce menu se retrouve bel et bien complet !
Encore un truc pas sec… alors on va faire les choses autrement !
- On va configurer le login automatique de l'utilisateur sur le RpiPi2[1] en créant un autologin dans systemd :
sudo nano /etc/systemd/system/getty@tty1.service.d/autologin.conf
- Le remplir avec ceci :
# Systemd : logue automatiquement la console tty1 avec l utilisateur arcade [service] ExecStart= ExecStart=-/sbin/agetty --autologin arcade --noclear %I 38400 linux
- Puis enfin lancer ces deux commandes :
sudo systemctl enable getty@tty1.service sudo sed -i -e "s/sbin\/agetty/sbin\/agetty -a arcade/g" /etc/systemd/system/getty.target.wants/getty@tty1.service
- Au redémarrage du RpiPi2 plus besoin de se loguer, reste donc à lancer Kodi en éditant le fichier .profile :
nano ~/.profile
- Et ajouter les lignes suivantes à la fin :
tty=`tty` # Start Kodi only if login in tty1 if [ $tty = '/dev/tty1' ]; then kodi fi
4 - Montage automatique du partage réseau ssh :
On va utiliser simplement le fstab, et s'arranger pour que le mot de passe ssh ne soit pas demandé.
- Installation de sshfs :
sudo apt-get instal sshfs
- Création d'une paire de clés publiques/privées pour l'utilisateur sur le client (le RpiPi2) :
fstab est géré par l'utilisateur root, c'est donc des cléf de celui-ci dont on a va avoir besoin, pour spécifier cela on utilise sudo :
sudo ssh-keygen -t rsa
Laisser le chemin par défaut (/root/.ssh/id_rsa) et laisser la demande de passphrase vide.
- Copier ensuite la clé publique sur le serveur (la machine ou se trouve le stockage) :
sudo ssh-copy-id -i /root/.ssh/id_rsa.pub -p N°-de-port MONLOGIN@IP-du-serveur
- Éditer le fstab :
sudo nano /etc/fstab
- Et ajouter cette ligne :
sshfs#MONLOGIN@IP-du-serveu:/répertoire/distant /hone/pi/video fuse port=N°-de-port,user,noatime,allow_other,_netdev 0 0
- Ne pas oublier le créer le dossier ~/video :
mkdir /home/pi/video
Et vérifier en montant le contenu de fstab :
sudo mount -a
5 - La télécommande infra-rouge :
Jusqu'à présent j'utilisais une télécommande de récupération, couplée à un récepteur infra-rouge connecté sur une entrée de la carte son d'un vieux PC.
Je me suis dit, cette fois-ci, on va utiliser les nouvelles techno, et grâce au HDMI CEC je vais pouvoir piloter le médiacenter exécuté sur le RpiPi2, avec la télécommande de la TV !
Mais en fait non, le téléviseur n'est pas compatible avec cette norme, il faut donc passer par un récepteur infrarouge connecté sur un GPIO. Ici j'ai câblé le GPI018.
- Installer le soft de gestion de l'infrarouge :
sudo apt-get install lirc
- Éditer hardware.conf pour régler les paramètres de LIRC :
sudo nano /etc/lirc/hardware.conf
- Faire correspondre le contenu à ceci :
######################################################## # /etc/lirc/hardware.conf # # Arguments which will be used when launching lircd LIRCD_ARGS="--uinput" # Don't start lircmd even if there seems to be a good config file # START_LIRCMD=false # Don't start irexec, even if a good config file seems to exist. # START_IREXEC=false #Try to load appropriate kernel modules LOAD_MODULES=true # Run "lircd --driver=help" for a list of supported drivers. DRIVER="default" # usually /dev/lirc0 is the correct setting for systems using udev DEVICE="/dev/lirc0" MODULES="lirc_rpi" # Default configuration files for your hardware if any LIRCD_CONF="" LIRCMD_CONF="" ########################################################
- Activer le module sur le RpiPi2 en éditant config.txt
sudo nano /boot/config.txt
- Dé-commenter la ligne (sans autre argument, c'est le GPIO18 qui sera écouté par le module, sinon pour par exemple le GPIO23, on indiquera dtoverlay=lirc-rpi,gpio_in_pin=23) et redémarrer le RpiPi2.
dtoverlay=lirc-rpi
- Pour tester si les commandes infrarouge sont bien reçues :
sudo killall lircd sudo mode2 -d /dev/lirc0
- À chaque appuie sur une touche de la télécommande, devrait s'afficher ce genre de truc :
space 1223 pulse 281 space 1193 pulse 350 space 1199 pulse 264 space 1901
- Bien, maintenant on va identifier la télécommande et associer chacun de ses boutons à une touche du clavier. Le programme va demander d'appuyer anarchiquement sur toutes les touches, puis de nommer les touches une à une. La syntaxe à respecter pour les noms est disponible en exécutant :
irrecord --list-namespace
Il est temps de procéder :
sudo irrecord -d /dev/lirc0 /etc/lirc/lircd.conf
J'ai choisis ces touches du clavier, qui correspondent aux raccourcis clavier les plus utile de Kodi, pour la simple raison que ça fonctionnera directement ! Pas la peine de configurer quoi que ce soit dans Kodi !
KEY_Up
KEY_Down
KEY_Right
KEY_Left
KEY_Enter
KEY_C (click droit)
KEY_PageUp
KEY_Esc (retour menu principal)
KEY_Back (retour menu précédent)
KEY_Rewind
KEY_Stop
KEY_PlayPause
KEY_FastForward
- Reste à redémarrer le service LIRC
sudo /etc/init.d/lirc restart
- Un moyen simple de savoir si ça marche, c'est de simplement appuyer sur les touches de la télécommande, ça devrait agir dans la console GNU/Linux ![2]
Par exemple la touche correspondant à KEY_C affichera le caractère C, normal quoi, puisque LIRC permet ainsi d'assigner l'entièreté des touches du clavier, et plus encore.
Voici le contenu de lircd.conf, il est toujours temps de le modifier au besoin !
# Please make this file available to others # by sending it to <lirc@bartelmus.de> # # this config file was automatically generated # using lirc-0.9.1-git(default) on Wed Jul 20 22:41:05 2016 # # contributed by # # brand: lircd.conf # model no. of remote control: # devices being controlled by this remote: # begin remote name lircd.conf bits 15 flags SPACE_ENC|CONST_LENGTH eps 30 aeps 100 one 304 1799 zero 304 746 ptrail 304 gap 66906 toggle_bit_mask 0x0 begin codes KEY_Up 0x43AA 0x4055 KEY_Down 0x4012 0x43ED KEY_Right 0x406E 0x4391 KEY_Left 0x43AE 0x4051 KEY_Enter 0x412A 0x42D5 KEY_C 0x42BE 0x4141 KEY_PageUp 0x409E 0x4361 KEY_Esc 0x4072 0x438D KEY_Back 0x3ECE 0x3D31 KEY_Rewind 0x404A 0x43B5 KEY_Stop 0x424A 0x41B5 KEY_PlayPause 0x414A 0x42B5 KEY_FastForward 0x434A 0x40B5 end codes end remote
Au lancement de Kodi la télécommande devrait fonctionner
Si ce n'est pas le cas, ressortir et vérifier que le processus lircd tourne bien.
ps -A | grep lirc
6 - Migration de base de données :
- Toute la configuration de Kodi est bien rangée dans le dossier caché .kodi dans le home de l'utilisateur.
J'ai donc récupéré le dossier de mon ancien médiacenter afin de le copier sur le nouveau.
Oké donc après redémarrage du RpiPi2, j'ajoute ma source de vidéos, je navigue avec ma télécommande parmi les fichiers média, et … haaaa mais non, où sont passés les status lu/non-lu des fichiers ??? Tout est vierge !
Le dossier .kodi/userdata/Databases est pourtant bien en place…
Ho, une nouvelle base MyVideo93.db a été crée, la mienne MyVideo99.db a été ignorée semble t'il !
Qu'à cela ne tienne, je renomme la mienne en MyVideo93.db :)
Toujours rien, et cette fois le message d'erreur suivant apparait dans le log Kodi : .kodi/temp/kodi.log
10:51:06 9.596940 T:1967722496 ERROR: Can't open the database MyVideos93 as it is a NEWER version than what we were expecting?
Après beaucoup de temps à trifouiller la configuration de Kodi, j'ai fini par comprendre le truc…
Les bases utilisées par Kodi (par défaut des bases SQLite, extention .db stockée dans .kodi/userdata/Databases) sont incompatible pour la simple raison que le Kodi du vieux PC Pentium4 est plus récent (KODI 16.0) que celui du RpiPi2 (KODI 15).
Impossible de downgrader, me voilà bien embêté…
- Pour résumer en une ligne : Sur le vieux PC médiacenter la base en V16 stokée dans ~/.kodi/userdata/Database/MyVideo99.db est incompatible avec la base sur le RpiPi2 en V15 stokée dans ~/.kodi/userdata/Database/MyVideo93.db.
- Je veux pourtant récupérer les données de cette base, surtout les fichier lu/non-lu, alors j'ai procédé ainsi :
- Installer les outils sur un ordinateur :
sudo apt install sqlite3 sqlitebrowser
- Ouvrir la base en V16 (celle qui contient les données) : MyVideo99.db
sqlite3 MyVideos99.db
- Dumper une à une les tables depuis SQLite en format SQL pour sauvegarder la structure.
Première commande, rediriger la sortie vers un fichier puis dumper la table depuis SQLite :
sqlite> .output bookmark.sql
- Seconde commande, dumper :
sqlite> .dump bookmark
- Faire de même pour les tables : files, path, settings, streamdetails.
On a donc sous la main les fichiers : bookmark.sql, files.sql, path.sql, settings.sql, streamdetails.sql.
- À la fin on quitte :
sqlite> .quit
- Ensuite on va importer ces données dans la base en V15 : MyVideo93.db
Ouvrir la base :
sqlite3 MyVideos93.db
- Tout d'abord effacez la table de la base:
sqlite> drop table bookmark;
- Puis lire le fichier sauvegardé:
sqlite> .read bookmark.sql
- Pour vérifier que la table s'est bien importée.
sqlite> select * from bookmark;
Faire de même pour les tables : files, path, settings, streamdetails.
- À la fin on quitte :
sqlite> .quit
Ok, mais ce n'est pas tout, car une fois la base MyVideo93.db mise en place sur le RpiPi2, toujours rien dans le dossier des vidéos, les status lu/non-lu ne remontent pas…
J'ai fini par comprendre qu'il s'agissait d'un problème avec les chemins utilisés sur l'ancien PC médiacenter qui étaient bien différents sur le nouveau RpiPi2, et que donc il fallait le mettre en conformité avec ce dernier dans la table path.
Sur la base MyVideo93.db, le seul path qui apparaissait était donc : /home/makoto/video/
- Il suffirait de remplacer tout les anciens path par ce nouveau.
On peut le faire à la main avec le logiciel sqlitebrowser, ou alors par la ligne de commande :
sqlite3 MyVideos93.db
- La commande va rechercher/remplacer le chemin /home/makoto/video/ par le nouveau !
UPDATE path SET strPath = REPLACE(strPath,'/home/makoto/video', '/home/pi/video');
- À la fin on quitte
sqlite> .quit
Voilà c'est terminé, une fois la base rangée sur le RpiPi2 à sa place .kodi/userdata/Database/MyVideos93.db je constate que les status lu/non-lu sont tous présents :) Ouf !!!
Ressources :
http://blog.dorian-depriester.fr/linux/raspberry/utiliser-une-telecommande-infrarouge-pour-controler-xbmc
http://kodi.wiki/view/Keymaps
http://kodi.wiki/view/LIRC
http://wiki.openelec.tv/index.php/Guide_To_lirc_rpi_GPIO_Receiver
http://bornslacker.com/raspberry-pi-with-openelec-part-2/
https://anderson69s.com/2015/08/04/raspberry-pi-dupliquer-sa-telecommande-ir/
http://info.geekitude.fr/kodi/accueil
http://www.geekmag.fr/kodi-deplacer-le-profil-et-ses-donnees/
https://doc.ubuntu-fr.org/sqlite#inserer_des_valeurs_dans_la_table
http://kodi.wiki/view/HOW-TO:Update_SQL_databases_when_files_move
Commentaires
Bonjour,
Tu avais aussi OSMC qui est une Raspbian "lite" optimisée pour Kodi, mois fun que le "home-made", mais LIRC fonctionne "out of the box", il y as peu de paquets a installer via apt pour faire fonctionner Hyperion.
Via SSH tu prend le contrôle à distance avec en login : osmc et en mdp : osmc
Oké, je testerais ça, merci ! ^^