Le problème : aucun lecteur ne cochait toutes les cases

Je voulais un lecteur de musique de bureau sous Linux qui ressemble à Spotify dans l’esprit, mais avec exactement les fonctionnalités que j’avais en tête. Rien de délirant:
- 🎵 Moteur audio GStreamer — pipeline
playbin → pulsesinkdirect, sans bin intermédiaire, pour une lecture sans craquements ni distorsion - 💿 Affichage vinyle animé
- 📀 Grille d’albums avec scrollbar cliquable et défilement fluide
- 🖼️ Pochettes d’album avec cache Cairo pré-converti pour un rendu rapide
- 🔍 Recherche de pochettes en ligne
- 📊 Barre de progression dessinée en Cairo (
Gtk.DrawingArea), plus légère et plus réactive qu’unGtk.Scale - ⌨️ Support des touches multimédia via un service MPRIS2 (D-Bus)
- 📚 Gestion de bibliothèque musicale (scan, base de données SQLite, métadonnées via mutagen)
- 🖱️ Menus contextuels :
- sur les pochettes : ajouter en favori, rechercher une pochette, infos artiste (Wikipédia)
- sur les pistes : ajouter en favori, paroles, infos fichier, vidéo YouTube
- ⚡ Chargement parallèle des pochettes (
ThreadPoolExecutor, 8 workers) - 🔤 Troncature intelligente des noms courts (AC/DC, Led Zeppelin, etc.)
J’ai testé une bonne partie de l’écosystème Linux : les lecteurs “tout en un” étaient soit trop lourds, soit trop datés dans leur interface, soit limités sur la gestion de bibliothèque. Ceux qui étaient beaux n’avaient pas la recherche de pochettes en ligne. Ceux qui géraient bien les métadonnées avaient une interface d’un autre âge. Aucun n’avait ce mélange précis de fonctionnalités que j’avais en tête, et je n’avais pas franchement envie de faire des compromis sur un outil que j’allais utiliser tous les jours.
Le projet s’appelle Galettify. Le nom n’a pas de grande signification cachée, mais il sonne bien à côté de Spotify, et il a l’avantage de ne pas se prendre au sérieux.
Ce que Galettify fait aujourd’hui
Après plusieurs sessions de vibecoding, voici où en est le projet :
Lecture audio
Le moteur repose sur GStreamer, avec un pipeline playbin → pulsesink en connexion directe. J’ai appris à mes dépens qu’ajouter un bin de conversion audio intermédiaire entre les deux introduit des craquements, donc le pipeline reste volontairement minimal.
Interface et rendu
L’interface est en GTK4 (via PyGObject), avec des éléments graphiques faits main en Cairo là où les widgets standards ne suffisaient pas : la barre de progression, par exemple, n’est pas un Gtk.Scale classique (qui ralentissait la synchronisation avec l’audio) mais une zone de dessin Cairo entièrement personnalisée.
Bibliothèque musicale
La bibliothèque est scannée depuis un dossier local, indexée dans SQLite, avec les métadonnées extraites via mutagen. Les pochettes sont mises en cache sous forme de surfaces Cairo pré-converties, et chargées en parallèle (via un pool de threads) pour que le scan initial ne bloque pas l’interface.
Pochettes et recherche en ligne Fini les pochettes manquantes ou moches : Galettify permet de rechercher et remplacer une pochette directement depuis un menu contextuel sur l’album.
Menus contextuels
- sur un album : favoris, recherche de pochette, infos artiste (Wikipédia)
- sur une piste : favoris, paroles, infos fichier, recherche de vidéo (YouTube)
Intégration système Un service MPRIS2 (D-Bus) permet de contrôler la lecture avec les touches multimédia du clavier, comme n’importe quel lecteur “sérieux” sous Linux.
Petits détails qui comptent Une fonction dédiée gère la troncature intelligente des noms d’artistes courts (AC/DC, Led Zeppelin…) pour éviter l’affichage tronqué façon “AC/D…” qui m’agaçait ailleurs.
https://github.com/le5emeaxe/Galettify
Galettify est un projet personnel, développé sous Linux avec PipeWire.