Deep Happy

Fonctions

Tout ce que fait Deep Happy aujourd'hui, énoncé en entier — pas les grandes lignes, la liste complète. Chaque point ci-dessous dit ce qu'il fait, où le trouver, et son réglage par défaut. Chaque fait ici est vrai de l'appli telle qu'elle est construite ; rien sur cette page n'est un projet pour plus tard.

Ce que c'est

Deep Happy est un lecteur natif macOS pour la radio internet, dans la barre de menus, écrit en Swift 6 avec SwiftUI et AppKit, et demandant macOS 26 ou ultérieur. Il n'a aucune dépendance tierce, aucun compte, rien où se connecter.

C'est un lecteur, pas l'appli d'un diffuseur : vous lui indiquez un flux, ou vous en cherchez un dans un annuaire, et il le joue. Sa raison d'être est la partie que la plupart des lecteurs de radio internet ratent — rester en lecture à travers les interruptions ordinaires de la journée d'un ordinateur portable — et son second tour est que le Mac qui joue peut être piloté depuis un autre Mac.

La version courte de tout cela est sur la présentation de Deep Happy ; les questions que les gens posent vraiment sont sur la page de foire aux questions.

Une lecture qui survit à la veille, à un VPN et à une connexion bloquée

Les lecteurs de radio internet échouent dans des situations ordinaires — un VPN qui se reconnecte, un écran d'ordinateur portable qui se rabat, une connexion qui se bloque sans le signaler — et l'échec habituel n'est pas un message d'erreur mais une appli qui affiche Playing sans qu'aucun son ne sorte. Deep Happy existe pour rendre ces situations invisibles : vous appuyez une fois sur Play et elle continue de jouer, ou elle dit honnêtement ce qui ne va pas.

Deux règles font l'essentiel du travail. Un changement de chemin réseau n'est jamais, en soi, une raison d'interrompre un flux qui produit toujours du son — ce qui décide, c'est si le son arrive toujours, pas ce que le système a annoncé. Et quand un flux a vraiment échoué, se rétablir veut toujours dire construire une connexion neuve : rien de bloqué n'est jamais relancé, repris ou déplacé dans l'espoir que ça revienne.

Vous entendrez peut-être un court silence pendant que cela se passe. Deep Happy n'est pas sans coupure et ne prétend pas l'être. Ce qu'elle promet, c'est que vous ne devriez jamais rester à regarder un Playing affiché sans aucun son.

Arrêter puis relancer est rapide aussi. Pendant une quinzaine de secondes après avoir appuyé sur Stop, l'appli garde le flux qu'elle jouait, si bien que Play le reprend aussitôt plutôt que de repartir à froid — instantanément, en pratique. Restez arrêté plus longtemps et Play se reconnecte à zéro, avec le temps que prend n'importe quel démarrage à froid.

Le panneau de la barre de menus et la ligne de statut de connexion

Cliquez sur l'icône de la barre de menus pour ouvrir le lecteur. Il affiche la station que vous écoutez, le morceau en cours, un bouton Play/Stop, et une ligne de statut sous le titre qui dit ce qui se passe vraiment — playing, connecting, l'attente du retour du réseau, reconnecting, ou l'impossibilité de joindre le flux. Vous n'avez jamais à deviner si ça fonctionne.

Tant qu'un flux n'a pas envoyé de titre de morceau, la ligne de titre affiche le nom de la station elle-même à la place.

Ajouter et gérer vos propres stations de radio

Le nom de la station se trouve en haut du lecteur, sous forme de puce pleine avec un chevron. Cliquez dessus et le lecteur devient la liste des stations ; le chevron en haut à gauche de la liste ramène le lecteur.

Chaque ligne est le nom d'une station avec, en dessous, ce que l'appli a réellement mesuré sur ce flux — quelque chose comme HLS · coussin de 25 s, ou Pas de fenêtre en direct · pas de coussin pour un flux où elle ne peut garder aucune mémoire tampon. Une station jamais jouée n'affiche aucune ligne, parce qu'on n'en sait encore rien. Une coche marque la station que vous écoutez ; cliquez sur une autre ligne pour changer, et le lecteur revient avec le nouveau nom dans la puce. Changer se connecte toujours à nouveau, si bien que vous entendez les quelques secondes de connexion habituelles plutôt que la mauvaise station.

Chaque ligne porte ses propres boutons crayon et corbeille, si bien que Renommer et Supprimer ne sont jamais à aller chercher ailleurs. Renommer ouvre les deux mêmes champs qu'Ajouter, déjà remplis avec le nom actuel ; le changer n'interrompt pas la lecture. Supprimer prend deux clics : le premier arme le bouton — il se remplit et prend la couleur d'accent — et le second supprime vraiment la station. Sélectionner une autre ligne, ouvrir un formulaire, ou quitter la page le désarme à nouveau, si bien qu'un bouton armé ne traîne jamais hors de vue. Le bouton Supprimer de la dernière station restante est atténué et ne fait rien, parce que le lecteur doit toujours en avoir une à jouer ; supprimer la station que vous écoutez vous bascule vers la première de la liste. Faites un clic droit sur une ligne pour les deux mêmes actions dans un menu, si vous préférez cela.

