Galdr, le player audio TUI que je ne trouvais pas ailleurs
Sommaire
J’écoute beaucoup de musique en travaillant et je passe déjà l’essentiel de ma journée dans un terminal. L’idée d’un player audio TUI semblait donc assez naturelle : lancer une commande, retrouver ma bibliothèque, choisir un album au clavier et revenir au code sans changer de contexte.
Les players en terminal ne manquent pas. J’en ai essayé plusieurs, parfois très complets, parfois volontairement minuscules. Pourtant, je ne trouvais pas vraiment mon bonheur. Il me manquait toujours quelque chose dans l’équilibre général : une navigation qui me paraisse immédiate, une interface agréable dans mon terminal, une vraie gestion de la file d’attente ou une intégration propre avec mon environnement Linux.
Je ne voulais pas construire le player audio universel. Je voulais construire le mien.
C’est comme cela qu’est né Galdr, un player audio local, rapide et piloté au clavier, écrit en Go.
Partir de ma bibliothèque, pas d’un service
Galdr commence dans ~/Music. Il parcourt les dossiers, lit les métadonnées disponibles et organise les morceaux par artiste et par album. Quand un tag manque, il se rabat sur le nom du fichier. Ce n’est pas spectaculaire, mais cela garantit qu’un morceau reste toujours identifiable.
Le périmètre est volontairement réduit aux fichiers MP3, FLAC et WAV. Il n’y a pas de streaming, de compte à créer, de synchronisation cloud ou de catalogue distant. Galdr ne télécharge rien et ne lance pas de daemon en arrière-plan. Ma bibliothèque existe déjà sur mon disque, le player n’a pas besoin de prétendre qu’elle vit ailleurs.
Je n’ai pas non plus ajouté de base de données ou de cache persistant pour l’indexer. Le scan doit être assez rapide pour être refait, et les playlists sont de simples fichiers M3U8 lisibles avec un éditeur de texte. La file d’attente, elle, reste un espace de travail temporaire. Charger une playlist puis déplacer quelques morceaux ne réécrit pas silencieusement le fichier d’origine.
Cette approche impose quelques limites, mais elles sont faciles à comprendre. Si j’ajoute de la musique, je relance un scan. Si je veux sauvegarder une sélection, je l’enregistre explicitement. Il y a peu d’état caché et, pour un outil personnel, c’est une qualité que j’apprécie de plus en plus.
Une TUI simple à regarder, moins simple à construire
L’interface de Galdr repose sur Bubble Tea, une implémentation de l’architecture Elm pour les applications en terminal. Les messages décrivent ce qui vient de se passer, la fonction de mise à jour fait évoluer l’état, puis la vue est recalculée. Ce modèle convient particulièrement bien à une application qui doit réagir en même temps au clavier, au redimensionnement du terminal, à la progression du morceau et aux événements du moteur audio.
Bubbles fournit quelques composants, notamment les champs de saisie utilisés pour la recherche et les playlists. Lip Gloss gère le style et la composition de l’interface.
Le résultat est organisé autour de trois panneaux : la bibliothèque, les morceaux et la file d’attente. Sur un terminal étroit, Galdr réduit progressivement cette disposition jusqu’à n’afficher que le panneau actif. Je voulais que l’interface reste utilisable dans une grande fenêtre comme dans un split un peu trop optimiste.
Le thème suit automatiquement celui d’Omarchy lorsqu’il est disponible. Sinon, Galdr reprend la palette ANSI du terminal. Il fonctionne aussi avec seize couleurs ou sans couleur. L’objectif n’était pas de dessiner une interface parfaite uniquement sur ma machine, mais de conserver une hiérarchie lisible quand le terminal décide de participer à la direction artistique.
Confier l’audio à un vrai moteur audio
Je tenais à écrire l’application en Go, mais pas à réimplémenter un décodeur MP3 pour le plaisir de souffrir. La lecture est donc confiée à mpv et plus précisément à libmpv, chargé par le binding go-mpv.
Ce choix permet à Galdr de s’appuyer sur la pile audio déjà présente sous Linux, que ce soit PipeWire, PulseAudio ou ALSA. Il apporte aussi une base solide pour la lecture gapless, le seek, le volume et ReplayGain. Galdr garde le morceau courant et son successeur dans la playlist de libmpv, ce qui évite d’introduire lui-même une coupure entre deux pistes compatibles.
Les métadonnées MP3 sont lues avec dhowden/tag. Pour les informations propres aux fichiers FLAC, j’utilise mewkiz/flac. La configuration optionnelle est un petit fichier TOML analysé avec BurntSushi/toml.
Ce partage des responsabilités me plaît bien. Galdr décide quoi jouer et comment le présenter. libmpv s’occupe de transformer les fichiers en son sans que je réinvente une décennie de travail sur les codecs et les sorties audio.
Les pochettes ANSI, une fonctionnalité rigoureusement indispensable
Dans le document de départ du projet, j’avais classé les pochettes d’album dans la section « pas pour le MVP ». C’était une décision raisonnable. Elle n’a donc pas tenu.
Un player audio fonctionne parfaitement sans afficher une image de huit caractères de large dans un terminal. Cela ne rend pas le son meilleur, ne facilite pas vraiment la navigation et ne résout aucun problème important. En revanche, voir apparaître une minuscule pochette colorée à côté du morceau en cours rend l’application immédiatement plus attachante. Certaines fonctionnalités justifient leur existence par la productivité. Celle-ci la justifie par un petit sourire.
Galdr cherche un fichier cover.jpg, cover.jpeg ou cover.png à côté des morceaux. L’image reste locale et n’est jamais téléchargée. Elle est réduite puis rendue avec le caractère ▀. La couleur du pixel supérieur devient la couleur du texte, celle du pixel inférieur devient la couleur de fond. Une seule cellule du terminal représente ainsi deux pixels verticaux, ce qui compense un peu les proportions naturellement étranges des caractères.
Le résultat est techniquement une approximation grossière de la pochette. C’est aussi exactement ce qu’il fallait.
Rester dans le terminal sans disparaître du bureau
Une application TUI ne devrait pas devenir invisible pour le reste du système. Galdr expose donc des contrôles MPRIS via godbus/dbus.
Les touches multimédias, playerctl, une barre de statut ou un écran de verrouillage peuvent connaître le morceau en cours et piloter la lecture. Si aucune session D-Bus n’est disponible, Galdr continue simplement de fonctionner dans le terminal.
C’était un point important pour moi. Je voulais la sobriété d’une TUI, pas renoncer aux interactions normales d’un player de bureau. Je peux lancer un album dans un terminal, passer au morceau suivant avec mon clavier et retrouver les métadonnées sur mon écran de verrouillage sans ajouter un service spécifique à Galdr.
Un outil personnel devenu un projet libre
Galdr a d’abord été construit pour ma bibliothèque, mon terminal et ma manière d’écouter de la musique. Le préparer pour une publication libre m’a obligé à rendre ces préférences moins fragiles : gérer plusieurs tailles de terminal, expliquer les dépendances, prévoir les erreurs de fichiers, tester la logique audio sans matériel et fournir des paquets pour plusieurs distributions.
Le projet reste volontairement centré sur Linux et la musique locale. Il ne cherche pas à remplacer Spotify, mpv ou tous les players existants. Il cherche à être un bon outil pour quelqu’un qui possède ses fichiers, aime son clavier et trouve tout à fait normal qu’une pochette d’album soit composée de petits blocs colorés.
Galdr est disponible sous licence MIT. Les retours, rapports de bugs et contributions ciblées sont les bienvenus.
Galdr Un player audio TUI rapide, local et pensé pour être piloté au clavier sous Linux. github.com/kvitrvn/galdr