patrick@fribourg:~$ man nowplayingd
nowplayingd
Un scrobbler et un visualiseur de musique, pour profiter au maximum de l'écoute.
Un daemon qui fait un tail -f sur ma musique : il écoute toutes mes
sources en tâche de fond, des enceintes du salon à l'iPhone dans le train, note chaque écoute
sur Last.fm et ListenBrainz, et la met en scène : pochette animée, coulisses, paroles en rythme
et un haïku écrit pour le morceau. Sur le Mac, l'iPhone, l'iPad et la télé.
statut : bêta version : 1.0 bêta, pas encore sur l'App Store → je cherche des bêta-testeurs éprouvé au quotidien : Sonos et Apple Music prérequis : un compte Last.fm (gratuit) système : macOS 26, iOS 26, iPadOS 26, tvOS 26
nowplayingd --help
Le mode d'emploi, en six étapes. Prérequis : un compte Last.fm, gratuit. C'est là que nowplayingd scrobble, et c'est par lui que l'iPhone et l'Apple TV savent ce qui joue quand la centrale n'est pas là. ListenBrainz, Mastodon et Bluesky sont en option. Pour scrobbler tes enceintes Sonos, il faut un Mac : l'iPhone, l'iPad et l'Apple TV les affichent, mais c'est le Mac qui les écoute en continu et envoie les écoutes à Last.fm.
- Installer. Rejoindre la bêta sur TestFlight, puis installer nowplayingd sur le Mac, et si tu veux sur l'iPhone, l'iPad et l'Apple TV.
- Démarrer sur le Mac. L'assistant te guide : connecter Last.fm (et ListenBrainz), choisir tes sources (enceintes Sonos, Apple Music, Spotify). nowplayingd vit ensuite dans la barre des menus.
- Faire du Mac la centrale. Réglages → Rôle → Centrale, si le Mac reste allumé : c'est lui qui écoute, scrobble (Sonos compris) et publie pour les autres écrans. La centrale empêche le Mac de se mettre en veille tout seul ; Mac éteint (ou MacBook refermé), les écoutes Sonos de ce moment-là ne sont pas scrobblées.
- Jumeler les écrans. Sur l'iPhone, l'iPad ou l'Apple TV, sur le même Wi-Fi : ouvrir nowplayingd, choisir la centrale et taper le code à 6 chiffres affiché sur le Mac. Une seule fois.
- Regarder. Sur le Mac, ⌥⌘N ouvre le plein écran. Sur l'iPhone ou l'iPad, le bouton plein écran, ou tourner l'appareil. L'Apple TV est toujours en plein écran ; la télécommande montre les commandes.
- Partager et partir. Le bouton partager publie le morceau sur Mastodon ou Bluesky (en un clic à la maison, par la centrale). Loin de la maison, l'iPhone scrobble lui-même ce que joue Apple Music.
Astuce Spotify sur iPhone. iOS ne laisse aucune app lire ce que joue Spotify. Le plus simple : relier Spotify à Last.fm dans Spotify même (Réglages → Apps → Last.fm). Spotify scrobble alors lui-même, et nowplayingd affiche le morceau via Last.fm, mais sans la position dans le morceau (ni compte à rebours, ni paroles synchronisées). Sur le Mac et sur les enceintes Sonos, Spotify est lu et scrobblé directement.
ls captures/
Morceau, groupe et pochettes inventés pour la démo : aucune œuvre sous droits. Touchez une image pour l'agrandir.
nowplayingd --everywhere
Le scrobbler écoute tout ; le visualiseur montre tout. Les deux moitiés de nowplayingd tiennent dans chaque appareil, chacun à sa façon :
- Mac : la barre des menus, et le mur « en écoute » en plein écran (⌥⌘N).
- iPhone : à la maison, l'écran de la centrale ; en 5G, ce que joue l'iPhone lui-même, et le scrobble d'Apple Music, bibliothèque et streaming. Des widgets sur l'écran d'accueil, l'écran verrouillé et en mode En veille, la pochette animée d'une minute à l'autre.
- iPhone et iPad en paysage : l'écran partagé, le morceau d'un côté, les paroles et les coulisses de l'autre ; un bouton ouvre le plein écran du Mac, tel quel.
- iPhone Duo : replié, un iPhone ; déplié, l'écran se partage de part et d'autre du pli.
- Apple TV : le plein écran au salon, commandé à la télécommande.
last.fm --stats
Mes statistiques d'écoute, comme sur la page musique, sur chaque écran. Les artistes et les albums du mois, l'horloge des écoutes, les pièces où ça joue et la radio en fond. Les deux dernières, aucun service ne les connaît : c'est la centrale qui tient le journal. Et de temps en temps, dans le plein écran, une page de statistiques passe en diaporama.
cat ORIGINE.md
Tout est parti du cadre « en écoute » de l'accueil de ce site. Un collecteur Python, sur le Mac mini, demande toutes les 30 secondes à Last.fm ce qui joue, écoute les enceintes Sonos de la maison, cherche l'artiste dans Wikidata et fait écrire un haïku sur le morceau. Le trajet complet est dans les coulisses, et ce que tout cela laisse comme traces, sur la page musique.
nowplayingd, c'est ce cadre devenu une vraie app Mac : sans Docker, sans collecteur, sans serveur, et pour n'importe qui, pas seulement pour mon compte Last.fm. Mêmes couleurs, même Nunito pour les titres, même ambre.
nowplayingd --role
Un Mac travaille, les autres affichent. Dans Réglages → Rôle, un Mac mini toujours allumé devient la centrale : il lit toutes les sources, trouve les paroles et les coulisses, écrit le haïku, et il est le seul à scrobbler, donc rien n'est jamais envoyé deux fois. L'iMac et le MacBook deviennent des écrans : ils affichent ce que la centrale publie, barre des menus et plein écran compris, et lui renvoient lecture, pause, suivant et « J'aime ».
Sous le capot : Bonjour (_nowplayingd._tcp) pour trouver la centrale, un
WebSocket qui pousse chaque changement, un code à six chiffres tapé une fois pour l'appairage, puis
une clé gardée au trousseau. La centrale démarre à l'ouverture de session, garde le Mac éveillé et
écrit une preuve de vie chaque minute. Si elle se tait, un écran reprend ses propres sources, sans
jamais scrobbler. Ni compte ni cloud : réseau local seulement. Le même principe que l'Agence de
fornews.ai, et que le cœur de Roon.
nowplayingd --fx
Le plein écran ne tient jamais en place. Pendant l'écoute, la pochette passe par seize effets, un toutes les vingt secondes, en repassant par le neutre entre deux : zoom lent, bascule 3D, halo ambré, reflet, vinyle qui tourne derrière la pochette, damier dont des cases pivotent au hasard, pulsation, balancier, volte, arc-en-ciel, aberration chromatique, écran cathodique, stores vénitiens, ondes, projecteur et glitch. Le point de départ change à chaque morceau.
Tout l'écran s'y met : une onde ambrée part de la pochette et l'image décroche à chaque nouveau morceau, une bande de lumière balaie l'écran toutes les deux minutes, l'ensemble respire très légèrement, et une ambiance de fond à la fois dérive derrière le cadre : poussière de vinyle, aurore, constellation ou écran cathodique. À la pause, l'écran s'éteint comme un vieux téléviseur, puis passe en noir et blanc assombri jusqu'au retour de la musique.
Nouveau aussi : un compte à rebours à la milliseconde (-03:44.588) à côté
d'une barre ambrée, et lecture, pause, suivant qui apparaissent en bas quand on bouge la souris.
Chaque effet se coupe dans les réglages, et tous s'arrêtent quand macOS réduit les animations.
sonos --subscribe
Les enceintes parlent les premières. La plupart des apps demandent aux enceintes Sonos ce qu'elles jouent toutes les quelques secondes, encore et encore, même quand rien ne change. nowplayingd s'abonne une fois aux événements UPnP de chaque enceinte du réseau, comme le fait l'app Sonos elle-même. Dès lors, ce sont les enceintes qui préviennent : pause, reprise, morceau suivant s'affichent en une fraction de seconde, et le réseau reste calme quand il ne se passe rien.
Sous le capot : un tout petit serveur HTTP sur le Mac, un SUBSCRIBE
au service AVTransport de chaque enceinte, un NOTIFY en retour à chaque
changement, renouvelé toutes les 30 minutes. La relève reste en filet de sécurité, toutes les
10 s. Réseau local seulement, ni compte ni cloud Sonos. Ci-dessous, le vrai journal de chez moi,
cet après-midi :
$ nowplayingd --verbose [17:49:24] sonos: événements attendus sur le port 49xxx [17:49:24] sonos: abonné aux événements de 192.168.1.x [17:49:24] sonos: premier événement reçu (192.168.1.x), relève espacée à 10 s [17:49:24] sonos: abonné aux événements de 192.168.1.x [17:49:24] sonos: abonné aux événements de 192.168.1.x … 9 enceintes [17:49:25] en écoute [sonos · Move 2]: The Young Gods — Toi du monde (Second Nature)
nowplayingd --verbose
Ce que fait la 1.0, en bêta : la liste peut encore bouger d'ici la sortie.
Tout ce qui joue
Les enceintes Sonos du réseau local, radio comprise : la station, son logo, et le morceau une fois reconnu. Apple Music et Spotify sur le Mac, avec la sortie audio (AirPlay, Bluetooth). Last.fm et ListenBrainz pour ce qui joue ailleurs.
Un coup d'œil
Le morceau en cours, sa pochette, la pièce ou la sortie audio, et l'historique de toutes les sources, dans l'ordre. Lecture, pause, suivant, Sonos compris, et « J'aime » sur Last.fm et ListenBrainz. Un widget, en trois tailles.
⌥⌘N
Les coulisses
Pochette géante, et en bas des cartes qui se relaient au hasard : extraits de Wikipédia, membres, studio et producteurs selon Wikidata, photo libre de Wikimedia Commons, années d'activité selon MusicBrainz, verso du vinyle par Cover Art Archive, artistes similaires de Last.fm. L'écran ne se met pas en veille pendant ce temps.
Un haïku par morceau
Écrit sur le Mac, dans ta langue (ou celle du morceau, au choix). Pendant l'écoute, une vague traverse ses lettres, comme le Dock sous le pointeur ; « Réduire les animations » la coupe. Sur le site, c'est Gemma 4 chez Infomaniak qui écrit les haïkus ; dans l'app, rien ne sort du Mac.
T
Les paroles
Synchronisées, ligne en cours en ambre, à l'écran une seconde environ après le début
du morceau : la recherche part avec la musique, la VO s'affiche d'abord et la traduction la rejoint
quelques secondes plus tard. La bonne version est choisie à sa durée (pas les paroles d'un live sur
la version studio). En VO, traduites sur le Mac, ou les deux, ligne sous ligne. [ et ] les décalent d'une demi-seconde, mémorisé par
morceau. Désactivées au départ : elles viennent de LRCLIB, une base communautaire, et
appartiennent à leurs auteurs.
Le scrobble, proprement
Vers Last.fm et ListenBrainz, une fois le morceau écouté à moitié (ou quatre minutes), envoyé à sa fin. Juste avant d'écrire, nowplayingd relit le compte : si une autre app (Plex, Sonos, Spotify) l'a déjà envoyé, même sous un titre un peu différent, il s'abstient. Hors ligne, les scrobbles attendent sur disque et repartent dans l'ordre.
⇧⌘M
Un post sur Mastodon ou Bluesky
Morceau, album, haïku, hashtags et pochette avec son texte alternatif, dans un aperçu modifiable, dans ta langue. Bluesky se connecte sans aucun mot de passe. Rien ne part sans un clic sur « Publier ».
Dans ta langue
De droite à gauche comprises. Wikipédia, Wikidata et les biographies suivent la langue choisie ; ce qui manque est traduit sur le Mac, avec la mention « Traduit sur l'appareil ». Les noms d'artistes, d'albums et de morceaux ne sont jamais traduits.
Aucune donnée collectée
Pas de compte chez moi, pas de pistage, pas d'analytique. Les identifiants restent dans le trousseau. nowplayingd ne parle qu'aux enceintes, aux services que l'on choisit et à des bases ouvertes qui ne voient que des noms d'artistes et d'albums.
tail -f /dev/music
otool -L nowplayingd
Pour celles et ceux qui codent : ce qu'il y a sous le capot, sans serveur ni dépendance tierce.
Le Mac, et rien d'autre
- Swift 6 et SwiftUI, concurrence stricte, macOS 26 minimum. Un
MenuBarExtra, sans icône dans le Dock. - Sonos en UPnP : découverte Bonjour (
_sonos._tcp), puis requêtes SOAP sur le port 1400 de chaque enceinte (GetTransportInfo,GetPositionInfo,GetMediaInfo), et abonnements aux événements UPnP (GENA) pour que les enceintes signalent elles-mêmes chaque changement. Ni compte ni cloud Sonos. - Rafraîchissement réglable : de 15 s à 5 min pour les services en ligne, de 3 s à 1 min sur le réseau local.
- Comptes au trousseau. Last.fm s'autorise dans le navigateur, sans mot de passe dans l'app.
L'IA sur l'appareil
- Foundation Models : le haïku est une structure
@Generable, trois vers, gardée en cache par morceau. Mac sans Apple Intelligence : pas de haïku, et pas d'erreur non plus. - Translation : paroles et biographies traduites sur le Mac, en un lot, gardées en cache.
- TextRenderer pour la vague du Dock : chaque glyphe du haïku est dessiné à part, grossi jusqu'à 1,7 fois et teinté d'ambre au passage, pendant que ses voisins s'écartent.
- Wikidata, MusicBrainz, Wikipédia : abstention en cas d'homonymes. Une source muette ou ambiguë ne donne aucune carte, plutôt qu'une carte fausse.
cat ROADMAP.md
-
Mac, iPhone, iPad, Apple TV · bêta
1.0 : tous les écrans
Sur l'App Store : gratuite au téléchargement, essai gratuit de 7 jours, puis achat unique de 5 CHF, à 2 CHF le premier mois, pour tous tes appareils. Pas d'abonnement. En bêta sur TestFlight ; reste à boucler : la soumission à Apple. Pas de date tant qu'Apple n'a pas dit oui.
Déjà dedans : une centrale, des écrans. Un Mac mini toujours allumé lit toutes les sources, écrit les haïkus et est le seul à scrobbler ; les autres Mac, l'iPhone, l'iPad (iPhone Duo compris) et l'Apple TV affichent ce qu'il publie. Loin de la maison, l'iPhone scrobble Apple Music lui-même ; widgets, plein écran sur la télé. Le même principe que l'Agence de fornews.ai.
-
plus tard
Et après
Les idées retenues, par priorité d'abord :
- Le vinyle et la radio reconnus (ShazamKit) : quand la source ne donne pas le titre, quelques secondes au micro suffisent pour l'afficher et le scrobbler. Puis le disque est retrouvé dans ta collection Discogs : ton pressage, son label, son année. Ou sans micro : tu choisis le vinyle que tu poses, et nowplayingd déroule la face.
- Siri, Raccourcis et Activité en direct : « Qu'est-ce qui joue au salon ? », la pochette et les paroles dans la Dynamic Island.
- Ton « Wrapped » chaque mois et en fin d'année, et la carte du monde de ton écoute (le pays de chaque artiste).
- Les crédits et notes de l'éditeur Apple Music dans les coulisses ; un visualiseur audio sur le Mac.
- Apple Watch, widgets interactifs ; décennies, réécoutes, découvertes du mois ; « il y a un an, tu écoutais… ».
- Un résumé « ma semaine en musique » sur Mastodon ; un mode soirée sur la télé : un QR code, et les invités suivent les paroles sur leur téléphone.
- Des thèmes d'affichage au choix (ambre, monochrome, couleurs de la pochette, néon, papier, haute lisibilité) et des mises en page (minimal, magazine, karaoké).
- iCloud : les écoutes du HomePod, de CarPlay et de la montre enfin scrobblées ; ce qui joue à la maison, visible partout ; ton journal d'écoute à toi dans iCloud Drive.
- Un économiseur d'écran pour le Mac, une fenêtre pour le Vision Pro, et des paroles sous licence à la place de LRCLIB.
nowplayingd --beta
Je cherche des bêta-testeurs. La bêta passe par TestFlight, l'outil d'Apple : gratuite, avec les mises à jour au fil de l'eau. Profil idéal : un Mac sous macOS 26, de la musique toute la journée, et si possible des enceintes Sonos, un compte Last.fm (indispensable), et si possible un compte ListenBrainz ou un Mac mini toujours allumé.
Pour participer, ouvre le lien public TestFlight sur ton Mac : testflight.apple.com/join/hjrvZzsT. Il s'ouvre dès qu'Apple a validé la bêta. Ce que j'attends : ce qui casse, ce qui manque, ce qui fait sourire, dans TestFlight ou en message privé sur Mastodon.
$ echo "Music is passion."
nowplayingd --version
Pas encore de lien App Store : la 1.0 est en bêta. C'est cette page qui fait foi, et je la mettrai à jour à chaque étape. L'aide et la confidentialité sont ici : aide · politique de confidentialité.
Une question, une enceinte qui ne remonte pas, une idée pour la feuille de route ? Le plus simple est de m'écrire sur Mastodon.