Repository navigation
v0.1.17
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.