Du libre, du code, des idées, du mélange d’ArraKISS…

De l’épice pour la pensée

Dans cet article, on va décrire la mise en place d'une station vidéo pour salon. Quelques contraintes sont à respecter :

  • On utilise autant que possible les outils intégrés par défaut au système.
  • On limite l'utilisation des ressources, il faut que ça soit rapide et fonctionnel sur des ordinateurs peu puissants.
  • On doit pouvoir afficher une liste des vidéos disponibles sur la station vidéo.
  • On garde en mémoire les fichiers déjà lus pour les repérer par une couleur différente (pratique pour les sériesvores)
  • Si on insère une clé USB ou disque dur externe, les fichiers présents dessus doivent être lus automatiquement.

Matériel


J'ai récupéré un ordinateur chez un *cash du coin. C'est pas le moins cher, mais ça permet d'éviter de laisser un ordinateur aller en déchetterie.

J'y ajoute un mini clavier sans fil. C'est tip top ces trucs, et ça contient une batterie donc très facile à recharger par USB.

Installer OpenBSD


Ça, c'est fastoche, ça prend quelques minutes. On crée un utilisateur qu'on nommera pour l'exemple "watcher".

On prévoit quand même quelques optimisations au niveau du système de fichier en activant les softdeps :

sed -i 's/rw,/rw,softdep,/g' /etc/fstab

Et on prépare l'installation de futurs paquets :

echo https://ftp.fr.openbsd.org/pub/OpenBSD > /etc/installurl

Enfin, on met à jour en lançant

syspatch

Vous voudrez peut-être réduire le temps d'attente au démarrage :

echo "set timeout 1" > /etc/boot.conf

Pour augmenter les performances graphiques, on peut aussi ajouter cette ligne dans /etc/sysctl.conf

machdep.allowaperture=1

Configurer l'autologin


On se sert de xenodm, le gestionnaire de connexion par défaut sous OpenBSD.
Afin d'automatiquement lancer la session de l'utilisateur configuré lors de l'installation, on suit les recommandations du wiki, à savoir éditer /etc/X11/xenodm/xenodm-config et ajouter :

DisplayManager._0.autoLogin:    watcher

On crée un fichier ~/.xsession pour l'utilisateur qui contiendra ces lignes :

. ~/.profile
xsetroot -solid black &
# son au max
mixerctl outputs.master=255,255
lutecium Videos/ &
cwm

Nous verrons ensuite à quoi correspond ce "lutecium".
Remarquez qu'on utilise un gestionnaire de fenêtres intégré à OpenBSD, pas besoin de l'installer.
Pensez à rendre ce fichier exécutable :

chmod +x ~/.xsession

Reste à activer xenodm :

rcctl enable xenodm && rcctl start xenodm

Chargement des langues et utf-8


Certaines applications en ont besoin, alors on précise dans le fichier ~/.profile de l'utilisateur ces lignes :

LC_CTYPE="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_ALL='fr_FR.UTF-8'
LANG='fr_FR.UTF-8'
export LC_CTYPE LC_MESSAGES LC_ALL LANG
export ENV=$HOME/.kshrc

Permettre l'extinction


On édite le fichier /etc/doas.conf pour permettre à l'utilisateur d'éteindre la machine en utilisant doas sans entrer de mot de passe :

cat /etc/doas.conf
permit nopass :wheel  cmd /sbin/shutdown
permit nopass :wheel  cmd /sbin/reboot

Installation de l'interface


La plupart du temps, c'est kodi qu'on installe. Sauf que je le trouve extrêmement lourd et plein de fonctionnalités qui ne me sont pas du tout utiles. Notez que si vous avez des alternatives à proposer, je suis preneur ;).
J'ai donc codé un petit truc, qui certes ne paie pas de mine mais fait ce que je veux : afficher mes fichiers et retenir lesquels ont déjà été vus. Ça s'appelle lutecium et ça ressemble à ça :

