Deep Happy

Возможности

Всё, что умеет Deep Happy сегодня, изложено полностью — не самое заметное, а весь список. Каждый пункт ниже описывает, что он делает, где его найти и что он делает по умолчанию. Каждый факт здесь верен для приложения в том виде, в котором оно собрано; на этой странице нет ни одного пункта из планов на будущее.

Что это такое

Deep Happy — нативный плеер интернет-радио для строки меню macOS, написанный на Swift 6 с SwiftUI и AppKit и требующий macOS 26 или новее. У него нет сторонних зависимостей, нет аккаунта и некуда входить.

Это плеер, а не приложение вещателя: вы направляете его на поток или ищете его в каталоге, и он играет. Причина его существования — та часть, которую большинство плееров интернет-радио делают неправильно: продолжать играть через обычные помехи дня ноутбука, — а второй его трюк в том, что Mac, который играет, можно направлять с другого Mac.

Короткая версия всего этого — на странице Deep Happy; вопросы, которые реально возникают, — на странице часто задаваемых вопросов.

Воспроизведение, которое переживает сон, VPN и зависший сокет

Плееры интернет-радио ломаются в обычных ситуациях — переподключение VPN, закрытие крышки ноутбука, сокет, зависающий без единого сообщения об этом, — и обычный сбой здесь не сообщение об ошибке, а приложение, которое показывает Playing, хотя само молчит. Deep Happy существует, чтобы сделать эти ситуации незаметными: вы нажимаете Play один раз, и оно продолжает играть — или честно говорит вам, что не так.

Основную работу делают два правила. Смена сетевого пути сама по себе никогда не повод разрывать поток, который всё ещё производит звук, — решает то, приходит ли ещё звук, а не то, что объявила система. А когда поток действительно перестал работать, восстановление всегда означает построение нового соединения: ничего зависшего никогда не подталкивают, не возобновляют и не перематывают в надежде, что оно оживёт.

Пока это происходит, возможен короткий разрыв. Deep Happy не бесшовный и не претендует на это. Он обещает другое: вы никогда не должны остаться перед экраном с Playing, из которого не доносится ни звука.

Остановить и запустить заново тоже быстро. Около пятнадцати секунд после нажатия Stop приложение держит поток, который играло, поэтому Play подхватывает его сразу, а не запускается с нуля, — на практике мгновенно. Если пауза дольше, Play подключается заново, и это занимает столько же, сколько любой холодный старт.

Всплывающее окно в строке меню и строка статуса соединения

Нажмите на иконку в строке меню, чтобы открыть плеер. Он показывает станцию, которую вы слушаете, играющий трек, кнопку Play/Stop и строку статуса под названием, которая говорит, что происходит на самом деле, — «играет», «подключение», «ожидание сети», «переподключение» или «не удаётся достучаться до потока». Вам никогда не нужно гадать, работает ли оно.

Пока поток не пришлёт название трека, строка названия показывает имя самой станции.

Добавление своих радиостанций и управление ими

Название станции лежит в верхней части плеера как заполненный чип со стрелкой. Нажмите на него — и плеер станет списком станций; стрелка в левом верхнем углу списка возвращает плеер обратно.

Каждая строка — это название станции, а под ним — то, что приложение реально измерило об этом потоке, что-то вроде HLS · 25 s cushion, или No live window · no cushion для потока, в котором не удаётся держать буфер. Станция, которую вы никогда не включали, не показывает строку вовсе, потому что о ней пока ничего не известно. Галочка отмечает станцию, которую вы слушаете; нажмите другую строку, чтобы переключиться, — и плеер вернётся с новым названием в чипе. Переключение всегда подключается заново, так что вы слышите обычные несколько секунд подключения, а не чужую станцию.

У каждой строки есть свои кнопки-карандаш и корзина, так что Rename и Remove никогда не приходится искать. Rename открывает те же два поля, что и Add, уже заполненные текущим именем; изменение имени не прерывает воспроизведение. Удаление занимает два клика: первый взводит кнопку — она заливается сплошным цветом и становится акцентного цвета, — а второй уже удаляет станцию. Выбор другой строки, открытие формы или уход со страницы снова снимают взвод, так что взведённая кнопка никогда не остаётся забытой. Кнопка Remove у последней оставшейся станции затемнена и ничего не делает, потому что плееру всегда нужна хотя бы одна станция для воспроизведения; удаление станции, которую вы слушаете, переключает вас на первую в списке. Для тех же двух действий через меню — щёлкните по строке правой кнопкой.

