Skip to content

Releases: dtseto/Hermes-master

v200b5

21 Dec 16:26

Choose a tag to compare

Patch to new skipping bug introduced in b4, fix login button bug, patch to rare intel infinite skip loop, new feature : add indicator for current station modes and other station modes in menu.

Introduces new unit tests for AudioBufferManager and AudioStreamer, including concurrency and buffering scenarios. Refactors AudioBufferManager for improved thread safety and error handling. Adds test hooks and debug logging to AudioStreamer for more reliable and deterministic testing for intel builds. Improves error handling in Pandora login methods. Fix login button bug. Also includes test output and debug log files.

v200b4 bug fix to stream crash

14 Nov 15:27

Choose a tag to compare

bug fixes for streaming crash

If signed and it doesn't open might not be executable try below
sudo chmod +x /Applications/Hermes.app/Contents/MacOS/Hermes

v200b3

10 Nov 20:40

Choose a tag to compare

streaming glitches fixed. Notarized version should be properly apple signed. Sparkle removed to fix signing error.

v200b2

10 Nov 04:10

Choose a tag to compare

Audiostreaming fixes to reduce sound glitches from lost packets and retries. UI fixes to align with modern macos standards use nested vstack hstacks from 2019 rather than manual constraints in 2010 code. Faster UI loading and fewer glitches. Unfortunately had to delete buttons and some graphics.

Screenshot 2025-11-09 at 7 56 03 PM
  • Audio pipeline (Sources/AudioStreamer/AudioStreamer.m, HermesTests/AudioStreamerRetryTests.m, docs): removed the legacy state-controller glue, made the state controller mandatory, added ADTS fallback,
    startup buffering, and strict content-length handling so retries happen before Core Audio plays truncated data. Tests were updated to cover the retry bookkeeping.
  • UI/layout (Resources/Base.lproj/MainMenu.xib): rewrote the playback view using nested NSStackViews, removed the ad-hoc fixed widths that caused constraint spam, added explicit widths/minimums for the
    playback stack/history pane, wrapped the album art so it stays square, and anchored the station list/history stacks so they don’t resize when cover art loads.
  • Hover fields (Sources/Views/LabelHoverShowFieldCell.m): fixed the custom cell to only subtract the hover overlay’s width when it’s visible, so artist/title/album labels no longer clip to a single
    word.

\Auto Layout stable (no more “Unable to satisfy constraints” flurries), the hover labels show full text, the history view shows complete rows, and AudioStreamer handles corrupted AAC chunks by buffering/retrying instead of glitching.
In short AudioStreamer: remove legacy glue, add ADTS fallback & startup buffer
UI: rebuilt playback pane with stack views, fixed hover labels, stabilize album art

v2.0.0b1 prerelease 11.0+ req

05 Nov 05:00

Choose a tag to compare

Major bug release fix and making Mac OS 11.0+ requirement permanent thus increasing version number.

  • error code, transient flag, and underlying NSError before teardown (Sources/AudioStreamer/AudioStreamer.h:88-125, Sources/AudioStreamer/
    AudioStreamer.m:29-339).
    • Introduced +[AudioStreamer isErrorCodeTransient:networkError:], codifying which errors are worth retrying, and ensured classifications are
      logged without changing existing playback behaviour.

    • Documented the hook (Documentation/AudioStreamerErrorHandling.md:1-9) and added AudioStreamerErrorClassificationTests to validate the
      helper and notification payload (HermesTests/AudioStreamerErrorClassificationTests.m:1-59).

    • Adjusted header nullability annotations so new APIs compile cleanly with strict warnings.
      • Input Monitoring reminder now respects a “don’t ask again” flow and moves the opt‑in to Preferences so it stops nagging after the first
      prompt.

    • Added a third “Don’t Remind Me Again” choice to the permission alert and gated auto-prompts behind a new inputMonitoringReminderEnabled
      toggle so reminders stop once dismissed (Sources/Controllers/PlaybackController.m:90-173, Sources/HermesAppDelegate.m:667-715).

    • Registered the new default and wired the status-menu reminder to disappear when the toggle is off (Sources/HermesAppDelegate.m:333-352,
      Sources/HermesAppDelegate.m:667-715).

    • Surfaced a “Enable Input Monitoring Reminder…” link in Preferences ▸ Playback that appears after suppression, updates the explanatory
      copy, and lets users re-enable the prompt on demand (Sources/Controllers/PreferencesController.h:13-38, Sources/Controllers/
      PreferencesController.m:100-226).

    • Synced the reminder toggle with the “Bind media keys” checkbox so disabling media keys also silences the reminder (Sources/Controllers/
      PreferencesController.m:148-178).

    • Updated the input-monitoring test suite to cover the new preference semantics and keep existing permission tests passing (HermesTests/
      InputMonitoringReminderTests.m:5-143, HermesTests/MediaPermissionTests.m:1-61, HermesTests/PlaybackControllerTests.m:150-180).

• - Dropped the persisted stream queue when decoding Station to avoid replaying stale URLs, zeroing lastKnownSeekTime, and flagging a fresh
fetch while keeping the last-known song for UI (Sources/Pandora/Station.m:92-140).

  • Added a safety guard around attemptingNewSong: so we don’t index an empty queue when the restored state has no pending tracks (Sources/
    Pandora/Station.m:196-200).
  • Updated the secure-coding tests to expect the queue to be cleared (but the last song retained) after a round-trip (HermesTests/
    SecureCodingPersistenceTests.m:132-146).

