Skip to content

v0.1.17

Choose a tag to compare

@github-actions github-actions released this 21 Feb 09:12
· 45 commits to main since this release

Changes

Full Changelog: v0.1.16...v0.1.17

  • feat: show in-app Homebrew update progress and result
    • Homebrew update previously felt opaque: users clicked update without seeing concrete progress in-app.
    • Requirement was to visualize integrated update execution, not only trigger it.
    • Reworked Homebrew update flow to run inside app process instead of only launching Terminal.
    • Added updater state model for UI binding:
    • isUpdating
    • updateStatusMessage
    • updateLog (bounded recent output)
    • lastUpdateSucceeded
    • checkForUpdates() now:
    • Sparkle: triggers Sparkle and logs a status line.
    • Homebrew: executes brew update && brew upgrade --cask applepie-rpc via zsh.
    • Captures stdout/stderr incrementally and appends to visible log lines.
    • Added robust failure paths:
    • Homebrew binary not found
    • shell launch failure
    • non-zero exit status
    • Updated menu UI update section to display:
    • progress spinner while running
    • success/failure icon after completion
    • status text
    • recent output lines (monospaced)
    • Kept unified update button behavior and channel badge.
    • Update action now provides immediate visual feedback.
    • Users can see update progress and outcome without leaving the app.
    • Failure cases are explicit and actionable.
    • Built macOS target successfully after changes:
  • feat: unify in-app update action across Sparkle and Homebrew
    • Users expected a single update button to perform updates directly.
    • In Homebrew-managed installs, the previous behavior only copied a brew command and showed an alert, which felt broken compared to Sparkle flow.
    • UpdaterService now exposes a unified checkForUpdates() flow that handles both channels.
    • Sparkle channel: unchanged behavior, triggers Sparkle update check.
    • Homebrew channel: launches Terminal and runs:
    • Added UpdateTriggerResult to communicate outcome to UI.
    • Added robust Homebrew binary resolution:
    • PATH candidates
    • /opt/homebrew/bin/brew
    • /usr/local/bin/brew
    • Added safe AppleScript escaping and Terminal-launch error handling.
    • UI update button now always uses a single action/label (Check for Updates).
    • Manual fallback is preserved:
    • If Terminal launch fails, command is copied to clipboard and alert is shown.
    • Update UX is now consistent: one button performs the update path for the active install channel.
    • Homebrew users no longer need to manually paste commands in normal cases.
    • Existing Sparkle behavior remains intact for direct installs.
    • Built macOS target successfully after changes:
  • fix: recover HomePod now-playing after firmware update
    • After recent HomePod firmware updates, pyatv sometimes returns nil for playing.device_state().
    • Our metadata path treated nil device_state as a hard stop and returned connected(nil), so title/artist/duration never reached UI/Discord.
    • Frequent re-scan/reconnect cycles also triggered pyatv knock tasks repeatedly, increasing noisy OSError 65 logs and instability.
    • fetchWithProtocol() required explicit playing/seeking device_state before parsing metadata.
    • config/connection caches expired too quickly, causing repeated scans and unnecessary connection churn.
    • NowPlayingService restarted polling even when host/interval were unchanged, duplicating start/update loops.
    • PyatvService: allow metadata parsing to continue when device_state is nil.
    • Keep state gating for explicit non-playing states.
    • Log nil state but continue parsing title/artist/album/position/duration.
    • PyatvService: relaxed cache TTLs to reduce re-scan/reconnect noise.
    • configTTL: 60s -> 300s
    • connectionTTL: 30s -> 120s
    • NowPlayingService: added idempotent start/updateTimer behavior.
    • Track current fetch host/interval.
    • Skip restart when requested host+interval matches active timer.
    • Reset tracked fetch state on stop/restart paths.
    • HomePod now-playing data can be displayed again even when device_state is omitted by firmware.
    • Less redundant reconnecting and fewer duplicate start/update cycles.
    • Reduced pyatv knock-related log spam.
    • Built macOS target successfully:
    • Runtime spot-check confirmed now-playing works on HomePod again.