Под станциями — Add station…, который открывает на месте два поля: имя на ваш выбор и адрес потока, который должен быть полным URL http:// или https://. Если адрес непригоден, приложение говорит об этом под полями и сохраняет то, что вы ввели. Список хранится отдельно на каждой машине, как и остальные настройки.

Поиск станции в открытом каталоге

Под Add station… находится Find a station… — для случаев, когда адреса потока у вас ещё нет. Открывается страница с полем поиска: введите имя станции или жанр и нажмите Return, либо нажмите Search. Deep Happy обращается к открытому каталогу станций и показывает список найденного — каждая строка показывает сокращённое имя над строкой того, что реально известно об этом потоке, например MP3 · 128 kbps · DE. Нажмите на строку или на её +, чтобы добавить станцию в свой список; вы вернётесь в список станций уже с ней.

Ввод адреса вручную по-прежнему работает точно так же. Каталог — это второй способ, для случаев, когда вы знаете имя или жанр, а не URL, — а не замена первому.

Одно честное ограничение: станция, найденная так, обычно относится к тем, из которых приложение пока не умеет читать название трека вживую, поэтому строка названия продолжает показывать имя самой станции, а кнопки поиска остаются затемнёнными — так же, как у любой станции до её первого включения.

Воспроизведение с запуска и тихий прогрев

Deep Happy начинает играть сразу после запуска; чтобы получить звук, не нужно нажимать Play. Выключите Play on launch в Settings, если предпочитаете, чтобы оно вас дождалось.

Если это выключено, аппаратная клавиша play может открыть Apple Music вместо Deep Happy, пока вы не нажмёте Play хотя бы раз за этот запуск, — macOS направляет клавишу тому приложению, которое последним издавало звук, а ещё не игравший Deep Happy на это не претендует.

Даже при выключенном варианте приложение всё равно готовит поток в фоне при запуске, так что первый Play занимает около половины секунды вместо девяти или около того, нужных холодному соединению. Увидеть это невозможно — плеер показывает Stopped и название станции, как и в любом другом случае. Это стоит того же трафика, что и воспроизведение, поэтому держится две минуты и затем сбрасывается: нажмёте Play в это время — будет мгновенно, позже — приложение подключится обычным способом.

Необязательная иконка в Dock и окно плеера

По умолчанию у Deep Happy нет иконки в Dock — весь плеер живёт в пункте строки меню. Включите Show Dock icon в Settings, если хотите окно: щелчок по иконке тогда открывает — или выводит на передний план — окно с точно таким же плеером. Выключить обратно всегда безопасно, потому что пункт в строке меню остаётся в любом случае.

Окно шире всплывающего и разложено бок о бок: обложка слева, в полную силу и без единой надписи поверх, а плеер — станция, трек, Play/Stop, кнопки поиска, недавние треки — колонкой справа. Обложка — квадрат только при минимальном размере окна; увеличьте окно, и обложка расширяется в горизонтальный кадр, всегда заполняя выделенное ей место. Это тот же плеер, что и во всплывающем окне, поэтому они никогда не могут говорить разное, — у окна просто есть место, чтобы показать картинку как следует. Оно подстраивает свой размер под то, что должно показать, так что длинное название трека делает его выше, а не обрезается. Открыть Settings можно с шестерёнки в плеере или стандартным сочетанием ⌘,.

Копирование исполнителя и названия

Нажмите в любом месте блока с исполнителем и названием — оба скопируются одной строкой, Artist - Title, ровно так, как прислал поток, готовой ко вставке в поиск, чат или заметку. Иконка копирования на мгновение превращается в галочку с надписью Copied рядом, не скрывая ни исполнителя, ни название. Если поток не присылает исполнителя для трека, строки с исполнителем просто нет, а клик всё равно копирует название.