Sous les stations se trouve Add station…, qui ouvre deux champs sur place  : un nom de votre choix et l'adresse du flux, qui doit être une URL complète en http:// ou https://. Si l'adresse n'est pas utilisable par l'appli, elle le dit sous les champs et garde ce que vous avez saisi. La liste est stockée par machine, comme les autres préférences.

Trouver une station dans un annuaire ouvert

Sous Add station… se trouve Find a station…, pour quand vous n'avez pas déjà l'adresse d'un flux. Cela ouvre une page avec un champ de recherche : tapez le nom d'une station ou un genre et appuyez sur Retour, ou cliquez sur Search. Deep Happy interroge un annuaire ouvert de stations et liste ce qu'il trouve — chaque ligne affiche un nom raccourci au-dessus d'une ligne de ce que l'on sait réellement sur ce flux, comme MP3 · 128 kbps · DE. Cliquez sur une ligne, ou sur son +, pour ajouter cette station à votre liste ; vous revenez sur la liste des stations, avec elle dedans.

Saisir une adresse à la main fonctionne encore exactement comme avant. L'annuaire est une seconde entrée, pour quand vous connaissez un nom ou un genre plutôt qu'une URL — pas un remplacement de la première.

Une limite honnête : une station trouvée ainsi est en général d'un type dont l'appli ne lit pas encore de titre de morceau en direct, si bien que sa ligne de titre continue d'afficher le nom de la station et que les boutons de recherche restent atténués pour elle — comme n'importe quelle station avant sa première lecture.

Jouer dès le lancement, et le préchauffage silencieux

Deep Happy commence à jouer dès qu'elle se lance ; vous n'avez pas à cliquer sur Play juste pour avoir du son. Désactivez Play on launch dans Settings si vous préférez qu'elle vous attende.

Une fois désactivé, la touche de lecture matérielle peut ouvrir Apple Music au lieu de Deep Happy tant que vous n'avez pas appuyé une fois sur Play dans ce lancement — macOS envoie la touche à l'appli qui a fait du son le plus récemment, et une Deep Happy qui n'a pas encore joué ne détient pas cette place.

Toujours avec ce réglage désactivé, l'appli prépare quand même le flux en arrière-plan dès qu'elle démarre, si bien que votre premier Play prend environ une demi-seconde au lieu des neuf secondes ou plus que demande une connexion à froid. Vous ne voyez rien se passer — le lecteur affiche Stopped et le nom de la station, exactement comme il le ferait autrement. Cela coûte la même bande passante que jouer, donc c'est conservé deux minutes puis abandonné : appuyez sur Play dans ce délai et c'est instantané, plus tard et l'appli se connecte normalement.

L'icône de Dock optionnelle et la fenêtre du lecteur

Deep Happy n'a pas d'icône de Dock par défaut — l'élément de la barre de menus est l'appli entière. Activez Show Dock icon dans Settings si vous préférez une fenêtre  : cliquer sur l'icône ouvre alors, ou fait passer au premier plan, une fenêtre contenant exactement le même lecteur. La désactiver à nouveau est toujours sans risque, puisque l'élément de la barre de menus reste là quoi qu'il arrive.

La fenêtre est plus large que le panneau et disposée côte à côte : la pochette à gauche, en pleine force et sans rien écrit dessus, et le lecteur — station, morceau, Play/Stop, boutons de recherche, morceaux récents — en colonne à droite. La pochette n'est carrée qu'à la plus petite taille de la fenêtre ; agrandissez-la et la pochette s'élargit en un cadrage paysage, remplissant toujours l'espace qu'on lui donne. C'est le même lecteur que le panneau, les deux ne peuvent donc jamais raconter des choses différentes — la fenêtre a simplement la place de bien montrer l'image. Elle s'ajuste à ce qu'elle doit montrer, si bien qu'un long titre de morceau la rend plus haute au lieu d'être coupé. Ouvrez Settings depuis l'icône d'engrenage du lecteur, ou avec le raccourci standard ⌘,.

Copier l'artiste et le titre

Cliquez n'importe où sur le bloc artiste-et-titre et les deux sont copiés en une seule chaîne, Artist - Title — exactement ce que le flux a envoyé, prête à coller dans une recherche, une discussion ou une note. L'icône de copie se change brièvement en coche avec Copied à côté, sans masquer l'artiste ni le titre. Si le flux n'envoie aucun artiste pour un morceau, il n'y a simplement pas de ligne d'artiste, et le clic copie quand même le titre.

