Journal Taliesin, serveur de streaming audio

Posté par (page perso) . Licence CC by-sa.
19
15
déc.
2017

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 pour la partie audio, le truc qu'on trouve sous ffmpeg notamment, ainsi que Ulfius dont j'avais déjà parlé ici, qui s'occupe de la partie serveur HTTP et 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 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 6232 = 2x1057 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

  • # Plugin nextcloud presque dans le même genre

    Posté par . Évalué à 1.

    Pour les feignants qui auraient déjà un serveur Nextcloud sous la main, il y a un plugin pour streamer de la musique directement dessus. Mais c'est juste du streaming sans transcoding.

  • # Maintient de la synchro audio

    Posté par (page perso) . Évalué à 3.

    Tu parles de jouer dans chaque pièce de la maison.
    As-tu regardé pour t’assurer que si tu joues le même morceau il est bien synchronisé entre les lecteurs (vu que tu parles uniquement d’un flux HTTP, je suppose que non, tu envoies, le client se débrouille) ?
    Du coup, dans du multi-pièces, tu n’as pas des effets de son bizarre à cause du manque de synchro (l’oreille y est très sensible) ?

    • [^] # Re: Maintient de la synchro audio

      Posté par (page perso) . Évalué à 4.

      Comme c'est un flux http, si on l'écoute en même temps sur plusieurs clients, il a peu de chances d'être synchronisé suffisamment pour qu'on n'entende pas d'effet de son bizarre. Ce n'est d'ailleurs pas mon but.

      Par contre, de la manière dont c'est programmé, si plusieurs clients écoutent le même flux webradio, ils n'auront pas beaucoup de décalage parce qu'un nouveau client lorsqu'il se connecte est positionné à peu près sur le temps courant de la musique qui est en train d'être jouée.

      J'ai un peu réinventé la roue pour la partie webradio parce que Icecast fait ca très bien déjà, mais c'était cool à faire, ca répond à mes besoins et ca m'a appris plein de trucs sur le transcodage.

  • # mpd compatible ?

    Posté par (page perso) . Évalué à 3.

    Est-ce que la partie web peut diffuser en continu un flux mpd ?
    Car j'ai un mpd qui diffuse en webradio, mais sous windows je n'ai trouvé que VLC capable de lire le flux. Et j'ai toujours eu envie de m'abstraire de l'application et pouvoir écouter ma radio directement via un navigateur.

  • # squeezebox

    Posté par . Évalué à -1.

    C'est pas mal comme projet mais au risque de troller, quelle différence avec un serveur squeezebox?

    • [^] # Re: squeezebox

      Posté par (page perso) . Évalué à 3.

      Ben je connais pas trop les squeezebox mais de ce que j'ai compris il te faut héberger sur une machine le programme qui va streamer la musique sur ton squeezebox.

      Taliesin n'a pas besoin de squeezebox, tu peux écouter la musique sur la même machine, sur une autre qui héberge un MPD, ou encore sur le téléphone ou la tablette avec laquelle tu accède à l'application par exemple, donc écouter la musique que tu as chez toi alors que tu es dans le métro, au boulot, ou au dodo…

  • # Sujet intéressant

    Posté par (page perso) . Évalué à 4.

    Journal bien écrit et qui donne envie d'essayer, merci !

    Du coup, j'ai relayé l'info sur linuxmao.org car ça peut en intéresser quelques uns là bas.

    Bonne continuation.

    https://librazik.tuxfamily.org - http://linuxmao.org - https://liberapay.com/trebmuh

  • # 62**32 = 2E57

    Posté par . Évalué à 3. Dernière modification le 17/12/17 à 22:45.

    Tu as inversé les chiffres dans la formule.

    Moyen mnémotechnique : un cadenas à chiffres avec trois positions, on sait que ça fait les nombres entre 0 et 999, soit mille possibilités => 10**3=1000 et pas 3**10=59049.

    Donc 62 "chiffres", et 32 positions => 62**32=2E57 et pas 32**62=2E93.

  • # Vers un ampli ?

    Posté par (page perso) . Évalué à 1.

    Je suis néophyte en ce domaine, et je cherche comment équiper mon nouveau serveur pour la diffusion de musique (voire films) sur mon ampli A/V.

    A priori, ton logiciel a l’air super intéressant (même s’il ne fait pas la vidéo pour l’instant), mais je ne vois pas trop comment ça se passe pour aller vers l’ampli… Tu parles de diffusion HTTP, mais n’y a-t-il pas aussi la possibilité d’une sortie via le chipset son de la machine ?

    • [^] # Re: Vers un ampli ?

      Posté par (page perso) . Évalué à 2.

      n’y a-t-il pas aussi la possibilité d’une sortie via le chipset son de la machine ?

      Alors oui, mais indirectement, Taliesin ne s'occupe que fournir un flux http pour écouter la musique.
      Dans mon cas, ce sont des RPi qui font tourner des serveurs MPD qui me permettent d'écouter la musique. Concrètement, c'est le serveur MPD lit le flux http de Taliesin et le balance sur la sortie son de la machine.

      L'avantage de MPD est qu'il possède une API qui permet de le contrôler à distance, ce que j'ai fait sur Angharad et que j'ai amélioré récemment pour tenir compte justement des nouveaux besoins de Taliesin.

      Cela dit, si ton besoin est uniquement de pouvoir contrôler ce que tu écoutes sur ton serveur, installer les versions complètes de Glewlwyd/Angharad/Taliesin risquent d'être un chouïa long et overkill, alors qu'il est déjà possible de le faire de manière plus simple, bien que non sécurisée, mais si ca ne sort pas de chez toi, c'est moins grave.

      Je posterai prochainement une documentation pour installer un serveur plus minimaliste mais plus simple.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.