Поиск трека и список недавних

Рядом с текущим треком — небольшая кнопка Spotify, единственный сервис поиска, включённый по умолчанию, — и нажатие на неё открывает в браузере поиск по этому треку. Включите Apple Music или Яндекс Музыку в Settings в разделе Look up in, и их кнопки присоединятся; выключите все три — и строка исчезнет. Кнопки затемнены, пока плеер показывает название станции вместо трека, потому что искать нечего.

Список Recent под ней хранит последние три трека; нажмите на любой, чтобы скопировать его, или щёлкните правой кнопкой для тех же вариантов поиска.

Аппаратные клавиши медиа и Control Centre

Клавиши play/pause и stop на клавиатуре работают с Deep Happy так же, как с любым другим плеером, а Control Centre тоже показывает текущий трек — в том числе через переподключение, поэтому клавиши продолжают управлять Deep Happy, а не переключаются на другое приложение.

Громкость и mute — системные, а не приложения

Ползунок громкости — это системная громкость той машины, которая издаёт звук: этой, пока вы слушаете локально, или той, которой управляете, если нет. Это тот же регулятор, что и клавиши громкости, Control Centre и любое другое приложение на этом Mac, так что, убавляя радио, вы убавляете заодно всё остальное, а ползунок на нуле заглушает всю машину целиком. Это реальное последствие, а не деталь: отдельной громкости приложения, за которой можно спрятаться, не существует.

Меняйте громкость клавишами, строкой меню или другим приложением — и ползунок последует за этим, и на этом Mac, и на любом Mac, которым вы управляете. Deep Happy никогда не восстанавливает громкость машины сам; как вы её оставили, так она и остаётся.

Кнопка в конце строки — это mute той машины, и это отдельная вещь от ползунка: mute оставляет громкость там, где она была, поэтому снятие mute возвращает звук ровно на тот уровень, на котором вы его оставили. Выключите звук машины любым другим способом — клавишей mute, строкой меню, другим приложением — и кнопка загорится, а ползунок потускнеет, так что панель с ползунком на 13% никогда не оставит вас гадать, почему нет звука. Нажмите её, или m, чтобы снять mute. Это важнее всего, когда вы управляете другим Mac, где не видите его собственный оверлей громкости. Устройство вывода без собственного управления mute — у некоторых его нет — просто никогда не меняет кнопку; приложение один раз записывает это в лог и больше не трогает устройство.

Удалённое управление: Deep Happy на другом Mac

Deep Happy на одном Mac может управлять Deep Happy на другом — играть, останавливать и видеть, что играет, — так что машина с колонками не обязана быть той, перед которой вы сидите.

Включение

Включается в Settings → Remote, в разделе This Mac: переключатель Allow remote control выключен по умолчанию, потому что приложение, слушающее сеть без спроса, — это не то, что выпускает этот проект. После включения раздел ниже показывает, как называется этот Mac и слушает ли он. При первом объявлении или поиске сервиса удалённого управления macOS запрашивает разрешение Local Network — этот запрос ожидаем, и без него удалённое управление не найдёт другой Mac.

Сопряжение

Нажмите Show pairing PIN на Mac с колонками: четыре цифры, обратный отсчёт на две минуты и три попытки, после которых окно закрывается и нужен новый PIN. На том Mac, с которого хотите управлять, откройте Settings → Remote → Control another MacPair a new Mac…, выберите первый Mac из списка и введите цифры. После этого он появится в списке с кнопкой Connect.

У Mac, который играет, может быть не более трёх сопряжённых пультов одновременно; четвёртая попытка отклоняется с указанием причины, а не тихой заменой одного из существующих. Отозвать пульт можно из списка Paired remotes на том Mac, который играет, — это немедленно разрывает его соединение. Когда попытка сопряжения отклоняется, сообщение называет, у какого именно Mac проблема, а не намекает, что другой прислал что-то плохое.

Под капотом сопряжение — это согласование ключа, аутентифицированное PIN-ом, после которого оба Mac разделяют долгосрочный ключ; этот ключ хранится в Keychain, и каждая последующая сессия идёт по TLS, аутентифицированному им, так что PIN вводится один раз и больше никуда не передаётся. Защита самого PIN — это как раз его двухминутное окно и бюджет из трёх попыток: четырёхзначный код не пароль, и с ним так и не обращаются.