Rechercher un morceau, et la liste récente

À côté du morceau en cours se trouve un petit bouton Spotify — le seul service de recherche activé par défaut — et cliquer dessus ouvre une recherche navigateur pour ce morceau. Activez Apple Music ou Yandex Music dans Settings, sous Look up in, et leurs boutons le rejoignent ; désactivez les trois et la ligne disparaît. Les boutons sont atténués pendant que le lecteur affiche le nom de la station plutôt qu'un morceau, puisqu'il n'y a rien à rechercher.

Une liste Recent en dessous garde les trois derniers morceaux ; cliquez sur l'un d'eux pour le copier, ou faites un clic droit pour les mêmes choix de recherche.

Touches multimédias matérielles et Control Centre

Les touches lecture/pause et arrêt de votre clavier fonctionnent avec Deep Happy comme avec n'importe quel autre lecteur, et Control Centre affiche aussi le morceau en cours — y compris pendant une reconnexion, si bien que les touches continuent de piloter Deep Happy au lieu de basculer vers une autre appli.

Le volume et la sourdine sont ceux du système, pas de l'appli

Le curseur de volume est le volume système de la machine qui fait le son — celle-ci pendant que vous écoutez en local, la machine que vous pilotez quand ce n'est pas le cas. C'est le même réglage que vos touches de volume, Control Centre et toute autre appli sur ce Mac, si bien que baisser la radio baisse tout le reste avec elle, et qu'un curseur à zéro réduit toute la machine au silence. C'est une vraie conséquence, pas un détail : il n'y a pas de volume d'appli séparé derrière lequel se cacher.

Changez le volume avec les touches, la barre de menus ou une autre appli à la place, et le curseur suit — sur ce Mac et sur tout Mac qui le pilote. Deep Happy ne restaure jamais le volume d'une machine de son propre chef ; là où vous le laissez, il reste.

Le bouton en bout de ligne est la sourdine de cette machine, et c'est une chose séparée du curseur : mettre en sourdine laisse le volume où il était, si bien qu'ôter la sourdine remet le son exactement au niveau où vous l'aviez laissé. Mettez la machine en sourdine autrement — la touche sourdine, la barre de menus, une autre appli — et le bouton s'allume et le curseur s'atténue, si bien qu'un panneau affichant un curseur à 13 % ne vous laisse jamais vous demander pourquoi il n'y a aucun son. Appuyez dessus, ou sur m, pour ôter la sourdine. Cela compte surtout quand vous pilotez un autre Mac, où vous ne voyez pas l'incrustation de volume de cette machine. Un périphérique de sortie sans propre contrôle de sourdine — certains n'en ont pas — ne fait simplement jamais bouger le bouton ; l'appli note cela une fois dans son journal et laisse le périphérique tranquille.

Contrôle à distance : piloter Deep Happy sur un autre Mac

Deep Happy sur un Mac peut piloter Deep Happy sur un autre — lecture, arrêt, et voir ce qui joue — si bien que la machine avec les enceintes n'a pas à être celle devant laquelle vous êtes assis.

L'activer

Activez-le dans Settings → Remote, sous This Mac : le commutateur Allow remote control est désactivé par défaut, parce qu'une appli qui écoute le réseau sans qu'on le lui demande n'est pas quelque chose que ce projet livre. Une fois activée, la section en dessous montre comment ce Mac s'appelle et s'il écoute. La première fois que Deep Happy annonce ou découvre un service de contrôle à distance, macOS demande l'autorisation d'accès au réseau local — cette demande est normale, et sans elle le contrôle à distance ne trouvera pas l'autre Mac.

Le jumelage

Appuyez sur Show pairing PIN sur le Mac qui a les enceintes : quatre chiffres, un compte à rebours de deux minutes, et trois essais avant que la fenêtre se ferme et qu'un nouveau code PIN soit nécessaire. Sur le Mac depuis lequel vous voulez piloter, ouvrez Settings → Remote → Control another MacPair a new Mac…, choisissez le premier Mac dans la liste et saisissez les chiffres. Il apparaît alors dans la liste avec un bouton Connect.

Un Mac qui joue peut avoir au plus trois contrôleurs jumelés à la fois ; une quatrième tentative est refusée, avec la raison donnée plutôt qu'en remplaçant silencieusement l'un d'eux. Révoquez un contrôleur depuis la liste Paired remotes sur le Mac qui joue, ce qui coupe sa connexion immédiatement. Quand une tentative de jumelage est refusée, le message nomme quel Mac avait le problème, plutôt que de laisser entendre que l'autre a envoyé quelque chose de mauvais.

