URL: https://linuxfr.org/users/superzen/journaux/taliesin-serveur-de-streaming-audio Title: Taliesin, serveur de streaming audio Authors: Babelouest Date: 2017年12月15日T02:20:38+01:00 License: CC By-SA Tags: streaming, langage_c, rest, libav, reactjs et c Score: 19 Dernier né de mon interface chaise-clavier, le besoin est de pouvoir écouter de n'importe où la musique que je stocke et classe amoureusement depuis longtemps. D'autant plus que je me refuse toujours à prendre des abonnements auprès des services payants comme Spotify ou [Google|Apple] Music. Également, je souhaite pouvoir déporter la lecture des flux audio sur des lecteurs externes comme VLC, ainsi que les différents Raspberry PI qui peuplent ma demeure et qui hébergent entre autres un service MPD. Depuis quelques années, je combinais l'utilisation de liquidsoap/icecast pour me faire une webradio de toute ma musique, et également subsonic pour écouter ma musique à la demande. Les deux ont rempli leur rôle avec plus ou moins de succès, mais avec le temps, j'ai eu envie d'avoir un système de webradio plus souple, et également de pouvoir jouer la musique que je veux dans chaque pièce de la maison. Voilà donc le fruit de mon labeur, un logiciel que j'ai appelé Taliesin, emprunté au nom d'un barde (entre autres choses) dans la mythologie celtique et la légende arthurienne. Il transcode en temps réel la musique qu'on lui demande de lire et balance tout ça dans un flux http au format qu'on lui aura demandé. Il se base sur [libav](https://libav.org/) pour la partie audio, le truc qu'on trouve sous ffmpeg notamment, ainsi que [Ulfius](https://github.com/babelouest/ulfius) dont j'avais [déjà parlé ici](https://linuxfr.org/users/superzen/journaux/ulfius-framework-pour-faire-des-api-web-en-c), qui s'occupe de la partie serveur HTTP et [Hoel](https://github.com/babelouest/hoel/) qui s'occupe de l'accès à la base de données (MariaDB ou SQLite3). Il ne s'occupe pas d'authentification parce qu'il préfère laisser ça à ceux qui savent le faire, et mange donc du token OAuth2 JWT qu'un [Glewlwyd](https://github.com/babelouest/glewlwyd) par exemple peut fournir pour s'assurer que l'utilisateur a bien le droit de lui parler. Il peut aussi fonctionner sans authentification si c'est vraiment ce que tu veux, mais gaffe. Seuls les flux audio en tant que tels n'utilisent pas de token OAuth2 pour l'authentification. En effet, les divers lecteurs qui sont capables de lire des flux comme VLC, MPD ou même la balise du HTML5 ne savent pas gérer des tokens dans le header HTTP à ma connaissance. Pour pallier ça, un flux audio possède une URL générée aléatoirement sur une chaîne de 32 caractères alphanumériques, genre `http://localhost:8576/api/stream/abcdefghijkLMNOPQRSTUV0123456789/`. Je me dis qu'avec environ 62^32 = 2x10^57 URL à tester, ça va prendre du temps à une personne malintentionnée pour en deviner... Il sait lire tous les formats que connait libav, et il peut transcoder en mp3, ogg/vorbis ou flac, dans divers bitrates ou fréquences. Il propose deux types de flux audio: - La webradio: Tu lui demandes de te lire un ensemble de fichiers, et il t'envoie ça dans un flux qui a une url unique et en continu, comme une webradio, ça gère plusieurs utilisateurs simultanés et ça envoie même le titre via les métadata ICY, mais pour des raisons techniques, ça ne peut t'envoyer que du mp3. Par contre, à la différence d'un Icecast, il se met en pause s'il n'y a aucun client qui écoute le flux. - le jukebox: tu lui demandes de te lire un ensemble de fichiers, mais c'est toi qui dit ce que tu veux lire et quand, et donc chaque fichier a une URL unique, de la forme `http://localhost:8576/api/stream/abcdefghijkLMNOPQRSTUV0123456789/?index=42`. Taliesin est capable de lire les métadonnées (artiste, album, etc.) dans les fichiers, sauf les ogg, pour une raison qui m'échappe encore. Il sait aussi lire et afficher les images des fichiers audio. Taliesin est multi-utilisateurs avec un niveau administrateur et un niveau utilisateur, l'idée derrière ca est de permettre de partager des bibliothèques de musique entre les utilisateurs mais en évitant qu'une mauvaise manipulation d'un utilisateur supprime des bibliothèques ou des playlists partagées par exemple. Il n'y a pas de contrôle de ressources utilisées, tous les utilisateurs peuvent lire autant de flux qu'ils veulent en même temps, créer autant de playlists qu'ils souhaitent, etc. Je pars du postulat de base que les utilisateurs sont amicaux avec le service et ne lui veulent pas du mal. Ça tourne plutôt bien sur une petite machine, j'ai fait quelques tests avec un Raspberry PI Zero et ça gérait ça assez bien ma foi. Il roulait avec une clé Wifi et les fichiers audio étaient accédés via NFS sur mon NAS dans le même réseau local, et je n'ai pas observé de problèmes pour un utilisateur unique. L'API est écrite en C, sous licence GPL V3, le client web est en ReactJS, sous licence MIT. Plus tard, Taliesin pourra peut-être aussi lire des videos, et même envoyer un flux sur un icecast, un vrai, avec lequel on pourra choisir son format de sortie pis toute. Pour l'instant je me concentre sur finir la version 1.0, il reste des bugs dans l'interface et dans l'API avant que ce soit fini. L'URL du projet sur GitHub: [https://github.com/babelouest/taliesin](https://github.com/babelouest/taliesin)