Управление

Нажмите Connect — и панель переключается на воспроизведение того Mac: станция, трек, управление, громкость и список недавних принадлежат машине, которой вы управляете, со строкой сверху, называющей её и сообщающей, что делает сессия. Играть здесь и управлять другим Mac одновременно нельзя — подключение останавливает всё, что играло здесь, точно так же, как если бы вы сами нажали Stop. Нажмите Disconnect, чтобы вернуть управление обратно; само по себе здесь ничего не начинает играть.

Эта же строка показывает, откуда сессия возвращается: Driving с именем Mac, пока связь держится, Reconnecting…, пока она карабкается обратно, — и тогда всё, что под ней, уже не подаётся как актуальное, — и not reachable с кнопкой Connect, когда попытки прекратились. Путь назад у вас перед глазами, а не в двух окнах, и Settings делает то же самое.

Обычно это и не нужно. Приложение помнит, каким Mac вы управляли, и переподключается само — когда вы открываете его заново, когда этот Mac просыпается и когда возвращается сеть, — каждый раз заново разыскивая тот Mac, так что изменившийся адрес или перезапущенное там приложение не помеха. Оно пробует около минуты, а затем останавливается, а не пытается вечно достучаться до выключенного Mac; пробуждение этого Mac или возвращение сети запускает попытки снова. Если другой Mac играл в момент разрыва связи, строка об этом говорит, но переподключение никогда не запускает воспроизведение само по себе. Выход из приложения сообщает другому Mac, что оно уходит, а не оставляет его узнавать об этом самому.

Когда другой Mac не находится

Поле Address в форме сопряжения — на случай, когда другой Mac вообще не обнаруживается, что и происходит под полнотуннельным VPN: он уводит все соединения с локальной сети, включая обнаружение сервисов, поэтому список остаётся пустым. Введите вместо этого имя или адрес другого Mac — сопряжение и все последующие сессии работают через него точно так же.

Режим Developer

В Settings есть третья вкладка, Developer, с одним переключателем. Включите его — и Deep Happy будет писать пошаговую трассировку сопряжения и удалённой сессии в системный лог. По умолчанию выключено, потому что это многословно — строка на каждый кадр в сессии, которая может идти часами.

Сбои в удалённом слое логируются независимо от положения переключателя, так что включать его стоит только перед тем, как вы намеренно что-то воспроизводите. Вкладка также даёт две готовые команды для Terminal, каждая со своей кнопкой копирования, — одна следит за логом вживую, другая читает последние полчаса — и объясняет, как сузить любую из них до одной половины удалённого слоя или до строк самого плеера.

Строка версии

Небольшая строка внизу плеера и в Settings называет точную сборку, которую вы используете; нажмите на неё, чтобы скопировать этот идентификатор, — именно это делает отчёт об ошибке воспроизводимым.

Чего оно не делает

  • NOАккаунт или регистрация. Нечего регистрировать, некуда входить, никакого лицензионного ключа вводить не нужно.
  • NOАналитика, телеметрия, реклама или сторонние SDK. В приложении вообще нет сторонних зависимостей.
  • NOСобственная станция. Deep Happy — не приложение какого-либо вещателя и не аффилирован ни с одним. Он играет тот поток, на который вы его направите.
  • NOСетевой слушатель, о котором вы не просили. Удалённое управление выключено, пока вы его не включите, а сопряжение требует PIN, который вводит человек.
  • NOБесшовное восстановление. Возврат после сбоя означает новое соединение, и пока это происходит, возможен короткий разрыв.

Что требуется

Требуется
macOS 26 или новее
Станции
Любой поток HTTP или HTTPS
Удалённо
Локальная сеть, до 3 пультов
Песочница
App Sandbox от Apple
Аккаунт
Нет

Пока не в Mac App Store. Deep Happy уже собирается и работает сегодня, до первой отправки на ревью. На этом сайте нет ссылки для скачивания, и всё, что где-либо ещё называет себя Deep Happy, — не наше.