(ne faîtes pas attention aux exemples, c'était des tests...)

Notez que on pourrait très bien utiliser ranger ou encore noice dans un terminal, mais ça ne garde pas une trace des épisodes déjà vus.

Pour m'en servir, il me faut python3, la bibliothèque tkinter, et un lecteur de vidéos (mpv).

pkg_add -z python-tkinter-3* mpv
ln -s /usr/local/bin/python3.6 /usr/local/bin/python3

Ensuite, j'installe lutecium dans /usr/local/bin :

ftp -o /usr/local/bin/lutecium http://dev.yeuxdelibad.net/tk-tools/Lu/lutecium
chmod +x /usr/local/bin/lutecium

Et voilà, on peut choisir sa vidéo avec le clavier.

Récupérer les vidéos


Là, c'est chacun sa façon de faire.
Certains feront un montage NFS, d'autres une synchronisation... Pour ma part je fais un peu les deux :

Dans /etc/fstab :

192.168.1.2:/mnt/data/ /mnt/NFS nfs rw,nodev,nosuid,soft,noatime 0 0

Ensuite, ajout d'une tâche cron :

crontab -e
@hourly /usr/local/bin/rsync -az --delete /mnt/NFS/ /home/watcher/Videos/

Lecture automatique si on insère une clé USB

Afin de lancer une lecture automatique des fichiers présents sur, par exemple, une clé USB insérée, j'utilise hotplugd.

pkg_add fuse hotplug-diskmount
rcctl enable hotplugd

On complète ensuite le fichier /etc/hotplug/attach :

#!/bin/sh

DEVCLASS=${1}
DEVNAME=${2}
LOGIN="watcher"
MOUNTPOINT=/home/${LOGIN}/usb

case "${DEVCLASS}" in
    2)
        mkdir -p -m 1777 "${MOUNTPOINT}"
        mount -o nodev,nosuid,noatime /dev/"${DEVNAME}"i "${MOUNTPOINT}"
        su "${LOGIN}" -c "DISPLAY=:0 mpv --alang=en,fr --slang=fr --save-position-on-quit  --fullscreen --keep-open=no \"${MOUNTPOINT}\"/*"
        ;;
esac

On oublie pas le chmod +x /etc/hotplug/attach. ;)

Vous pouvez faire de même avec un script "detach" :

 cat /etc/hotplug/detach
#!/bin/sh

DEVCLASS=$1
DEVNAME=$2

case $DEVCLASS in
    2)
        /sbin/umount "/mnt/${DEVNAME}"
        exit 0
        ;;
esac
exit 0

Bien qu'on puisse faire nettement moins spécifique comme configuration, avec celle-ci ça fonctionne bien et je sais exactement où sont montées les clés USB. À chaque fois qu'une d'entre elle est branchée, hop ça lit tout ce qui est dessus.

§

Mot de la fin

Ça sera tout pour cette petite présentation. Le clavier est petit, mais me permet de modifier le volume du son, faire pause, accélérer... Tout ce qu'il me faut en fait ;)
Vos idées et suggestions sont les bienvenues, je suis certain qu'on peut améliorer tout ça ;)

edit : j'ai ajouté l'heure à lutecium

Peut-être vous souvenez-vous, je développais pendant un temps dontpanic. Cette application permettait de télécharger des vidéos via le protocole torrent, et de les regarder au fur et à mesure qu'on récupérait les données. De plus, on pouvait garder une trace des épisodes regardés, avoir le synopsis des films... Bref, c'était devenu trop gros pour moi seul, et surtout difficile à maintenir. Autre souci ennuyeux, le code reposait sur une bibliothèque python (libtorrent) peu pratique à porter sur d'autres systèmes.

Un peu plus tard, j'ai repris le principe avec une interface dans un terminal en l'appelant "torstream". Afin de charger les torrents, je laissais cete tâche à aria2, et ça fonctionnait plutôt pas mal.

Cependant, les moteurs de recherche dans la DHT changent souvent, ou la façon dont j'avais écrit torstream rendait peu pratique le maintient de la partie "recherche".

Dernièrement, j'ai retroussé mes manches et j'ai le plaisir de vous annoncer la sortie de torstream en version "0.5" (ouais, jsuis un fou ^^). J'en suis assez content car j'ai pu résoudre plusieurs soucis, notamment :

  • L'intégration de nouveaux moteurs de recherche et leur maintient est beaucoup plus pratique. Moteurs et interface sont séparés.
  • Les recherches se font plus rapidement grâce à des requêtes en parallèle.
  • L'interface ne se limite plus au terminal, on peut utiliser aussi une interface web. Cette partie me permet de préparer la publication de torstream sur un serveur. En effet, ça, ça serait le pied, mais j'y reviens plus tard.
  • L'interface web s'appuie sur des requêtes en AJAX. C'est plus joli et fluide. Reste du boulot sur le CSS cependant.
  • Les recherches sont mises en cache, ça aussi, pour préparer la publication en tant que serveur.