En dessous, le jumelage est un accord de clé authentifié par code PIN qui laisse les deux Mac partager une clé de longue durée ; cette clé est conservée dans le Keychain, et chaque session par la suite tourne sur TLS authentifié avec elle, si bien que le code PIN est saisi une fois et ne circule plus jamais. La protection du code PIN tient tout entière dans sa fenêtre de deux minutes et son budget de trois essais — un code à quatre chiffres n'est pas un mot de passe, et il n'est pas traité comme tel.

Piloter

Appuyez sur Connect et le panneau bascule sur la lecture de ce Mac : la station, le morceau, les commandes de lecture, le volume et la liste récente appartiennent tous à la machine que vous pilotez, avec une ligne en haut qui la nomme et dit ce que fait la session. Jouer ici et piloter un autre Mac s'excluent mutuellement — se connecter arrête ce qui jouait ici, comme si vous aviez appuyé vous-même sur Stop. Appuyez sur Disconnect pour rendre la main ; rien ne commence à jouer ici de son propre chef.

Cette ligne est aussi d'où revient une session : Driving un Mac nommé pendant que le lien tient, Reconnecting… pendant qu'il remonte — et ce qui est en dessous n'est alors plus présenté comme actuel — et not reachable, avec un bouton Connect, une fois qu'il a arrêté d'essayer. Le chemin du retour est devant vous plutôt qu'à deux fenêtres de distance, et Settings fait la même chose.

Vous n'en avez généralement pas besoin. L'appli se souvient du Mac que vous pilotiez et se reconnecte d'elle-même quand vous la rouvrez, quand ce Mac se réveille et quand le réseau revient — en recherchant l'autre Mac à nouveau, si bien qu'une adresse changée ou une appli relancée là-bas n'est pas un obstacle. Elle essaie pendant environ une minute puis se repose plutôt que de retenter indéfiniment contre un Mac qui est éteint ; réveiller celui-ci, ou le retour du réseau, la relance. Si l'autre Mac jouait quand le lien est tombé, la ligne le dit, mais se reconnecter ne relance jamais la lecture de son propre chef. Quitter prévient l'autre Mac qu'elle s'en va, plutôt que de le laisser s'en apercevoir.

Quand l'autre Mac est introuvable

Le champ Address dans le formulaire de jumelage sert pour quand l'autre Mac ne peut pas être découvert du tout, ce qui arrive sous un VPN à tunnel complet : il route chaque connexion hors du réseau local, découverte de service comprise, si bien que le sélecteur reste vide. Saisissez plutôt le nom ou l'adresse de l'autre Mac ; le jumelage et chaque session par la suite fonctionnent de la même façon par-dessus.

Mode développeur

Settings a un troisième onglet, Developer, qui contient un commutateur. Activez-le et Deep Happy écrit une trace pas à pas du jumelage et de la session à distance dans le journal système. C'est désactivé par défaut parce que c'est bavard — une ligne par trame sur une session qui tourne pendant des heures.

Les échecs de la couche à distance sont journalisés que le commutateur soit activé ou non, donc l'activer ne vaut la peine qu'avant de reproduire délibérément quelque chose. L'onglet fournit aussi deux commandes Terminal toutes prêtes, chacune avec un bouton de copie — l'une suit le journal en direct, l'autre lit la dernière demi-heure — et explique comment restreindre l'une ou l'autre à une moitié de la couche à distance ou aux lignes propres au lecteur.

La ligne de version

Une petite ligne en bas du lecteur, et dans Settings, nomme la version exacte que vous faites tourner ; cliquez dessus pour copier cette identité, ce qui rend un rapport de bug reproductible.

Ce qu'elle ne fait pas

  • NOUn compte ou une inscription. Rien à enregistrer, rien où se connecter, aucune clé de licence à saisir.
  • NOAnalytique, télémétrie, publicités ou SDK tiers. Il n'y a aucune dépendance tierce dans l'appli, du tout.
  • NOUne station à elle. Deep Happy n'est l'appli d'aucun diffuseur et n'est affiliée à aucun. Elle joue le flux que vous lui indiquez.
  • NOUn écouteur réseau que vous n'avez pas demandé. Le contrôle à distance est désactivé tant que vous ne l'activez pas, et le jumelage demande un code PIN saisi par une personne.
  • NOUne reprise sans coupure. Revenir d'un échec veut dire une connexion neuve, et vous entendrez peut-être un court silence pendant que cela se passe.

Ce qu'elle demande

Requiert
macOS 26 ou ultérieur
Stations
Tout flux HTTP ou HTTPS
À distance
Réseau local, jusqu'à 3 contrôleurs
Sandbox
App Sandbox d'Apple
Compte
Aucun

Pas encore sur le Mac App Store. Deep Happy se compile et tourne aujourd'hui, avant une première soumission. Il n'y a aucun lien de téléchargement sur ce site, et tout ce qui, ailleurs, prétend être Deep Happy n'est pas de nous.