From 8074b9ba60570f30f815801ffaf71f2ebf6047fc Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 06:39:36 -0400 Subject: [PATCH 01/35] Add native iOS listener app (v1 scaffold) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implements the app described in docs/IOS_APP_HANDOFF.md (#71): a SwiftUI radio tuner that talks to the public listener API and plays the Icecast stream through AVPlayer. The reason it exists is background resilience. The PWA schedules its stall recovery with setTimeout, which iOS never fires once it suspends the JS runtime at a track-transition underrun, so the station goes silent until the user foregrounds it. Here, an audio background mode keeps the process alive, and recovery runs on three independent signals: - AVPlayerItem stall/failure notifications - a 3s watchdog that catches the case AVPlayer does not report, where it still claims to be playing but the playhead has stopped moving - stream_epoch changes seen by the now-playing poll, which mean the broadcast restarted underneath us Each reconnect rebuilds the player item against a cache-busted URL and backs off 2s, 4s, 6s … capped at 15s, mirroring the web player, and takes a UIApplication background task so a reconnect that starts behind a locked screen gets to finish. Also included: station list on the web home page's 15s refresh, live now-playing (750ms foreground poll matching the web, 3s backgrounded where only the lock screen consumes it), up next / recently played, artist bio and knowledge facts, lock-screen and Control Center controls with skip and seek disabled since everyone hears the same broadcast, and a first-run server URL screen that validates against /api/health before saving. No third-party dependencies. Backend and web code are untouched. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM.xcodeproj/project.pbxproj | 290 ++++++++++ .../xcshareddata/xcschemes/AlchemyFM.xcscheme | 78 +++ ios/AlchemyFM/AlchemyFMApp.swift | 16 + .../AccentColor.colorset/Contents.json | 20 + .../AppIcon.appiconset/Contents.json | 13 + ios/AlchemyFM/Assets.xcassets/Contents.json | 6 + ios/AlchemyFM/Info.plist | 63 +++ ios/AlchemyFM/Models/Station.swift | 106 ++++ ios/AlchemyFM/Networking/AlchemyAPI.swift | 125 +++++ ios/AlchemyFM/Networking/ServerConfig.swift | 74 +++ ios/AlchemyFM/Networking/StationStore.swift | 51 ++ ios/AlchemyFM/Playback/RadioPlayer.swift | 514 ++++++++++++++++++ ios/AlchemyFM/Views/NowPlayingView.swift | 131 +++++ ios/AlchemyFM/Views/RootView.swift | 60 ++ ios/AlchemyFM/Views/ServerSetupView.swift | 109 ++++ ios/AlchemyFM/Views/SettingsView.swift | 58 ++ ios/AlchemyFM/Views/StationListView.swift | 195 +++++++ 17 files changed, 1909 insertions(+) create mode 100644 ios/AlchemyFM.xcodeproj/project.pbxproj create mode 100644 ios/AlchemyFM.xcodeproj/xcshareddata/xcschemes/AlchemyFM.xcscheme create mode 100644 ios/AlchemyFM/AlchemyFMApp.swift create mode 100644 ios/AlchemyFM/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/AlchemyFM/Assets.xcassets/Contents.json create mode 100644 ios/AlchemyFM/Info.plist create mode 100644 ios/AlchemyFM/Models/Station.swift create mode 100644 ios/AlchemyFM/Networking/AlchemyAPI.swift create mode 100644 ios/AlchemyFM/Networking/ServerConfig.swift create mode 100644 ios/AlchemyFM/Networking/StationStore.swift create mode 100644 ios/AlchemyFM/Playback/RadioPlayer.swift create mode 100644 ios/AlchemyFM/Views/NowPlayingView.swift create mode 100644 ios/AlchemyFM/Views/RootView.swift create mode 100644 ios/AlchemyFM/Views/ServerSetupView.swift create mode 100644 ios/AlchemyFM/Views/SettingsView.swift create mode 100644 ios/AlchemyFM/Views/StationListView.swift diff --git a/ios/AlchemyFM.xcodeproj/project.pbxproj b/ios/AlchemyFM.xcodeproj/project.pbxproj new file mode 100644 index 0000000..9947cdc --- /dev/null +++ b/ios/AlchemyFM.xcodeproj/project.pbxproj @@ -0,0 +1,290 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXFileReference section */ + 1A0000000000000000000004 /* AlchemyFM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AlchemyFM.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 1A0000000000000000000010 /* Exceptions for "AlchemyFM" folder in "AlchemyFM" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 1A0000000000000000000006 /* AlchemyFM */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 1A0000000000000000000005 /* AlchemyFM */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 1A0000000000000000000010 /* Exceptions for "AlchemyFM" folder in "AlchemyFM" target */, + ); + path = AlchemyFM; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1A0000000000000000000008 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1A0000000000000000000002 = { + isa = PBXGroup; + children = ( + 1A0000000000000000000005 /* AlchemyFM */, + 1A0000000000000000000003 /* Products */, + ); + sourceTree = ""; + }; + 1A0000000000000000000003 /* Products */ = { + isa = PBXGroup; + children = ( + 1A0000000000000000000004 /* AlchemyFM.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1A0000000000000000000006 /* AlchemyFM */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A000000000000000000000B /* Build configuration list for PBXNativeTarget "AlchemyFM" */; + buildPhases = ( + 1A0000000000000000000007 /* Sources */, + 1A0000000000000000000008 /* Frameworks */, + 1A0000000000000000000009 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 1A0000000000000000000005 /* AlchemyFM */, + ); + name = AlchemyFM; + packageProductDependencies = ( + ); + productName = AlchemyFM; + productReference = 1A0000000000000000000004 /* AlchemyFM.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1A0000000000000000000001 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2660; + LastUpgradeCheck = 2660; + TargetAttributes = { + 1A0000000000000000000006 = { + CreatedOnToolsVersion = 26.6; + }; + }; + }; + buildConfigurationList = 1A000000000000000000000A /* Build configuration list for PBXProject "AlchemyFM" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1A0000000000000000000002; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 1A0000000000000000000003 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1A0000000000000000000006 /* AlchemyFM */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1A0000000000000000000009 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1A0000000000000000000007 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1A000000000000000000000C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1A000000000000000000000D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 1A000000000000000000000E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = AlchemyFM/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 0.1.0; + PRODUCT_BUNDLE_IDENTIFIER = fm.alchemy.AlchemyFM; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1A000000000000000000000F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = AlchemyFM/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 0.1.0; + PRODUCT_BUNDLE_IDENTIFIER = fm.alchemy.AlchemyFM; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1A000000000000000000000A /* Build configuration list for PBXProject "AlchemyFM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A000000000000000000000C /* Debug */, + 1A000000000000000000000D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1A000000000000000000000B /* Build configuration list for PBXNativeTarget "AlchemyFM" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A000000000000000000000E /* Debug */, + 1A000000000000000000000F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1A0000000000000000000001 /* Project object */; +} diff --git a/ios/AlchemyFM.xcodeproj/xcshareddata/xcschemes/AlchemyFM.xcscheme b/ios/AlchemyFM.xcodeproj/xcshareddata/xcschemes/AlchemyFM.xcscheme new file mode 100644 index 0000000..36405ad --- /dev/null +++ b/ios/AlchemyFM.xcodeproj/xcshareddata/xcschemes/AlchemyFM.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/AlchemyFM/AlchemyFMApp.swift b/ios/AlchemyFM/AlchemyFMApp.swift new file mode 100644 index 0000000..2a5e2ba --- /dev/null +++ b/ios/AlchemyFM/AlchemyFMApp.swift @@ -0,0 +1,16 @@ +import SwiftUI + +@main +struct AlchemyFMApp: App { + @State private var server = ServerConfig() + @State private var player = RadioPlayer() + + var body: some Scene { + WindowGroup { + RootView() + .environment(server) + .environment(player) + .preferredColorScheme(.dark) + } + } +} diff --git a/ios/AlchemyFM/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/AlchemyFM/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..ab840e1 --- /dev/null +++ b/ios/AlchemyFM/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.180", + "green" : "0.690", + "red" : "0.980" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..13613e3 --- /dev/null +++ b/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/AlchemyFM/Assets.xcassets/Contents.json b/ios/AlchemyFM/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ios/AlchemyFM/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/AlchemyFM/Info.plist b/ios/AlchemyFM/Info.plist new file mode 100644 index 0000000..59ac569 --- /dev/null +++ b/ios/AlchemyFM/Info.plist @@ -0,0 +1,63 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Alchemy FM + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + UILaunchScreen + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + + UIBackgroundModes + + audio + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + + + NSLocalNetworkUsageDescription + Alchemy FM connects to your self-hosted radio server on your local network to list stations and play the live stream. + + diff --git a/ios/AlchemyFM/Models/Station.swift b/ios/AlchemyFM/Models/Station.swift new file mode 100644 index 0000000..400450a --- /dev/null +++ b/ios/AlchemyFM/Models/Station.swift @@ -0,0 +1,106 @@ +import Foundation + +// Mirrors backend/app/schemas.py. Only the listener-facing fields are modelled — +// Codable ignores everything else the API sends, so admin-only fields can be +// added server-side without breaking the app. + +struct KnowledgeSource: Codable, Hashable { + let url: String + var title: String = "" +} + +struct KnowledgeFact: Codable, Hashable { + let category: String + let text: String + var confidence: Double = 0 + var sources: [KnowledgeSource] = [] +} + +struct KnowledgeBlock: Codable, Hashable { + var facts: [KnowledgeFact] = [] + var rotationIntervalSec: Int = 15 +} + +struct NowPlaying: Codable, Hashable { + let title: String + let artist: String + var itemId: String? + var coverUrl: String? + var artistBio: String? + var artistBioUrl: String? + var knowledge: KnowledgeBlock? + + /// Identity for "did the track change?" checks. `item_id` is the real key + /// when present; title+artist covers stations whose source has no ids. + var trackKey: String { + itemId ?? "\(artist)|\(title)" + } +} + +struct TrackRef: Codable, Hashable { + let itemId: String + let title: String + let artist: String + var coverUrl: String? + /// Only set on recently-played rows. + var playedAt: Date? +} + +/// `GET /api/stations` +struct StationSummary: Codable, Hashable, Identifiable { + let slug: String + let name: String + var description: String = "" + var artworkUrl: String = "" + /// Direct Icecast URL. Preferred over the `/listen` redirect for playback — + /// it skips the backend proxy hop and its 20/min rate limit. + var streamUrl: String = "" + var listeners: Int = 0 + var onAir: Bool = false + /// Bumped when the broadcast restarts; used to cache-bust reconnects. + var streamEpoch: Int = 0 + var nowPlaying: NowPlaying? + var featured: Bool = false + + var id: String { slug } +} + +/// `GET /api/stations/{slug}` +struct StationDetail: Codable, Hashable, Identifiable { + let slug: String + let name: String + var description: String = "" + var artworkUrl: String = "" + var streamUrl: String = "" + var listeners: Int = 0 + var onAir: Bool = false + var streamEpoch: Int = 0 + var nowPlaying: NowPlaying? + var upNext: [TrackRef] = [] + var recentlyPlayed: [TrackRef] = [] + + var id: String { slug } + + var summary: StationSummary { + StationSummary( + slug: slug, + name: name, + description: description, + artworkUrl: artworkUrl, + streamUrl: streamUrl, + listeners: listeners, + onAir: onAir, + streamEpoch: streamEpoch, + nowPlaying: nowPlaying + ) + } +} + +/// `GET /api/health` — used to validate a server URL before saving it. +struct ServerHealth: Codable { + let status: String + var stationsEnabled: Int = 0 + var encodeFormat: String = "mp3" + var bitrate: Int = 0 + var gitSha: String = "unknown" +} diff --git a/ios/AlchemyFM/Networking/AlchemyAPI.swift b/ios/AlchemyFM/Networking/AlchemyAPI.swift new file mode 100644 index 0000000..6a785b9 --- /dev/null +++ b/ios/AlchemyFM/Networking/AlchemyAPI.swift @@ -0,0 +1,125 @@ +import Foundation + +enum APIError: LocalizedError { + case badURL + case http(status: Int) + case notAlchemyServer + + var errorDescription: String? { + switch self { + case .badURL: + return "That doesn't look like a valid address." + case .http(let status) where status == 404: + return "Not found on this server (404)." + case .http(let status): + return "The server returned HTTP \(status)." + case .notAlchemyServer: + return "Reachable, but it doesn't look like an Alchemy FM server." + } + } +} + +struct AlchemyAPI: Sendable { + let baseURL: URL + + private static let session: URLSession = { + let config = URLSessionConfiguration.default + config.timeoutIntervalForRequest = 10 + config.timeoutIntervalForResource = 20 + // Deliberately off: with it on, an unreachable server doesn't fail, it + // waits — which leaves the setup screen spinning forever on a typo'd + // address, and stalls the poll loop instead of letting it retry. + config.waitsForConnectivity = false + // Station/now-playing responses are all `Cache-Control: no-store` + // server-side; skipping the local cache avoids a redundant disk hit on + // a 750ms poll loop. + config.requestCachePolicy = .reloadIgnoringLocalCacheData + return URLSession(configuration: config) + }() + + private static let decoder: JSONDecoder = { + let d = JSONDecoder() + d.keyDecodingStrategy = .convertFromSnakeCase + // FastAPI emits naive ISO-8601 for `played_at`, sometimes with + // fractional seconds, sometimes with a timezone. A malformed or + // unexpected timestamp must not fail the whole station payload. + d.dateDecodingStrategy = .custom { decoder in + let raw = try decoder.singleValueContainer().decode(String.self) + return Self.parseTimestamp(raw) ?? .distantPast + } + return d + }() + + private static let timestampFormatters: [ISO8601DateFormatter] = { + let withFraction = ISO8601DateFormatter() + withFraction.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + let plain = ISO8601DateFormatter() + plain.formatOptions = [.withInternetDateTime] + return [withFraction, plain] + }() + + private static func parseTimestamp(_ raw: String) -> Date? { + // Naive timestamps (no trailing Z/offset) are UTC on this backend. + let candidates = raw.hasSuffix("Z") || raw.contains("+") ? [raw] : [raw + "Z", raw] + for candidate in candidates { + for formatter in timestampFormatters { + if let date = formatter.date(from: candidate) { return date } + } + } + return nil + } + + // MARK: - Endpoints + + func stations() async throws -> [StationSummary] { + try await get("/api/stations") + } + + func station(slug: String) async throws -> StationDetail { + let escaped = slug.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? slug + return try await get("/api/stations/\(escaped)") + } + + func health() async throws -> ServerHealth { + let health: ServerHealth = try await get("/api/health") + guard health.status == "ok" else { throw APIError.notAlchemyServer } + return health + } + + private func get(_ path: String) async throws -> T { + guard let url = URL(string: path, relativeTo: baseURL) else { throw APIError.badURL } + let (data, response) = try await Self.session.data(from: url) + if let http = response as? HTTPURLResponse, !(200..<300).contains(http.statusCode) { + throw APIError.http(status: http.statusCode) + } + do { + return try Self.decoder.decode(T.self, from: data) + } catch is DecodingError { + // Reaching a live web server that isn't Alchemy FM is the common + // case here (a router admin page, a Traefik 404 page, …). + throw APIError.notAlchemyServer + } + } + + // MARK: - URL helpers + + /// Resolves a URL the API handed us. `artwork_url` and `stream_url` arrive + /// absolute (built from the request host), but `cover_url` is a same-origin + /// path like `/api/cover/abc?size=300`, so both forms have to work. + func resolve(_ value: String?) -> URL? { + guard let value, !value.isEmpty else { return nil } + if value.hasPrefix("http://") || value.hasPrefix("https://") { + return URL(string: value) + } + return URL(string: value, relativeTo: baseURL)?.absoluteURL + } + + /// Fetches image bytes (cover art, station artwork) off the shared session. + func imageData(at url: URL) async throws -> Data { + let (data, response) = try await Self.session.data(from: url) + if let http = response as? HTTPURLResponse, !(200..<300).contains(http.statusCode) { + throw APIError.http(status: http.statusCode) + } + return data + } +} diff --git a/ios/AlchemyFM/Networking/ServerConfig.swift b/ios/AlchemyFM/Networking/ServerConfig.swift new file mode 100644 index 0000000..2bd192c --- /dev/null +++ b/ios/AlchemyFM/Networking/ServerConfig.swift @@ -0,0 +1,74 @@ +import Foundation +import Observation + +/// The backend base URL. Alchemy FM is self-hosted, so there is no default — +/// first run asks for the address. +@MainActor +@Observable +final class ServerConfig { + private static let defaultsKey = "alchemyfm.serverURL" + + private(set) var baseURL: URL? + + init(defaults: UserDefaults = .standard) { + self.defaults = defaults + if let stored = defaults.string(forKey: Self.defaultsKey) { + baseURL = URL(string: stored) + } + } + + private let defaults: UserDefaults + + var isConfigured: Bool { baseURL != nil } + + var api: AlchemyAPI? { + baseURL.map { AlchemyAPI(baseURL: $0) } + } + + /// Display form for the settings field — no trailing slash noise. + var displayString: String { + baseURL?.absoluteString.trimmingTrailingSlash ?? "" + } + + func save(_ url: URL) { + baseURL = url + defaults.set(url.absoluteString, forKey: Self.defaultsKey) + } + + func clear() { + baseURL = nil + defaults.removeObject(forKey: Self.defaultsKey) + } + + /// Turns whatever the user typed into a usable base URL. + /// `alchemy.local:8080` and `http://10.0.0.5:8080/` both normalise fine. + static func normalize(_ raw: String) -> URL? { + var text = raw.trimmingCharacters(in: .whitespacesAndNewlines) + guard !text.isEmpty else { return nil } + if !text.contains("://") { text = "http://" + text } + text = text.trimmingTrailingSlash + + guard let components = URLComponents(string: text), + let scheme = components.scheme?.lowercased(), + scheme == "http" || scheme == "https", + let host = components.host, !host.isEmpty + else { return nil } + + // A base URL must end in "/" for relative-path resolution to keep any + // subpath (e.g. https://host/radio/ + api/health). + return URL(string: text + "/") + } + + /// Confirms a candidate URL is actually an Alchemy FM server before saving. + static func validate(_ url: URL) async throws -> ServerHealth { + try await AlchemyAPI(baseURL: url).health() + } +} + +extension String { + var trimmingTrailingSlash: String { + var copy = self + while copy.hasSuffix("/") { copy.removeLast() } + return copy + } +} diff --git a/ios/AlchemyFM/Networking/StationStore.swift b/ios/AlchemyFM/Networking/StationStore.swift new file mode 100644 index 0000000..0901004 --- /dev/null +++ b/ios/AlchemyFM/Networking/StationStore.swift @@ -0,0 +1,51 @@ +import Foundation +import Observation + +/// Backs the station grid. Refreshes on the same 15s cadence as the web home +/// page so listener counts and on-air badges don't go stale while the app sits +/// open. +@MainActor +@Observable +final class StationStore { + private(set) var stations: [StationSummary] = [] + private(set) var errorMessage: String? + private(set) var hasLoaded = false + + @ObservationIgnored private var refreshTask: Task? + + func start(api: AlchemyAPI) { + guard refreshTask == nil else { return } + refreshTask = Task { [weak self] in + while !Task.isCancelled { + await self?.refresh(api: api) + guard !Task.isCancelled else { return } + try? await Task.sleep(for: .seconds(15)) + } + } + } + + func stop() { + refreshTask?.cancel() + refreshTask = nil + } + + func refresh(api: AlchemyAPI) async { + do { + stations = try await api.stations() + errorMessage = nil + } catch { + // Keep whatever we already showed — a dropped poll shouldn't blank + // the grid out from under someone who is listening. + errorMessage = stations.isEmpty ? error.localizedDescription : nil + } + hasLoaded = true + } + + /// Called when the server URL changes, so stale stations don't linger. + func reset() { + stop() + stations = [] + errorMessage = nil + hasLoaded = false + } +} diff --git a/ios/AlchemyFM/Playback/RadioPlayer.swift b/ios/AlchemyFM/Playback/RadioPlayer.swift new file mode 100644 index 0000000..d52a66a --- /dev/null +++ b/ios/AlchemyFM/Playback/RadioPlayer.swift @@ -0,0 +1,514 @@ +import AVFoundation +import Foundation +import MediaPlayer +import Observation +import UIKit + +/// Owns the live stream: one `AVPlayer`, the audio session, the lock-screen +/// controls, the now-playing poll loop, and — the whole point of the native +/// app — reconnect logic that keeps working while backgrounded. +/// +/// Alchemy FM is live radio, not a music library: there is no seeking, no +/// skipping, and "play" always means *re-tune to live*, never *resume a +/// buffer*. See docs/IOS_APP_HANDOFF.md. +@MainActor +@Observable +final class RadioPlayer { + + enum State: Equatable { + case idle + case connecting + case playing + case reconnecting(attempt: Int) + case interrupted + case failed(String) + } + + private(set) var state: State = .idle + private(set) var station: StationSummary? + private(set) var detail: StationDetail? + + /// True while the user wants audio. Drives the watchdog and every reconnect + /// decision — nothing retries once the user has actually stopped. + private(set) var wantsLive = false + + @ObservationIgnored var api: AlchemyAPI? + + // MARK: Private state + + @ObservationIgnored private var player: AVPlayer? + @ObservationIgnored private var observations: [NSKeyValueObservation] = [] + @ObservationIgnored private var notificationObservers: [NSObjectProtocol] = [] + @ObservationIgnored private var reconnectTask: Task? + @ObservationIgnored private var watchdogTask: Task? + @ObservationIgnored private var pollTask: Task? + @ObservationIgnored private var artworkTask: Task? + @ObservationIgnored private var backgroundTask: UIBackgroundTaskIdentifier = .invalid + @ObservationIgnored private var attempt = 0 + @ObservationIgnored private var playingEpoch = 0 + @ObservationIgnored private var lastObservedTime: CMTime = .invalid + @ObservationIgnored private var frozenSamples = 0 + @ObservationIgnored private var currentArtworkKey: String? + @ObservationIgnored private var remoteCommandsInstalled = false + @ObservationIgnored private var isInterrupted = false + + // MARK: - Derived state for the UI + + var isPlaying: Bool { state == .playing } + + var isBusy: Bool { + switch state { + case .connecting, .reconnecting: return true + default: return false + } + } + + var nowPlaying: NowPlaying? { detail?.nowPlaying ?? station?.nowPlaying } + + var statusText: String { + switch state { + case .idle: return "Stopped" + case .connecting: return "Tuning in…" + case .playing: return "Live" + case .reconnecting(let n): return n <= 1 ? "Reconnecting…" : "Reconnecting… (\(n))" + case .interrupted: return "Interrupted" + case .failed(let message): return message + } + } + + func isTuned(to slug: String) -> Bool { station?.slug == slug } + + // MARK: - Tuning + + func tune(to station: StationSummary, api: AlchemyAPI) { + self.api = api + if self.station?.slug != station.slug { + teardownPlayer() + pollTask?.cancel() + pollTask = nil + detail = nil + } + self.station = station + installRemoteCommands() + startPolling() + play() + } + + func play() { + guard station != nil else { return } + wantsLive = true + isInterrupted = false + attempt = 0 + cancelReconnect() + openStream() + } + + func stop() { + wantsLive = false + isInterrupted = false + cancelReconnect() + teardownPlayer() + state = .idle + deactivateSession() + endBackgroundTask() + updateNowPlayingInfo() + } + + func toggle() { + if wantsLive { stop() } else { play() } + } + + /// Fully leaves the station — stops audio and drops the poll loop. + func leave() { + stop() + pollTask?.cancel() + pollTask = nil + station = nil + detail = nil + currentArtworkKey = nil + MPNowPlayingInfoCenter.default().nowPlayingInfo = nil + } + + // MARK: - Stream lifecycle + + private func openStream() { + guard let station else { return } + playingEpoch = detail?.streamEpoch ?? station.streamEpoch + guard let url = streamURL(for: station) else { + state = .failed("This station has no stream URL.") + return + } + + teardownPlayer() + state = attempt == 0 ? .connecting : .reconnecting(attempt: attempt) + activateSession() + + let item = AVPlayerItem(url: url) + let player = AVPlayer(playerItem: item) + // Live radio: don't sit buffering in the hope of a stall-free future. + // Start immediately and let failures surface fast so we can re-tune. + player.automaticallyWaitsToMinimizeStalling = false + player.allowsExternalPlayback = true + self.player = player + + observe(player: player, item: item) + player.play() + + lastObservedTime = .invalid + frozenSamples = 0 + startWatchdog() + updateNowPlayingInfo() + } + + /// Cache-busts every connection. The web player uses `stream_epoch` for + /// this; the extra nonce covers repeat attempts *within* one epoch, where an + /// unchanged URL can come back from a stale cached connection. + private func streamURL(for station: StationSummary) -> URL? { + guard let base = api?.resolve(station.streamUrl) ?? URL(string: station.streamUrl) else { + return nil + } + guard var components = URLComponents(url: base, resolvingAgainstBaseURL: true) else { + return base + } + var query = components.queryItems ?? [] + query.append(URLQueryItem(name: "_e", value: String(playingEpoch))) + query.append(URLQueryItem(name: "_t", value: String(Int(Date().timeIntervalSince1970)))) + components.queryItems = query + return components.url ?? base + } + + private func teardownPlayer() { + // Observers first: tearing down otherwise fires a spurious `.paused` + // transition that would look like a stall and trigger a reconnect. + observations.forEach { $0.invalidate() } + observations.removeAll() + notificationObservers.forEach { NotificationCenter.default.removeObserver($0) } + notificationObservers.removeAll() + watchdogTask?.cancel() + watchdogTask = nil + + player?.pause() + player?.replaceCurrentItem(with: nil) + player = nil + lastObservedTime = .invalid + frozenSamples = 0 + } + + // MARK: - Observation + + private func observe(player: AVPlayer, item: AVPlayerItem) { + observations = [ + item.observe(\.status, options: [.new]) { [weak self] item, _ in + Task { @MainActor [weak self] in self?.handleItemStatus(item) } + }, + player.observe(\.timeControlStatus, options: [.new]) { [weak self] player, _ in + Task { @MainActor [weak self] in self?.handleTimeControlStatus(player) } + }, + ] + + let center = NotificationCenter.default + let session = AVAudioSession.sharedInstance() + notificationObservers = [ + center.addObserver( + forName: AVPlayerItem.playbackStalledNotification, object: item, queue: .main + ) { [weak self] _ in + Task { @MainActor [weak self] in self?.scheduleReconnect(reason: "playback stalled") } + }, + center.addObserver( + forName: AVPlayerItem.failedToPlayToEndTimeNotification, object: item, queue: .main + ) { [weak self] note in + let error = note.userInfo?[AVPlayerItemFailedToPlayToEndTimeErrorKey] as? Error + let reason = error?.localizedDescription ?? "stream ended" + Task { @MainActor [weak self] in self?.scheduleReconnect(reason: reason) } + }, + center.addObserver( + forName: AVAudioSession.interruptionNotification, object: session, queue: .main + ) { [weak self] note in + Task { @MainActor [weak self] in self?.handleInterruption(note) } + }, + center.addObserver( + forName: AVAudioSession.routeChangeNotification, object: session, queue: .main + ) { [weak self] note in + Task { @MainActor [weak self] in self?.handleRouteChange(note) } + }, + ] + } + + private func handleItemStatus(_ item: AVPlayerItem) { + guard item === player?.currentItem, item.status == .failed else { return } + scheduleReconnect(reason: item.error?.localizedDescription ?? "stream failed") + } + + private func handleTimeControlStatus(_ player: AVPlayer) { + guard player === self.player else { return } + switch player.timeControlStatus { + case .playing: + attempt = 0 + state = .playing + endBackgroundTask() + updateNowPlayingInfo() + case .paused: + // We never pause ourselves without first tearing down observers, so + // reaching here while live means iOS or the network stopped us. + if wantsLive, !isInterrupted { + scheduleReconnect(reason: "playback stopped unexpectedly") + } + case .waitingToPlayAtSpecifiedRate: + break + @unknown default: + break + } + } + + private func handleInterruption(_ note: Notification) { + guard let raw = note.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt, + let type = AVAudioSession.InterruptionType(rawValue: raw) + else { return } + + switch type { + case .began: + // A call or Siri took the session. Suspend our own retry machinery + // so we aren't fighting the system for it. + isInterrupted = true + cancelReconnect() + watchdogTask?.cancel() + watchdogTask = nil + state = .interrupted + case .ended: + isInterrupted = false + let rawOptions = note.userInfo?[AVAudioSessionInterruptionOptionKey] as? UInt ?? 0 + let options = AVAudioSession.InterruptionOptions(rawValue: rawOptions) + if wantsLive, options.contains(.shouldResume) { + play() + } else { + stop() + } + @unknown default: + break + } + } + + private func handleRouteChange(_ note: Notification) { + guard let raw = note.userInfo?[AVAudioSessionRouteChangeReasonKey] as? UInt, + let reason = AVAudioSession.RouteChangeReason(rawValue: raw) + else { return } + // Headphones pulled / Bluetooth dropped — never fall back to the + // speaker at whatever volume the room didn't ask for. + if reason == .oldDeviceUnavailable { stop() } + } + + // MARK: - Recovery + + /// Catches the failure mode AVPlayer doesn't report: it still claims to be + /// playing, but the playhead has stopped moving because no audio is + /// arriving. This is the native replacement for the PWA's `setTimeout` + /// heartbeat, and unlike that one it keeps running while backgrounded. + private func startWatchdog() { + watchdogTask?.cancel() + watchdogTask = Task { [weak self] in + while !Task.isCancelled { + try? await Task.sleep(for: .seconds(3)) + guard !Task.isCancelled, let self else { return } + self.checkForSilentStall() + } + } + } + + private func checkForSilentStall() { + guard wantsLive, state == .playing, let player else { + frozenSamples = 0 + return + } + let now = player.currentTime() + defer { lastObservedTime = now } + + guard lastObservedTime.isValid, now.isValid else { + frozenSamples = 0 + return + } + if CMTimeCompare(now, lastObservedTime) == 0 { + frozenSamples += 1 + if frozenSamples >= 2 { + scheduleReconnect(reason: "no audio arriving") + } + } else { + frozenSamples = 0 + } + } + + private func scheduleReconnect(reason: String) { + guard wantsLive, !isInterrupted, reconnectTask == nil else { return } + + // Buys ~30s of execution time so a reconnect that starts while the + // screen is locked actually gets to finish before iOS suspends us. + beginBackgroundTask() + + attempt += 1 + state = .reconnecting(attempt: attempt) + // Mirrors the web player's backoff: 2s, 4s, 6s … capped at 15s. + let delay = min(15.0, 2.0 + Double(attempt - 1) * 2.0) + NSLog("[AlchemyFM] reconnect in %.0fs (attempt %d): %@", delay, attempt, reason) + + teardownPlayer() + reconnectTask = Task { [weak self] in + try? await Task.sleep(for: .seconds(delay)) + guard !Task.isCancelled, let self else { return } + self.reconnectTask = nil + guard self.wantsLive, !self.isInterrupted else { return } + self.openStream() + } + } + + private func cancelReconnect() { + reconnectTask?.cancel() + reconnectTask = nil + } + + // MARK: - Audio session + + private func activateSession() { + let session = AVAudioSession.sharedInstance() + do { + try session.setCategory(.playback, mode: .default, policy: .longFormAudio) + try session.setActive(true) + } catch { + NSLog("[AlchemyFM] audio session activation failed: %@", error.localizedDescription) + } + } + + private func deactivateSession() { + try? AVAudioSession.sharedInstance().setActive( + false, options: .notifyOthersOnDeactivation + ) + } + + private func beginBackgroundTask() { + guard backgroundTask == .invalid else { return } + backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "AlchemyFM.reconnect") { + Task { @MainActor [weak self] in self?.endBackgroundTask() } + } + } + + private func endBackgroundTask() { + guard backgroundTask != .invalid else { return } + UIApplication.shared.endBackgroundTask(backgroundTask) + backgroundTask = .invalid + } + + // MARK: - Now-playing metadata + + /// The API — not Icecast in-stream metadata — is the source of truth. + private func startPolling() { + guard pollTask == nil else { return } + pollTask = Task { [weak self] in + while !Task.isCancelled { + guard let self, let api = self.api, let slug = self.station?.slug else { return } + do { + let detail = try await api.station(slug: slug) + if !Task.isCancelled { self.apply(detail) } + } catch { + // Transient by assumption — the loop itself is the retry. + } + guard !Task.isCancelled else { return } + try? await Task.sleep(for: .milliseconds(self.pollInterval)) + } + } + } + + private var pollInterval: Int { + guard wantsLive else { return 5000 } + // Foreground mirrors the web player's 750ms now-playing poll. In the + // background the only consumer is the lock screen, which doesn't need + // sub-second updates — and a 750ms network loop behind a locked screen + // is a battery cost with nothing to show for it. + return UIApplication.shared.applicationState == .active ? 750 : 3000 + } + + private func apply(_ detail: StationDetail) { + self.detail = detail + station = detail.summary + updateNowPlayingInfo() + + // The broadcast restarted underneath us: our connection is dead even if + // AVPlayer hasn't worked that out yet. + if wantsLive, detail.streamEpoch != playingEpoch { + playingEpoch = detail.streamEpoch + scheduleReconnect(reason: "stream epoch changed") + } + } + + // MARK: - Lock screen / Control Center + + private func installRemoteCommands() { + guard !remoteCommandsInstalled else { return } + remoteCommandsInstalled = true + + let center = MPRemoteCommandCenter.shared() + center.playCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.play() } + return .success + } + // Live radio has nothing to resume into, so "pause" is really "stop". + center.pauseCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.stop() } + return .success + } + center.stopCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.stop() } + return .success + } + center.togglePlayPauseCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.toggle() } + return .success + } + + let unsupported: [MPRemoteCommand] = [ + center.nextTrackCommand, center.previousTrackCommand, + center.skipForwardCommand, center.skipBackwardCommand, + center.seekForwardCommand, center.seekBackwardCommand, + center.changePlaybackPositionCommand, + ] + unsupported.forEach { $0.isEnabled = false } + } + + private func updateNowPlayingInfo() { + let center = MPNowPlayingInfoCenter.default() + guard let station else { + center.nowPlayingInfo = nil + return + } + let track = nowPlaying + var info = center.nowPlayingInfo ?? [:] + info[MPMediaItemPropertyTitle] = track?.title ?? station.name + info[MPMediaItemPropertyArtist] = track?.artist ?? station.description + info[MPMediaItemPropertyAlbumTitle] = station.name + info[MPNowPlayingInfoPropertyIsLiveStream] = true + info[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0 + center.nowPlayingInfo = info + refreshArtworkIfNeeded() + } + + private func refreshArtworkIfNeeded() { + guard let api, let station else { return } + guard let url = api.resolve(nowPlaying?.coverUrl) ?? api.resolve(station.artworkUrl) else { + return + } + let key = url.absoluteString + guard key != currentArtworkKey else { return } + currentArtworkKey = key + + artworkTask?.cancel() + artworkTask = Task { [weak self] in + guard let data = try? await api.imageData(at: url), + let image = UIImage(data: data), + !Task.isCancelled, + let self, self.currentArtworkKey == key + else { return } + var info = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [:] + info[MPMediaItemPropertyArtwork] = MPMediaItemArtwork(boundsSize: image.size) { _ in + image + } + MPNowPlayingInfoCenter.default().nowPlayingInfo = info + } + } +} diff --git a/ios/AlchemyFM/Views/NowPlayingView.swift b/ios/AlchemyFM/Views/NowPlayingView.swift new file mode 100644 index 0000000..6ca85c6 --- /dev/null +++ b/ios/AlchemyFM/Views/NowPlayingView.swift @@ -0,0 +1,131 @@ +import SwiftUI + +struct NowPlayingView: View { + @Environment(RadioPlayer.self) private var player + @Environment(ServerConfig.self) private var server + + var body: some View { + ScrollView { + VStack(spacing: 20) { + Artwork(path: player.nowPlaying?.coverUrl ?? player.station?.artworkUrl, + api: server.api, + cornerRadius: 16) + .frame(maxWidth: 320) + .aspectRatio(1, contentMode: .fit) + .shadow(radius: 18, y: 8) + .padding(.top, 8) + + trackInfo + transport + + if let bio = player.nowPlaying?.artistBio, !bio.isEmpty { + section("About \(player.nowPlaying?.artist ?? "the artist")") { + Text(bio) + .font(.callout) + .foregroundStyle(.secondary) + } + } + + if let facts = player.nowPlaying?.knowledge?.facts, !facts.isEmpty { + section("Did you know") { + VStack(alignment: .leading, spacing: 10) { + ForEach(Array(facts.enumerated()), id: \.offset) { _, fact in + Text(fact.text) + .font(.callout) + .foregroundStyle(.secondary) + } + } + } + } + + if let upNext = player.detail?.upNext, !upNext.isEmpty { + section("Up next") { trackList(upNext) } + } + + if let recent = player.detail?.recentlyPlayed, !recent.isEmpty { + section("Recently played") { trackList(recent, showTime: true) } + } + } + .padding(.horizontal, 20) + .padding(.bottom, 32) + } + .navigationTitle(player.station?.name ?? "Now Playing") + .navigationBarTitleDisplayMode(.inline) + } + + private var trackInfo: some View { + VStack(spacing: 6) { + Text(player.nowPlaying?.title ?? player.station?.name ?? "") + .font(.title2.bold()) + .multilineTextAlignment(.center) + + Text(player.nowPlaying?.artist ?? "") + .font(.title3) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + + HStack(spacing: 6) { + if player.isPlaying { + Circle().fill(.green).frame(width: 6, height: 6) + } + Text(player.statusText) + if let station = player.station, station.onAir { + Text("·") + Text(station.listeners == 1 ? "1 listener" : "\(station.listeners) listeners") + } + } + .font(.caption) + .foregroundStyle(.secondary) + .padding(.top, 2) + } + } + + private var transport: some View { + // No skip, no seek — everyone hears the same broadcast. + PlayStopButton(size: .largeTitle) + .frame(width: 72, height: 72) + .background(.quaternary, in: Circle()) + } + + private func trackList(_ tracks: [TrackRef], showTime: Bool = false) -> some View { + VStack(spacing: 10) { + ForEach(Array(tracks.enumerated()), id: \.offset) { _, track in + HStack(spacing: 10) { + Artwork(path: track.coverUrl, api: server.api, cornerRadius: 4) + .frame(width: 36, height: 36) + + VStack(alignment: .leading, spacing: 1) { + Text(track.title) + .font(.subheadline) + .lineLimit(1) + Text(track.artist) + .font(.caption) + .foregroundStyle(.secondary) + .lineLimit(1) + } + + Spacer(minLength: 0) + + if showTime, let playedAt = track.playedAt, playedAt != .distantPast { + Text(playedAt, format: .relative(presentation: .numeric)) + .font(.caption2) + .foregroundStyle(.tertiary) + } + } + } + } + } + + private func section( + _ title: String, @ViewBuilder content: () -> Content + ) -> some View { + VStack(alignment: .leading, spacing: 10) { + Text(title) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(.secondary) + content() + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.top, 4) + } +} diff --git a/ios/AlchemyFM/Views/RootView.swift b/ios/AlchemyFM/Views/RootView.swift new file mode 100644 index 0000000..24d969a --- /dev/null +++ b/ios/AlchemyFM/Views/RootView.swift @@ -0,0 +1,60 @@ +import SwiftUI + +struct RootView: View { + @Environment(ServerConfig.self) private var server + + var body: some View { + if server.isConfigured { + StationListView() + } else { + ServerSetupView() + } + } +} + +/// Shared cover-art view. Every image the API points at is either an absolute +/// URL (station artwork) or a same-origin path (`/api/cover/…`), so resolution +/// always goes through the API client. +struct Artwork: View { + let path: String? + let api: AlchemyAPI? + var cornerRadius: CGFloat = 10 + + var body: some View { + AsyncImage(url: api?.resolve(path)) { phase in + switch phase { + case .success(let image): + image.resizable().aspectRatio(contentMode: .fill) + default: + ZStack { + Rectangle().fill(.quaternary) + Image(systemName: "antenna.radiowaves.left.and.right") + .font(.title3) + .foregroundStyle(.tertiary) + } + } + } + .clipShape(RoundedRectangle(cornerRadius: cornerRadius, style: .continuous)) + } +} + +/// Small pulsing dot used for the on-air badge. +struct OnAirBadge: View { + let isOnAir: Bool + let listeners: Int + + var body: some View { + HStack(spacing: 5) { + Circle() + .fill(isOnAir ? Color.green : Color.secondary) + .frame(width: 6, height: 6) + if isOnAir { + Text(listeners == 1 ? "1 listener" : "\(listeners) listeners") + } else { + Text("Off air") + } + } + .font(.caption2) + .foregroundStyle(.secondary) + } +} diff --git a/ios/AlchemyFM/Views/ServerSetupView.swift b/ios/AlchemyFM/Views/ServerSetupView.swift new file mode 100644 index 0000000..04225ac --- /dev/null +++ b/ios/AlchemyFM/Views/ServerSetupView.swift @@ -0,0 +1,109 @@ +import SwiftUI + +/// First run. Alchemy FM is self-hosted, so there is no sensible default +/// server — the app is useless until it knows where yours lives. +struct ServerSetupView: View { + @Environment(ServerConfig.self) private var server + + var body: some View { + VStack(spacing: 28) { + Spacer() + + VStack(spacing: 12) { + Image(systemName: "antenna.radiowaves.left.and.right") + .font(.system(size: 52)) + .foregroundStyle(.tint) + Text("Alchemy FM") + .font(.largeTitle.bold()) + Text("Enter the address of your Alchemy FM server to get started.") + .font(.subheadline) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } + + ServerURLEditor(initialText: "") { url in + server.save(url) + } + + Spacer() + Spacer() + } + .padding(.horizontal, 28) + } +} + +/// URL field + a connect button that verifies `GET /api/health` before saving, +/// so a typo surfaces here rather than as an empty station list later. +struct ServerURLEditor: View { + let initialText: String + let onSave: (URL) -> Void + + @State private var text: String = "" + @State private var isChecking = false + @State private var errorMessage: String? + @State private var successMessage: String? + @FocusState private var isFocused: Bool + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + TextField("http://alchemy.local:8080", text: $text) + .textFieldStyle(.roundedBorder) + .textInputAutocapitalization(.never) + .autocorrectionDisabled() + .keyboardType(.URL) + .submitLabel(.go) + .focused($isFocused) + .onSubmit(connect) + + if let errorMessage { + Label(errorMessage, systemImage: "exclamationmark.triangle") + .font(.footnote) + .foregroundStyle(.red) + } else if let successMessage { + Label(successMessage, systemImage: "checkmark.circle") + .font(.footnote) + .foregroundStyle(.green) + } else { + Text("Include the port if it isn't 80 or 443. http:// is assumed.") + .font(.footnote) + .foregroundStyle(.secondary) + } + + Button(action: connect) { + HStack { + if isChecking { ProgressView().controlSize(.small) } + Text(isChecking ? "Checking…" : "Connect") + } + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .disabled(isChecking || text.trimmingCharacters(in: .whitespaces).isEmpty) + } + .onAppear { if text.isEmpty { text = initialText } } + } + + private func connect() { + guard let url = ServerConfig.normalize(text) else { + errorMessage = APIError.badURL.errorDescription + successMessage = nil + return + } + isChecking = true + errorMessage = nil + successMessage = nil + isFocused = false + + Task { + do { + let health = try await ServerConfig.validate(url) + successMessage = "Connected — \(health.stationsEnabled) station" + + (health.stationsEnabled == 1 ? "" : "s") + isChecking = false + onSave(url) + } catch { + errorMessage = error.localizedDescription + isChecking = false + } + } + } +} diff --git a/ios/AlchemyFM/Views/SettingsView.swift b/ios/AlchemyFM/Views/SettingsView.swift new file mode 100644 index 0000000..af36734 --- /dev/null +++ b/ios/AlchemyFM/Views/SettingsView.swift @@ -0,0 +1,58 @@ +import SwiftUI + +struct SettingsView: View { + @Environment(ServerConfig.self) private var server + @Environment(RadioPlayer.self) private var player + @Environment(\.dismiss) private var dismiss + + var body: some View { + NavigationStack { + Form { + Section("Server") { + ServerURLEditor(initialText: server.displayString) { url in + guard url != server.baseURL else { + dismiss() + return + } + // Stations, artwork and the stream all live on the old + // host — none of it survives the switch. + player.leave() + server.save(url) + dismiss() + } + .padding(.vertical, 4) + } + + Section { + Button("Forget this server", role: .destructive) { + player.leave() + server.clear() + dismiss() + } + } + + Section("About") { + LabeledContent("Version", value: Self.version) + Text("Alchemy FM is live radio — everyone hears the same " + + "broadcast, so there's no skipping or seeking.") + .font(.footnote) + .foregroundStyle(.secondary) + } + } + .navigationTitle("Settings") + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + Button("Done") { dismiss() } + } + } + } + } + + private static var version: String { + let info = Bundle.main.infoDictionary + let short = info?["CFBundleShortVersionString"] as? String ?? "0" + let build = info?["CFBundleVersion"] as? String ?? "0" + return "\(short) (\(build))" + } +} diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift new file mode 100644 index 0000000..531801e --- /dev/null +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -0,0 +1,195 @@ +import SwiftUI + +struct StationListView: View { + @Environment(ServerConfig.self) private var server + @Environment(RadioPlayer.self) private var player + + @State private var store = StationStore() + @State private var path: [String] = [] + @State private var showingSettings = false + + var body: some View { + NavigationStack(path: $path) { + content + .navigationTitle("Alchemy FM") + .navigationDestination(for: String.self) { _ in + NowPlayingView() + } + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + Button { + showingSettings = true + } label: { + Image(systemName: "gearshape") + } + .accessibilityLabel("Settings") + } + } + .safeAreaInset(edge: .bottom) { + if player.station != nil && path.isEmpty { + MiniPlayerBar { path.append("now-playing") } + } + } + } + .sheet(isPresented: $showingSettings) { + SettingsView() + } + .task(id: server.baseURL) { + store.reset() + guard let api = server.api else { return } + store.start(api: api) + } + .onDisappear { store.stop() } + } + + @ViewBuilder + private var content: some View { + if let message = store.errorMessage, store.stations.isEmpty { + ContentUnavailableView { + Label("Can't reach the server", systemImage: "wifi.exclamationmark") + } description: { + Text(message) + } actions: { + Button("Server settings") { showingSettings = true } + } + } else if store.stations.isEmpty && store.hasLoaded { + ContentUnavailableView( + "No stations", + systemImage: "antenna.radiowaves.left.and.right.slash", + description: Text("This server has no enabled stations yet.") + ) + } else if store.stations.isEmpty { + ProgressView().controlSize(.large) + .frame(maxWidth: .infinity, maxHeight: .infinity) + } else { + stationList + } + } + + private var stationList: some View { + List(store.stations) { station in + Button { + tune(to: station) + } label: { + StationRow(station: station, isTuned: player.isTuned(to: station.slug)) + } + .buttonStyle(.plain) + .listRowBackground(Color.clear) + } + .listStyle(.plain) + .refreshable { + guard let api = server.api else { return } + await store.refresh(api: api) + } + } + + private func tune(to station: StationSummary) { + guard let api = server.api else { return } + player.tune(to: station, api: api) + path.append("now-playing") + } +} + +struct StationRow: View { + let station: StationSummary + let isTuned: Bool + + @Environment(ServerConfig.self) private var server + + var body: some View { + HStack(spacing: 12) { + Artwork(path: station.artworkUrl, api: server.api) + .frame(width: 64, height: 64) + + VStack(alignment: .leading, spacing: 3) { + HStack(spacing: 6) { + Text(station.name) + .font(.headline) + .lineLimit(1) + if isTuned { + Image(systemName: "waveform") + .font(.caption) + .foregroundStyle(.tint) + } + } + + if let track = station.nowPlaying { + Text("\(track.title) — \(track.artist)") + .font(.subheadline) + .foregroundStyle(.secondary) + .lineLimit(1) + } else if !station.description.isEmpty { + Text(station.description) + .font(.subheadline) + .foregroundStyle(.secondary) + .lineLimit(1) + } + + OnAirBadge(isOnAir: station.onAir, listeners: station.listeners) + } + + Spacer(minLength: 0) + } + .padding(.vertical, 4) + .contentShape(Rectangle()) + } +} + +struct MiniPlayerBar: View { + @Environment(RadioPlayer.self) private var player + @Environment(ServerConfig.self) private var server + + let onTap: () -> Void + + var body: some View { + HStack(spacing: 12) { + Artwork(path: player.nowPlaying?.coverUrl ?? player.station?.artworkUrl, + api: server.api, + cornerRadius: 6) + .frame(width: 40, height: 40) + + VStack(alignment: .leading, spacing: 2) { + Text(player.nowPlaying?.title ?? player.station?.name ?? "") + .font(.subheadline.weight(.medium)) + .lineLimit(1) + Text(player.isPlaying ? (player.nowPlaying?.artist ?? "") : player.statusText) + .font(.caption) + .foregroundStyle(.secondary) + .lineLimit(1) + } + + Spacer(minLength: 0) + + PlayStopButton() + } + .padding(.horizontal, 14) + .padding(.vertical, 8) + .background(.bar) + .contentShape(Rectangle()) + .onTapGesture(perform: onTap) + } +} + +/// Live radio: stop, not pause. Restarting always re-tunes to live. +struct PlayStopButton: View { + @Environment(RadioPlayer.self) private var player + var size: Font = .title2 + + var body: some View { + Button { + player.toggle() + } label: { + ZStack { + if player.isBusy { + ProgressView() + } else { + Image(systemName: player.wantsLive ? "stop.fill" : "play.fill") + .font(size) + } + } + .frame(width: 44, height: 44) + } + .buttonStyle(.plain) + .accessibilityLabel(player.wantsLive ? "Stop" : "Play") + } +} From e9e8a208f351c7f050446625931c6a0ad8f32e30 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 07:07:41 -0400 Subject: [PATCH 02/35] Fix stall watchdog false-positives; add app icon and signing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Testing against a live server showed the app tearing the player down every ~11 seconds with "no audio arriving" — so audio never survived long enough to be audible. Two separate mistakes in the liveness check: - It used player.currentTime() as the progress signal. On an Icecast stream the playhead does not advance the way a finite asset's does, so a perfectly healthy connection looked permanently frozen. - Switching to the access log fixed most of it but still fired about once a minute, because numberOfBytesTransferred is per-event: reading only the newest entry makes the running total appear to drop each time AVPlayer opens a new event. The marker is now the sum of bytes transferred across all access-log events, which is monotonic while data is arriving, falling back to the buffered range end before the log has entries. Sampling moved to 2s with a 3-sample threshold, so a genuine silent stall is caught in ~6s. App icon is generated from the PWA's icon-512.png, upscaled to 1024pt and flattened onto the manifest's #111113 background since iOS app icons must be opaque. DEVELOPMENT_TEAM is set for device builds. It isn't a secret (team IDs ship inside every signed app), but contributors building on their own account will need to change it or override it in Xcode. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM.xcodeproj/project.pbxproj | 2 + .../AppIcon.appiconset/AppIcon-1024.png | Bin 0 -> 470967 bytes .../AppIcon.appiconset/Contents.json | 1 + ios/AlchemyFM/Models/Station.swift | 7 ++ ios/AlchemyFM/Playback/RadioPlayer.swift | 63 +++++++++++++----- ios/AlchemyFM/Views/StationListView.swift | 2 +- 6 files changed, 57 insertions(+), 18 deletions(-) create mode 100644 ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png diff --git a/ios/AlchemyFM.xcodeproj/project.pbxproj b/ios/AlchemyFM.xcodeproj/project.pbxproj index 9947cdc..4fd1cb7 100644 --- a/ios/AlchemyFM.xcodeproj/project.pbxproj +++ b/ios/AlchemyFM.xcodeproj/project.pbxproj @@ -219,6 +219,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ZMUB88RZ5D; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = ""; ENABLE_PREVIEWS = YES; @@ -244,6 +245,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ZMUB88RZ5D; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = ""; ENABLE_PREVIEWS = YES; diff --git a/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png b/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..208a1fbda920a44244f3e90b6730a992f3084e53 GIT binary patch literal 470967 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
bHJD%LExI*&u)9a5G3!FUG^ToagY1>Tb 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 literal 0 HcmV?d00001 diff --git a/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json index 13613e3..f22e10c 100644 --- a/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/AlchemyFM/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "AppIcon-1024.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/ios/AlchemyFM/Models/Station.swift b/ios/AlchemyFM/Models/Station.swift index 400450a..ad9635b 100644 --- a/ios/AlchemyFM/Models/Station.swift +++ b/ios/AlchemyFM/Models/Station.swift @@ -63,6 +63,13 @@ struct StationSummary: Codable, Hashable, Identifiable { var featured: Bool = false var id: String { slug } + + /// Stations without uploaded artwork report `artwork_url` as an empty + /// string, which is common — fall back to the current track's cover so the + /// grid isn't a wall of placeholders. + var listArtwork: String? { + artworkUrl.isEmpty ? nowPlaying?.coverUrl : artworkUrl + } } /// `GET /api/stations/{slug}` diff --git a/ios/AlchemyFM/Playback/RadioPlayer.swift b/ios/AlchemyFM/Playback/RadioPlayer.swift index d52a66a..23987af 100644 --- a/ios/AlchemyFM/Playback/RadioPlayer.swift +++ b/ios/AlchemyFM/Playback/RadioPlayer.swift @@ -46,7 +46,7 @@ final class RadioPlayer { @ObservationIgnored private var backgroundTask: UIBackgroundTaskIdentifier = .invalid @ObservationIgnored private var attempt = 0 @ObservationIgnored private var playingEpoch = 0 - @ObservationIgnored private var lastObservedTime: CMTime = .invalid + @ObservationIgnored private var lastProgressMarker: Double? @ObservationIgnored private var frozenSamples = 0 @ObservationIgnored private var currentArtworkKey: String? @ObservationIgnored private var remoteCommandsInstalled = false @@ -154,7 +154,7 @@ final class RadioPlayer { observe(player: player, item: item) player.play() - lastObservedTime = .invalid + lastProgressMarker = nil frozenSamples = 0 startWatchdog() updateNowPlayingInfo() @@ -190,7 +190,7 @@ final class RadioPlayer { player?.pause() player?.replaceCurrentItem(with: nil) player = nil - lastObservedTime = .invalid + lastProgressMarker = nil frozenSamples = 0 } @@ -300,39 +300,68 @@ final class RadioPlayer { // MARK: - Recovery /// Catches the failure mode AVPlayer doesn't report: it still claims to be - /// playing, but the playhead has stopped moving because no audio is - /// arriving. This is the native replacement for the PWA's `setTimeout` - /// heartbeat, and unlike that one it keeps running while backgrounded. + /// playing, but no audio is actually arriving. This is the native + /// replacement for the PWA's `setTimeout` heartbeat, and unlike that one it + /// keeps running while backgrounded. private func startWatchdog() { watchdogTask?.cancel() watchdogTask = Task { [weak self] in while !Task.isCancelled { - try? await Task.sleep(for: .seconds(3)) + try? await Task.sleep(for: .seconds(2)) guard !Task.isCancelled, let self else { return } self.checkForSilentStall() } } } + /// A number that must keep rising while the stream is healthy. + /// + /// Deliberately *not* `player.currentTime()`: on an Icecast stream the + /// playhead doesn't advance the way a finite asset's does, so treating a + /// static currentTime as a stall tears down a perfectly good connection + /// every few seconds. Bytes transferred is the direct measure of the thing + /// this check is actually named for. + private func streamProgressMarker() -> Double? { + guard let item = player?.currentItem else { return nil } + // Summed across every event, not just the last one: byte counts are + // per-event, so reading only the newest entry makes the total appear to + // drop each time AVPlayer opens a new one — which reads as a stall on a + // stream that is in fact perfectly healthy. + if let events = item.accessLog()?.events, !events.isEmpty { + let total = events.reduce(Int64(0)) { $0 + max(0, $1.numberOfBytesTransferred) } + if total > 0 { return Double(total) } + } + // Before the access log has an entry, the buffered range still grows. + if let range = item.loadedTimeRanges.last?.timeRangeValue { + return CMTimeGetSeconds(CMTimeRangeGetEnd(range)) + } + return nil + } + private func checkForSilentStall() { - guard wantsLive, state == .playing, let player else { + guard wantsLive, state == .playing else { + frozenSamples = 0 + return + } + guard let marker = streamProgressMarker() else { frozenSamples = 0 + lastProgressMarker = nil return } - let now = player.currentTime() - defer { lastObservedTime = now } + defer { lastProgressMarker = marker } - guard lastObservedTime.isValid, now.isValid else { + guard let previous = lastProgressMarker else { frozenSamples = 0 return } - if CMTimeCompare(now, lastObservedTime) == 0 { - frozenSamples += 1 - if frozenSamples >= 2 { - scheduleReconnect(reason: "no audio arriving") - } - } else { + if marker > previous { frozenSamples = 0 + return + } + frozenSamples += 1 + // ~6s of a live stream delivering nothing while it claims to be playing. + if frozenSamples >= 3 { + scheduleReconnect(reason: "no audio arriving") } } diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index 531801e..a7f6166 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -98,7 +98,7 @@ struct StationRow: View { var body: some View { HStack(spacing: 12) { - Artwork(path: station.artworkUrl, api: server.api) + Artwork(path: station.listArtwork, api: server.api) .frame(width: 64, height: 64) VStack(alignment: .leading, spacing: 3) { From 7bab741b66a9752d340c6f50336205d7d6d2e3ee Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 09:08:31 -0400 Subject: [PATCH 03/35] Fix silent playback: player never started, and iOS probe was unanswered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The app connected to the stream and rendered a full now-playing UI while producing no sound at all, on both the simulator and a device. Two causes, found by logging AVPlayer's actual state each watchdog tick: playhead=0.0 marker=17 rate=0.0 tcs=2 status=1 keepUp=1 empty=0 Buffer healthy, item ready, rate pinned at zero. 1. automaticallyWaitsToMinimizeStalling was set to false. That was meant to start playback promptly, but it also means a play() issued before the item reaches .readyToPlay is dropped and never retried. openStream calls play() immediately, so the player sat at rate 0 forever, buffering happily and playing nothing. It is back to its default. 2. Playback used the direct Icecast stream_url. Before opening a real playback connection, iOS sniffs a media resource with a small `Range: bytes=0-1` probe; Icecast ignores the range and answers with an endless 200, so the probe never terminates. The backend already solves this on /api/stations/{slug}/listen, which answers the probe with a bounded 206 (see _probe_range_end in routers/stations.py) — that endpoint is now what AVPlayer gets. Note this contradicts the handoff doc's advice to prefer stream_url, which is wrong for iOS. Verified against a live server: 78s of continuous playback with the playhead advancing in real time and zero reconnects, versus a teardown every ~57s before. That ~57s cycle was a symptom of the player never starting, not the proxy timeout it looked like. The watchdog now logs the playhead alongside the byte marker when it fires, since a frozen marker with a moving playhead (stream died) and both frozen at zero (player never started) need very different fixes. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Networking/AlchemyAPI.swift | 15 +++++++++++++++ ios/AlchemyFM/Playback/RadioPlayer.swift | 21 +++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/ios/AlchemyFM/Networking/AlchemyAPI.swift b/ios/AlchemyFM/Networking/AlchemyAPI.swift index 6a785b9..b5efd30 100644 --- a/ios/AlchemyFM/Networking/AlchemyAPI.swift +++ b/ios/AlchemyFM/Networking/AlchemyAPI.swift @@ -86,6 +86,21 @@ struct AlchemyAPI: Sendable { return health } + /// The stream URL to hand `AVPlayer`. + /// + /// Deliberately the backend's same-origin `/listen` endpoint rather than + /// the direct Icecast `stream_url`. Before opening a real playback + /// connection, iOS sniffs a media resource with a tiny `Range: bytes=0-1` + /// probe. Icecast ignores the range and answers with an endless `200`, so + /// the probe never terminates and playback never starts — the connection + /// registers as a listener while producing no audio. `/listen` answers the + /// probe with a bounded `206` (see `_probe_range_end` in + /// backend/app/routers/stations.py) and streams normally otherwise. + func listenURL(slug: String) -> URL? { + let escaped = slug.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? slug + return URL(string: "/api/stations/\(escaped)/listen", relativeTo: baseURL)?.absoluteURL + } + private func get(_ path: String) async throws -> T { guard let url = URL(string: path, relativeTo: baseURL) else { throw APIError.badURL } let (data, response) = try await Self.session.data(from: url) diff --git a/ios/AlchemyFM/Playback/RadioPlayer.swift b/ios/AlchemyFM/Playback/RadioPlayer.swift index 23987af..4e428c4 100644 --- a/ios/AlchemyFM/Playback/RadioPlayer.swift +++ b/ios/AlchemyFM/Playback/RadioPlayer.swift @@ -145,9 +145,10 @@ final class RadioPlayer { let item = AVPlayerItem(url: url) let player = AVPlayer(playerItem: item) - // Live radio: don't sit buffering in the hope of a stall-free future. - // Start immediately and let failures surface fast so we can re-tune. - player.automaticallyWaitsToMinimizeStalling = false + // Left at its default (true) on purpose. Setting it false means a + // `play()` issued before the item reaches `.readyToPlay` is dropped and + // never retried — the player then buffers forever at rate 0, which + // looks exactly like a working connection that produces no sound. player.allowsExternalPlayback = true self.player = player @@ -164,7 +165,12 @@ final class RadioPlayer { /// this; the extra nonce covers repeat attempts *within* one epoch, where an /// unchanged URL can come back from a stale cached connection. private func streamURL(for station: StationSummary) -> URL? { - guard let base = api?.resolve(station.streamUrl) ?? URL(string: station.streamUrl) else { + // Falls back to the direct Icecast URL only if we somehow have no API + // client — see `listenURL` for why that is the worse option on iOS. + let candidate = api?.listenURL(slug: station.slug) + ?? api?.resolve(station.streamUrl) + ?? URL(string: station.streamUrl) + guard let base = candidate else { return nil } guard var components = URLComponents(url: base, resolvingAgainstBaseURL: true) else { @@ -361,6 +367,13 @@ final class RadioPlayer { frozenSamples += 1 // ~6s of a live stream delivering nothing while it claims to be playing. if frozenSamples >= 3 { + // Worth logging the playhead too: a frozen marker with a moving + // playhead means the stream died, while both frozen at zero means + // the player never actually started (see openStream). + NSLog( + "[AlchemyFM] stall: marker=%.0f playhead=%.1f rate=%.1f", + marker, CMTimeGetSeconds(player?.currentTime() ?? .zero), player?.rate ?? -1 + ) scheduleReconnect(reason: "no audio arriving") } } From 16683f58da0334683851b29241b5a6e42907bdae Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 11:14:46 -0400 Subject: [PATCH 04/35] Separate playing a station from browsing one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tapping a row used to tune the station and navigate in one gesture, so there was no way to look at what else was on without hijacking playback. Rows now carry two independent controls: the artwork/title area opens the station's page, and a trailing button plays it in place without leaving the list. Opening a station starts nothing — only its play button does. Station pages therefore have to work for a station you are not listening to. StationDetailView takes any StationSummary and reads from the player when that station happens to be the tuned one, falling back to its own StationDetailLoader otherwise. That loader polls at 5s rather than the player's 750ms: nothing on a browsed page drives a lock screen, and the tuned station's fast poll must not be disturbed by whatever else is being looked at. Playback state ("Live", "Reconnecting…") is shown only for the tuned station; other pages just say whether they are on air. NowPlayingView is gone — it assumed the station on screen was always the one playing, which is exactly the assumption being removed here. Verified against a live server: playing Concrete Poetry from the list then opening Skate Park left concrete-poetry at 1 listener and skate-park-anthems at 0, and pressing play there moved the listener across cleanly with no reconnects. Co-Authored-By: Claude Opus 5 --- .../Networking/StationDetailLoader.swift | 43 +++++ ...yingView.swift => StationDetailView.swift} | 61 +++++-- ios/AlchemyFM/Views/StationListView.swift | 163 ++++++++++-------- 3 files changed, 182 insertions(+), 85 deletions(-) create mode 100644 ios/AlchemyFM/Networking/StationDetailLoader.swift rename ios/AlchemyFM/Views/{NowPlayingView.swift => StationDetailView.swift} (64%) diff --git a/ios/AlchemyFM/Networking/StationDetailLoader.swift b/ios/AlchemyFM/Networking/StationDetailLoader.swift new file mode 100644 index 0000000..d55de33 --- /dev/null +++ b/ios/AlchemyFM/Networking/StationDetailLoader.swift @@ -0,0 +1,43 @@ +import Foundation +import Observation + +/// Polls one station's detail for a page you're *browsing* rather than +/// listening to. +/// +/// The player already polls the tuned station hard (750ms) to drive the lock +/// screen. Browsing a different station shouldn't disturb that or start any +/// audio, so this runs its own slower loop and touches nothing else. +@MainActor +@Observable +final class StationDetailLoader { + private(set) var detail: StationDetail? + + @ObservationIgnored private var task: Task? + @ObservationIgnored private var loadedSlug: String? + + func start(slug: String, api: AlchemyAPI) { + guard loadedSlug != slug else { return } + stop() + loadedSlug = slug + detail = nil + task = Task { [weak self] in + while !Task.isCancelled { + do { + let detail = try await api.station(slug: slug) + guard !Task.isCancelled else { return } + self?.detail = detail + } catch { + // Transient — the loop is the retry. + } + guard !Task.isCancelled else { return } + try? await Task.sleep(for: .seconds(5)) + } + } + } + + func stop() { + task?.cancel() + task = nil + loadedSlug = nil + } +} diff --git a/ios/AlchemyFM/Views/NowPlayingView.swift b/ios/AlchemyFM/Views/StationDetailView.swift similarity index 64% rename from ios/AlchemyFM/Views/NowPlayingView.swift rename to ios/AlchemyFM/Views/StationDetailView.swift index 6ca85c6..cfc8910 100644 --- a/ios/AlchemyFM/Views/NowPlayingView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -1,13 +1,33 @@ import SwiftUI -struct NowPlayingView: View { +/// A station's page. Works for any station, not just the tuned one — opening it +/// starts nothing; only the play button does. +struct StationDetailView: View { + let station: StationSummary + @Environment(RadioPlayer.self) private var player @Environment(ServerConfig.self) private var server + @State private var loader = StationDetailLoader() + + private var isTuned: Bool { player.isTuned(to: station.slug) } + + /// When this *is* the tuned station, reuse the player's fast poll rather + /// than running a second loop against the same endpoint. + private var detail: StationDetail? { + isTuned ? player.detail : loader.detail + } + + private var nowPlaying: NowPlaying? { + detail?.nowPlaying ?? station.nowPlaying + } + + private var listeners: Int { detail?.listeners ?? station.listeners } + private var onAir: Bool { detail?.onAir ?? station.onAir } var body: some View { ScrollView { VStack(spacing: 20) { - Artwork(path: player.nowPlaying?.coverUrl ?? player.station?.artworkUrl, + Artwork(path: nowPlaying?.coverUrl ?? station.listArtwork, api: server.api, cornerRadius: 16) .frame(maxWidth: 320) @@ -18,15 +38,15 @@ struct NowPlayingView: View { trackInfo transport - if let bio = player.nowPlaying?.artistBio, !bio.isEmpty { - section("About \(player.nowPlaying?.artist ?? "the artist")") { + if let bio = nowPlaying?.artistBio, !bio.isEmpty { + section("About \(nowPlaying?.artist ?? "the artist")") { Text(bio) .font(.callout) .foregroundStyle(.secondary) } } - if let facts = player.nowPlaying?.knowledge?.facts, !facts.isEmpty { + if let facts = nowPlaying?.knowledge?.facts, !facts.isEmpty { section("Did you know") { VStack(alignment: .leading, spacing: 10) { ForEach(Array(facts.enumerated()), id: \.offset) { _, fact in @@ -38,40 +58,51 @@ struct NowPlayingView: View { } } - if let upNext = player.detail?.upNext, !upNext.isEmpty { + if let upNext = detail?.upNext, !upNext.isEmpty { section("Up next") { trackList(upNext) } } - if let recent = player.detail?.recentlyPlayed, !recent.isEmpty { + if let recent = detail?.recentlyPlayed, !recent.isEmpty { section("Recently played") { trackList(recent, showTime: true) } } } .padding(.horizontal, 20) .padding(.bottom, 32) } - .navigationTitle(player.station?.name ?? "Now Playing") + .navigationTitle(station.name) .navigationBarTitleDisplayMode(.inline) + .task(id: isTuned) { + guard let api = server.api else { return } + if isTuned { + loader.stop() + } else { + loader.start(slug: station.slug, api: api) + } + } + .onDisappear { loader.stop() } } private var trackInfo: some View { VStack(spacing: 6) { - Text(player.nowPlaying?.title ?? player.station?.name ?? "") + Text(nowPlaying?.title ?? station.name) .font(.title2.bold()) .multilineTextAlignment(.center) - Text(player.nowPlaying?.artist ?? "") + Text(nowPlaying?.artist ?? station.description) .font(.title3) .foregroundStyle(.secondary) .multilineTextAlignment(.center) HStack(spacing: 6) { - if player.isPlaying { + if isTuned && player.isPlaying { Circle().fill(.green).frame(width: 6, height: 6) } - Text(player.statusText) - if let station = player.station, station.onAir { + // Only the tuned station has playback state worth reporting; + // for anything else this page is just a preview. + Text(isTuned ? player.statusText : (onAir ? "On air" : "Off air")) + if onAir { Text("·") - Text(station.listeners == 1 ? "1 listener" : "\(station.listeners) listeners") + Text(listeners == 1 ? "1 listener" : "\(listeners) listeners") } } .font(.caption) @@ -82,7 +113,7 @@ struct NowPlayingView: View { private var transport: some View { // No skip, no seek — everyone hears the same broadcast. - PlayStopButton(size: .largeTitle) + StationPlayButton(station: detail?.summary ?? station, size: .largeTitle) .frame(width: 72, height: 72) .background(.quaternary, in: Circle()) } diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index a7f6166..3b690d4 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -5,15 +5,15 @@ struct StationListView: View { @Environment(RadioPlayer.self) private var player @State private var store = StationStore() - @State private var path: [String] = [] + @State private var path: [StationSummary] = [] @State private var showingSettings = false var body: some View { NavigationStack(path: $path) { content .navigationTitle("Alchemy FM") - .navigationDestination(for: String.self) { _ in - NowPlayingView() + .navigationDestination(for: StationSummary.self) { station in + StationDetailView(station: station) } .toolbar { ToolbarItem(placement: .topBarTrailing) { @@ -26,8 +26,8 @@ struct StationListView: View { } } .safeAreaInset(edge: .bottom) { - if player.station != nil && path.isEmpty { - MiniPlayerBar { path.append("now-playing") } + if let tuned = player.station { + MiniPlayerBar { path.append(tuned) } } } } @@ -68,13 +68,8 @@ struct StationListView: View { private var stationList: some View { List(store.stations) { station in - Button { - tune(to: station) - } label: { - StationRow(station: station, isTuned: player.isTuned(to: station.slug)) - } - .buttonStyle(.plain) - .listRowBackground(Color.clear) + StationRow(station: station) { path.append(station) } + .listRowBackground(Color.clear) } .listStyle(.plain) .refreshable { @@ -82,56 +77,99 @@ struct StationListView: View { await store.refresh(api: api) } } - - private func tune(to station: StationSummary) { - guard let api = server.api else { return } - player.tune(to: station, api: api) - path.append("now-playing") - } } +/// Two independent controls: the artwork/title area opens the station, the +/// trailing button plays it. Tapping a row must never change what's playing. struct StationRow: View { let station: StationSummary - let isTuned: Bool + let onOpen: () -> Void @Environment(ServerConfig.self) private var server + @Environment(RadioPlayer.self) private var player + + private var isTuned: Bool { player.isTuned(to: station.slug) } var body: some View { HStack(spacing: 12) { - Artwork(path: station.listArtwork, api: server.api) - .frame(width: 64, height: 64) - - VStack(alignment: .leading, spacing: 3) { - HStack(spacing: 6) { - Text(station.name) - .font(.headline) - .lineLimit(1) - if isTuned { - Image(systemName: "waveform") - .font(.caption) - .foregroundStyle(.tint) + Button(action: onOpen) { + HStack(spacing: 12) { + Artwork(path: station.listArtwork, api: server.api) + .frame(width: 64, height: 64) + + VStack(alignment: .leading, spacing: 3) { + HStack(spacing: 6) { + Text(station.name) + .font(.headline) + .lineLimit(1) + if isTuned && player.isPlaying { + Image(systemName: "waveform") + .font(.caption) + .foregroundStyle(.tint) + .accessibilityLabel("Now playing") + } + } + + if let track = station.nowPlaying { + Text("\(track.title) — \(track.artist)") + .font(.subheadline) + .foregroundStyle(.secondary) + .lineLimit(1) + } else if !station.description.isEmpty { + Text(station.description) + .font(.subheadline) + .foregroundStyle(.secondary) + .lineLimit(1) + } + + OnAirBadge(isOnAir: station.onAir, listeners: station.listeners) } - } - if let track = station.nowPlaying { - Text("\(track.title) — \(track.artist)") - .font(.subheadline) - .foregroundStyle(.secondary) - .lineLimit(1) - } else if !station.description.isEmpty { - Text(station.description) - .font(.subheadline) - .foregroundStyle(.secondary) - .lineLimit(1) + Spacer(minLength: 0) } - - OnAirBadge(isOnAir: station.onAir, listeners: station.listeners) + .contentShape(Rectangle()) } + .buttonStyle(.plain) - Spacer(minLength: 0) + StationPlayButton(station: station) } .padding(.vertical, 4) - .contentShape(Rectangle()) + } +} + +/// Plays *this* station, whatever is playing now. Only shows a stop control +/// when this is the station currently tuned in. +struct StationPlayButton: View { + let station: StationSummary + var size: Font = .title2 + + @Environment(RadioPlayer.self) private var player + @Environment(ServerConfig.self) private var server + + private var isTuned: Bool { player.isTuned(to: station.slug) } + private var isLive: Bool { isTuned && player.wantsLive } + + var body: some View { + Button { + if isTuned { + player.toggle() + } else if let api = server.api { + player.tune(to: station, api: api) + } + } label: { + ZStack { + if isTuned && player.isBusy { + ProgressView() + } else { + Image(systemName: isLive ? "stop.fill" : "play.fill") + .font(size) + } + } + .frame(width: 44, height: 44) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .accessibilityLabel(isLive ? "Stop \(station.name)" : "Play \(station.name)") } } @@ -152,7 +190,7 @@ struct MiniPlayerBar: View { Text(player.nowPlaying?.title ?? player.station?.name ?? "") .font(.subheadline.weight(.medium)) .lineLimit(1) - Text(player.isPlaying ? (player.nowPlaying?.artist ?? "") : player.statusText) + Text(subtitle) .font(.caption) .foregroundStyle(.secondary) .lineLimit(1) @@ -160,7 +198,9 @@ struct MiniPlayerBar: View { Spacer(minLength: 0) - PlayStopButton() + if let station = player.station { + StationPlayButton(station: station) + } } .padding(.horizontal, 14) .padding(.vertical, 8) @@ -168,28 +208,11 @@ struct MiniPlayerBar: View { .contentShape(Rectangle()) .onTapGesture(perform: onTap) } -} -/// Live radio: stop, not pause. Restarting always re-tunes to live. -struct PlayStopButton: View { - @Environment(RadioPlayer.self) private var player - var size: Font = .title2 - - var body: some View { - Button { - player.toggle() - } label: { - ZStack { - if player.isBusy { - ProgressView() - } else { - Image(systemName: player.wantsLive ? "stop.fill" : "play.fill") - .font(size) - } - } - .frame(width: 44, height: 44) - } - .buttonStyle(.plain) - .accessibilityLabel(player.wantsLive ? "Stop" : "Play") + private var subtitle: String { + guard player.isPlaying else { return player.statusText } + let station = player.station?.name ?? "" + let artist = player.nowPlaying?.artist ?? "" + return artist.isEmpty ? station : "\(artist) · \(station)" } } From 337c3442b823eee91855e3341fb679363c26faff Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 11:24:23 -0400 Subject: [PATCH 05/35] Add per-device toggles for artist info and track trivia MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The server's artist_bio_enabled setting governs every listener on every client, which is the wrong granularity for "I want this on a desktop screen but not on my phone". Settings now carries two local toggles, defaulting on, that decide whether to render the material the server did send. They are deliberately display-only: the server toggle still decides whether the data is sent at all, and turning these off does not reduce the payload. That tradeoff is fine here — the point is what is on screen, not bandwidth. Track trivia gets its own toggle rather than riding along with artist info, since the knowledge block is separately feature-flagged server-side and someone may reasonably want one and not the other. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/DisplayPreferences.swift | 13 +++++++++++++ ios/AlchemyFM/Views/SettingsView.swift | 13 +++++++++++++ ios/AlchemyFM/Views/StationDetailView.swift | 7 +++++-- 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 ios/AlchemyFM/Views/DisplayPreferences.swift diff --git a/ios/AlchemyFM/Views/DisplayPreferences.swift b/ios/AlchemyFM/Views/DisplayPreferences.swift new file mode 100644 index 0000000..b9ec49c --- /dev/null +++ b/ios/AlchemyFM/Views/DisplayPreferences.swift @@ -0,0 +1,13 @@ +import Foundation + +/// Per-device display preferences, read with `@AppStorage`. +/// +/// Deliberately independent of the server's `artist_bio_enabled` setting: that +/// one governs every listener on every client, and the common case is wanting +/// this material on a desktop screen but not on a phone. The server toggle +/// still wins in the sense that it stops sending the data at all — these only +/// decide whether to show what did arrive. +enum DisplayPreference { + static let showArtistBio = "alchemyfm.showArtistBio" + static let showTrackTrivia = "alchemyfm.showTrackTrivia" +} diff --git a/ios/AlchemyFM/Views/SettingsView.swift b/ios/AlchemyFM/Views/SettingsView.swift index af36734..44f1f19 100644 --- a/ios/AlchemyFM/Views/SettingsView.swift +++ b/ios/AlchemyFM/Views/SettingsView.swift @@ -5,6 +5,9 @@ struct SettingsView: View { @Environment(RadioPlayer.self) private var player @Environment(\.dismiss) private var dismiss + @AppStorage(DisplayPreference.showArtistBio) private var showArtistBio = true + @AppStorage(DisplayPreference.showTrackTrivia) private var showTrackTrivia = true + var body: some View { NavigationStack { Form { @@ -23,6 +26,16 @@ struct SettingsView: View { .padding(.vertical, 4) } + Section { + Toggle("Artist info", isOn: $showArtistBio) + Toggle("Track trivia", isOn: $showTrackTrivia) + } header: { + Text("On station pages") + } footer: { + Text("Applies to this device only — the web player keeps " + + "showing whatever the server has enabled.") + } + Section { Button("Forget this server", role: .destructive) { player.leave() diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index cfc8910..3b1d21d 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -9,6 +9,9 @@ struct StationDetailView: View { @Environment(ServerConfig.self) private var server @State private var loader = StationDetailLoader() + @AppStorage(DisplayPreference.showArtistBio) private var showArtistBio = true + @AppStorage(DisplayPreference.showTrackTrivia) private var showTrackTrivia = true + private var isTuned: Bool { player.isTuned(to: station.slug) } /// When this *is* the tuned station, reuse the player's fast poll rather @@ -38,7 +41,7 @@ struct StationDetailView: View { trackInfo transport - if let bio = nowPlaying?.artistBio, !bio.isEmpty { + if showArtistBio, let bio = nowPlaying?.artistBio, !bio.isEmpty { section("About \(nowPlaying?.artist ?? "the artist")") { Text(bio) .font(.callout) @@ -46,7 +49,7 @@ struct StationDetailView: View { } } - if let facts = nowPlaying?.knowledge?.facts, !facts.isEmpty { + if showTrackTrivia, let facts = nowPlaying?.knowledge?.facts, !facts.isEmpty { section("Did you know") { VStack(alignment: .leading, spacing: 10) { ForEach(Array(facts.enumerated()), id: \.offset) { _, fact in From efd5a5d0a881225ff4be1a91418d64a87c75fd49 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 11:51:18 -0400 Subject: [PATCH 06/35] =?UTF-8?q?Move=20track=20trivia=20behind=20an=20?= =?UTF-8?q?=E2=93=98=20badge=20on=20the=20cover=20art?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Matches the web player, which puts a small circular ⓘ on the artwork and opens the facts from there rather than laying them out in the page. The badge only renders when the current track actually has facts, so its presence is itself the signal that there is something to read. This also fixes the layout problem the inline version created: three paragraphs of grey body text sat between the transport and "Up next", pushing the queue below the fold and competing with the artist bio for the same visual weight. Both of those sections are gone from the page now. The sheet shows each fact with its category and its source link. Sources were previously dropped entirely, which mattered more than it looks: these facts are LLM-generated from web search and make very specific claims ("Maynard James Keenan's 42nd birthday", "released December 18, 2007"), so the citation is the reader's only way to check one. Two deliberate departures from the web player: - No 15s auto-rotation. That suits a fixed desktop panel you glance at; on a phone the reader is holding the text, and having it advance mid-sentence is worse than showing all of it. - The facts travel with the presentation via .sheet(item:) rather than being snapshotted into separate @State and shown with .sheet(isPresented:). The latter renders an empty sheet — the body builds before the snapshot lands, so the title appears and the facts do not. Verified against a local stub serving a known knowledge block, since no station on the live server had facts across ~5 minutes of polling all 21. Badge appears on the cover, opens, and renders all three facts with categories and working Wikipedia links. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationDetailView.swift | 45 +++++++--- ios/AlchemyFM/Views/TrackTrivia.swift | 94 +++++++++++++++++++++ 2 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 ios/AlchemyFM/Views/TrackTrivia.swift diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index 3b1d21d..ac2ba37 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -27,6 +27,21 @@ struct StationDetailView: View { private var listeners: Int { detail?.listeners ?? station.listeners } private var onAir: Bool { detail?.onAir ?? station.onAir } + /// Carries the facts with the presentation. Snapshotting into separate + /// @State and using .sheet(isPresented:) loses them — the sheet body builds + /// before the snapshot lands, and renders an empty list. + private struct TriviaContext: Identifiable { + let id: String + let facts: [KnowledgeFact] + let title: String + } + + @State private var trivia: TriviaContext? + + private var facts: [KnowledgeFact] { + showTrackTrivia ? (nowPlaying?.knowledge?.facts ?? []) : [] + } + var body: some View { ScrollView { VStack(spacing: 20) { @@ -36,6 +51,21 @@ struct StationDetailView: View { .frame(maxWidth: 320) .aspectRatio(1, contentMode: .fit) .shadow(radius: 18, y: 8) + .overlay(alignment: .bottomTrailing) { + if !facts.isEmpty { + TriviaBadge { + // Snapshot on open: the station keeps polling, + // and a track change shouldn't swap the text + // out from under someone mid-read. + trivia = TriviaContext( + id: nowPlaying?.trackKey ?? station.slug, + facts: facts, + title: nowPlaying?.title ?? station.name + ) + } + .padding(10) + } + } .padding(.top, 8) trackInfo @@ -49,18 +79,6 @@ struct StationDetailView: View { } } - if showTrackTrivia, let facts = nowPlaying?.knowledge?.facts, !facts.isEmpty { - section("Did you know") { - VStack(alignment: .leading, spacing: 10) { - ForEach(Array(facts.enumerated()), id: \.offset) { _, fact in - Text(fact.text) - .font(.callout) - .foregroundStyle(.secondary) - } - } - } - } - if let upNext = detail?.upNext, !upNext.isEmpty { section("Up next") { trackList(upNext) } } @@ -74,6 +92,9 @@ struct StationDetailView: View { } .navigationTitle(station.name) .navigationBarTitleDisplayMode(.inline) + .sheet(item: $trivia) { context in + TrackTriviaSheet(facts: context.facts, trackTitle: context.title) + } .task(id: isTuned) { guard let api = server.api else { return } if isTuned { diff --git a/ios/AlchemyFM/Views/TrackTrivia.swift b/ios/AlchemyFM/Views/TrackTrivia.swift new file mode 100644 index 0000000..33ab5a5 --- /dev/null +++ b/ios/AlchemyFM/Views/TrackTrivia.swift @@ -0,0 +1,94 @@ +import SwiftUI + +/// The ⓘ affordance the web player puts on the cover art. Only rendered when +/// the current track actually has facts, so its presence is itself the signal +/// that there's something to read. +struct TriviaBadge: View { + let action: () -> Void + + var body: some View { + Button(action: action) { + Image(systemName: "info") + .font(.system(size: 13, weight: .bold)) + .foregroundStyle(.tint) + .frame(width: 28, height: 28) + .background(.ultraThinMaterial, in: Circle()) + .overlay( + Circle().strokeBorder(Color.accentColor.opacity(0.55), lineWidth: 1) + ) + } + .buttonStyle(.plain) + .accessibilityLabel("Track trivia") + } +} + +/// The facts for the current track, each with its category and source. +/// +/// The web player rotates these on a 15s timer in a small popover. A sheet has +/// room to show them all, and a reader holding the phone shouldn't have text +/// advancing mid-sentence — so they're stacked and separated rather than paged. +struct TrackTriviaSheet: View { + let facts: [KnowledgeFact] + let trackTitle: String + + @Environment(\.dismiss) private var dismiss + + var body: some View { + NavigationStack { + ScrollView { + VStack(alignment: .leading, spacing: 22) { + ForEach(Array(facts.enumerated()), id: \.offset) { index, fact in + if index > 0 { Divider() } + factRow(fact) + } + } + .padding(.horizontal, 20) + .padding(.vertical, 16) + } + .navigationTitle(trackTitle) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + Button("Done") { dismiss() } + } + } + } + .presentationDetents([.medium, .large]) + } + + private func factRow(_ fact: KnowledgeFact) -> some View { + VStack(alignment: .leading, spacing: 8) { + Text(Self.categoryLabel(fact.category)) + .font(.caption2.weight(.semibold)) + .foregroundStyle(.tint) + .textCase(.uppercase) + + Text(fact.text) + .font(.callout) + + // Generated from web search, so the citation is the only way a + // reader can check a specific claim. + ForEach(Array(fact.sources.enumerated()), id: \.offset) { _, source in + if let url = URL(string: source.url) { + Link(destination: url) { + Label( + source.title.isEmpty ? (url.host() ?? "Source") : source.title, + systemImage: "arrow.up.right" + ) + .font(.caption) + } + } + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private static func categoryLabel(_ raw: String) -> String { + switch raw { + case "song_fact": return "Song" + case "album_fact": return "Album" + case "artist_fact": return "Artist" + default: return raw.replacingOccurrences(of: "_", with: " ") + } + } +} From f81f4e023e2850451f182b1e453d23cb4f24002a Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 11:56:52 -0400 Subject: [PATCH 07/35] Move the artist bio behind a tap on the artist's name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same slide-up treatment as track trivia. The artist's name under the track title becomes the target rather than a second glyph on the artwork: it is self-labelling, so there is nothing to guess, and the cover keeps a single badge instead of accumulating a row of unlabelled icons. Bios run to a few thousand characters — T.I. is 2.9 KB — so inline they pushed "Up next" off the screen on essentially every track. The station page is now artwork, title/artist, transport, queue, with both extras a tap away. Surfaces artist_bio_url as a "Read more on Last.fm" link, which was being decoded and then dropped, the same oversight as the trivia sources. Both sheets share one .sheet(item:) driven by an enum rather than two stacked .sheet modifiers, which is unreliable on a single view. Verified against the live server: T.I. on Concrete Poetry, tinted name with an ⓘ, sheet opens with the full bio, scrolls, expands to the large detent, and the Last.fm link resolves. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/ArtistBioSheet.swift | 43 ++++++++++ ios/AlchemyFM/Views/StationDetailView.swift | 93 +++++++++++++++------ ios/AlchemyFM/Views/TrackTrivia.swift | 2 +- 3 files changed, 112 insertions(+), 26 deletions(-) create mode 100644 ios/AlchemyFM/Views/ArtistBioSheet.swift diff --git a/ios/AlchemyFM/Views/ArtistBioSheet.swift b/ios/AlchemyFM/Views/ArtistBioSheet.swift new file mode 100644 index 0000000..b3dbfc2 --- /dev/null +++ b/ios/AlchemyFM/Views/ArtistBioSheet.swift @@ -0,0 +1,43 @@ +import SwiftUI + +/// The artist biography, opened by tapping the artist's name. +/// +/// Same slide-up treatment as the trivia sheet. Keeping it off the station page +/// matters more than it sounds: bios run to a few thousand characters and used +/// to push "Up next" below the fold on every single track. +struct ArtistBioSheet: View { + let artist: String + let text: String + let sourceURL: URL? + + @Environment(\.dismiss) private var dismiss + + var body: some View { + NavigationStack { + ScrollView { + VStack(alignment: .leading, spacing: 16) { + Text(text) + .font(.callout) + + if let sourceURL { + Link(destination: sourceURL) { + Label("Read more on Last.fm", systemImage: "arrow.up.right") + .font(.caption) + } + } + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 20) + .padding(.vertical, 16) + } + .navigationTitle(artist) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .topBarTrailing) { + Button("Done") { dismiss() } + } + } + } + .presentationDetents([.medium, .large]) + } +} diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index ac2ba37..f3b2e80 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -27,21 +27,35 @@ struct StationDetailView: View { private var listeners: Int { detail?.listeners ?? station.listeners } private var onAir: Bool { detail?.onAir ?? station.onAir } - /// Carries the facts with the presentation. Snapshotting into separate - /// @State and using .sheet(isPresented:) loses them — the sheet body builds - /// before the snapshot lands, and renders an empty list. - private struct TriviaContext: Identifiable { - let id: String - let facts: [KnowledgeFact] - let title: String + /// One case per slide-up, carrying its content. + /// + /// The content travels with the presentation rather than living in separate + /// @State read by `.sheet(isPresented:)` — that renders an empty sheet, + /// because the body builds before the state lands. A single enum also keeps + /// this to one `.sheet` modifier; stacking two on one view is unreliable. + private enum DetailSheet: Identifiable { + case trivia(key: String, facts: [KnowledgeFact], trackTitle: String) + case bio(key: String, artist: String, text: String, source: URL?) + + var id: String { + switch self { + case .trivia(let key, _, _): return "trivia-\(key)" + case .bio(let key, _, _, _): return "bio-\(key)" + } + } } - @State private var trivia: TriviaContext? + @State private var sheet: DetailSheet? private var facts: [KnowledgeFact] { showTrackTrivia ? (nowPlaying?.knowledge?.facts ?? []) : [] } + private var availableBio: String? { + guard showArtistBio, let bio = nowPlaying?.artistBio, !bio.isEmpty else { return nil } + return bio + } + var body: some View { ScrollView { VStack(spacing: 20) { @@ -57,10 +71,10 @@ struct StationDetailView: View { // Snapshot on open: the station keeps polling, // and a track change shouldn't swap the text // out from under someone mid-read. - trivia = TriviaContext( - id: nowPlaying?.trackKey ?? station.slug, + sheet = .trivia( + key: nowPlaying?.trackKey ?? station.slug, facts: facts, - title: nowPlaying?.title ?? station.name + trackTitle: nowPlaying?.title ?? station.name ) } .padding(10) @@ -71,14 +85,6 @@ struct StationDetailView: View { trackInfo transport - if showArtistBio, let bio = nowPlaying?.artistBio, !bio.isEmpty { - section("About \(nowPlaying?.artist ?? "the artist")") { - Text(bio) - .font(.callout) - .foregroundStyle(.secondary) - } - } - if let upNext = detail?.upNext, !upNext.isEmpty { section("Up next") { trackList(upNext) } } @@ -92,8 +98,13 @@ struct StationDetailView: View { } .navigationTitle(station.name) .navigationBarTitleDisplayMode(.inline) - .sheet(item: $trivia) { context in - TrackTriviaSheet(facts: context.facts, trackTitle: context.title) + .sheet(item: $sheet) { item in + switch item { + case .trivia(_, let facts, let trackTitle): + TrackTriviaSheet(facts: facts, trackTitle: trackTitle) + case .bio(_, let artist, let text, let source): + ArtistBioSheet(artist: artist, text: text, sourceURL: source) + } } .task(id: isTuned) { guard let api = server.api else { return } @@ -106,16 +117,48 @@ struct StationDetailView: View { .onDisappear { loader.stop() } } + /// Tapping the artist's name opens their biography — a self-labelling + /// target, which is why this is here rather than a second unlabelled glyph + /// on the artwork competing with the trivia badge. + @ViewBuilder + private var artistLine: some View { + let artist = nowPlaying?.artist ?? station.description + + if let bio = availableBio, !artist.isEmpty { + Button { + sheet = .bio( + key: artist, + artist: artist, + text: bio, + source: nowPlaying?.artistBioUrl.flatMap(URL.init(string:)) + ) + } label: { + HStack(spacing: 5) { + Text(artist) + Image(systemName: "info.circle") + .font(.footnote) + } + .font(.title3) + .foregroundStyle(.tint) + .multilineTextAlignment(.center) + } + .buttonStyle(.plain) + .accessibilityLabel("About \(artist)") + } else { + Text(artist) + .font(.title3) + .foregroundStyle(.secondary) + .multilineTextAlignment(.center) + } + } + private var trackInfo: some View { VStack(spacing: 6) { Text(nowPlaying?.title ?? station.name) .font(.title2.bold()) .multilineTextAlignment(.center) - Text(nowPlaying?.artist ?? station.description) - .font(.title3) - .foregroundStyle(.secondary) - .multilineTextAlignment(.center) + artistLine HStack(spacing: 6) { if isTuned && player.isPlaying { diff --git a/ios/AlchemyFM/Views/TrackTrivia.swift b/ios/AlchemyFM/Views/TrackTrivia.swift index 33ab5a5..63a6c0b 100644 --- a/ios/AlchemyFM/Views/TrackTrivia.swift +++ b/ios/AlchemyFM/Views/TrackTrivia.swift @@ -83,7 +83,7 @@ struct TrackTriviaSheet: View { .frame(maxWidth: .infinity, alignment: .leading) } - private static func categoryLabel(_ raw: String) -> String { + static func categoryLabel(_ raw: String) -> String { switch raw { case "song_fact": return "Song" case "album_fact": return "Album" From 6b01f5c87f19af2d78a8c7e9c98e937cc5d3f635 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 12:08:42 -0400 Subject: [PATCH 08/35] Add appearance setting, mini-player marquee, station skip on lock screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Appearance: the app hard-coded .dark, so it ignored the system setting entirely. Settings now carries System/Light/Dark, defaulting to System. Light mode had never been exercised before this — the adaptive colours hold up, since everything was already .bar/.quaternary/.secondary/tint rather than fixed values. Mini player: long titles were truncated in a bar that is permanently on screen and has no detail view of its own, so there was nowhere to read the rest. MarqueeText slides to reveal the tail, slowly, pausing at each end. Deliberately not used anywhere else: list rows and station pages have room to wrap or a screen to open, and self-moving text is a cost there. The scrolling copy sits in an overlay behind a hidden, truncating copy that does the layout. Letting the fixedSize text participate in layout directly propagates the full string width into the enclosing HStack, which shoves the artwork off the leading edge of the bar. Lock screen: ⏮/⏭ were disabled on the grounds that live radio has nothing to skip to. They now tune to the previous/next station, wrapping at both ends, which is the closest thing a radio has to a skip button. The station list screen keeps the player's copy of the ordering in sync so the buttons follow the same order shown on screen. Seek and scrub stay disabled — a live stream still has no timeline. Verified in the simulator: System follows the host appearance, and the marquee reveals the tail of a 57-character title in the mini player while the same title stays truncated in the list row above it. The lock-screen buttons are not verified — the simulator does not render the now-playing widget. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/AlchemyFMApp.swift | 5 +- ios/AlchemyFM/Playback/RadioPlayer.swift | 39 ++++++++- ios/AlchemyFM/Views/DisplayPreferences.swift | 42 +++++++-- ios/AlchemyFM/Views/MarqueeText.swift | 92 ++++++++++++++++++++ ios/AlchemyFM/Views/SettingsView.swift | 13 ++- ios/AlchemyFM/Views/StationListView.swift | 18 ++-- 6 files changed, 194 insertions(+), 15 deletions(-) create mode 100644 ios/AlchemyFM/Views/MarqueeText.swift diff --git a/ios/AlchemyFM/AlchemyFMApp.swift b/ios/AlchemyFM/AlchemyFMApp.swift index 2a5e2ba..3562d3b 100644 --- a/ios/AlchemyFM/AlchemyFMApp.swift +++ b/ios/AlchemyFM/AlchemyFMApp.swift @@ -5,12 +5,15 @@ struct AlchemyFMApp: App { @State private var server = ServerConfig() @State private var player = RadioPlayer() + @AppStorage(DisplayPreference.appearance) private var appearance = AppearanceMode.system.rawValue + var body: some Scene { WindowGroup { RootView() .environment(server) .environment(player) - .preferredColorScheme(.dark) + // nil follows the system setting. + .preferredColorScheme(AppearanceMode.resolve(appearance).colorScheme) } } } diff --git a/ios/AlchemyFM/Playback/RadioPlayer.swift b/ios/AlchemyFM/Playback/RadioPlayer.swift index 4e428c4..838a9af 100644 --- a/ios/AlchemyFM/Playback/RadioPlayer.swift +++ b/ios/AlchemyFM/Playback/RadioPlayer.swift @@ -34,6 +34,14 @@ final class RadioPlayer { @ObservationIgnored var api: AlchemyAPI? + /// The station list in display order, kept current by the station list + /// screen. Backs the lock screen's ⏮/⏭, which tune between stations. + @ObservationIgnored private var stationOrder: [StationSummary] = [] + + func updateStationOrder(_ stations: [StationSummary]) { + stationOrder = stations + } + // MARK: Private state @ObservationIgnored private var player: AVPlayer? @@ -504,8 +512,22 @@ final class RadioPlayer { return .success } + // There is no next *track* to skip to — everyone hears the same + // broadcast — so these tune to the next station instead, which is the + // closest thing a radio has to a skip button. + center.nextTrackCommand.isEnabled = true + center.nextTrackCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.tuneToAdjacentStation(offset: 1) } + return .success + } + center.previousTrackCommand.isEnabled = true + center.previousTrackCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.tuneToAdjacentStation(offset: -1) } + return .success + } + + // Seeking stays off: a live stream has no timeline to scrub. let unsupported: [MPRemoteCommand] = [ - center.nextTrackCommand, center.previousTrackCommand, center.skipForwardCommand, center.skipBackwardCommand, center.seekForwardCommand, center.seekBackwardCommand, center.changePlaybackPositionCommand, @@ -513,6 +535,21 @@ final class RadioPlayer { unsupported.forEach { $0.isEnabled = false } } + /// Wraps around, so ⏭ off the end of the list returns to the first station + /// rather than doing nothing and looking broken. + private func tuneToAdjacentStation(offset: Int) { + guard let api, + !stationOrder.isEmpty, + let current = station, + let index = stationOrder.firstIndex(where: { $0.slug == current.slug }) + else { return } + + let count = stationOrder.count + let next = stationOrder[((index + offset) % count + count) % count] + guard next.slug != current.slug else { return } + tune(to: next, api: api) + } + private func updateNowPlayingInfo() { let center = MPNowPlayingInfoCenter.default() guard let station else { diff --git a/ios/AlchemyFM/Views/DisplayPreferences.swift b/ios/AlchemyFM/Views/DisplayPreferences.swift index b9ec49c..9b90063 100644 --- a/ios/AlchemyFM/Views/DisplayPreferences.swift +++ b/ios/AlchemyFM/Views/DisplayPreferences.swift @@ -1,13 +1,43 @@ -import Foundation +import SwiftUI /// Per-device display preferences, read with `@AppStorage`. /// -/// Deliberately independent of the server's `artist_bio_enabled` setting: that -/// one governs every listener on every client, and the common case is wanting -/// this material on a desktop screen but not on a phone. The server toggle -/// still wins in the sense that it stops sending the data at all — these only -/// decide whether to show what did arrive. +/// The content toggles are deliberately independent of the server's +/// `artist_bio_enabled` setting: that one governs every listener on every +/// client, and the common case is wanting this material on a desktop screen but +/// not on a phone. The server toggle still wins in the sense that it stops +/// sending the data at all — these only decide whether to show what arrived. enum DisplayPreference { static let showArtistBio = "alchemyfm.showArtistBio" static let showTrackTrivia = "alchemyfm.showTrackTrivia" + static let appearance = "alchemyfm.appearance" +} + +enum AppearanceMode: String, CaseIterable, Identifiable { + case system + case light + case dark + + var id: String { rawValue } + + var label: String { + switch self { + case .system: return "System" + case .light: return "Light" + case .dark: return "Dark" + } + } + + /// nil hands the decision back to the system. + var colorScheme: ColorScheme? { + switch self { + case .system: return nil + case .light: return .light + case .dark: return .dark + } + } + + static func resolve(_ raw: String) -> AppearanceMode { + AppearanceMode(rawValue: raw) ?? .system + } } diff --git a/ios/AlchemyFM/Views/MarqueeText.swift b/ios/AlchemyFM/Views/MarqueeText.swift new file mode 100644 index 0000000..343ff8e --- /dev/null +++ b/ios/AlchemyFM/Views/MarqueeText.swift @@ -0,0 +1,92 @@ +import SwiftUI + +/// Single-line text that slides to reveal its tail when it doesn't fit. +/// +/// Used only in the mini player, where the bar is permanently on screen and a +/// truncated title has nowhere else to be read. Everywhere else has room to +/// wrap or a detail screen to open, and text that moves on its own is a cost +/// rather than a feature — so this deliberately isn't applied globally. +struct MarqueeText: View { + let text: String + var font: Font = .subheadline + var weight: Font.Weight? + /// Points per second. An unhurried read, not an LED ticker — this sits in + /// a bar that's permanently on screen, so speed is the wrong thing to + /// optimise for. + var speed: Double = 15 + /// Pause at each end, so the start and the end are each legible at rest. + var pause: Double = 2.5 + + @State private var textWidth: CGFloat = 0 + @State private var boxWidth: CGFloat = 0 + @State private var shifted = false + + private var overflow: CGFloat { max(0, textWidth - boxWidth) } + + private var resolvedFont: Font { + weight.map { font.weight($0) } ?? font + } + + var body: some View { + // A hidden, truncating copy does the layout — it compresses under + // pressure exactly like a plain Text would. The visible copy is + // fixedSize (so it can be wider than the box) and lives in an overlay, + // where its intrinsic width can't push its siblings around. + Text(text) + .font(resolvedFont) + .lineLimit(1) + .hidden() + .overlay(alignment: .leading) { + Text(text) + .font(resolvedFont) + .lineLimit(1) + .fixedSize() + .background( + GeometryReader { proxy in + Color.clear + .preference(key: MarqueeWidthKey.self, value: proxy.size.width) + } + ) + .offset(x: shifted ? -overflow : 0) + } + .onPreferenceChange(MarqueeWidthKey.self) { textWidth = $0 } + .background( + GeometryReader { proxy in + Color.clear.preference(key: MarqueeBoxKey.self, value: proxy.size.width) + } + ) + .onPreferenceChange(MarqueeBoxKey.self) { boxWidth = $0 } + .clipped() + .onChange(of: text) { _, _ in restart() } + .onChange(of: overflow) { _, _ in restart() } + .onAppear { restart() } + } + + private func restart() { + // Drop any in-flight repeatForever animation before starting another, + // otherwise they stack and the text drifts. + withAnimation(.none) { shifted = false } + guard overflow > 0 else { return } + withAnimation( + .linear(duration: Double(overflow) / speed) + .delay(pause) + .repeatForever(autoreverses: true) + ) { + shifted = true + } + } +} + +private struct MarqueeWidthKey: PreferenceKey { + static let defaultValue: CGFloat = 0 + static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { + value = max(value, nextValue()) + } +} + +private struct MarqueeBoxKey: PreferenceKey { + static let defaultValue: CGFloat = 0 + static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) { + value = max(value, nextValue()) + } +} diff --git a/ios/AlchemyFM/Views/SettingsView.swift b/ios/AlchemyFM/Views/SettingsView.swift index 44f1f19..1ffdf5f 100644 --- a/ios/AlchemyFM/Views/SettingsView.swift +++ b/ios/AlchemyFM/Views/SettingsView.swift @@ -7,6 +7,7 @@ struct SettingsView: View { @AppStorage(DisplayPreference.showArtistBio) private var showArtistBio = true @AppStorage(DisplayPreference.showTrackTrivia) private var showTrackTrivia = true + @AppStorage(DisplayPreference.appearance) private var appearance = AppearanceMode.system.rawValue var body: some View { NavigationStack { @@ -26,6 +27,15 @@ struct SettingsView: View { .padding(.vertical, 4) } + Section("Appearance") { + Picker("Theme", selection: $appearance) { + ForEach(AppearanceMode.allCases) { mode in + Text(mode.label).tag(mode.rawValue) + } + } + .pickerStyle(.segmented) + } + Section { Toggle("Artist info", isOn: $showArtistBio) Toggle("Track trivia", isOn: $showTrackTrivia) @@ -47,7 +57,8 @@ struct SettingsView: View { Section("About") { LabeledContent("Version", value: Self.version) Text("Alchemy FM is live radio — everyone hears the same " - + "broadcast, so there's no skipping or seeking.") + + "broadcast, so there's no seeking within a track. On " + + "the lock screen, ⏮ and ⏭ change station.") .font(.footnote) .foregroundStyle(.secondary) } diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index 3b690d4..ad51c35 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -39,6 +39,10 @@ struct StationListView: View { guard let api = server.api else { return } store.start(api: api) } + // Keeps the lock screen's ⏮/⏭ pointed at the same order shown here. + .onChange(of: store.stations) { _, stations in + player.updateStationOrder(stations) + } .onDisappear { store.stop() } } @@ -187,13 +191,15 @@ struct MiniPlayerBar: View { .frame(width: 40, height: 40) VStack(alignment: .leading, spacing: 2) { - Text(player.nowPlaying?.title ?? player.station?.name ?? "") - .font(.subheadline.weight(.medium)) - .lineLimit(1) - Text(subtitle) - .font(.caption) + // The bar is always on screen and has no detail view of its + // own, so a truncated title here has nowhere else to be read. + MarqueeText( + text: player.nowPlaying?.title ?? player.station?.name ?? "", + font: .subheadline, + weight: .medium + ) + MarqueeText(text: subtitle, font: .caption) .foregroundStyle(.secondary) - .lineLimit(1) } Spacer(minLength: 0) From ddb2b944e20a53732866b950387ffe95e521aa39 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 12:17:11 -0400 Subject: [PATCH 09/35] Add local favorite stations, pinned to the top of the list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Favourites are stored on the device and never sent anywhere. The API already sorts `featured` stations first, but that is the operator's choice for every listener; this is one person's, on one phone, so the two are kept separate rather than one silently overriding the other. Favourited stations move into their own "Favorites" section above "All stations", and each group keeps the server's ordering inside itself — so featured/sort_order still decides what leads within a group. With no favourites the list renders exactly as before, without empty section headers. Toggling is a leading swipe, with a long-press menu as a second route. The row already carries two targets — tap to open, button to play — and a third control would crowd both. The lock screen's ⏮/⏭ now follow this same order, favourites included, so skipping matches the list you can actually see. Verified in the simulator: swipe reveals Favorite, the station moves to a Favorites section, swiping it again offers Unfavorite, and the slug persists to UserDefaults. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/AlchemyFMApp.swift | 2 + ios/AlchemyFM/Networking/FavoritesStore.swift | 51 ++++++++++++++++ ios/AlchemyFM/Views/StationListView.swift | 58 +++++++++++++++++-- 3 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 ios/AlchemyFM/Networking/FavoritesStore.swift diff --git a/ios/AlchemyFM/AlchemyFMApp.swift b/ios/AlchemyFM/AlchemyFMApp.swift index 3562d3b..812555d 100644 --- a/ios/AlchemyFM/AlchemyFMApp.swift +++ b/ios/AlchemyFM/AlchemyFMApp.swift @@ -4,6 +4,7 @@ import SwiftUI struct AlchemyFMApp: App { @State private var server = ServerConfig() @State private var player = RadioPlayer() + @State private var favorites = FavoritesStore() @AppStorage(DisplayPreference.appearance) private var appearance = AppearanceMode.system.rawValue @@ -12,6 +13,7 @@ struct AlchemyFMApp: App { RootView() .environment(server) .environment(player) + .environment(favorites) // nil follows the system setting. .preferredColorScheme(AppearanceMode.resolve(appearance).colorScheme) } diff --git a/ios/AlchemyFM/Networking/FavoritesStore.swift b/ios/AlchemyFM/Networking/FavoritesStore.swift new file mode 100644 index 0000000..81e9c44 --- /dev/null +++ b/ios/AlchemyFM/Networking/FavoritesStore.swift @@ -0,0 +1,51 @@ +import Foundation +import Observation + +/// Favourite stations, stored on the device. +/// +/// Deliberately local. The API already sorts `featured` stations first, but +/// that is the operator's choice for every listener; this is one person's, on +/// one phone, and the two shouldn't overwrite each other. +@MainActor +@Observable +final class FavoritesStore { + private static let key = "alchemyfm.favorites" + + private(set) var slugs: Set = [] + + private let defaults: UserDefaults + + init(defaults: UserDefaults = .standard) { + self.defaults = defaults + slugs = Set(defaults.stringArray(forKey: Self.key) ?? []) + } + + func isFavorite(_ slug: String) -> Bool { + slugs.contains(slug) + } + + func toggle(_ slug: String) { + if slugs.contains(slug) { + slugs.remove(slug) + } else { + slugs.insert(slug) + } + defaults.set(Array(slugs), forKey: Self.key) + } + + /// Favourites first, each group keeping the server's ordering — so the + /// operator's `featured`/`sort_order` still decides what leads within each + /// group rather than being replaced by insertion order. + func partition(_ stations: [StationSummary]) -> (favorites: [StationSummary], others: [StationSummary]) { + var favorites: [StationSummary] = [] + var others: [StationSummary] = [] + for station in stations { + if slugs.contains(station.slug) { + favorites.append(station) + } else { + others.append(station) + } + } + return (favorites, others) + } +} diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index ad51c35..5cb91aa 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -3,6 +3,7 @@ import SwiftUI struct StationListView: View { @Environment(ServerConfig.self) private var server @Environment(RadioPlayer.self) private var player + @Environment(FavoritesStore.self) private var favorites @State private var store = StationStore() @State private var path: [StationSummary] = [] @@ -39,8 +40,9 @@ struct StationListView: View { guard let api = server.api else { return } store.start(api: api) } - // Keeps the lock screen's ⏮/⏭ pointed at the same order shown here. - .onChange(of: store.stations) { _, stations in + // Keeps the lock screen's ⏮/⏭ pointed at the same order shown here, + // favourites included — skipping should follow the list you can see. + .onChange(of: displayOrder, initial: true) { _, stations in player.updateStationOrder(stations) } .onDisappear { store.stop() } @@ -70,10 +72,25 @@ struct StationListView: View { } } + private var displayOrder: [StationSummary] { + let groups = favorites.partition(store.stations) + return groups.favorites + groups.others + } + private var stationList: some View { - List(store.stations) { station in - StationRow(station: station) { path.append(station) } - .listRowBackground(Color.clear) + let groups = favorites.partition(store.stations) + + return List { + if groups.favorites.isEmpty { + ForEach(store.stations) { row($0) } + } else { + Section("Favorites") { + ForEach(groups.favorites) { row($0) } + } + Section("All stations") { + ForEach(groups.others) { row($0) } + } + } } .listStyle(.plain) .refreshable { @@ -81,6 +98,37 @@ struct StationListView: View { await store.refresh(api: api) } } + + /// Favouriting lives on a swipe and a long-press rather than a third button + /// in the row — the row already carries "open" and "play", and a third + /// target would crowd both of them. + private func row(_ station: StationSummary) -> some View { + let isFavorite = favorites.isFavorite(station.slug) + + return StationRow(station: station) { path.append(station) } + .listRowBackground(Color.clear) + .swipeActions(edge: .leading, allowsFullSwipe: true) { + Button { + favorites.toggle(station.slug) + } label: { + Label( + isFavorite ? "Unfavorite" : "Favorite", + systemImage: isFavorite ? "star.slash" : "star" + ) + } + .tint(.yellow) + } + .contextMenu { + Button { + favorites.toggle(station.slug) + } label: { + Label( + isFavorite ? "Remove from Favorites" : "Add to Favorites", + systemImage: isFavorite ? "star.slash" : "star" + ) + } + } + } } /// Two independent controls: the artwork/title area opens the station, the From ea6fd34acd0f0bc5ec4c0c4cd7dda0d8d773fa60 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 12:24:47 -0400 Subject: [PATCH 10/35] Add optional operator sign-in, unlocking the heart action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hearting a track is admin-only in the web player and was simply absent here. Settings now takes optional admin credentials; without them the app behaves exactly as before, which is the point — listening needs no account and someone who never signs in should never notice this exists. Sign-in goes through POST /api/admin/login for the session cookie rather than sending HTTP Basic on each request. require_admin would accept Basic on the write endpoint, but the station poll decides whether to include `hearted` by looking for a session cookie specifically (admin_user_from_request), so Basic alone would let you heart a track while never being able to see that it worked. Credentials go in the Keychain, not UserDefaults where the display preferences live — that is a plist in the app container and ends up in file-system backups. Stored per host, so pointing the app at another server doesn't reuse credentials meant for the previous one, and signing out drops the cookie immediately rather than waiting out its 7-day expiry. `hearted` is nil for anyone not signed in, so it doubles as the gate: no sign-in, no heart state, no button. The toggle updates optimistically because the poll that would confirm it is up to 5s away when browsing, and falls back to server truth if the write fails. Verified: signed out, the API omits `hearted` and no button renders; wrong credentials report "Wrong username or password" and persist nothing. A successful sign-in and an actual heart toggle are unverified — they need real admin credentials, which are the operator's to enter. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/AlchemyFMApp.swift | 2 + ios/AlchemyFM/Models/Station.swift | 3 + .../Networking/AdminCredentialStore.swift | 58 +++++++++++++ ios/AlchemyFM/Networking/AdminSession.swift | 81 ++++++++++++++++++ ios/AlchemyFM/Networking/AlchemyAPI.swift | 56 +++++++++++++ ios/AlchemyFM/Views/AdminSection.swift | 84 +++++++++++++++++++ ios/AlchemyFM/Views/RootView.swift | 17 +++- ios/AlchemyFM/Views/SettingsView.swift | 2 + ios/AlchemyFM/Views/StationDetailView.swift | 65 +++++++++++++- 9 files changed, 361 insertions(+), 7 deletions(-) create mode 100644 ios/AlchemyFM/Networking/AdminCredentialStore.swift create mode 100644 ios/AlchemyFM/Networking/AdminSession.swift create mode 100644 ios/AlchemyFM/Views/AdminSection.swift diff --git a/ios/AlchemyFM/AlchemyFMApp.swift b/ios/AlchemyFM/AlchemyFMApp.swift index 812555d..67b8877 100644 --- a/ios/AlchemyFM/AlchemyFMApp.swift +++ b/ios/AlchemyFM/AlchemyFMApp.swift @@ -5,6 +5,7 @@ struct AlchemyFMApp: App { @State private var server = ServerConfig() @State private var player = RadioPlayer() @State private var favorites = FavoritesStore() + @State private var admin = AdminSession() @AppStorage(DisplayPreference.appearance) private var appearance = AppearanceMode.system.rawValue @@ -14,6 +15,7 @@ struct AlchemyFMApp: App { .environment(server) .environment(player) .environment(favorites) + .environment(admin) // nil follows the system setting. .preferredColorScheme(AppearanceMode.resolve(appearance).colorScheme) } diff --git a/ios/AlchemyFM/Models/Station.swift b/ios/AlchemyFM/Models/Station.swift index ad9635b..9872df0 100644 --- a/ios/AlchemyFM/Models/Station.swift +++ b/ios/AlchemyFM/Models/Station.swift @@ -29,6 +29,9 @@ struct NowPlaying: Codable, Hashable { var artistBio: String? var artistBioUrl: String? var knowledge: KnowledgeBlock? + /// Only sent to a signed-in operator, so nil doubles as "not an admin" — + /// which is exactly what gates the heart button. + var hearted: Bool? /// Identity for "did the track change?" checks. `item_id` is the real key /// when present; title+artist covers stations whose source has no ids. diff --git a/ios/AlchemyFM/Networking/AdminCredentialStore.swift b/ios/AlchemyFM/Networking/AdminCredentialStore.swift new file mode 100644 index 0000000..287f661 --- /dev/null +++ b/ios/AlchemyFM/Networking/AdminCredentialStore.swift @@ -0,0 +1,58 @@ +import Foundation +import Security + +/// Admin credentials, kept in the Keychain. +/// +/// Deliberately not `UserDefaults`, where the other preferences live: that is a +/// plist in the app container, readable from a file-system backup. This is an +/// operator's password for their own server. +/// +/// Keyed by host, so pointing the app at a different server doesn't silently +/// reuse credentials meant for the previous one. +enum AdminCredentialStore { + private static let service = "fm.alchemy.AlchemyFM.admin" + + struct Credentials: Codable, Equatable { + let username: String + let password: String + } + + static func save(_ credentials: Credentials, host: String) { + guard let data = try? JSONEncoder().encode(credentials) else { return } + delete(host: host) + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: host, + kSecValueData as String: data, + // Needs to be readable while the app runs in the background to + // re-authenticate, but never leaves this device. + kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly, + ] + SecItemAdd(query as CFDictionary, nil) + } + + static func load(host: String) -> Credentials? { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: host, + kSecReturnData as String: true, + kSecMatchLimit as String: kSecMatchLimitOne, + ] + var item: CFTypeRef? + guard SecItemCopyMatching(query as CFDictionary, &item) == errSecSuccess, + let data = item as? Data + else { return nil } + return try? JSONDecoder().decode(Credentials.self, from: data) + } + + static func delete(host: String) { + let query: [String: Any] = [ + kSecClass as String: kSecClassGenericPassword, + kSecAttrService as String: service, + kSecAttrAccount as String: host, + ] + SecItemDelete(query as CFDictionary) + } +} diff --git a/ios/AlchemyFM/Networking/AdminSession.swift b/ios/AlchemyFM/Networking/AdminSession.swift new file mode 100644 index 0000000..266f473 --- /dev/null +++ b/ios/AlchemyFM/Networking/AdminSession.swift @@ -0,0 +1,81 @@ +import Foundation +import Observation + +/// Optional operator sign-in. +/// +/// Everything the app does by default is public and unauthenticated. Signing in +/// unlocks exactly one thing — hearting the current track, which is an admin +/// action in the web player too. Nothing else changes, and the app is fully +/// usable without ever touching this. +@MainActor +@Observable +final class AdminSession { + enum State: Equatable { + case signedOut + case signingIn + case signedIn(username: String) + case failed(String) + } + + private(set) var state: State = .signedOut + + var username: String? { + if case .signedIn(let name) = state { return name } + return nil + } + + var isSignedIn: Bool { username != nil } + + /// Restores a stored sign-in for this host, if there is one. + /// + /// The session cookie usually outlives a launch, but re-authenticating is a + /// single cheap request and avoids the case where it has expired server + /// side and the heart button silently stops working. + func restore(for baseURL: URL) async { + guard let host = baseURL.host(), + let credentials = AdminCredentialStore.load(host: host) + else { + state = .signedOut + return + } + await signIn( + username: credentials.username, + password: credentials.password, + baseURL: baseURL, + persist: false + ) + } + + func signIn(username: String, password: String, baseURL: URL, persist: Bool = true) async { + guard let host = baseURL.host() else { return } + state = .signingIn + do { + let name = try await AlchemyAPI(baseURL: baseURL) + .adminLogin(username: username, password: password) + if persist { + AdminCredentialStore.save( + .init(username: username, password: password), host: host + ) + } + state = .signedIn(username: name) + } catch { + // A stored credential that no longer works shouldn't keep silently + // retrying on every launch. + if persist == false { AdminCredentialStore.delete(host: host) } + state = .failed(error.localizedDescription) + } + } + + func signOut(baseURL: URL?) { + if let host = baseURL?.host() { + AdminCredentialStore.delete(host: host) + } + // Drops the admin_session cookie so the station poll stops returning + // heart state immediately, rather than until it expires. + if let baseURL, let storage = HTTPCookieStorage.shared.cookies(for: baseURL) { + storage.filter { $0.name == "admin_session" } + .forEach(HTTPCookieStorage.shared.deleteCookie) + } + state = .signedOut + } +} diff --git a/ios/AlchemyFM/Networking/AlchemyAPI.swift b/ios/AlchemyFM/Networking/AlchemyAPI.swift index b5efd30..512d0bc 100644 --- a/ios/AlchemyFM/Networking/AlchemyAPI.swift +++ b/ios/AlchemyFM/Networking/AlchemyAPI.swift @@ -9,8 +9,14 @@ enum APIError: LocalizedError { switch self { case .badURL: return "That doesn't look like a valid address." + case .http(let status) where status == 401: + return "Wrong username or password." case .http(let status) where status == 404: return "Not found on this server (404)." + case .http(let status) where status == 429: + return "Too many attempts — wait a few minutes and try again." + case .http(let status) where status == 503: + return "Admin is disabled on this server (no ADMIN_PASSWORD set)." case .http(let status): return "The server returned HTTP \(status)." case .notAlchemyServer: @@ -86,6 +92,56 @@ struct AlchemyAPI: Sendable { return health } + // MARK: - Admin (optional) + + /// Exchanges credentials for the `admin_session` cookie. + /// + /// The cookie, not HTTP Basic, is what unlocks the heart feature: the + /// station endpoint decides whether to include `hearted` by looking for a + /// session cookie specifically (`admin_user_from_request`), even though + /// `require_admin` would also accept Basic auth on the write endpoint. + /// URLSession stores and replays the cookie for us. + @discardableResult + func adminLogin(username: String, password: String) async throws -> String { + struct Body: Encodable { + let username: String + let password: String + } + struct Reply: Decodable { + let username: String + } + let reply: Reply = try await post( + "/api/admin/login", body: Body(username: username, password: password) + ) + return reply.username + } + + /// `POST /api/admin/navidrome/songs/{item_id}/heart` + @discardableResult + func setHeart(itemId: String, hearted: Bool) async throws -> Bool { + struct Body: Encodable { let hearted: Bool } + struct Reply: Decodable { let hearted: Bool } + let escaped = itemId.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? itemId + let reply: Reply = try await post( + "/api/admin/navidrome/songs/\(escaped)/heart", body: Body(hearted: hearted) + ) + return reply.hearted + } + + private func post(_ path: String, body: Body) async throws -> T { + guard let url = URL(string: path, relativeTo: baseURL) else { throw APIError.badURL } + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.httpBody = try JSONEncoder().encode(body) + + let (data, response) = try await Self.session.data(for: request) + if let http = response as? HTTPURLResponse, !(200..<300).contains(http.statusCode) { + throw APIError.http(status: http.statusCode) + } + return try Self.decoder.decode(T.self, from: data) + } + /// The stream URL to hand `AVPlayer`. /// /// Deliberately the backend's same-origin `/listen` endpoint rather than diff --git a/ios/AlchemyFM/Views/AdminSection.swift b/ios/AlchemyFM/Views/AdminSection.swift new file mode 100644 index 0000000..4b214ca --- /dev/null +++ b/ios/AlchemyFM/Views/AdminSection.swift @@ -0,0 +1,84 @@ +import SwiftUI + +/// Optional operator sign-in, in Settings. +/// +/// Kept explicitly optional: listening needs no account, and the only thing +/// this unlocks is hearting the current track — an admin action in the web +/// player too. Someone who never signs in should never notice it's missing. +struct AdminSection: View { + @Environment(ServerConfig.self) private var server + @Environment(AdminSession.self) private var admin + + @State private var username = "" + @State private var password = "" + @FocusState private var focus: Field? + + private enum Field { case username, password } + + var body: some View { + Section { + switch admin.state { + case .signedIn(let name): + LabeledContent("Signed in", value: name) + Button("Sign out", role: .destructive) { + admin.signOut(baseURL: server.baseURL) + username = "" + password = "" + } + + default: + TextField("Admin username", text: $username) + .textInputAutocapitalization(.never) + .autocorrectionDisabled() + .textContentType(.username) + .focused($focus, equals: .username) + .submitLabel(.next) + .onSubmit { focus = .password } + + SecureField("Admin password", text: $password) + .textContentType(.password) + .focused($focus, equals: .password) + .submitLabel(.go) + .onSubmit(signIn) + + if case .failed(let message) = admin.state { + Label(message, systemImage: "exclamationmark.triangle") + .font(.footnote) + .foregroundStyle(.red) + } + + Button(action: signIn) { + HStack { + if case .signingIn = admin.state { + ProgressView().controlSize(.small) + } + Text("Sign in") + } + } + .disabled(!canSubmit) + } + } header: { + Text("Operator (optional)") + } footer: { + Text("Only needed to heart the current track, the same as signing in " + + "on the web player. Everything else works signed out. Stored " + + "in the Keychain for this server only.") + } + } + + private var canSubmit: Bool { + if case .signingIn = admin.state { return false } + return !username.trimmingCharacters(in: .whitespaces).isEmpty && !password.isEmpty + } + + private func signIn() { + guard canSubmit, let baseURL = server.baseURL else { return } + focus = nil + let user = username.trimmingCharacters(in: .whitespaces) + let secret = password + Task { + await admin.signIn(username: user, password: secret, baseURL: baseURL) + if admin.isSignedIn { password = "" } + } + } +} diff --git a/ios/AlchemyFM/Views/RootView.swift b/ios/AlchemyFM/Views/RootView.swift index 24d969a..ee13829 100644 --- a/ios/AlchemyFM/Views/RootView.swift +++ b/ios/AlchemyFM/Views/RootView.swift @@ -2,12 +2,21 @@ import SwiftUI struct RootView: View { @Environment(ServerConfig.self) private var server + @Environment(AdminSession.self) private var admin var body: some View { - if server.isConfigured { - StationListView() - } else { - ServerSetupView() + Group { + if server.isConfigured { + StationListView() + } else { + ServerSetupView() + } + } + // Credentials are stored per host, so switching servers re-evaluates + // from scratch rather than carrying a sign-in across. + .task(id: server.baseURL) { + guard let baseURL = server.baseURL else { return } + await admin.restore(for: baseURL) } } } diff --git a/ios/AlchemyFM/Views/SettingsView.swift b/ios/AlchemyFM/Views/SettingsView.swift index 1ffdf5f..4a818c5 100644 --- a/ios/AlchemyFM/Views/SettingsView.swift +++ b/ios/AlchemyFM/Views/SettingsView.swift @@ -27,6 +27,8 @@ struct SettingsView: View { .padding(.vertical, 4) } + AdminSection() + Section("Appearance") { Picker("Theme", selection: $appearance) { ForEach(AppearanceMode.allCases) { mode in diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index f3b2e80..c864a6a 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -47,6 +47,11 @@ struct StationDetailView: View { @State private var sheet: DetailSheet? + /// Local heart state while a toggle is in flight, cleared when the track + /// changes so a stale override can't bleed onto the next song. + @State private var heartOverride: Bool? + @State private var heartBusy = false + private var facts: [KnowledgeFact] { showTrackTrivia ? (nowPlaying?.knowledge?.facts ?? []) : [] } @@ -114,6 +119,7 @@ struct StationDetailView: View { loader.start(slug: station.slug, api: api) } } + .onChange(of: nowPlaying?.trackKey) { _, _ in heartOverride = nil } .onDisappear { loader.stop() } } @@ -178,11 +184,64 @@ struct StationDetailView: View { } } + /// The heart is an operator action, so it only exists once the server has + /// told us the current heart state — which it only does for a signed-in + /// admin. No sign-in, no `hearted`, no button. + private var isHearted: Bool { + heartOverride ?? (nowPlaying?.hearted ?? false) + } + + private var canHeart: Bool { + nowPlaying?.hearted != nil && nowPlaying?.itemId != nil + } + private var transport: some View { // No skip, no seek — everyone hears the same broadcast. - StationPlayButton(station: detail?.summary ?? station, size: .largeTitle) - .frame(width: 72, height: 72) - .background(.quaternary, in: Circle()) + HStack(spacing: 0) { + // Balances the heart so the play button stays centred. + Color.clear.frame(width: 44, height: 44) + Spacer(minLength: 12) + + StationPlayButton(station: detail?.summary ?? station, size: .largeTitle) + .frame(width: 72, height: 72) + .background(.quaternary, in: Circle()) + + Spacer(minLength: 12) + + if canHeart { + Button(action: toggleHeart) { + Image(systemName: isHearted ? "heart.fill" : "heart") + .font(.title2) + .foregroundStyle(isHearted ? .pink : .secondary) + .frame(width: 44, height: 44) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .disabled(heartBusy) + .accessibilityLabel(isHearted ? "Remove heart" : "Heart this track") + } else { + Color.clear.frame(width: 44, height: 44) + } + } + .frame(maxWidth: 320) + } + + private func toggleHeart() { + guard let api = server.api, let itemId = nowPlaying?.itemId else { return } + let target = !isHearted + // Optimistic: the poll that would confirm it is up to 5s away when + // browsing, and a heart that lags that far feels broken. + heartOverride = target + heartBusy = true + Task { + do { + heartOverride = try await api.setHeart(itemId: itemId, hearted: target) + } catch { + // Fall back to whatever the server says next poll. + heartOverride = nil + } + heartBusy = false + } } private func trackList(_ tracks: [TrackRef], showTime: Bool = false) -> some View { From 5b2f5893e699cba86836a9c162f69a61331e2f56 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 12:30:17 -0400 Subject: [PATCH 11/35] Open the tuned station from the mini player as a slide-up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tapping the mini player pushed onto the navigation stack, so the station slid in from the trailing edge — the right gesture for a list row, the wrong one for a bar pinned to the bottom of the screen. It now rises from the bar it was tapped on and can be pulled back down, with a chevron-down close rather than a back arrow. Tapping a row in the list still pushes, which is what that gesture should do. Only the mini player changes. Settings and the now-playing sheet share one .sheet modifier driven by an enum. They were about to be two stacked .sheet modifiers on the same view, which is the arrangement that silently misbehaves — the same trap that made the trivia sheet come up empty. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationListView.swift | 61 ++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index 5cb91aa..9d32872 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -7,7 +7,22 @@ struct StationListView: View { @State private var store = StationStore() @State private var path: [StationSummary] = [] - @State private var showingSettings = false + @State private var sheet: ListSheet? + + /// One `.sheet` modifier, two presentations. Stacking two `.sheet`s on a + /// single view is unreliable. + private enum ListSheet: Identifiable { + case settings + /// The tuned station, opened from the mini player. + case nowPlaying(StationSummary) + + var id: String { + switch self { + case .settings: return "settings" + case .nowPlaying(let station): return "now-playing-\(station.slug)" + } + } + } var body: some View { NavigationStack(path: $path) { @@ -19,7 +34,7 @@ struct StationListView: View { .toolbar { ToolbarItem(placement: .topBarTrailing) { Button { - showingSettings = true + sheet = .settings } label: { Image(systemName: "gearshape") } @@ -28,12 +43,19 @@ struct StationListView: View { } .safeAreaInset(edge: .bottom) { if let tuned = player.station { - MiniPlayerBar { path.append(tuned) } + // Rises from the bar it was tapped on, rather than + // sliding in from the side like a list row would. + MiniPlayerBar { sheet = .nowPlaying(tuned) } } } } - .sheet(isPresented: $showingSettings) { - SettingsView() + .sheet(item: $sheet) { item in + switch item { + case .settings: + SettingsView() + case .nowPlaying(let station): + NowPlayingSheet(station: station) + } } .task(id: server.baseURL) { store.reset() @@ -56,7 +78,7 @@ struct StationListView: View { } description: { Text(message) } actions: { - Button("Server settings") { showingSettings = true } + Button("Server settings") { sheet = .settings } } } else if store.stations.isEmpty && store.hasLoaded { ContentUnavailableView( @@ -131,6 +153,33 @@ struct StationListView: View { } } +/// The tuned station, presented from the mini player. +/// +/// A push would slide in from the trailing edge, which is the right gesture +/// for a list row but the wrong one for a bar pinned to the bottom — this +/// rises from where it was tapped and can be pulled back down. +struct NowPlayingSheet: View { + let station: StationSummary + + @Environment(\.dismiss) private var dismiss + + var body: some View { + NavigationStack { + StationDetailView(station: station) + .toolbar { + ToolbarItem(placement: .topBarLeading) { + Button { + dismiss() + } label: { + Image(systemName: "chevron.down") + } + .accessibilityLabel("Close") + } + } + } + } +} + /// Two independent controls: the artwork/title area opens the station, the /// trailing button plays it. Tapping a row must never change what's playing. struct StationRow: View { From 7f538f1991fe1106985ab168efae3a56ea63d06b Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 12:35:02 -0400 Subject: [PATCH 12/35] Add a heart action to the station-row swipe for signed-in operators MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sits alongside Favorite on the same leading swipe, so hearting what a station is playing doesn't require opening it first. Absent entirely when signed out, like the heart on the station page. Deliberately one-way. GET /api/stations never reports heart state — only the station detail calls attach_operator_heart — so a swipe action here cannot know whether the track is already hearted, and a control that might be hearting or un-hearting depending on state the user can't see is worse than one that only ever hearts. Un-hearting stays on the station page, which does know. Favorite remains the first action, so a full swipe still favourites rather than silently doing the new thing. For feedback, a hearted track shows a small heart against its title until the station moves on. That is tracked by item id rather than station, so it clears itself on the next track instead of implying the new one is hearted too. Verified signed out: only Favorite appears. The heart action itself needs operator credentials to exercise. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationListView.swift | 57 +++++++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index 9d32872..2fc780e 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -4,6 +4,13 @@ struct StationListView: View { @Environment(ServerConfig.self) private var server @Environment(RadioPlayer.self) private var player @Environment(FavoritesStore.self) private var favorites + @Environment(AdminSession.self) private var admin + + /// Tracks hearted from this screen. The list endpoint never reports heart + /// state — only the station detail does — so this is the only feedback + /// available without a request per row. Keyed by item id, so it clears + /// itself when the station moves on to the next track. + @State private var heartedItems: Set = [] @State private var store = StationStore() @State private var path: [StationSummary] = [] @@ -94,6 +101,23 @@ struct StationListView: View { } } + /// One-way on purpose. A swipe action can't show current state — the list + /// payload doesn't carry it — and a control that might be hearting or + /// un-hearting depending on state you can't see is worse than one that + /// only ever hearts. Un-hearting lives on the station page, which does + /// know the state. + private func heart(itemId: String) { + guard let api = server.api else { return } + heartedItems.insert(itemId) + Task { + do { + _ = try await api.setHeart(itemId: itemId, hearted: true) + } catch { + heartedItems.remove(itemId) + } + } + } + private var displayOrder: [StationSummary] { let groups = favorites.partition(store.stations) return groups.favorites + groups.others @@ -126,8 +150,12 @@ struct StationListView: View { /// target would crowd both of them. private func row(_ station: StationSummary) -> some View { let isFavorite = favorites.isFavorite(station.slug) + let itemId = station.nowPlaying?.itemId - return StationRow(station: station) { path.append(station) } + return StationRow( + station: station, + isHearted: itemId.map(heartedItems.contains) ?? false + ) { path.append(station) } .listRowBackground(Color.clear) .swipeActions(edge: .leading, allowsFullSwipe: true) { Button { @@ -139,6 +167,16 @@ struct StationListView: View { ) } .tint(.yellow) + + // Operator-only, exactly like the heart on the station page. + if admin.isSignedIn, let itemId { + Button { + heart(itemId: itemId) + } label: { + Label("Heart", systemImage: "heart") + } + .tint(.pink) + } } .contextMenu { Button { @@ -184,6 +222,7 @@ struct NowPlayingSheet: View { /// trailing button plays it. Tapping a row must never change what's playing. struct StationRow: View { let station: StationSummary + var isHearted: Bool = false let onOpen: () -> Void @Environment(ServerConfig.self) private var server @@ -212,10 +251,18 @@ struct StationRow: View { } if let track = station.nowPlaying { - Text("\(track.title) — \(track.artist)") - .font(.subheadline) - .foregroundStyle(.secondary) - .lineLimit(1) + HStack(spacing: 5) { + if isHearted { + Image(systemName: "heart.fill") + .font(.caption2) + .foregroundStyle(.pink) + .accessibilityLabel("Hearted") + } + Text("\(track.title) — \(track.artist)") + .lineLimit(1) + } + .font(.subheadline) + .foregroundStyle(.secondary) } else if !station.description.isEmpty { Text(station.description) .font(.subheadline) From 060055b94cc5d21533726c09692f841acecf52ab Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 12:38:51 -0400 Subject: [PATCH 13/35] Give the mini player's text column the full width it has MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The title and subtitle sat next to a Spacer. Both are flexible, so the HStack split the slack between them rather than giving it all to the text — the text column ended up narrower than the bar, and titles that would have fit were scrolling for no reason. The column now claims the remaining width itself and the Spacer is gone, so the play button still sits at the trailing edge and the marquee only engages when a title genuinely doesn't fit. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationListView.swift | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index 2fc780e..b061f5e 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -345,8 +345,11 @@ struct MiniPlayerBar: View { MarqueeText(text: subtitle, font: .caption) .foregroundStyle(.secondary) } - - Spacer(minLength: 0) + // Claims the remaining width outright instead of leaving a Spacer + // to compete for it. Both are flexible, so HStack splits the slack + // between them — which left the title narrower than the bar and set + // titles scrolling that would otherwise have fit. + .frame(maxWidth: .infinity, alignment: .leading) if let station = player.station { StationPlayButton(station: station) From 7338a001b2ccd9ff10dfcfceda99abf0117c51b9 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 12:48:30 -0400 Subject: [PATCH 14/35] Restructure the station screen's now-playing block MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Everything on the screen sat at a uniform 20pt from everything else, so nothing read as belonging together: four separate things, evenly spaced, with no grouping to say which was which. - Title and artist tighten to 4pt so they read as one unit. - The status line moves below the transport. Between the artist and the play button it separated the metadata from its own heading; underneath it annotates the control it describes. - The play button is filled with the accent colour. It was .quaternary grey — the faintest control on a screen whose entire purpose is playing the station. - A hairline divider separates now-playing from the queue, which previously just continued the same vertical rhythm. Spacing is deliberately uneven now (24 / 24 / 14 / 26) rather than one value repeated, since that evenness was the problem. The heart still balances against an invisible spacer so the play button stays centred whether or not an operator is signed in. Isolated to one commit so it can be reverted whole if it doesn't land. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationDetailView.swift | 67 +++++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index c864a6a..45c629b 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -63,7 +63,7 @@ struct StationDetailView: View { var body: some View { ScrollView { - VStack(spacing: 20) { + VStack(spacing: 0) { Artwork(path: nowPlaying?.coverUrl ?? station.listArtwork, api: server.api, cornerRadius: 16) @@ -87,15 +87,31 @@ struct StationDetailView: View { } .padding(.top, 8) - trackInfo + // Deliberately uneven spacing: title and artist belong + // together, the transport is its own thing, and the status line + // annotates the transport rather than dividing the metadata. + titleBlock + .padding(.top, 24) + transport + .padding(.top, 24) + + statusLine + .padding(.top, 14) + + if hasQueue { + Divider() + .padding(.top, 26) + } if let upNext = detail?.upNext, !upNext.isEmpty { section("Up next") { trackList(upNext) } + .padding(.top, 20) } if let recent = detail?.recentlyPlayed, !recent.isEmpty { section("Recently played") { trackList(recent, showTime: true) } + .padding(.top, 20) } } .padding(.horizontal, 20) @@ -158,30 +174,37 @@ struct StationDetailView: View { } } - private var trackInfo: some View { - VStack(spacing: 6) { + private var hasQueue: Bool { + !(detail?.upNext.isEmpty ?? true) || !(detail?.recentlyPlayed.isEmpty ?? true) + } + + private var titleBlock: some View { + VStack(spacing: 4) { Text(nowPlaying?.title ?? station.name) .font(.title2.bold()) .multilineTextAlignment(.center) artistLine + } + } - HStack(spacing: 6) { - if isTuned && player.isPlaying { - Circle().fill(.green).frame(width: 6, height: 6) - } - // Only the tuned station has playback state worth reporting; - // for anything else this page is just a preview. - Text(isTuned ? player.statusText : (onAir ? "On air" : "Off air")) - if onAir { - Text("·") - Text(listeners == 1 ? "1 listener" : "\(listeners) listeners") - } + /// Sits below the transport, annotating it. Between the artist and the + /// play button it just split the metadata away from its own heading. + private var statusLine: some View { + HStack(spacing: 6) { + if isTuned && player.isPlaying { + Circle().fill(.green).frame(width: 6, height: 6) + } + // Only the tuned station has playback state worth reporting; for + // anything else this page is just a preview. + Text(isTuned ? player.statusText : (onAir ? "On air" : "Off air")) + if onAir { + Text("·") + Text(listeners == 1 ? "1 listener" : "\(listeners) listeners") } - .font(.caption) - .foregroundStyle(.secondary) - .padding(.top, 2) } + .font(.caption) + .foregroundStyle(.secondary) } /// The heart is an operator action, so it only exists once the server has @@ -202,9 +225,13 @@ struct StationDetailView: View { Color.clear.frame(width: 44, height: 44) Spacer(minLength: 12) + // The one thing this screen exists to do, so it stops being the + // faintest control on it. StationPlayButton(station: detail?.summary ?? station, size: .largeTitle) - .frame(width: 72, height: 72) - .background(.quaternary, in: Circle()) + .frame(width: 64, height: 64) + .background(Color.accentColor, in: Circle()) + .foregroundStyle(.white) + .tint(.white) Spacer(minLength: 12) From 9b34a93dd3ce7dc673b5a91bfb5b4d9d3fe8d16d Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 13:10:02 -0400 Subject: [PATCH 15/35] Give the now-playing block a visible container MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Whitespace and a hairline divider grouped the block correctly but read as no change at all — the separation was legible as design intent and not as a boundary. An actual edge is what says these things belong together and the queue below doesn't. Title, artist, transport and status now sit in a filled rounded container with a hairline border, replacing the divider. Internal hierarchy from the previous commit is unchanged; only the enclosure is new. Uses secondarySystemBackground and a primary-opacity border so it tracks light and dark rather than needing a second set of values. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationDetailView.swift | 46 ++++++++++++--------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index 45c629b..a3373e4 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -87,26 +87,12 @@ struct StationDetailView: View { } .padding(.top, 8) - // Deliberately uneven spacing: title and artist belong - // together, the transport is its own thing, and the status line - // annotates the transport rather than dividing the metadata. - titleBlock - .padding(.top, 24) - - transport - .padding(.top, 24) - - statusLine - .padding(.top, 14) - - if hasQueue { - Divider() - .padding(.top, 26) - } + nowPlayingCard + .padding(.top, 18) if let upNext = detail?.upNext, !upNext.isEmpty { section("Up next") { trackList(upNext) } - .padding(.top, 20) + .padding(.top, 26) } if let recent = detail?.recentlyPlayed, !recent.isEmpty { @@ -174,8 +160,30 @@ struct StationDetailView: View { } } - private var hasQueue: Bool { - !(detail?.upNext.isEmpty ?? true) || !(detail?.recentlyPlayed.isEmpty ?? true) + /// The now-playing block as one bounded object. + /// + /// Whitespace and a hairline weren't enough separation to read as a + /// grouping — an actual edge is what says "these belong together, the + /// queue below does not". + private var nowPlayingCard: some View { + VStack(spacing: 0) { + titleBlock + transport + .padding(.top, 20) + statusLine + .padding(.top, 12) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 20) + .padding(.horizontal, 16) + .background( + RoundedRectangle(cornerRadius: 18, style: .continuous) + .fill(Color(.secondarySystemBackground)) + ) + .overlay( + RoundedRectangle(cornerRadius: 18, style: .continuous) + .strokeBorder(Color.primary.opacity(0.08), lineWidth: 1) + ) } private var titleBlock: some View { From d495fc676d77c3456cfc99985faccdcc115fdeba Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 13:25:54 -0400 Subject: [PATCH 16/35] Lay the now-playing card out as a row with a labelled action MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The card was ~200pt tall to hold two lines of text and one button, stacked down the centre with the full width unused. Together with the 320pt cover that pushed the queue almost entirely below the fold — one item visible where there is now room for three. Metadata moves left, the heart joins it on the right of the same row, and the transport becomes a full-width button beneath. The button is labelled rather than a glyph because "play" is the wrong verb here: on live radio it means tune in to what is already happening, not resume, and no icon carries that. It reads "Listen live", and "Stop" once tuned in — an icon alone would have to imply both. Titles wrap to two lines rather than scrolling. The mini player marquees because it is a fixed one-line bar with no detail view to open; this screen has the room and nothing else on it moves. Two lines caps how far a long title can grow the card. Artist drops to subheadline so it supports the title instead of competing with it, now that both are left-aligned. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationDetailView.swift | 109 ++++++++++++-------- 1 file changed, 66 insertions(+), 43 deletions(-) diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index a3373e4..f7a7f19 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -146,17 +146,17 @@ struct StationDetailView: View { Image(systemName: "info.circle") .font(.footnote) } - .font(.title3) + .font(.subheadline) .foregroundStyle(.tint) - .multilineTextAlignment(.center) + .multilineTextAlignment(.leading) } .buttonStyle(.plain) .accessibilityLabel("About \(artist)") } else { Text(artist) - .font(.title3) + .font(.subheadline) .foregroundStyle(.secondary) - .multilineTextAlignment(.center) + .lineLimit(1) } } @@ -167,15 +167,20 @@ struct StationDetailView: View { /// queue below does not". private var nowPlayingCard: some View { VStack(spacing: 0) { - titleBlock - transport - .padding(.top, 20) + HStack(alignment: .top, spacing: 12) { + titleBlock + Spacer(minLength: 0) + if canHeart { heartButton } + } + + listenButton + .padding(.top, 16) + statusLine - .padding(.top, 12) + .padding(.top, 10) } .frame(maxWidth: .infinity) - .padding(.vertical, 20) - .padding(.horizontal, 16) + .padding(16) .background( RoundedRectangle(cornerRadius: 18, style: .continuous) .fill(Color(.secondarySystemBackground)) @@ -187,13 +192,18 @@ struct StationDetailView: View { } private var titleBlock: some View { - VStack(spacing: 4) { + VStack(alignment: .leading, spacing: 3) { + // Wraps rather than scrolling: unlike the mini player this screen + // has the room, and nothing else on it moves. Capped at two lines + // so a 60-character title can't grow the card without limit. Text(nowPlaying?.title ?? station.name) - .font(.title2.bold()) - .multilineTextAlignment(.center) + .font(.title3.bold()) + .lineLimit(2) + .fixedSize(horizontal: false, vertical: true) artistLine } + .frame(maxWidth: .infinity, alignment: .leading) } /// Sits below the transport, annotating it. Between the artist and the @@ -226,39 +236,52 @@ struct StationDetailView: View { nowPlaying?.hearted != nil && nowPlaying?.itemId != nil } - private var transport: some View { - // No skip, no seek — everyone hears the same broadcast. - HStack(spacing: 0) { - // Balances the heart so the play button stays centred. - Color.clear.frame(width: 44, height: 44) - Spacer(minLength: 12) - - // The one thing this screen exists to do, so it stops being the - // faintest control on it. - StationPlayButton(station: detail?.summary ?? station, size: .largeTitle) - .frame(width: 64, height: 64) - .background(Color.accentColor, in: Circle()) - .foregroundStyle(.white) - .tint(.white) - - Spacer(minLength: 12) - - if canHeart { - Button(action: toggleHeart) { - Image(systemName: isHearted ? "heart.fill" : "heart") - .font(.title2) - .foregroundStyle(isHearted ? .pink : .secondary) - .frame(width: 44, height: 44) - .contentShape(Rectangle()) + private var heartButton: some View { + Button(action: toggleHeart) { + Image(systemName: isHearted ? "heart.fill" : "heart") + .font(.title3) + .foregroundStyle(isHearted ? .pink : .secondary) + .frame(width: 40, height: 40) + .contentShape(Rectangle()) + } + .buttonStyle(.plain) + .disabled(heartBusy) + .accessibilityLabel(isHearted ? "Remove heart" : "Heart this track") + } + + /// Labelled rather than an icon, because "play" is the wrong verb here. + /// On live radio it means *tune in to what is already happening*, not + /// resume — and no glyph conveys that. No skip, no seek: everyone hears + /// the same broadcast. + private var listenButton: some View { + let isLive = isTuned && player.wantsLive + + return Button { + if isTuned { + player.toggle() + } else if let api = server.api { + player.tune(to: detail?.summary ?? station, api: api) + } + } label: { + HStack(spacing: 8) { + if isTuned && player.isBusy { + ProgressView() + .tint(.white) + } else { + Image(systemName: isLive ? "stop.fill" : "play.fill") } - .buttonStyle(.plain) - .disabled(heartBusy) - .accessibilityLabel(isHearted ? "Remove heart" : "Heart this track") - } else { - Color.clear.frame(width: 44, height: 44) + Text(isLive ? "Stop" : "Listen live") + .font(.headline) } + .foregroundStyle(.white) + .frame(maxWidth: .infinity) + .padding(.vertical, 13) + .background( + RoundedRectangle(cornerRadius: 12, style: .continuous) + .fill(Color.accentColor) + ) } - .frame(maxWidth: 320) + .buttonStyle(.plain) } private func toggleHeart() { From e2dba2895a94fcd3b22fd3088e79684854f74e83 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 13:31:29 -0400 Subject: [PATCH 17/35] Match the web player's accent, with a picker to override it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The accent was #F9AF2D, a value invented while scaffolding the asset catalog before I knew the theme system existed. It coincidentally matched the backend's DEFAULT_THEME name ("amber") but not this install, which is set to violet — so the app was amber while the web player and the app's own icon, generated from the PWA artwork, were both violet. Settings now offers the same six accents as the web player, using the same hex values (themes.css [data-accent]), defaulting to "Match server" — which reads default_theme from /api/health and follows it. A theme on this backend is only an accent, not a palette, so matching it is this one value. The accent applies once at the root via .tint, which propagates. The two places that hardcoded Color.accentColor now use .tint, since Color.accentColor reads the asset catalog and would have ignored the setting. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Models/Station.swift | 2 + ios/AlchemyFM/Networking/ServerConfig.swift | 9 ++++ ios/AlchemyFM/Views/DisplayPreferences.swift | 57 ++++++++++++++++++++ ios/AlchemyFM/Views/RootView.swift | 8 +++ ios/AlchemyFM/Views/SettingsView.swift | 33 +++++++++++- ios/AlchemyFM/Views/StationDetailView.swift | 2 +- ios/AlchemyFM/Views/TrackTrivia.swift | 2 +- 7 files changed, 110 insertions(+), 3 deletions(-) diff --git a/ios/AlchemyFM/Models/Station.swift b/ios/AlchemyFM/Models/Station.swift index 9872df0..56aeaae 100644 --- a/ios/AlchemyFM/Models/Station.swift +++ b/ios/AlchemyFM/Models/Station.swift @@ -113,4 +113,6 @@ struct ServerHealth: Codable { var encodeFormat: String = "mp3" var bitrate: Int = 0 var gitSha: String = "unknown" + /// One of the accents in backend/app/themes.py. + var defaultTheme: String = "amber" } diff --git a/ios/AlchemyFM/Networking/ServerConfig.swift b/ios/AlchemyFM/Networking/ServerConfig.swift index 2bd192c..d4b4680 100644 --- a/ios/AlchemyFM/Networking/ServerConfig.swift +++ b/ios/AlchemyFM/Networking/ServerConfig.swift @@ -10,6 +10,15 @@ final class ServerConfig { private(set) var baseURL: URL? + /// The accent this server tells its listeners to use, so the app can match + /// the web player by default instead of picking its own colour. + private(set) var serverTheme: String? + + func refreshServerTheme() async { + guard let api else { return } + serverTheme = try? await api.health().defaultTheme + } + init(defaults: UserDefaults = .standard) { self.defaults = defaults if let stored = defaults.string(forKey: Self.defaultsKey) { diff --git a/ios/AlchemyFM/Views/DisplayPreferences.swift b/ios/AlchemyFM/Views/DisplayPreferences.swift index 9b90063..0523bed 100644 --- a/ios/AlchemyFM/Views/DisplayPreferences.swift +++ b/ios/AlchemyFM/Views/DisplayPreferences.swift @@ -11,6 +11,63 @@ enum DisplayPreference { static let showArtistBio = "alchemyfm.showArtistBio" static let showTrackTrivia = "alchemyfm.showTrackTrivia" static let appearance = "alchemyfm.appearance" + static let accent = "alchemyfm.accent" +} + +/// The same six accents the web player offers, with the same hex values — +/// see `VALID_THEMES` in backend/app/themes.py and `[data-accent]` in +/// web/static/themes.css. A theme on this backend is only an accent colour, +/// not a whole palette, so matching it is just this one value. +enum AccentTheme: String, CaseIterable, Identifiable { + /// Follows whatever the server reports as its `default_theme`. + case server + case amber + case violet + case blue + case emerald + case rose + case cyan + + var id: String { rawValue } + + var label: String { + switch self { + case .server: return "Match server" + case .amber: return "Amber" + case .violet: return "Violet" + case .blue: return "Blue" + case .emerald: return "Emerald" + case .rose: return "Rose" + case .cyan: return "Cyan" + } + } + + /// nil only for `.server`, which has no colour of its own. + var color: Color? { + switch self { + case .server: return nil + case .amber: return Color(red: 0.976, green: 0.686, blue: 0.176) + case .violet: return Color(red: 0.545, green: 0.361, blue: 0.965) + case .blue: return Color(red: 0.231, green: 0.510, blue: 0.965) + case .emerald: return Color(red: 0.063, green: 0.725, blue: 0.506) + case .rose: return Color(red: 0.957, green: 0.247, blue: 0.369) + case .cyan: return Color(red: 0.024, green: 0.714, blue: 0.831) + } + } + + /// Maps a server-reported theme id onto an accent, falling back the same + /// way the backend does when it doesn't recognise one. + static func fromServer(_ raw: String?) -> AccentTheme { + guard let raw, let match = AccentTheme(rawValue: raw), match != .server else { + return .amber + } + return match + } + + static func resolve(_ stored: String, serverTheme: String?) -> Color { + let chosen = AccentTheme(rawValue: stored) ?? .server + return chosen.color ?? fromServer(serverTheme).color ?? AccentTheme.amber.color! + } } enum AppearanceMode: String, CaseIterable, Identifiable { diff --git a/ios/AlchemyFM/Views/RootView.swift b/ios/AlchemyFM/Views/RootView.swift index ee13829..81f17f9 100644 --- a/ios/AlchemyFM/Views/RootView.swift +++ b/ios/AlchemyFM/Views/RootView.swift @@ -4,6 +4,8 @@ struct RootView: View { @Environment(ServerConfig.self) private var server @Environment(AdminSession.self) private var admin + @AppStorage(DisplayPreference.accent) private var accent = AccentTheme.server.rawValue + var body: some View { Group { if server.isConfigured { @@ -12,10 +14,16 @@ struct RootView: View { ServerSetupView() } } + // Applied once here rather than per-view: `.tint` propagates, so + // everything drawn with `.tint` picks up the accent without each + // call site resolving it. Views must not use Color.accentColor, + // which reads the asset catalog and would ignore this. + .tint(AccentTheme.resolve(accent, serverTheme: server.serverTheme)) // Credentials are stored per host, so switching servers re-evaluates // from scratch rather than carrying a sign-in across. .task(id: server.baseURL) { guard let baseURL = server.baseURL else { return } + await server.refreshServerTheme() await admin.restore(for: baseURL) } } diff --git a/ios/AlchemyFM/Views/SettingsView.swift b/ios/AlchemyFM/Views/SettingsView.swift index 4a818c5..1cbacaf 100644 --- a/ios/AlchemyFM/Views/SettingsView.swift +++ b/ios/AlchemyFM/Views/SettingsView.swift @@ -8,6 +8,7 @@ struct SettingsView: View { @AppStorage(DisplayPreference.showArtistBio) private var showArtistBio = true @AppStorage(DisplayPreference.showTrackTrivia) private var showTrackTrivia = true @AppStorage(DisplayPreference.appearance) private var appearance = AppearanceMode.system.rawValue + @AppStorage(DisplayPreference.accent) private var accent = AccentTheme.server.rawValue var body: some View { NavigationStack { @@ -29,13 +30,31 @@ struct SettingsView: View { AdminSection() - Section("Appearance") { + Section { Picker("Theme", selection: $appearance) { ForEach(AppearanceMode.allCases) { mode in Text(mode.label).tag(mode.rawValue) } } .pickerStyle(.segmented) + + Picker("Accent", selection: $accent) { + ForEach(AccentTheme.allCases) { theme in + Label { + Text(theme == .server ? serverAccentLabel : theme.label) + } icon: { + Circle() + .fill(theme.color ?? serverAccentColor) + .frame(width: 14, height: 14) + } + .tag(theme.rawValue) + } + } + } header: { + Text("Appearance") + } footer: { + Text("The same accents the web player offers. \"Match server\" " + + "follows whatever this server is set to.") } Section { @@ -75,6 +94,18 @@ struct SettingsView: View { } } + private var serverAccent: AccentTheme { + AccentTheme.fromServer(server.serverTheme) + } + + private var serverAccentLabel: String { + server.serverTheme == nil ? "Match server" : "Match server (\(serverAccent.label))" + } + + private var serverAccentColor: Color { + serverAccent.color ?? .gray + } + private static var version: String { let info = Bundle.main.infoDictionary let short = info?["CFBundleShortVersionString"] as? String ?? "0" diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index f7a7f19..bfb9032 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -278,7 +278,7 @@ struct StationDetailView: View { .padding(.vertical, 13) .background( RoundedRectangle(cornerRadius: 12, style: .continuous) - .fill(Color.accentColor) + .fill(.tint) ) } .buttonStyle(.plain) diff --git a/ios/AlchemyFM/Views/TrackTrivia.swift b/ios/AlchemyFM/Views/TrackTrivia.swift index 63a6c0b..02671f0 100644 --- a/ios/AlchemyFM/Views/TrackTrivia.swift +++ b/ios/AlchemyFM/Views/TrackTrivia.swift @@ -14,7 +14,7 @@ struct TriviaBadge: View { .frame(width: 28, height: 28) .background(.ultraThinMaterial, in: Circle()) .overlay( - Circle().strokeBorder(Color.accentColor.opacity(0.55), lineWidth: 1) + Circle().strokeBorder(.tint.opacity(0.55), lineWidth: 1) ) } .buttonStyle(.plain) From f97383b90bd6975e838d4d0e526bff8b649ab165 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 13:35:58 -0400 Subject: [PATCH 18/35] Add an audio-output picker to the station card MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit iOS gives apps no way to enumerate or select Bluetooth devices directly, so AVRoutePickerView is the sanctioned route — it lists Bluetooth speakers, headphones and AirPlay destinations together. Previously this was reachable only from Control Center, even though the app already sets allowsExternalPlayback and the .longFormAudio route policy. prioritizesVideoDevices is off: this is an audio-only app, and leaving it on biases the picker toward video destinations and hides some speakers. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/RoutePickerButton.swift | 27 +++++++++++++++++++++ ios/AlchemyFM/Views/StationDetailView.swift | 6 ++++- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 ios/AlchemyFM/Views/RoutePickerButton.swift diff --git a/ios/AlchemyFM/Views/RoutePickerButton.swift b/ios/AlchemyFM/Views/RoutePickerButton.swift new file mode 100644 index 0000000..814da0e --- /dev/null +++ b/ios/AlchemyFM/Views/RoutePickerButton.swift @@ -0,0 +1,27 @@ +import AVKit +import SwiftUI + +/// The system audio-output picker. +/// +/// iOS gives apps no way to enumerate or select Bluetooth devices directly — +/// this is the sanctioned route, and it lists Bluetooth speakers, headphones +/// and AirPlay destinations together. Wrapping it here just saves a trip to +/// Control Center. +struct RoutePickerButton: UIViewRepresentable { + var tint: Color + var activeTint: Color + + func makeUIView(context: Context) -> AVRoutePickerView { + let picker = AVRoutePickerView() + // Audio-only app: without this the picker biases towards video + // destinations and hides some speakers. + picker.prioritizesVideoDevices = false + picker.backgroundColor = .clear + return picker + } + + func updateUIView(_ picker: AVRoutePickerView, context: Context) { + picker.tintColor = UIColor(tint) + picker.activeTintColor = UIColor(activeTint) + } +} diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index bfb9032..cc1306d 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -167,10 +167,14 @@ struct StationDetailView: View { /// queue below does not". private var nowPlayingCard: some View { VStack(spacing: 0) { - HStack(alignment: .top, spacing: 12) { + HStack(alignment: .top, spacing: 8) { titleBlock Spacer(minLength: 0) if canHeart { heartButton } + // Bluetooth speakers and AirPlay destinations both live here. + RoutePickerButton(tint: .secondary, activeTint: .accentColor) + .frame(width: 40, height: 40) + .accessibilityLabel("Choose audio output") } listenButton From 4931c8a6a3ca1f07e7463e12def64ce490299993 Mon Sep 17 00:00:00 2001 From: Marcus Magnant Date: Sun, 2 Aug 2026 13:43:46 -0400 Subject: [PATCH 19/35] Stop list rows colliding with the pinned section headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plain-style list headers pin to the top of the viewport while rows scroll underneath them. The Favorites and All stations headers had no background, so a row passing behind a header drew in the same pixels as the header text — artwork and two sets of titles overlapping into something unreadable. The headers are now opaque and span the full width, so rows disappear behind them the way the pinning behaviour assumes. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationListView.swift | 25 +++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index b061f5e..6884cbf 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -130,11 +130,15 @@ struct StationListView: View { if groups.favorites.isEmpty { ForEach(store.stations) { row($0) } } else { - Section("Favorites") { + Section { ForEach(groups.favorites) { row($0) } + } header: { + sectionHeader("Favorites") } - Section("All stations") { + Section { ForEach(groups.others) { row($0) } + } header: { + sectionHeader("All stations") } } } @@ -145,6 +149,23 @@ struct StationListView: View { } } + /// Plain-style list headers pin to the top while rows scroll beneath them, + /// so a header with no background lets both draw in the same place at once + /// — the title reads as garbage over whatever row is passing under it. + /// This one is opaque and spans the full width, so rows disappear behind it. + private func sectionHeader(_ title: String) -> some View { + Text(title) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(.secondary) + .textCase(nil) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.horizontal, 20) + .padding(.top, 14) + .padding(.bottom, 7) + .background(Color(.systemBackground)) + .listRowInsets(EdgeInsets()) + } + /// Favouriting lives on a swipe and a long-press rather than a third button /// in the row — the row already carries "open" and "play", and a third /// target would crowd both of them. From 862b965784fe83460ec240a5be73951c7b944c72 Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 13:55:08 -0400 Subject: [PATCH 20/35] Add Chromecast support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The phone stays the remote: the Chromecast fetches the Icecast stream from the server itself, and the app still drives which station plays. Browsing, now-playing polling, favourites and hearts are untouched, since none of them depend on where the audio comes out. While a session is live, openStream hands the stream URL and metadata to the receiver instead of building an AVPlayerItem, and the stall watchdog and reconnect logic stand down — they are AVPlayer's, and there is no AVPlayer. Recovery becomes the receiver's problem. Starting or ending a session moves the audio automatically rather than making the listener re-press play. The SDK is fetched by ios/Vendor/fetch-cast-sdk.sh rather than committed: at 29 MB it would sit in this public repo's history forever. xcodebuild still works unchanged — no workspace, no Ruby toolchain. Took the dynamic framework despite Google's docs steering you to the static one. The static library references GTMSessionFetcher without defining it, so it needs that vendored separately — the manual-setup page doesn't mention this. The dynamic framework compiles GTMSessionFetcher and Protobuf in with hidden visibility, verified with nm, so it stands alone. It is also 29 MB against 141 MB. The docs' claim that the dynamic build needs Protobuf >= 3.13 separately does not hold for 4.8.6. The cast button only appears once a receiver is actually on the network, rather than offering a button that opens an empty list. Co-Authored-By: Claude Opus 5 --- .gitignore | 3 + ios/AlchemyFM.xcodeproj/project.pbxproj | 39 +++++ ios/AlchemyFM/AlchemyFMApp.swift | 6 + ios/AlchemyFM/Info.plist | 13 +- ios/AlchemyFM/Playback/CastController.swift | 149 ++++++++++++++++++++ ios/AlchemyFM/Playback/RadioPlayer.swift | 29 ++++ ios/AlchemyFM/Views/CastButton.swift | 19 +++ ios/AlchemyFM/Views/RootView.swift | 7 + ios/AlchemyFM/Views/StationDetailView.swift | 18 ++- ios/Vendor/fetch-cast-sdk.sh | 46 ++++++ 10 files changed, 326 insertions(+), 3 deletions(-) create mode 100644 ios/AlchemyFM/Playback/CastController.swift create mode 100644 ios/AlchemyFM/Views/CastButton.swift create mode 100755 ios/Vendor/fetch-cast-sdk.sh diff --git a/.gitignore b/.gitignore index 82c4a6f..0782ae1 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ venv/ alchemyfm-backup/ cookies.txt login_out.txt + +# Google Cast SDK — 141 MB, fetched by ios/Vendor/fetch-cast-sdk.sh +ios/Vendor/GoogleCast.xcframework/ diff --git a/ios/AlchemyFM.xcodeproj/project.pbxproj b/ios/AlchemyFM.xcodeproj/project.pbxproj index 4fd1cb7..193eba0 100644 --- a/ios/AlchemyFM.xcodeproj/project.pbxproj +++ b/ios/AlchemyFM.xcodeproj/project.pbxproj @@ -6,8 +6,28 @@ objectVersion = 77; objects = { +/* Begin PBXBuildFile section */ + 1A0000000000000000000012 /* GoogleCast.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0000000000000000000011 /* GoogleCast.xcframework */; }; + 1A0000000000000000000014 /* GoogleCast.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0000000000000000000011 /* GoogleCast.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1A0000000000000000000015 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1A0000000000000000000014 /* GoogleCast.xcframework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1A0000000000000000000004 /* AlchemyFM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AlchemyFM.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A0000000000000000000011 /* GoogleCast.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = GoogleCast.xcframework; path = Vendor/GoogleCast.xcframework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -36,6 +56,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1A0000000000000000000012 /* GoogleCast.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -46,10 +67,19 @@ isa = PBXGroup; children = ( 1A0000000000000000000005 /* AlchemyFM */, + 1A0000000000000000000013 /* Frameworks */, 1A0000000000000000000003 /* Products */, ); sourceTree = ""; }; + 1A0000000000000000000013 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1A0000000000000000000011 /* GoogleCast.xcframework */, + ); + name = Frameworks; + sourceTree = ""; + }; 1A0000000000000000000003 /* Products */ = { isa = PBXGroup; children = ( @@ -68,6 +98,7 @@ 1A0000000000000000000007 /* Sources */, 1A0000000000000000000008 /* Frameworks */, 1A0000000000000000000009 /* Resources */, + 1A0000000000000000000015 /* Embed Frameworks */, ); buildRules = ( ); @@ -225,6 +256,10 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = AlchemyFM/Info.plist; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Vendor", + ); LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -251,6 +286,10 @@ ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = AlchemyFM/Info.plist; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Vendor", + ); LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/AlchemyFM/AlchemyFMApp.swift b/ios/AlchemyFM/AlchemyFMApp.swift index 67b8877..74eca14 100644 --- a/ios/AlchemyFM/AlchemyFMApp.swift +++ b/ios/AlchemyFM/AlchemyFMApp.swift @@ -9,6 +9,12 @@ struct AlchemyFMApp: App { @AppStorage(DisplayPreference.appearance) private var appearance = AppearanceMode.system.rawValue + init() { + // Before any Cast UI exists, since GCKUICastButton needs the shared + // context to have been configured. + CastController.shared.start() + } + var body: some Scene { WindowGroup { RootView() diff --git a/ios/AlchemyFM/Info.plist b/ios/AlchemyFM/Info.plist index 59ac569..a013c2f 100644 --- a/ios/AlchemyFM/Info.plist +++ b/ios/AlchemyFM/Info.plist @@ -56,8 +56,17 @@ - + NSLocalNetworkUsageDescription - Alchemy FM connects to your self-hosted radio server on your local network to list stations and play the live stream. + Alchemy FM connects to your self-hosted radio server on your local network to list stations and play the live stream, and finds Chromecast devices to cast to. + + + NSBonjourServices + + _googlecast._tcp + _CC1AD845._googlecast._tcp + diff --git a/ios/AlchemyFM/Playback/CastController.swift b/ios/AlchemyFM/Playback/CastController.swift new file mode 100644 index 0000000..52662b1 --- /dev/null +++ b/ios/AlchemyFM/Playback/CastController.swift @@ -0,0 +1,149 @@ +import Foundation +import GoogleCast +import Observation + +/// Chromecast session state. +/// +/// While a session is live the Chromecast fetches the Icecast stream itself and +/// the phone is only a remote — so `RadioPlayer`'s AVPlayer, its stall watchdog +/// and its reconnect logic all stand down, and recovery becomes the receiver's +/// problem. Everything above playback (station list, now-playing polling, +/// favourites, hearts) is unaffected, because none of it depends on where the +/// audio comes out. +@MainActor +@Observable +final class CastController: NSObject { + static let shared = CastController() + + private(set) var isCasting = false + private(set) var deviceName: String? + + /// Whether any receiver is currently visible on the network. Drives whether + /// the cast button is worth showing at all. + private(set) var hasDevices = false + + @ObservationIgnored private var started = false + @ObservationIgnored private var discoveryObservation: NSKeyValueObservation? + + /// Must run before any Cast UI is created. + func start() { + guard !started else { return } + started = true + + // The Default Media Receiver plays plain audio without a custom + // receiver app of our own. It is also the id named in Info.plist's + // NSBonjourServices entry, which has to match for discovery to work. + let criteria = GCKDiscoveryCriteria(applicationID: kGCKDefaultMediaReceiverApplicationID) + let options = GCKCastOptions(discoveryCriteria: criteria) + options.physicalVolumeButtonsWillControlDeviceVolume = true + // Keep the session alive when the app is backgrounded — the whole point + // is that the speakers keep playing. + options.suspendSessionsWhenBackgrounded = false + GCKCastContext.setSharedInstanceWith(options) + + GCKCastContext.sharedInstance().sessionManager.add(self) + + let discovery = GCKCastContext.sharedInstance().discoveryManager + discovery.passiveScan = true + discovery.add(self) + hasDevices = discovery.deviceCount > 0 + } + + var remoteMediaClient: GCKRemoteMediaClient? { + GCKCastContext.sharedInstance().sessionManager.currentCastSession?.remoteMediaClient + } + + /// Hands a station to the receiver. The Chromecast pulls the stream from + /// the server directly, so this only has to describe it. + func load(streamURL: URL, title: String, artist: String, station: String, artwork: URL?) { + guard let client = remoteMediaClient else { return } + + let metadata = GCKMediaMetadata(metadataType: .musicTrack) + metadata.setString(title, forKey: kGCKMetadataKeyTitle) + metadata.setString(artist, forKey: kGCKMetadataKeyArtist) + metadata.setString(station, forKey: kGCKMetadataKeyAlbumTitle) + if let artwork { + metadata.addImage(GCKImage(url: artwork, width: 300, height: 300)) + } + + let media = GCKMediaInformationBuilder(contentURL: streamURL) + // Live, so the receiver shows no scrubber and doesn't try to seek. + media.streamType = .live + media.contentType = "audio/mpeg" + media.metadata = metadata + + let request = GCKMediaLoadRequestDataBuilder() + request.mediaInformation = media.build() + request.autoplay = true + + client.loadMedia(with: request.build()) + } + + /// Updates what the receiver displays without interrupting playback. + func updateMetadata(title: String, artist: String, station: String, artwork: URL?) { + // The Default Media Receiver takes its display metadata from the load + // request, so refreshing it means re-issuing one — which would restart + // the stream. Not worth a gap in audio every time a track changes; the + // receiver keeps showing the track it started on. + } + + /// Stops the audio but keeps the session, so the next station can start + /// on the same speakers without reconnecting to them. + func stopPlayback() { + remoteMediaClient?.stop() + } + + /// Disconnects from the receiver entirely. + func endSession() { + remoteMediaClient?.stop() + GCKCastContext.sharedInstance().sessionManager.endSession() + } +} + +extension CastController: GCKSessionManagerListener { + nonisolated func sessionManager( + _ sessionManager: GCKSessionManager, didStart session: GCKCastSession + ) { + Task { @MainActor in + self.isCasting = true + self.deviceName = session.device.friendlyName + } + } + + nonisolated func sessionManager( + _ sessionManager: GCKSessionManager, didResumeCastSession session: GCKCastSession + ) { + Task { @MainActor in + self.isCasting = true + self.deviceName = session.device.friendlyName + } + } + + nonisolated func sessionManager( + _ sessionManager: GCKSessionManager, didEnd session: GCKCastSession, withError error: Error? + ) { + Task { @MainActor in + self.isCasting = false + self.deviceName = nil + } + } + + nonisolated func sessionManager( + _ sessionManager: GCKSessionManager, + didFailToStart session: GCKCastSession, + withError error: Error + ) { + Task { @MainActor in + self.isCasting = false + self.deviceName = nil + } + } +} + +extension CastController: GCKDiscoveryManagerListener { + nonisolated func didUpdateDeviceList() { + Task { @MainActor in + self.hasDevices = GCKCastContext.sharedInstance().discoveryManager.deviceCount > 0 + } + } +} diff --git a/ios/AlchemyFM/Playback/RadioPlayer.swift b/ios/AlchemyFM/Playback/RadioPlayer.swift index 838a9af..93ddfa3 100644 --- a/ios/AlchemyFM/Playback/RadioPlayer.swift +++ b/ios/AlchemyFM/Playback/RadioPlayer.swift @@ -116,12 +116,24 @@ final class RadioPlayer { isInterrupted = false cancelReconnect() teardownPlayer() + // Stops the audio but keeps the Cast session, so the next station + // starts on the same speakers without reconnecting to them. + CastController.shared.stopPlayback() state = .idle deactivateSession() endBackgroundTask() updateNowPlayingInfo() } + /// Called when a Cast session starts or ends, to move audio between the + /// phone and the receiver without the user having to press anything. + func castStateChanged() { + guard wantsLive else { return } + cancelReconnect() + attempt = 0 + openStream() + } + func toggle() { if wantsLive { stop() } else { play() } } @@ -147,6 +159,23 @@ final class RadioPlayer { return } + // While casting, the receiver fetches the stream itself. Nothing local + // to build, and nothing local to watch — the watchdog and reconnect + // logic below are AVPlayer's, and there is no AVPlayer. + if CastController.shared.isCasting { + teardownPlayer() + deactivateSession() + CastController.shared.load( + streamURL: url, + title: nowPlaying?.title ?? station.name, + artist: nowPlaying?.artist ?? "", + station: station.name, + artwork: api?.resolve(nowPlaying?.coverUrl) ?? api?.resolve(station.artworkUrl) + ) + state = .playing + return + } + teardownPlayer() state = attempt == 0 ? .connecting : .reconnecting(attempt: attempt) activateSession() diff --git a/ios/AlchemyFM/Views/CastButton.swift b/ios/AlchemyFM/Views/CastButton.swift new file mode 100644 index 0000000..e26ecbc --- /dev/null +++ b/ios/AlchemyFM/Views/CastButton.swift @@ -0,0 +1,19 @@ +import GoogleCast +import SwiftUI + +/// Google's own cast button, which owns the device-picker sheet and its +/// connected/connecting states. Rebuilding it would mean reimplementing +/// discovery UI for no gain. +struct CastButton: UIViewRepresentable { + var tint: Color + + func makeUIView(context: Context) -> GCKUICastButton { + let button = GCKUICastButton() + button.triggersDefaultCastDialog = true + return button + } + + func updateUIView(_ button: GCKUICastButton, context: Context) { + button.tintColor = UIColor(tint) + } +} diff --git a/ios/AlchemyFM/Views/RootView.swift b/ios/AlchemyFM/Views/RootView.swift index 81f17f9..61e20e1 100644 --- a/ios/AlchemyFM/Views/RootView.swift +++ b/ios/AlchemyFM/Views/RootView.swift @@ -2,7 +2,9 @@ import SwiftUI struct RootView: View { @Environment(ServerConfig.self) private var server + @Environment(RadioPlayer.self) private var player @Environment(AdminSession.self) private var admin + @State private var cast = CastController.shared @AppStorage(DisplayPreference.accent) private var accent = AccentTheme.server.rawValue @@ -21,6 +23,11 @@ struct RootView: View { .tint(AccentTheme.resolve(accent, serverTheme: server.serverTheme)) // Credentials are stored per host, so switching servers re-evaluates // from scratch rather than carrying a sign-in across. + // Moves audio between the phone and the receiver when a session + // starts or ends, without the listener pressing anything. + .onChange(of: cast.isCasting) { _, _ in + player.castStateChanged() + } .task(id: server.baseURL) { guard let baseURL = server.baseURL else { return } await server.refreshServerTheme() diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index cc1306d..1ce4337 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -8,6 +8,7 @@ struct StationDetailView: View { @Environment(RadioPlayer.self) private var player @Environment(ServerConfig.self) private var server @State private var loader = StationDetailLoader() + @State private var cast = CastController.shared @AppStorage(DisplayPreference.showArtistBio) private var showArtistBio = true @AppStorage(DisplayPreference.showTrackTrivia) private var showTrackTrivia = true @@ -171,6 +172,14 @@ struct StationDetailView: View { titleBlock Spacer(minLength: 0) if canHeart { heartButton } + // Only worth the space once a receiver is actually on the + // network — otherwise it's a button that opens an empty list. + if cast.hasDevices { + CastButton(tint: cast.isCasting ? .accentColor : .secondary) + .frame(width: 34, height: 34) + .accessibilityLabel("Cast to a device") + } + // Bluetooth speakers and AirPlay destinations both live here. RoutePickerButton(tint: .secondary, activeTint: .accentColor) .frame(width: 40, height: 40) @@ -210,6 +219,13 @@ struct StationDetailView: View { .frame(maxWidth: .infinity, alignment: .leading) } + /// While casting, where the audio is going matters more than the local + /// player's state — which reads idle, because there is no local player. + private var castingLabel: String? { + guard isTuned, cast.isCasting else { return nil } + return cast.deviceName.map { "Casting to \($0)" } ?? "Casting" + } + /// Sits below the transport, annotating it. Between the artist and the /// play button it just split the metadata away from its own heading. private var statusLine: some View { @@ -219,7 +235,7 @@ struct StationDetailView: View { } // Only the tuned station has playback state worth reporting; for // anything else this page is just a preview. - Text(isTuned ? player.statusText : (onAir ? "On air" : "Off air")) + Text(castingLabel ?? (isTuned ? player.statusText : (onAir ? "On air" : "Off air"))) if onAir { Text("·") Text(listeners == 1 ? "1 listener" : "\(listeners) listeners") diff --git a/ios/Vendor/fetch-cast-sdk.sh b/ios/Vendor/fetch-cast-sdk.sh new file mode 100755 index 0000000..bbf19a4 --- /dev/null +++ b/ios/Vendor/fetch-cast-sdk.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# +# Downloads the Google Cast SDK for iOS. +# +# The framework is 29 MB, which is why it isn't committed — it would sit in +# this public repo's history permanently and every clone would pay for it. +# Run this once after cloning: +# +# ios/Vendor/fetch-cast-sdk.sh +# +# The dynamic build, despite Google's docs steering you to the static one. +# The static library references GTMSessionFetcher without defining it, so it +# needs that vendored separately; the dynamic framework compiles both it and +# Protobuf in with hidden visibility, so it stands alone. It is also 29 MB +# rather than 141 MB. The docs' claim that the dynamic build needs Protobuf +# >= 3.13 separately does not hold for 4.8.6 — verified with nm. +set -euo pipefail + +VERSION="4.8.6" +URL="https://dl.google.com/dl/chromecast/sdk/ios/GoogleCastSDK-ios-${VERSION}_dynamic.zip" + +DEST="$(cd "$(dirname "$0")" && pwd)" +FRAMEWORK="${DEST}/GoogleCast.xcframework" + +if [ -d "${FRAMEWORK}" ]; then + echo "GoogleCast.xcframework is already here. Delete it first to re-fetch." + exit 0 +fi + +WORK="$(mktemp -d)" +trap 'rm -rf "${WORK}"' EXIT + +echo "Fetching Google Cast SDK ${VERSION}…" +curl -fL --progress-bar -o "${WORK}/cast.zip" "${URL}" + +echo "Unpacking…" +unzip -q "${WORK}/cast.zip" -d "${WORK}/unpacked" + +SRC="$(find "${WORK}/unpacked" -maxdepth 3 -name 'GoogleCast.xcframework' -type d | head -1)" +if [ -z "${SRC}" ]; then + echo "error: GoogleCast.xcframework not found in the download." >&2 + exit 1 +fi + +mv "${SRC}" "${FRAMEWORK}" +echo "Installed ${FRAMEWORK}" From 430a789ddd6c331331ec9f887e7f806a341aba33 Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 13:59:26 -0400 Subject: [PATCH 21/35] Make the list headers scroll instead of pinning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Giving the pinned headers an opaque background didn't fix the overlap: rows win the z-order against a plain-style section header, so the header text and whatever row is passing behind it still drew into the same pixels. They are ordinary rows now rather than Section headers, so they scroll with the content and cannot overlap anything. For a list this short, sticky headers were buying nothing to begin with — the previous commit tried to paint over a problem that didn't need to exist. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationListView.swift | 36 ++++++++++------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/ios/AlchemyFM/Views/StationListView.swift b/ios/AlchemyFM/Views/StationListView.swift index 6884cbf..4fe245c 100644 --- a/ios/AlchemyFM/Views/StationListView.swift +++ b/ios/AlchemyFM/Views/StationListView.swift @@ -130,16 +130,10 @@ struct StationListView: View { if groups.favorites.isEmpty { ForEach(store.stations) { row($0) } } else { - Section { - ForEach(groups.favorites) { row($0) } - } header: { - sectionHeader("Favorites") - } - Section { - ForEach(groups.others) { row($0) } - } header: { - sectionHeader("All stations") - } + sectionHeader("Favorites") + ForEach(groups.favorites) { row($0) } + sectionHeader("All stations") + ForEach(groups.others) { row($0) } } } .listStyle(.plain) @@ -149,21 +143,23 @@ struct StationListView: View { } } - /// Plain-style list headers pin to the top while rows scroll beneath them, - /// so a header with no background lets both draw in the same place at once - /// — the title reads as garbage over whatever row is passing under it. - /// This one is opaque and spans the full width, so rows disappear behind it. + /// An ordinary row, not a `Section` header. + /// + /// Plain-style section headers pin to the top of the viewport while rows + /// scroll underneath, and the row wins the z-order — so the header text and + /// whatever row is passing behind it draw in the same pixels. Giving the + /// header an opaque background didn't fix that. Scrolling with the content + /// removes the overlap rather than trying to paint over it, and for a list + /// this short there's nothing to be gained from sticky headers anyway. private func sectionHeader(_ title: String) -> some View { Text(title) .font(.subheadline.weight(.semibold)) .foregroundStyle(.secondary) - .textCase(nil) .frame(maxWidth: .infinity, alignment: .leading) - .padding(.horizontal, 20) - .padding(.top, 14) - .padding(.bottom, 7) - .background(Color(.systemBackground)) - .listRowInsets(EdgeInsets()) + .padding(.top, 18) + .padding(.bottom, 2) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) } /// Favouriting lives on a swipe and a long-press rather than a third button From 7c34fcee4b1115b68ceb79da049917af9b0bcdad Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 14:02:08 -0400 Subject: [PATCH 22/35] Actually start Cast discovery MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Discovery never ran, so no Chromecast was ever found and iOS never even asked for local network permission — the app appeared in Settings with no Local Network toggle at all, because nothing had touched the network. startDiscoveryAfterFirstTapOnCastButton defaults to true: the SDK defers discovery until a cast button is tapped, so the permission prompt lands on a deliberate user action. That deadlocks against showing the button only once a device has been found — no button, so no scan, so no devices, so no button, forever. Discovery now starts at launch and scans actively rather than passively; passive scans are lower power but slow enough to notice a device that it reads as casting being broken. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Playback/CastController.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ios/AlchemyFM/Playback/CastController.swift b/ios/AlchemyFM/Playback/CastController.swift index 52662b1..c684267 100644 --- a/ios/AlchemyFM/Playback/CastController.swift +++ b/ios/AlchemyFM/Playback/CastController.swift @@ -39,13 +39,22 @@ final class CastController: NSObject { // Keep the session alive when the app is backgrounded — the whole point // is that the speakers keep playing. options.suspendSessionsWhenBackgrounded = false + // Defaults to true, which defers discovery until a cast button is + // tapped. Since the button here only appears once a device has been + // found, that deadlocks: no button, so no scan, so no devices, so no + // button — and the local network prompt never fires either, because + // nothing ever touches the network. + options.startDiscoveryAfterFirstTapOnCastButton = false GCKCastContext.setSharedInstanceWith(options) GCKCastContext.sharedInstance().sessionManager.add(self) let discovery = GCKCastContext.sharedInstance().discoveryManager - discovery.passiveScan = true discovery.add(self) + // Active, not passive: passive scans are lower power but far slower to + // notice a device, which reads as "casting doesn't work". + discovery.passiveScan = false + discovery.startDiscovery() hasDevices = discovery.deviceCount > 0 } From eed597bc8647c2a420d37e29ca0e81fbf36f3ba8 Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 15:25:24 -0400 Subject: [PATCH 23/35] Move the heart to the trailing edge, and offer it as a remote command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The heart sat between the title and the output controls, grouping it with them. It is an action on the track, not on where the track plays, so the cast and route buttons now group together and the heart sits apart at the trailing edge. Also wires MPRemoteCommandCenter's likeCommand, gated on the same signal as the on-screen button: `hearted` is only sent to a signed-in operator, so its presence decides whether the heart is offered at all. Whether iOS surfaces this on the Lock Screen is iOS's decision — it is reliably shown on CarPlay and the Watch and inconsistently on the phone — but it costs little and it is the only route to a heart in the *system* now-playing UI. A guaranteed one would mean a Live Activity with its own widget extension. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Playback/RadioPlayer.swift | 31 +++++++++++++++++++++ ios/AlchemyFM/Views/StationDetailView.swift | 7 ++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/ios/AlchemyFM/Playback/RadioPlayer.swift b/ios/AlchemyFM/Playback/RadioPlayer.swift index 93ddfa3..6285974 100644 --- a/ios/AlchemyFM/Playback/RadioPlayer.swift +++ b/ios/AlchemyFM/Playback/RadioPlayer.swift @@ -540,6 +540,14 @@ final class RadioPlayer { Task { @MainActor [weak self] in self?.toggle() } return .success } + // Whether iOS surfaces this on the Lock Screen is its call — it's + // reliably shown on CarPlay and the Watch, less so on the phone. Wiring + // it costs little and it's the only route to a heart in the *system* + // now-playing UI; a custom one would mean a Live Activity. + center.likeCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.toggleHeart() } + return .success + } // There is no next *track* to skip to — everyone hears the same // broadcast — so these tune to the next station instead, which is the @@ -593,9 +601,32 @@ final class RadioPlayer { info[MPNowPlayingInfoPropertyIsLiveStream] = true info[MPNowPlayingInfoPropertyPlaybackRate] = isPlaying ? 1.0 : 0.0 center.nowPlayingInfo = info + updateHeartCommand() refreshArtworkIfNeeded() } + /// `hearted` is only sent to a signed-in operator, so its presence is what + /// decides whether the heart is offered at all — same gate as the button on + /// the station page. + private func updateHeartCommand() { + let like = MPRemoteCommandCenter.shared().likeCommand + let hearted = nowPlaying?.hearted + like.isEnabled = hearted != nil && nowPlaying?.itemId != nil + like.isActive = hearted ?? false + like.localizedTitle = (hearted ?? false) ? "Unheart" : "Heart" + } + + /// Exposed for the remote command; the station page has its own optimistic + /// path because it can show the result immediately. + func toggleHeart() { + guard let api, let itemId = nowPlaying?.itemId else { return } + let target = !(nowPlaying?.hearted ?? false) + Task { + _ = try? await api.setHeart(itemId: itemId, hearted: target) + // The next poll brings back the authoritative value. + } + } + private func refreshArtworkIfNeeded() { guard let api, let station else { return } guard let url = api.resolve(nowPlaying?.coverUrl) ?? api.resolve(station.artworkUrl) else { diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index 1ce4337..029784d 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -171,7 +171,10 @@ struct StationDetailView: View { HStack(alignment: .top, spacing: 8) { titleBlock Spacer(minLength: 0) - if canHeart { heartButton } + // Output controls group together on the left; the heart is an + // action on the track, not on where it plays, so it sits apart + // at the trailing edge. + // // Only worth the space once a receiver is actually on the // network — otherwise it's a button that opens an empty list. if cast.hasDevices { @@ -184,6 +187,8 @@ struct StationDetailView: View { RoutePickerButton(tint: .secondary, activeTint: .accentColor) .frame(width: 40, height: 40) .accessibilityLabel("Choose audio output") + + if canHeart { heartButton } } listenButton From 08f5e1f3d20ba5440501b9c90f1b5d3839212e94 Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 15:30:01 -0400 Subject: [PATCH 24/35] Keep the station card a fixed height across track changes The title sized to its content, so a two-line track followed by a one-line one changed the card's height and shoved the whole queue below it up or down. That happens several times an hour on a screen nobody is touching. The title now reserves two lines whether it needs them or not, so the card is the same height for every track. The cost is a gap under a one-line title where the reserved line sits. A single line with a marquee would avoid both the jump and the gap, at the price of text that moves on a screen where nothing else does. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationDetailView.swift | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index 029784d..dbc2fa5 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -211,12 +211,13 @@ struct StationDetailView: View { private var titleBlock: some View { VStack(alignment: .leading, spacing: 3) { - // Wraps rather than scrolling: unlike the mini player this screen - // has the room, and nothing else on it moves. Capped at two lines - // so a 60-character title can't grow the card without limit. + // Always two lines tall, occupied or not. Sizing to the title + // instead means the card changes height whenever a one-line track + // follows a two-line one, and the whole queue below it jumps — + // several times an hour, on a screen nobody is interacting with. Text(nowPlaying?.title ?? station.name) .font(.title3.bold()) - .lineLimit(2) + .lineLimit(2, reservesSpace: true) .fixedSize(horizontal: false, vertical: true) artistLine From c54420abe931b76ba7d1dd9d476f488deb880d67 Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 15:34:22 -0400 Subject: [PATCH 25/35] Scroll the station title instead of wrapping it Wrapping changed the card's height whenever a one-line track followed a two-line one, shoving the queue below it around several times an hour. Reserving two lines fixed the movement but left a gap under every short title, which is most of them. A single scrolling line is the same height for every track and never padded, and it matches the mini player. This reverses the earlier call that this screen should wrap because it has the room and nothing else on it moves. That held in isolation; it stopped holding once the height changes it caused turned out to be the more annoying problem. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationDetailView.swift | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index dbc2fa5..187e78f 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -211,14 +211,16 @@ struct StationDetailView: View { private var titleBlock: some View { VStack(alignment: .leading, spacing: 3) { - // Always two lines tall, occupied or not. Sizing to the title - // instead means the card changes height whenever a one-line track - // follows a two-line one, and the whole queue below it jumps — - // several times an hour, on a screen nobody is interacting with. - Text(nowPlaying?.title ?? station.name) - .font(.title3.bold()) - .lineLimit(2, reservesSpace: true) - .fixedSize(horizontal: false, vertical: true) + // One line, scrolling when it doesn't fit. Wrapping changed the + // card's height whenever a one-line track followed a two-line one, + // shoving the queue below it around several times an hour; + // reserving two lines fixed that but left a gap under every short + // title. A single line is always the same height and never padded. + MarqueeText( + text: nowPlaying?.title ?? station.name, + font: .title3, + weight: .bold + ) artistLine } From c3d635e6660f73b6eac6e746058de11a4fcca9ea Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 15:42:12 -0400 Subject: [PATCH 26/35] Align the three station-card controls to each other MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The cast, AirPlay and heart glyphs come from three different sources — the Cast SDK, AVKit and SF Symbols — and were being given three different frame sizes on top of that. The result was three sizes, three stroke weights and three vertical positions in one row. They now share one box size, the heart is weighted to match what the two UIKit glyphs render at rather than SF Symbols' lighter default, and the group is nudged up so their centres sit on the title's centre instead of the top of its line box. Verified for the cast and route buttons; the heart needs an operator sign-in to appear, which this simulator doesn't have. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Views/StationDetailView.swift | 54 +++++++++++++-------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/ios/AlchemyFM/Views/StationDetailView.swift b/ios/AlchemyFM/Views/StationDetailView.swift index 187e78f..ed43dc8 100644 --- a/ios/AlchemyFM/Views/StationDetailView.swift +++ b/ios/AlchemyFM/Views/StationDetailView.swift @@ -171,24 +171,7 @@ struct StationDetailView: View { HStack(alignment: .top, spacing: 8) { titleBlock Spacer(minLength: 0) - // Output controls group together on the left; the heart is an - // action on the track, not on where it plays, so it sits apart - // at the trailing edge. - // - // Only worth the space once a receiver is actually on the - // network — otherwise it's a button that opens an empty list. - if cast.hasDevices { - CastButton(tint: cast.isCasting ? .accentColor : .secondary) - .frame(width: 34, height: 34) - .accessibilityLabel("Cast to a device") - } - - // Bluetooth speakers and AirPlay destinations both live here. - RoutePickerButton(tint: .secondary, activeTint: .accentColor) - .frame(width: 40, height: 40) - .accessibilityLabel("Choose audio output") - - if canHeart { heartButton } + controls } listenButton @@ -264,12 +247,43 @@ struct StationDetailView: View { nowPlaying?.hearted != nil && nowPlaying?.itemId != nil } + /// Uniform box for every control, so three glyphs from three sources — the + /// Cast SDK, AVKit, and SF Symbols — sit on one line instead of three + /// slightly different ones. + private static let controlSize: CGFloat = 30 + + private var controls: some View { + HStack(spacing: 10) { + // Only worth the space once a receiver is actually on the network + // — otherwise it's a button that opens an empty list. + if cast.hasDevices { + CastButton(tint: cast.isCasting ? .accentColor : .secondary) + .frame(width: Self.controlSize, height: Self.controlSize) + .accessibilityLabel("Cast to a device") + } + + // Bluetooth speakers and AirPlay destinations both live here. + RoutePickerButton(tint: .secondary, activeTint: .accentColor) + .frame(width: Self.controlSize, height: Self.controlSize) + .accessibilityLabel("Choose audio output") + + // The heart is an action on the track rather than on where it + // plays, so it sits past the two output controls. + if canHeart { heartButton } + } + // Nudged up so the glyphs' centres line up with the title's, rather + // than with the top of its line box. + .offset(y: -3) + } + private var heartButton: some View { Button(action: toggleHeart) { Image(systemName: isHearted ? "heart.fill" : "heart") - .font(.title3) + // Matched to the weight the Cast and AirPlay glyphs render at; + // .title3's default stroke reads noticeably thinner beside them. + .font(.system(size: 20, weight: .medium)) .foregroundStyle(isHearted ? .pink : .secondary) - .frame(width: 40, height: 40) + .frame(width: Self.controlSize, height: Self.controlSize) .contentShape(Rectangle()) } .buttonStyle(.plain) From 67feb73e09a5e4b690b24289668eb4f0f369e212 Mon Sep 17 00:00:00 2001 From: Marcus Magnant <64668236+MMagTech@users.noreply.github.com> Date: Sun, 2 Aug 2026 15:47:27 -0400 Subject: [PATCH 27/35] Add tuning static between station switches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Matches the web player's tuning bed, on a Settings toggle, defaulting on. The noise is synthesised rather than shipped as an asset — band-passed white noise at a randomised centre frequency, so no two switches sound the same and there's no audio file in the bundle. It deliberately doesn't duck the live stream the way the web player has to. There the audio element keeps playing the old station through the switch, so its volume must be pulled down and restored, and the restore can be throttled while backgrounded — tuning-static.js carries a workaround for playback stranded at ~18% volume because of exactly that. Tuning here tears the old AVPlayer down first, so there is already a gap to fill and nothing to duck. Skipped while casting, where the audio is coming out of a speaker this wouldn't reach, and on the first tune-in, where there is no switch to cover. A failure to start the engine is swallowed: this is decoration and must never be why a station doesn't tune. Verified that switching stations still moves the listener across with zero reconnects and no audio-engine errors — that the two engines coexist was the risk, not the sound itself. Co-Authored-By: Claude Opus 5 --- ios/AlchemyFM/Playback/RadioPlayer.swift | 8 ++ ios/AlchemyFM/Playback/TuningStatic.swift | 89 ++++++++++++++++++++ ios/AlchemyFM/Views/DisplayPreferences.swift | 1 + ios/AlchemyFM/Views/SettingsView.swift | 8 ++ 4 files changed, 106 insertions(+) create mode 100644 ios/AlchemyFM/Playback/TuningStatic.swift diff --git a/ios/AlchemyFM/Playback/RadioPlayer.swift b/ios/AlchemyFM/Playback/RadioPlayer.swift index 6285974..7b47fb2 100644 --- a/ios/AlchemyFM/Playback/RadioPlayer.swift +++ b/ios/AlchemyFM/Playback/RadioPlayer.swift @@ -91,6 +91,14 @@ final class RadioPlayer { func tune(to station: StationSummary, api: AlchemyAPI) { self.api = api if self.station?.slug != station.slug { + // Only when switching *between* stations while listening — not on + // the first tune-in, and not when casting, where the audio is + // coming out of a speaker this burst wouldn't reach. + if wantsLive, self.station != nil, !CastController.shared.isCasting, + UserDefaults.standard.object(forKey: DisplayPreference.tuningStatic) as? Bool ?? true + { + TuningStatic.shared.play() + } teardownPlayer() pollTask?.cancel() pollTask = nil diff --git a/ios/AlchemyFM/Playback/TuningStatic.swift b/ios/AlchemyFM/Playback/TuningStatic.swift new file mode 100644 index 0000000..363f899 --- /dev/null +++ b/ios/AlchemyFM/Playback/TuningStatic.swift @@ -0,0 +1,89 @@ +import AVFoundation + +/// A short burst of FM-style static, played across a station change. +/// +/// Synthesised rather than shipped as an asset: it's band-passed white noise +/// at a randomised centre frequency, so no two switches sound identical and +/// there's no audio file in the bundle. +/// +/// Notably this doesn't duck the live stream the way the web player must. There +/// the `