Et la suite alors?
Je voudrais proposer torstream comme application à héberger sur un serveur. Quiconque tape sa recherche dans l'interface peut alors charger et regarder une vidéo. J'ai eu énormément d'espoir en découvrant récemment webtorrent qui transforme votre navigateur en client bittorrent. Cependant, ce dernier fonctionne très bien, mais pas avec les torrents qu'on utilise tous (basé sur websockets et pas TCP/IP). Trop déçu que je suis, j'espère très fort qu'il va permettre de prendre en charge les torrents habituels bientôt, et là ça va roxer du poney! :)

Bon, j'arrête là le blabla et vous laisse tester la nouvelle version, disponible ici : https://framagit.org/Thuban/torstream

alt

OPaMa est un gestionnaire de paquets pour OpenBSD. qui utilise les outils pkg_*.

Comment ça, ça ne sert à rien :D ?
Peut-être pas à tout le monde, mais j'avais envie, voilà. :P

Il permet notamment de :

  • Chercher des paquets.
  • Obtenir la description d'un paquet.
  • Lister les paquets installés.
  • Installer/Désinstaller un paquet.
  • Supprimer les paquets inutiles.
  • Modifier le dépôt utilisé (fichier /etc/installurl).

Vous le trouverez sur framagit : https://framagit.org/Thuban/opama.

aperçu d'opama 1
aperçu d'opama 2
aperçu d'opama 3
aperçu d'opama 4
aperçu d'opama 5

Vous connaissez peut-être déjà l'excellent syncthing, un outil multiplateforme permettant de partager ses fichiers de façon décentralisée. C'est un peu comme un dropbox, mais sans avoir besoin des serveurs de dropbox.
Je l'utilise sans vergogne pour mes sauvegardes ainsi que pour partager des documents avec des collègues.
Puisque syncthign tourne en arrière-plan, il me manquait une façon d'être informé lorsqu'un personne me propose un nouveau partage, ou être averti d'un évènement quelconque. En cherchant des outils de notification, on trouve bien quelques petites choses mais pas à mon goût :

  • Syncthing-GTK, basé sur GTK comme son nom l'indique. Il ne m'a pas plu, car il re-crée une interface à syncthing alors que tout est disponible dans le navigateur. Et puis glade pour faire une interface... Bon, il marche très bien, mais je n'avais pas besoin de tant.
  • QSyncthingTray : oh, du Qt et du C++, au revoir. (bah oui, je serais bien incapable de résoudre un problème s'il y en a un un jour. Et installer Qt juste pour ça.... hum :/ )

Vous me voyez venir, j'ai sorti mes doigts de mon c.. (cartable) pour coder un tout petit truc tout simple en Tk : Syncthing-notifier.
Queles caractéristiques de ce dernier :

  • Un fichier python seul, les images sont intégrées à l'intérieur (base64). Ça facilite les mises à jour s'il y en a.
  • Notifications affichées sur le même système que Nobelium.
  • Alerte en cas de nouveau partage disponible.
  • Alerte en cas de mise à jour disponible.
  • Clic gauche sur l'icône du systray pour afficher syncthing dans le navigateur.
  • Clic droit pour afficher une fenêtre de dialogue afin de quitter l'outi.

Il reste peut-être des bugs, mais je laisse ça en ligne pour permettre à chacun de proposer ses améliorations. Normalement, ce n'est pas bien compliquer d'en ajouter si vous en avez besoin.

Allez, au travail maintenant.

Je bosse sur des bouts de code en ce moment, et dans une application, je voulais proposer des notifications.
Après avoir modifié des bouts de code trouvés ci et là, j'ai pensé que ça pourrait tout aussi bien faire office de remplaçant à notify-send ou autre notifier basé sur GTK ou autre : Nobelium était né.
Ce dernier se base sur tkinter, c'est donc très léger. Il affiche un message à l'emplacement souhaité de l'écran, peut contenir des images, il est animé et ses couleurs peuvent être modifiées.

Vous trouverez le code sur framagit : https://framagit.org/Thuban/No

Voici à quoi il ressemble :

alt

alt

À titre d'exemple, j'ai utilisé ce code pour écrire un démon qui m'envoie des notifications sur ce que mon lecteur de musique MPD joue que j'ai appelé Mn.
Voici ce que ça donne :

alt

Enjoy ;)