A better Sonos grouping mechanism for use with Spotify
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Sconeos is a native Swift 6 spatial audio controller for Sonos households and Spotify on macOS and iOS.
Sconeos is structured as a single Swift Package (SconeKit) with strict module boundaries.
SconeDomain defines pure value types for speakers (SpeakerModel, BondedSatellite, BatteryTelemetry), 21-step discrete volumes (DiscreteVolume), spatial room placement (FloorplanNode, FloorLevel), and grouping presets.SonosProtocolBoundary handles SSDP and mDNS speaker discovery, UPnP SOAP topology and transport commands, and device battery/surround telemetry.SpotifyBridge manages PKCE OAuth 2.0 authentication in Keychain, fetches track metadata and queues from the Spotify Web API, and resolves Spotify URIs for direct Sonos UPnP handoff.SconeStore coordinates household discovery, optimistic command execution, floorplan persistence, and preset state on @MainActor.SconeUI provides the shared SwiftUI interface across macOS and iOS, including FloorplanMapView, SpeakerSilhouetteView, SconeBrandEmblem, GroupDetailView, NowPlayingDock, and SconeSettingsView.SconeosApp is the executable entry point and wires Sparkle 2 auto-updates on macOS.Sconeos builds with DylKit, Dylan's shared app framework. DylApp.toml configures the app, and the ./run shim runs DylKit's devkit and release-kit tools. Setup, building, tests, background launches, screenshots and the iOS Simulator are in DylKit's apple-dev-loop skill. Releasing is in apple-release. Both ship in the DylKit Cursor plugin.
release-kit bundles the app, strips build-machine rpaths, embeds Sparkle.framework, and signs everything inside-out (Installer.xpc, Downloader.xpc with its entitlements preserved, Autoupdate, Updater.app, then Sconeos.app with Sconeos.local.entitlements). Releases are signed ad-hoc with the designated requirement pinned to the bundle identifier, so Sparkle accepts each build as the same app. Untrusted self-signed certificates get killed by syspolicyd/amfid on quarantined launches.
To rotate or generate a Sparkle EdDSA keypair (storing the private key in the macOS login Keychain and writing the public key to sparkle-public-key.txt):
./scripts/generate-sparkle-key.sh
The download site in server/ is a thin @dylkit/web app that reads DylApp.toml and server/public/appcast.xml. CI for the site is the site workflow in .github/workflows/site.yml.