patrick.ostertag

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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

nowplayingd en plein écran : grande pochette à gauche, « en écoute », le titre Background Process, Les Démons · tail -f /dev/music, deux lignes Wikidata, un haïku dont une lettre sur deux gonfle comme le Dock, et en bas deux cartes de coulisses, Wikipédia et Last.fm. Signature $ nowplayingd en bas à gauche.
le plein écran · morceau, groupe et pochette inventés pour la démo : aucune œuvre sous droits sur les captures

ls captures/

Apple TV · le plein écran au salon
Apple TV · le plein écran au salon
Apple TV · les coulisses, d'un geste vers le bas
Apple TV · les coulisses, d'un geste vers le bas
iPhone · ce qui joue, et son genre
iPhone · ce qui joue, et son genre
Mac · le plein écran
Mac · le plein écran
Apple TV · genres et sous-genres du mois
Apple TV · genres et sous-genres du mois
Apple TV · l'artiste en pleine page
Apple TV · l'artiste en pleine page
iPhone en paysage · plein écran
iPhone en paysage · plein écran
iPad · un écran de salon
iPad · un écran de salon
iPhone · l'historique, avec les genres
iPhone · l'historique, avec les genres
Apple TV · les albums du mois
Apple TV · les albums du mois
iPhone · les statistiques d'écoute
iPhone · les statistiques d'écoute
Mac · la barre des menus
Mac · la barre des menus
Apple TV · l'horloge des écoutes
Apple TV · l'horloge des écoutes

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 :

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.

Architecture de nowplayingd : sources, centrale, écrans Enceintes Sonos UPnP · événements Apple Music · Spotify ce Mac Last.fm · ListenBrainz écoutes d'ailleurs Bases ouvertes Wikidata · MusicBrainz · LRCLIB Mac mini --hub haïku (Apple Intelligence) · paroles · coulisses traduction sur l'appareil · seul à scrobbler Scrobbles Last.fm · ListenBrainz Partage Mastodon · Bluesky _nowplayingd._tcp · WebSocket · réseau local iMac --display en service MacBook --display en service Apple TV Salon en bêta Apple TV Chambre en bêta Apple TV Bureau en bêta Apple TV Cuisine en bêta iPhone bêta en bêta iPad bêta en bêta Apple TV : suit sa pièce Sonos, lit seule Sonos et Last.fm si la centrale est absente en service
architecture · la centrale et ses écrans, aujourd'hui et demain

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.

Zoom lent
Bascule 3D
Halo ambré
Reflet
Vinyle
Damier
Pulsation
Balancier
Volte
Arc-en-ciel
Aberration
Écran CRT
Stores
Ondes
Projecteur
Glitch

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.

Sources

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.

Barre des menus

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.

Plein écran · ⌥⌘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.

Apple Intelligence

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.

Option · touche 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.

Optionnel · désactivé au départ

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.

Partage · ⇧⌘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 ».

36 langues

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.

Vie privée

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

Le plein écran sur un iMac : pochette, titre, haïku, deux cartes de coulisses (Wikipédia et Wikidata) et, à droite, la colonne des dernières écoutes, avec des groupes inventés comme Kernel Panic Orchestra ou The Cron Jobs.
sur un iMac, avec l'historique en colonne
Le menu de la barre : $ nowplayingd --now-playing, le morceau en cours joué par Sonos au salon, six dernières écoutes datées, puis Plein écran, Rafraîchir maintenant, Réglages et Quitter.
le menu

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

  1. 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.

  2. 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.