• - Adopted NSSecureCoding end‑to‑end for Song and Station, adding defensive decode helpers and tightening encode/decode logic so archives stay
type-safe.

  • Forced history and playback persistence to write with requiresSecureCoding:YES, but kept a one-time legacy fallback that rewrites old blobs
    into the secure format so upgrades still work.
  • Added SecureCodingPersistenceTests to exercise the secure round-trip and legacy→secure migration paths.
  • Fixed header/includes so both app and test targets resolve the AudioStreamer playlist dependency and history imports consistently.
    improves compatibility future versions with station list and history playing list

• Wrapped initializeModernAudioSystem in autorelease pools to keep startup allocations tightly scoped, and added a per-iteration pool plus an
inner pool for the async AAC warm-up. No tests were run for this refactor.

  • Added the PlaybackSleepLockTests suite that stubs a lightweight PlaybackController to verify pause/play behavior and flag resets across
    screensaver and screen-lock notifications (HermesTests/PlaybackSleepLockTests.m:1).

Refined proxy validation so we no longer block on NSHost during setHTTPProxy:—we trim/validate host/port locally and leave DNS work to the
existing async validator. Added a regression test that covers whitespace trimming and makes sure empty hosts are rejected.

• Added a consistent “Input Monitoring required” reminder across the app: playback startup now checks media-key readiness, the Preferences
toggle prompts again when binding media keys, and the status-bar menu gains a contextual “Enable Media Keys…” entry with live visibility.
Centralized helper logic in PlaybackController to reopen System Settings, decide when reminders should appear, and keep menu state in sync
through HermesAppDelegate. Verified reminder behavior with the new HermesTests/InputMonitoringReminderTests.m, which stubs the controller/
delegate to ensure reminders fire and hide as expected.

• - Added connection-level session tracking so every URLConnection records its active NSURLSession, supports reconfiguration, and exposes an
API to invalidate cached sessions (Sources/URLConnection.h:5, Sources/URLConnection.m:7, Sources/URLConnection.m:325).

  • Updated the preferences flow to remember the last proxy selection and trigger a cache reset whenever users return to “System
    proxy,” ensuring stale proxy sessions are torn down (Sources/Controllers/PreferencesController.m:7, Sources/Controllers/
    PreferencesController.m:156, Sources/Controllers/PreferencesController.m:181).
  • Expanded the proxy test suite with mock sessions/data tasks to confirm that resetting cached sessions does invalidate any tracked proxy
    session (HermesTests/URLConnectionProxyTests.m:7, HermesTests/URLConnectionProxyTests.m:24, HermesTests/URLConnectionProxyTests.m:153).
    Audiostreamer refactor into separate files
    fix to delete station setting to stop centering that causes view to glitch

1.32b12 bug fixes

29 Oct 04:41

Choose a tag to compare

start fix - Routed the status-item window activation back onto the main thread so AppKit isn’t touched from a background queue (Sources/HermesAppDelegate.m:644-651).
start fix - Added AX permission checks before starting the media-key tap, prompting users and skipping setup when Input Monitoring isn’t granted (Sources/Controllers/PlaybackController.m:11-203).
Play/pause button fix - Replaced the deprecated menu/toolbar validation hooks with a single validateUserInterfaceItem: implementation that updates Play/Pause titles and enables rules for both menus and toolbar buttons
    (Sources/Controllers/PlaybackController.h:16, Sources/Controllers/PlaybackController.m:710-760).
delete station added back - Injected a “Delete Station…” item into the Pandora menu at launch so it reuses the existing deleteSelected: behavior without editing the nib (Sources/HermesAppDelegate.m:338-366).

1.32b11 UI Refresh and macOS 11.0 Minimum

18 Jul 22:21

Choose a tag to compare

Big ui fix and minimum os increase to 11.0. BIG change in UI flatter UI now that drawers are removed in High Sierra replaced with views in main view that mimic web layout. Minor changes to work with 11.0 remove deprecated code. Removed references to growler and drawers. EDIT quick patch for crashing error Strong reference to fix "Block Retain Cycle" or "Completion Handler Retain Cycle".

1.32b10 double stream fixes

18 Jul 16:16

Choose a tag to compare

Pre-release

Double stream fixes mostly.
Minimum deployment target raised to 10.12, remove nskeydown nsdeviceindependentmodifier, nsalternatekeymask, nscompositesourceover.
Double playing fixes, automatic station restart caused some double playing, in future manually refresh, added extra state locking, state transition recovery, state warnings, extra logging for audio, logging for when playstation is called,
increase buffering for newer computers

1.32b8 apple silicon

26 Feb 16:33

Choose a tag to compare

1.32b8 apple silicon Pre-release
Pre-release

nsurl session refactor, better compatiblity on newer machines 10.11+ target, App should be apple developer signed.

1.32b9 streaming fixes

14 Jul 19:28
ecee68a

Choose a tag to compare

Pre-release

Streaming fixes by using newer audio apis, logging cleaned up, added hardened runtime network and memory settings for better compatibility with newer mac os versions.
Built for apple silicon and intel below signed/notarized version available.