From fb9a6fcb9b55b0525b3c8469c4927f5277352974 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Mon, 3 Mar 2025 20:21:30 -0800 Subject: [PATCH 01/31] Initial commit --- QueueCube.xcodeproj/project.pbxproj | 335 ++++++++++++++++++ .../xcshareddata/xcschemes/QueueCube.xcscheme | 82 +++++ QueueCube/API.swift | 126 +++++++ QueueCube/AddMediaBarView.swift | 38 ++ .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 ++ QueueCube/Assets.xcassets/Contents.json | 6 + QueueCube/ContentView.swift | 122 +++++++ QueueCube/NowPlayingView.swift | 73 ++++ QueueCube/PlaylistView.swift | 90 +++++ QueueCube/QueueCubeApp.swift | 26 ++ QueueCube/Utilities.swift | 56 +++ 12 files changed, 1000 insertions(+) create mode 100644 QueueCube.xcodeproj/project.pbxproj create mode 100644 QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme create mode 100644 QueueCube/API.swift create mode 100644 QueueCube/AddMediaBarView.swift create mode 100644 QueueCube/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 QueueCube/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 QueueCube/Assets.xcassets/Contents.json create mode 100644 QueueCube/ContentView.swift create mode 100644 QueueCube/NowPlayingView.swift create mode 100644 QueueCube/PlaylistView.swift create mode 100644 QueueCube/QueueCubeApp.swift create mode 100644 QueueCube/Utilities.swift diff --git a/QueueCube.xcodeproj/project.pbxproj b/QueueCube.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f9a5720 --- /dev/null +++ b/QueueCube.xcodeproj/project.pbxproj @@ -0,0 +1,335 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXFileReference section */ + CD4E9B972D7691C20066FC17 /* QueueCube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QueueCube.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + CD4E9B992D7691C20066FC17 /* QueueCube */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = QueueCube; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + CD4E9B942D7691C20066FC17 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CD4E9B8E2D7691C20066FC17 = { + isa = PBXGroup; + children = ( + CD4E9B992D7691C20066FC17 /* QueueCube */, + CD4E9B982D7691C20066FC17 /* Products */, + ); + sourceTree = ""; + }; + CD4E9B982D7691C20066FC17 /* Products */ = { + isa = PBXGroup; + children = ( + CD4E9B972D7691C20066FC17 /* QueueCube.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CD4E9B962D7691C20066FC17 /* QueueCube */ = { + isa = PBXNativeTarget; + buildConfigurationList = CD4E9BA22D7691C40066FC17 /* Build configuration list for PBXNativeTarget "QueueCube" */; + buildPhases = ( + CD4E9B932D7691C20066FC17 /* Sources */, + CD4E9B942D7691C20066FC17 /* Frameworks */, + CD4E9B952D7691C20066FC17 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + CD4E9B992D7691C20066FC17 /* QueueCube */, + ); + name = QueueCube; + packageProductDependencies = ( + ); + productName = QueueCube; + productReference = CD4E9B972D7691C20066FC17 /* QueueCube.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CD4E9B8F2D7691C20066FC17 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1700; + LastUpgradeCheck = 1700; + TargetAttributes = { + CD4E9B962D7691C20066FC17 = { + CreatedOnToolsVersion = 17.0; + }; + }; + }; + buildConfigurationList = CD4E9B922D7691C20066FC17 /* Build configuration list for PBXProject "QueueCube" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CD4E9B8E2D7691C20066FC17; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = CD4E9B982D7691C20066FC17 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CD4E9B962D7691C20066FC17 /* QueueCube */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CD4E9B952D7691C20066FC17 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CD4E9B932D7691C20066FC17 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + CD4E9BA02D7691C40066FC17 /* 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_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = 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_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 19.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + 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; + }; + CD4E9BA12D7691C40066FC17 /* 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_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = 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_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 19.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CD4E9BA32D7691C40066FC17 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = net.buzzert.QueueCube; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,6"; + }; + name = Debug; + }; + CD4E9BA42D7691C40066FC17 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = net.buzzert.QueueCube; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,6"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CD4E9B922D7691C20066FC17 /* Build configuration list for PBXProject "QueueCube" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CD4E9BA02D7691C40066FC17 /* Debug */, + CD4E9BA12D7691C40066FC17 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CD4E9BA22D7691C40066FC17 /* Build configuration list for PBXNativeTarget "QueueCube" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CD4E9BA32D7691C40066FC17 /* Debug */, + CD4E9BA42D7691C40066FC17 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CD4E9B8F2D7691C20066FC17 /* Project object */; +} diff --git a/QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme b/QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme new file mode 100644 index 0000000..edecdfc --- /dev/null +++ b/QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/QueueCube/API.swift b/QueueCube/API.swift new file mode 100644 index 0000000..abdd1bb --- /dev/null +++ b/QueueCube/API.swift @@ -0,0 +1,126 @@ +// +// API.swift +// QueueCube +// +// Created by James Magahern on 3/3/25. +// + +import Foundation + +struct MediaItem: Codable +{ + let filename: String + let title: String? + let id: Int + + let current: Bool? + let playing: Bool? + let metadata: Metadata? + + // MARK: - Types + + struct Metadata: Codable + { + let title: String? + let description: String? + let siteName: String? + } +} + +struct NowPlayingInfo: Codable +{ + let playingItem: MediaItem? + let isPaused: Bool + let volume: Int +} + +struct API +{ + let baseURL: URL + + init(baseURL: URL) { + self.baseURL = baseURL + } + + public func fetchNowPlayingInfo() async throws -> NowPlayingInfo { + try await request() + .path("/nowplaying") + .json() + } + + public func fetchPlaylist() async throws -> [MediaItem] { + try await request() + .path("/playlist") + .json() + } + + public func play() async throws { + try await request() + .path("/play") + .post() + } + + public func pause() async throws { + try await request() + .path("/pause") + .post() + } + + public func events() async throws -> AsyncStream { + return AsyncStream { continuation in + let url = request() + .path("/events") + .websocket() + + let websocketTask = URLSession.shared.webSocketTask(with: url) + websocketTask.resume() + + Task { + do { + let event = { (data: Data) in + try JSONDecoder().decode(Event.self, from: data) + } + + while websocketTask.state == .running { + switch try await websocketTask.receive() { + case .string(let string): + let event = try event(string.data(using: .utf8)!) + continuation.yield(event) + case .data(let data): + let event = try event(data) + continuation.yield(event) + default: + break + } + } + } catch { + print("Websocket Error: \(error)") + } + } + } + } + + private func request() -> RequestBuilder { + RequestBuilder(url: self.baseURL) + } + + // MARK: - Types + + struct Event: Decodable + { + let type: EventType + + enum CodingKeys: String, CodingKey { + case type = "event" + } + + enum EventType: String, Decodable { + case playlistUpdate = "playlist_update" + case nowPlayingUpdate = "now_playing_update" + case volumeUpdate = "volume_update" + case favoritesUpdate = "favorites_update" + case metadataUpdate = "metadata_update" + case mpdUpdate = "mpd_update" + } + } +} diff --git a/QueueCube/AddMediaBarView.swift b/QueueCube/AddMediaBarView.swift new file mode 100644 index 0000000..9b1ddcd --- /dev/null +++ b/QueueCube/AddMediaBarView.swift @@ -0,0 +1,38 @@ +// +// AddMediaBarView.swift +// QueueCube +// +// Created by James Magahern on 3/3/25. +// + +import SwiftUI + +@Observable +class AddMediaBarViewModel +{ + var fieldContents: String = "" + + let onAdd: (String) -> Void = { _ in } + let onSearch: () -> Void = {} +} + +struct AddMediaBarView: View +{ + @State var model: AddMediaBarViewModel + + var body: some View { + VStack { + HStack { + Button(action: model.onSearch) { Image(systemName: "magnifyingglass") } + + TextField("Add any URL…", text: $model.fieldContents) + .textFieldStyle(.roundedBorder) + + Button(action: { model.onAdd(model.fieldContents) }) { Text("Add") } + .keyboardShortcut(.defaultAction) + } + .padding() + } + .background(Color.black.opacity(0.4)) + } +} diff --git a/QueueCube/Assets.xcassets/AccentColor.colorset/Contents.json b/QueueCube/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/QueueCube/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/QueueCube/Assets.xcassets/AppIcon.appiconset/Contents.json b/QueueCube/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/QueueCube/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/QueueCube/Assets.xcassets/Contents.json b/QueueCube/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/QueueCube/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/QueueCube/ContentView.swift b/QueueCube/ContentView.swift new file mode 100644 index 0000000..1ab8b1e --- /dev/null +++ b/QueueCube/ContentView.swift @@ -0,0 +1,122 @@ +// +// ContentView.swift +// QueueCube +// +// Created by James Magahern on 3/3/25. +// + +import SwiftUI + +struct ContentView: View +{ + @State var model: MainViewModel + + init() { + self.model = MainViewModel() + + let api = self.model.api + self.model.nowPlayingViewModel.onPlayPause = { model in + Task { model.isPlaying ? try await api.pause() : try await api.play() } + } + } + + var body: some View { + MainView(model: model) + .task { await watchWebsocket() } + .task { await refresh([.nowPlaying, .playlist]) } + } + + // MARK: - Types + + struct RefreshType: OptionSet + { + let rawValue: Int + + static let nowPlaying = RefreshType(rawValue: 1 << 0) + static let playlist = RefreshType(rawValue: 1 << 1) + } +} + +extension ContentView +{ + private func refresh(_ what: RefreshType) async { + do { + if what.contains(.nowPlaying) { + let nowPlaying = try await model.api.fetchNowPlayingInfo() + model.nowPlayingViewModel.title = nowPlaying.playingItem?.title ?? "??" + model.nowPlayingViewModel.subtitle = nowPlaying.playingItem?.filename ?? "??" + model.nowPlayingViewModel.isPlaying = !nowPlaying.isPaused + model.playlistModel.isPlaying = !nowPlaying.isPaused + } + + if what.contains(.playlist) { + let playlist = try await model.api.fetchPlaylist() + model.playlistModel.items = playlist.map { mediaItem in + PlaylistItem( + id: String(mediaItem.id), + title: mediaItem.title ?? mediaItem.filename, + filename: mediaItem.filename, + isCurrent: mediaItem.current ?? false + ) + } + } + } catch { + print("Error refreshing content: \(error)") + } + } + + private func watchWebsocket() async { + do { + for await event in try await model.api.events() { + await handle(event: event) + } + } catch { + print("Events error: \(error)") + } + } + + private func handle(event: API.Event) async { + switch event.type { + case .volumeUpdate: fallthrough + case .nowPlayingUpdate: + await refresh(.nowPlaying) + + case .metadataUpdate: fallthrough + case .mpdUpdate: + await refresh([.playlist, .nowPlaying]) + + default: + break + } + } +} + +@Observable +class MainViewModel +{ + var api = API(baseURL: URL(string: ProcessInfo.processInfo.environment["API_SERVER"]!)!) + + var playlistModel = PlaylistViewModel() + var nowPlayingViewModel = NowPlayingViewModel() + var addMediaViewModel = AddMediaBarViewModel() +} + +struct MainView: View +{ + @State var model: MainViewModel + + var body: some View { + VStack { + VStack { + NowPlayingView(model: model.nowPlayingViewModel) + PlaylistView(model: model.playlistModel) + } + .frame(minHeight: 0.0) + .layoutPriority(1.0) + .padding() + + AddMediaBarView(model: model.addMediaViewModel) + .layoutPriority(2.0) + } + } +} diff --git a/QueueCube/NowPlayingView.swift b/QueueCube/NowPlayingView.swift new file mode 100644 index 0000000..fc8321f --- /dev/null +++ b/QueueCube/NowPlayingView.swift @@ -0,0 +1,73 @@ +// +// NowPlayingView.swift +// QueueCube +// +// Created by James Magahern on 3/3/25. +// + +import SwiftUI + +@Observable +class NowPlayingViewModel +{ + var onPlayPause: (NowPlayingViewModel) -> Void = { _ in } + var onNext: (NowPlayingViewModel) -> Void = { _ in } + var onPrev: (NowPlayingViewModel) -> Void = { _ in } + + var isPlaying: Bool = false + var title: String = "Loading…" + var subtitle: String = "" + var volume: Double = 0.5 +} + +struct NowPlayingView: View +{ + @State var model: NowPlayingViewModel + + var body: some View { + content() + .background(background()) + } + + @ViewBuilder + private func content() -> some View { + HStack { + VStack(alignment: .leading) { + Text(model.title) + .font(.title3) + .lineLimit(1) + + Text(model.subtitle) + .foregroundColor(.secondary) + .font(.subheadline) + .lineLimit(1) + } + .padding() + + Spacer() + + controls() + .padding() + } + } + + @ViewBuilder + private func controls() -> some View { + let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" + + HStack { + Slider(value: $model.volume, in: 0.0...1.0) + .frame(maxWidth: 100.0) + + Button(action: { model.onPrev(model) } ) { Image(systemName: "arrow.left.to.line.compact") } + Button(action: { model.onPlayPause(model) }) { Image(systemName: playPauseImageName) } + Button(action: { model.onNext(model) }) { Image(systemName: "arrow.right.to.line.compact") } + } + } + + @ViewBuilder + private func background() -> some View { + RoundedRectangle(cornerRadius: 8.0) + .fill(Color(white: 0.0, opacity: 0.4)) + } +} diff --git a/QueueCube/PlaylistView.swift b/QueueCube/PlaylistView.swift new file mode 100644 index 0000000..0d5bda1 --- /dev/null +++ b/QueueCube/PlaylistView.swift @@ -0,0 +1,90 @@ +// +// PlaylistView.swift +// QueueCube +// +// Created by James Magahern on 3/3/25. +// + +import SwiftUI + +struct PlaylistItem: Identifiable +{ + let id: String + let title: String + let filename: String + let isCurrent: Bool +} + +@Observable +class PlaylistViewModel +{ + var isPlaying: Bool = false + var items: [PlaylistItem] = [] +} + +struct PlaylistView: View +{ + var model: PlaylistViewModel + + var body: some View { + List(model.items) { item in + PlaylistItemCell( + title: item.title, + subtitle: item.filename, + state: item.isCurrent ? (model.isPlaying ? PlaylistItemCell.State.playing : PlaylistItemCell.State.paused) + : .queued + ) + } + } +} + +struct PlaylistItemCell: View +{ + let title: String + let subtitle: String + let state: State + + var body: some View { + let icon: String = switch state { + case .queued: "play.fill" + case .playing: "speaker.wave.3.fill" + case .paused: "speaker.fill" + } + + HStack { + Button(action: {}) { Image(systemName: icon) } + .buttonStyle(BorderlessButtonStyle()) + .tint(Color.primary) + .frame(width: 15.0) + + VStack(alignment: .leading) { + Text(title) + .font(.body.bold()) + .lineLimit(1) + + Text(subtitle) + .foregroundColor(.secondary) + .lineLimit(1) + } + + Spacer() + + HStack { + Button(action: {}) { + Image(systemName: "xmark") + .tint(.red) + } + } + } + .listRowBackground(state != .queued ? Color.white.opacity(0.15) : nil) + .padding([.top, .bottom], 8.0) + } + + // MARK: - Types + + enum State { + case queued + case playing + case paused + } +} diff --git a/QueueCube/QueueCubeApp.swift b/QueueCube/QueueCubeApp.swift new file mode 100644 index 0000000..508fcb8 --- /dev/null +++ b/QueueCube/QueueCubeApp.swift @@ -0,0 +1,26 @@ +// +// QueueCubeApp.swift +// QueueCube +// +// Created by James Magahern on 3/3/25. +// + +import SwiftUI + +@main +struct QueueCubeApp: App { + var body: some Scene { + WindowGroup { + ContentView() + .frame(minWidth: 400.0, minHeight: 600.0) + .onAppear { +#if targetEnvironment(macCatalyst) + guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return } + windowScene.titlebar?.titleVisibility = .hidden + windowScene.titlebar?.separatorStyle = .none +#endif + } + } + + } +} diff --git a/QueueCube/Utilities.swift b/QueueCube/Utilities.swift new file mode 100644 index 0000000..3d961ca --- /dev/null +++ b/QueueCube/Utilities.swift @@ -0,0 +1,56 @@ +// +// Utilities.swift +// QueueCube +// +// Created by James Magahern on 3/3/25. +// + +import Foundation + +struct RequestBuilder +{ + let url: URL + private var httpMethod: HTTPMethod = .get + + init(url: URL) { + self.url = url + } + + public func method(_ method: HTTPMethod) -> Self { + var copy = self + copy.httpMethod = method + return copy + } + + public func path(_ path: any StringProtocol) -> Self { + return RequestBuilder(url: self.url.appending(path: path)) + } + + public func build() -> URLRequest { + var request = URLRequest(url: self.url) + request.httpMethod = self.httpMethod.rawValue + return request + } + + public func json() async throws -> T { + let urlRequest = self.build() + let (data, _) = try await URLSession.shared.data(for: urlRequest) + return try JSONDecoder().decode(T.self, from: data) + } + + public func post() async throws { + let urlRequest = self.method(.post).build() + (_, _) = try await URLSession.shared.data(for: urlRequest) + } + + public func websocket() -> URL { + guard var components = URLComponents(url: self.url, resolvingAgainstBaseURL: false) else { fatalError() } + components.scheme = components.scheme == "https" ? "wss" : "ws" + return components.url! + } + + enum HTTPMethod: String { + case get = "GET" + case post = "POST" + } +} From 74c0227ec70992afae47ec5bf71f884eb9d5c7a2 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Mon, 3 Mar 2025 21:08:47 -0800 Subject: [PATCH 02/31] Implements a few more api endpoints --- QueueCube/API.swift | 34 ++++++++++++++++++++++++++ QueueCube/AddMediaBarView.swift | 4 ++-- QueueCube/ContentView.swift | 42 ++++++++++++++++++++++++++++++--- QueueCube/NowPlayingView.swift | 14 +++++++---- QueueCube/PlaylistView.swift | 17 +++++++++---- QueueCube/Utilities.swift | 26 ++++++++++++++++++-- 6 files changed, 121 insertions(+), 16 deletions(-) diff --git a/QueueCube/API.swift b/QueueCube/API.swift index abdd1bb..5f6819e 100644 --- a/QueueCube/API.swift +++ b/QueueCube/API.swift @@ -66,6 +66,40 @@ struct API .post() } + public func skip(_ to: Int? = nil) async throws { + let path = if let to { "/skip/\(to)" } else { "/skip" } + try await request() + .path(path) + .post() + } + + public func previous() async throws { + try await request() + .path("/previous") + .post() + } + + public func add(mediaURL: String) async throws { + try await request() + .path("/playlist") + .body([ "url" : mediaURL ]) + .post() + } + + public func delete(index: Int) async throws { + try await request() + .path("/playlist/\(index)") + .method(.delete) + .execute() + } + + public func setVolume(_ value: Double) async throws { + try await request() + .path("/volume") + .body([ "volume" : Int(value * 100) ]) + .post() + } + public func events() async throws -> AsyncStream { return AsyncStream { continuation in let url = request() diff --git a/QueueCube/AddMediaBarView.swift b/QueueCube/AddMediaBarView.swift index 9b1ddcd..5e57d1a 100644 --- a/QueueCube/AddMediaBarView.swift +++ b/QueueCube/AddMediaBarView.swift @@ -12,8 +12,8 @@ class AddMediaBarViewModel { var fieldContents: String = "" - let onAdd: (String) -> Void = { _ in } - let onSearch: () -> Void = {} + var onAdd: (String) -> Void = { _ in } + var onSearch: () -> Void = {} } struct AddMediaBarView: View diff --git a/QueueCube/ContentView.swift b/QueueCube/ContentView.swift index 1ab8b1e..c70f59b 100644 --- a/QueueCube/ContentView.swift +++ b/QueueCube/ContentView.swift @@ -15,9 +15,37 @@ struct ContentView: View self.model = MainViewModel() let api = self.model.api - self.model.nowPlayingViewModel.onPlayPause = { model in + + let nowPlayingModel = self.model.nowPlayingViewModel + nowPlayingModel.onPlayPause = { model in Task { model.isPlaying ? try await api.pause() : try await api.play() } } + nowPlayingModel.onNext = { _ in + Task { try await api.skip() } + } + nowPlayingModel.onPrev = { _ in + Task { try await api.previous() } + } + nowPlayingModel.onVolumeChange = { model in + Task { try await api.setVolume(model.volume) } + } + + let playlistModel = model.playlistModel + playlistModel.onSeek = { item in + Task { try await api.skip(item.index) } + } + playlistModel.onDelete = { item in + Task { try await api.delete(index: item.index) } + } + + let addMediaModel = model.addMediaViewModel + addMediaModel.onAdd = { mediaURL in + let strippedURL = mediaURL.trimmingCharacters(in: .whitespacesAndNewlines) + if !strippedURL.isEmpty { + addMediaModel.fieldContents = "" + Task { try await api.add(mediaURL: strippedURL) } + } + } } var body: some View { @@ -46,13 +74,15 @@ extension ContentView model.nowPlayingViewModel.title = nowPlaying.playingItem?.title ?? "??" model.nowPlayingViewModel.subtitle = nowPlaying.playingItem?.filename ?? "??" model.nowPlayingViewModel.isPlaying = !nowPlaying.isPaused + model.nowPlayingViewModel.volume = Double(nowPlaying.volume) / 100.0 model.playlistModel.isPlaying = !nowPlaying.isPaused } if what.contains(.playlist) { let playlist = try await model.api.fetchPlaylist() - model.playlistModel.items = playlist.map { mediaItem in + model.playlistModel.items = playlist.enumerated().map { (idx, mediaItem) in PlaylistItem( + index: idx, id: String(mediaItem.id), title: mediaItem.title ?? mediaItem.filename, filename: mediaItem.filename, @@ -68,6 +98,7 @@ extension ContentView private func watchWebsocket() async { do { for await event in try await model.api.events() { + print("Got event: \(event.type)") await handle(event: event) } } catch { @@ -81,6 +112,9 @@ extension ContentView case .nowPlayingUpdate: await refresh(.nowPlaying) + case .playlistUpdate: + await refresh(.playlist) + case .metadataUpdate: fallthrough case .mpdUpdate: await refresh([.playlist, .nowPlaying]) @@ -109,11 +143,13 @@ struct MainView: View VStack { VStack { NowPlayingView(model: model.nowPlayingViewModel) + .padding() + PlaylistView(model: model.playlistModel) + .frame(maxWidth: 640.0) } .frame(minHeight: 0.0) .layoutPriority(1.0) - .padding() AddMediaBarView(model: model.addMediaViewModel) .layoutPriority(2.0) diff --git a/QueueCube/NowPlayingView.swift b/QueueCube/NowPlayingView.swift index fc8321f..4fa8712 100644 --- a/QueueCube/NowPlayingView.swift +++ b/QueueCube/NowPlayingView.swift @@ -10,9 +10,10 @@ import SwiftUI @Observable class NowPlayingViewModel { - var onPlayPause: (NowPlayingViewModel) -> Void = { _ in } - var onNext: (NowPlayingViewModel) -> Void = { _ in } - var onPrev: (NowPlayingViewModel) -> Void = { _ in } + var onPlayPause: (NowPlayingViewModel) -> Void = { _ in } + var onNext: (NowPlayingViewModel) -> Void = { _ in } + var onPrev: (NowPlayingViewModel) -> Void = { _ in } + var onVolumeChange: (NowPlayingViewModel) -> Void = { _ in } var isPlaying: Bool = false var title: String = "Loading…" @@ -56,8 +57,11 @@ struct NowPlayingView: View let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" HStack { - Slider(value: $model.volume, in: 0.0...1.0) - .frame(maxWidth: 100.0) + Slider( + value: $model.volume, + in: 0.0...1.0, + onEditingChanged: { _ in model.onVolumeChange(model) } + ).frame(maxWidth: 100.0) Button(action: { model.onPrev(model) } ) { Image(systemName: "arrow.left.to.line.compact") } Button(action: { model.onPlayPause(model) }) { Image(systemName: playPauseImageName) } diff --git a/QueueCube/PlaylistView.swift b/QueueCube/PlaylistView.swift index 0d5bda1..cc5ec35 100644 --- a/QueueCube/PlaylistView.swift +++ b/QueueCube/PlaylistView.swift @@ -9,6 +9,7 @@ import SwiftUI struct PlaylistItem: Identifiable { + let index: Int let id: String let title: String let filename: String @@ -20,6 +21,9 @@ class PlaylistViewModel { var isPlaying: Bool = false var items: [PlaylistItem] = [] + + var onSeek: (PlaylistItem) -> Void = { _ in } + var onDelete: (PlaylistItem) -> Void = { _ in } } struct PlaylistView: View @@ -32,7 +36,9 @@ struct PlaylistView: View title: item.title, subtitle: item.filename, state: item.isCurrent ? (model.isPlaying ? PlaylistItemCell.State.playing : PlaylistItemCell.State.paused) - : .queued + : .queued, + onLeadingIconClick: { model.onSeek(item) }, + onDeleteButtonClick: { model.onDelete(item) }, ) } } @@ -44,6 +50,9 @@ struct PlaylistItemCell: View let subtitle: String let state: State + let onLeadingIconClick: () -> Void + let onDeleteButtonClick: () -> Void + var body: some View { let icon: String = switch state { case .queued: "play.fill" @@ -52,7 +61,7 @@ struct PlaylistItemCell: View } HStack { - Button(action: {}) { Image(systemName: icon) } + Button(action: onLeadingIconClick) { Image(systemName: icon) } .buttonStyle(BorderlessButtonStyle()) .tint(Color.primary) .frame(width: 15.0) @@ -70,14 +79,14 @@ struct PlaylistItemCell: View Spacer() HStack { - Button(action: {}) { + Button(action: onDeleteButtonClick) { Image(systemName: "xmark") .tint(.red) } } } .listRowBackground(state != .queued ? Color.white.opacity(0.15) : nil) - .padding([.top, .bottom], 8.0) + .padding([.top, .bottom], 8.0) } // MARK: - Types diff --git a/QueueCube/Utilities.swift b/QueueCube/Utilities.swift index 3d961ca..8cf95a9 100644 --- a/QueueCube/Utilities.swift +++ b/QueueCube/Utilities.swift @@ -11,6 +11,7 @@ struct RequestBuilder { let url: URL private var httpMethod: HTTPMethod = .get + private var body: Data? = nil init(url: URL) { self.url = url @@ -26,9 +27,20 @@ struct RequestBuilder return RequestBuilder(url: self.url.appending(path: path)) } + public func body(_ data: Codable) -> Self { + var copy = self + copy.body = try! JSONEncoder().encode(data) + return copy + } + public func build() -> URLRequest { var request = URLRequest(url: self.url) request.httpMethod = self.httpMethod.rawValue + if let body { + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + request.httpBody = body + } + return request } @@ -39,8 +51,17 @@ struct RequestBuilder } public func post() async throws { - let urlRequest = self.method(.post).build() - (_, _) = try await URLSession.shared.data(for: urlRequest) + try await self.method(.post).execute() + } + + public func execute() async throws { + let urlRequest = self.build() + let (data, response) = try await URLSession.shared.data(for: urlRequest) + if let httpResponse = response as? HTTPURLResponse { + if httpResponse.statusCode != 200 { + print("POST error \(httpResponse.statusCode): \(String(data: data, encoding: .utf8)!)") + } + } } public func websocket() -> URL { @@ -52,5 +73,6 @@ struct RequestBuilder enum HTTPMethod: String { case get = "GET" case post = "POST" + case delete = "DELETE" } } From 45f1f521e24ca2f99c5d69bf4eca08fc1d08d622 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 2 May 2025 21:27:46 -0700 Subject: [PATCH 03/31] implements settings --- QueueCube.xcodeproj/project.pbxproj | 25 +++- .../xcshareddata/xcschemes/QueueCube.xcscheme | 3 +- QueueCube/API.swift | 16 +- QueueCube/AddMediaBarView.swift | 4 +- QueueCube/ContentView.swift | 115 ++++++++++----- QueueCube/Info.plist | 11 ++ QueueCube/Localizable/Localizable.xcstrings | 132 +++++++++++++++++ QueueCube/Localizable/Strings.swift | 24 +++ QueueCube/NowPlayingView.swift | 2 +- QueueCube/QueueCubeApp.swift | 19 +++ QueueCube/SettingsView.swift | 137 ++++++++++++++++++ QueueCube/Utilities.swift | 37 +++++ 12 files changed, 481 insertions(+), 44 deletions(-) create mode 100644 QueueCube/Info.plist create mode 100644 QueueCube/Localizable/Localizable.xcstrings create mode 100644 QueueCube/Localizable/Strings.swift create mode 100644 QueueCube/SettingsView.swift diff --git a/QueueCube.xcodeproj/project.pbxproj b/QueueCube.xcodeproj/project.pbxproj index f9a5720..bb48242 100644 --- a/QueueCube.xcodeproj/project.pbxproj +++ b/QueueCube.xcodeproj/project.pbxproj @@ -10,9 +10,22 @@ CD4E9B972D7691C20066FC17 /* QueueCube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QueueCube.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + CD8ACBBF2DC5B8F2008BF856 /* Exceptions for "QueueCube" folder in "QueueCube" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = CD4E9B962D7691C20066FC17 /* QueueCube */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + /* Begin PBXFileSystemSynchronizedRootGroup section */ CD4E9B992D7691C20066FC17 /* QueueCube */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + CD8ACBBF2DC5B8F2008BF856 /* Exceptions for "QueueCube" folder in "QueueCube" target */, + ); path = QueueCube; sourceTree = ""; }; @@ -184,6 +197,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; @@ -240,6 +254,7 @@ MTL_FAST_MATH = YES; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; VALIDATE_PRODUCT = YES; }; name = Release; @@ -250,16 +265,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = DQQH5H6GBD; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = QueueCube/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.6; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -282,16 +300,19 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_IDENTITY = "-"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = DQQH5H6GBD; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = QueueCube/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 17.6; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme b/QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme index edecdfc..ba5f128 100644 --- a/QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme +++ b/QueueCube.xcodeproj/xcshareddata/xcschemes/QueueCube.xcscheme @@ -39,8 +39,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" - allowLocationSimulation = "YES" - internalIOSLaunchStyle = "2"> + allowLocationSimulation = "YES"> Self? { + let settings = Settings.fromDefaults() + + guard let baseURL = settings.serverURL.flatMap({ URL(string: $0) }) + else { return nil } + + return API(baseURL: baseURL) + } + init(baseURL: URL) { self.baseURL = baseURL } @@ -135,11 +144,16 @@ struct API } private func request() -> RequestBuilder { - RequestBuilder(url: self.baseURL) + RequestBuilder(url: baseURL) } // MARK: - Types + enum Error: Swift.Error + { + case apiNotConfigured + } + struct Event: Decodable { let type: EventType diff --git a/QueueCube/AddMediaBarView.swift b/QueueCube/AddMediaBarView.swift index 5e57d1a..8ef535d 100644 --- a/QueueCube/AddMediaBarView.swift +++ b/QueueCube/AddMediaBarView.swift @@ -25,10 +25,10 @@ struct AddMediaBarView: View HStack { Button(action: model.onSearch) { Image(systemName: "magnifyingglass") } - TextField("Add any URL…", text: $model.fieldContents) + TextField(.addAnyURL, text: $model.fieldContents) .textFieldStyle(.roundedBorder) - Button(action: { model.onAdd(model.fieldContents) }) { Text("Add") } + Button(action: { model.onAdd(model.fieldContents) }) { Text(.add) } .keyboardShortcut(.defaultAction) } .padding() diff --git a/QueueCube/ContentView.swift b/QueueCube/ContentView.swift index c70f59b..4cc0b7c 100644 --- a/QueueCube/ContentView.swift +++ b/QueueCube/ContentView.swift @@ -14,36 +14,36 @@ struct ContentView: View init() { self.model = MainViewModel() - let api = self.model.api - - let nowPlayingModel = self.model.nowPlayingViewModel - nowPlayingModel.onPlayPause = { model in - Task { model.isPlaying ? try await api.pause() : try await api.play() } - } - nowPlayingModel.onNext = { _ in - Task { try await api.skip() } - } - nowPlayingModel.onPrev = { _ in - Task { try await api.previous() } - } - nowPlayingModel.onVolumeChange = { model in - Task { try await api.setVolume(model.volume) } - } - - let playlistModel = model.playlistModel - playlistModel.onSeek = { item in - Task { try await api.skip(item.index) } - } - playlistModel.onDelete = { item in - Task { try await api.delete(index: item.index) } - } - - let addMediaModel = model.addMediaViewModel - addMediaModel.onAdd = { mediaURL in - let strippedURL = mediaURL.trimmingCharacters(in: .whitespacesAndNewlines) - if !strippedURL.isEmpty { - addMediaModel.fieldContents = "" - Task { try await api.add(mediaURL: strippedURL) } + if let api = model.api { + let nowPlayingModel = self.model.nowPlayingViewModel + nowPlayingModel.onPlayPause = { model in + Task { model.isPlaying ? try await api.pause() : try await api.play() } + } + nowPlayingModel.onNext = { _ in + Task { try await api.skip() } + } + nowPlayingModel.onPrev = { _ in + Task { try await api.previous() } + } + nowPlayingModel.onVolumeChange = { model in + Task { try await api.setVolume(model.volume) } + } + + let playlistModel = model.playlistModel + playlistModel.onSeek = { item in + Task { try await api.skip(item.index) } + } + playlistModel.onDelete = { item in + Task { try await api.delete(index: item.index) } + } + + let addMediaModel = model.addMediaViewModel + addMediaModel.onAdd = { mediaURL in + let strippedURL = mediaURL.trimmingCharacters(in: .whitespacesAndNewlines) + if !strippedURL.isEmpty { + addMediaModel.fieldContents = "" + Task { try await api.add(mediaURL: strippedURL) } + } } } } @@ -68,9 +68,11 @@ struct ContentView: View extension ContentView { private func refresh(_ what: RefreshType) async { + guard let api = model.api else { return } + do { if what.contains(.nowPlaying) { - let nowPlaying = try await model.api.fetchNowPlayingInfo() + let nowPlaying = try await api.fetchNowPlayingInfo() model.nowPlayingViewModel.title = nowPlaying.playingItem?.title ?? "??" model.nowPlayingViewModel.subtitle = nowPlaying.playingItem?.filename ?? "??" model.nowPlayingViewModel.isPlaying = !nowPlaying.isPaused @@ -79,7 +81,7 @@ extension ContentView } if what.contains(.playlist) { - let playlist = try await model.api.fetchPlaylist() + let playlist = try await api.fetchPlaylist() model.playlistModel.items = playlist.enumerated().map { (idx, mediaItem) in PlaylistItem( index: idx, @@ -96,8 +98,10 @@ extension ContentView } private func watchWebsocket() async { + guard let api = model.api else { return } + do { - for await event in try await model.api.events() { + for await event in try await api.events() { print("Got event: \(event.type)") await handle(event: event) } @@ -128,7 +132,7 @@ extension ContentView @Observable class MainViewModel { - var api = API(baseURL: URL(string: ProcessInfo.processInfo.environment["API_SERVER"]!)!) + var api = API.fromSettings() var playlistModel = PlaylistViewModel() var nowPlayingViewModel = NowPlayingViewModel() @@ -138,21 +142,60 @@ class MainViewModel struct MainView: View { @State var model: MainViewModel + @State var isSettingsVisible: Bool = false + + init(model: MainViewModel) { + self.model = model + + Task { + let settingsChangedNotifications = NotificationCenter.default.notifications(named: .settingsChanged) + .map({ _ in Optional.none }) + + for await _ in settingsChangedNotifications { + model.api = API.fromSettings() + } + } + } var body: some View { + let showConfigurationDialog = model.api == nil + VStack { VStack { NowPlayingView(model: model.nowPlayingViewModel) .padding() + .disabled(showConfigurationDialog) - PlaylistView(model: model.playlistModel) - .frame(maxWidth: 640.0) + if showConfigurationDialog { + Spacer() + + ContentUnavailableView { + Image(systemName: "server.rack") + Text(.notConfigured) + } actions: { + Button { + isSettingsVisible = true + } label: { + Text(.settings) + } + } + + Spacer() + } else { + PlaylistView(model: model.playlistModel) + .frame(maxWidth: 640.0) + } } .frame(minHeight: 0.0) .layoutPriority(1.0) AddMediaBarView(model: model.addMediaViewModel) .layoutPriority(2.0) + .disabled(showConfigurationDialog) } + .sheet(isPresented: $isSettingsVisible) { + SettingsView(onDone: { isSettingsVisible = false }) + } + } } diff --git a/QueueCube/Info.plist b/QueueCube/Info.plist new file mode 100644 index 0000000..6a6654d --- /dev/null +++ b/QueueCube/Info.plist @@ -0,0 +1,11 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings new file mode 100644 index 0000000..6719077 --- /dev/null +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -0,0 +1,132 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "ADD" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add" + } + } + } + }, + "ADD_ANY_URL" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add any URL…" + } + } + } + }, + "CONFIGURATION" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Configuration" + } + } + } + }, + "DONE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Done" + } + } + } + }, + "General" : { + + }, + "GENERAL" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "General" + } + } + } + }, + "NOT_CONFIGURED" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Not Configured" + } + } + } + }, + "SERVER_IS_ONLINE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server is online" + } + } + } + }, + "SERVER_URL" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Server URL" + } + } + } + }, + "SETTINGS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settings" + } + } + } + }, + "SETTINGS_ELLIPSES" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Settings…" + } + } + } + }, + "UNABLE_TO_CONNECT" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unable to connect" + } + } + } + }, + "VALIDATING" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Validating…" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift new file mode 100644 index 0000000..ce9c4f4 --- /dev/null +++ b/QueueCube/Localizable/Strings.swift @@ -0,0 +1,24 @@ +// +// Strings.swift +// QueueCube +// +// Created by James Magahern on 5/2/25. +// + +import SwiftUI + +extension LocalizedStringKey +{ + static let serverURL = LocalizedStringKey("SERVER_URL") + static let settings = LocalizedStringKey("SETTINGS") + static let settings_ = LocalizedStringKey("SETTINGS_ELLIPSES") + static let done = LocalizedStringKey("DONE") + static let notConfigured = LocalizedStringKey("NOT_CONFIGURED") + static let add = LocalizedStringKey("ADD") + static let addAnyURL = LocalizedStringKey("ADD_ANY_URL") + static let serverIsOnline = LocalizedStringKey("SERVER_IS_ONLINE") + static let unableToConnect = LocalizedStringKey("UNABLE_TO_CONNECT") + static let configuration = LocalizedStringKey("CONFIGURATION") + static let validating = LocalizedStringKey("VALIDATING") + static let general = LocalizedStringKey("GENERAL") +} diff --git a/QueueCube/NowPlayingView.swift b/QueueCube/NowPlayingView.swift index 4fa8712..65dde23 100644 --- a/QueueCube/NowPlayingView.swift +++ b/QueueCube/NowPlayingView.swift @@ -16,7 +16,7 @@ class NowPlayingViewModel var onVolumeChange: (NowPlayingViewModel) -> Void = { _ in } var isPlaying: Bool = false - var title: String = "Loading…" + var title: String = "" var subtitle: String = "" var volume: Double = 0.5 } diff --git a/QueueCube/QueueCubeApp.swift b/QueueCube/QueueCubeApp.swift index 508fcb8..d2430ac 100644 --- a/QueueCube/QueueCubeApp.swift +++ b/QueueCube/QueueCubeApp.swift @@ -9,6 +9,8 @@ import SwiftUI @main struct QueueCubeApp: App { + @Environment(\.openWindow) private var openWindow + var body: some Scene { WindowGroup { ContentView() @@ -20,7 +22,24 @@ struct QueueCubeApp: App { windowScene.titlebar?.separatorStyle = .none #endif } + }.commands { + CommandGroup(replacing: .appSettings) { + Button(.settings_) { + openWindow(id: .settingsWindowID) + } + .keyboardShortcut(",", modifiers: .command) + } } + .defaultSize(width: 640.0, height: 800.0) + WindowGroup(id: .settingsWindowID) { + SettingsView(onDone: {}) + } + .defaultSize(width: 480.0, height: 400.0) } } + +fileprivate extension String +{ + static let settingsWindowID = "settings" +} diff --git a/QueueCube/SettingsView.swift b/QueueCube/SettingsView.swift new file mode 100644 index 0000000..6ea6fbb --- /dev/null +++ b/QueueCube/SettingsView.swift @@ -0,0 +1,137 @@ +// +// SettingsView.swift +// QueueCube +// +// Created by James Magahern on 5/2/25. +// + +import SwiftUI + +@Observable +class SettingsViewModel +{ + var serverURL: String = "" + var validationState: ValidationState = .empty + + private var validationTimer: Timer? = nil + + init() { + validateSettings() + observeForValidation() + } + + static func fromDefaults() -> SettingsViewModel { + let settings = Settings.fromDefaults() + let model = SettingsViewModel() + model.serverURL = settings.serverURL ?? "" + + return model + } + + private func observeForValidation() { + withObservationTracking { + _ = serverURL + } onChange: { + Task { @MainActor [weak self] in + guard let self else { return } + setNeedsValidation() + saveSettings() + + observeForValidation() + } + } + } + + private func setNeedsValidation() { + self.validationTimer?.invalidate() + self.validationTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in + self?.validateSettings() + } + } + + private func validateSettings() { + guard !serverURL.isEmpty else { + validationState = .empty + return + } + + self.validationState = .validating + + Task { + do { + let url = try URL(string: serverURL).try_unwrap() + let api = API(baseURL: url) + _ = try await api.fetchNowPlayingInfo() + + self.validationState = .valid + } catch { + print("Validation failed: \(error)") + self.validationState = .notValid + } + } + } + + private func saveSettings() { + Settings(serverURL: self.serverURL) + .save() + } + + // MARK: - Types + + enum ValidationState + { + case empty + case validating + case notValid + case valid + } +} + +struct SettingsView: View +{ + let onDone: () -> Void + @State var model = SettingsViewModel.fromDefaults() + + var body: some View { + TabView { + Tab("General", systemImage: "gear") { + generalTab() + } + } + } + + @ViewBuilder + func generalTab() -> some View { + Form { + Section(.configuration) { + TextField(.serverURL, text: $model.serverURL) + .autocapitalization(.none) + .autocorrectionDisabled() + .keyboardType(.URL) + } + + switch model.validationState { + case .empty: + EmptyView() + case .validating: + HStack { + ProgressView() + .progressViewStyle(.circular) + Text(.validating) + } + case .notValid: + HStack { + Image(systemName: "x.circle.fill") + Text(.unableToConnect) + } + .foregroundStyle(.red) + case .valid: + HStack { + Image(systemName: "checkmark.circle.fill") + Text(.serverIsOnline) + } + .foregroundStyle(.green) + } + } + } +} diff --git a/QueueCube/Utilities.swift b/QueueCube/Utilities.swift index 8cf95a9..154e7f9 100644 --- a/QueueCube/Utilities.swift +++ b/QueueCube/Utilities.swift @@ -7,6 +7,43 @@ import Foundation +struct Settings +{ + var serverURL: String? + + static func fromDefaults() -> Settings { + let serverURL = UserDefaults.standard.string(forKey: Keys.serverURL.rawValue) + return Settings(serverURL: serverURL) + } + + func save() { + UserDefaults.standard.set(serverURL, forKey: Keys.serverURL.rawValue) + NotificationCenter.default.post(name: .settingsChanged, object: nil) + } + + // MARK: - Types + + enum Keys: String + { + case serverURL + } +} + +extension Notification.Name +{ + static let settingsChanged = Notification.Name("settingsChanged") +} + +extension Optional +{ + func try_unwrap() throws -> Wrapped { + guard let self else { throw UnwrapError() } + return self + } + + struct UnwrapError: Swift.Error {} +} + struct RequestBuilder { let url: URL From 8807d6e6210bb5b9e0cda29a79dbe51d3484f968 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 30 May 2025 16:45:09 -0700 Subject: [PATCH 04/31] better handling of connection errors --- QueueCube/API.swift | 82 +++++++++++++++------ QueueCube/ContentView.swift | 73 ++++++++++++++---- QueueCube/Localizable/Localizable.xcstrings | 10 +++ QueueCube/Localizable/Strings.swift | 1 + 4 files changed, 129 insertions(+), 37 deletions(-) diff --git a/QueueCube/API.swift b/QueueCube/API.swift index bea4601..449d95a 100644 --- a/QueueCube/API.swift +++ b/QueueCube/API.swift @@ -9,7 +9,7 @@ import Foundation struct MediaItem: Codable { - let filename: String + let filename: String? let title: String? let id: Int @@ -109,40 +109,65 @@ struct API .post() } - public func events() async throws -> AsyncStream { + public func events() async throws -> AsyncStream { return AsyncStream { continuation in - let url = request() - .path("/events") - .websocket() - - let websocketTask = URLSession.shared.webSocketTask(with: url) - websocketTask.resume() + var websocketTask: URLSessionWebSocketTask = spawnWebsocketTask(with: continuation) Task { - do { - let event = { (data: Data) in - try JSONDecoder().decode(Event.self, from: data) - } + while true { + try await Task.sleep(for: .seconds(5)) - while websocketTask.state == .running { - switch try await websocketTask.receive() { - case .string(let string): - let event = try event(string.data(using: .utf8)!) - continuation.yield(event) - case .data(let data): - let event = try event(data) - continuation.yield(event) - default: - break + websocketTask.sendPing { error in + if let error { + print("Ping error: \(error). Trying to reconnect.") + continuation.yield(.error(.websocketError(error))) + websocketTask = spawnWebsocketTask(with: continuation) + } else { + continuation.yield(.event(Event(type: .receivedWebsocketPong))) } } - } catch { - print("Websocket Error: \(error)") } } } } + private func spawnWebsocketTask( + with continuation: AsyncStream.Continuation + ) -> URLSessionWebSocketTask + { + let url = request() + .path("/events") + .websocket() + + let websocketTask = URLSession.shared.webSocketTask(with: url) + websocketTask.resume() + + Task { + do { + let event = { (data: Data) in + try JSONDecoder().decode(Event.self, from: data) + } + + while websocketTask.state == .running { + switch try await websocketTask.receive() { + case .string(let string): + let event = try event(string.data(using: .utf8)!) + continuation.yield(.event(event)) + case .data(let data): + let event = try event(data) + continuation.yield(.event(event)) + default: + break + } + } + } catch { + print("Websocket Error: \(error)") + } + } + + return websocketTask + } + private func request() -> RequestBuilder { RequestBuilder(url: baseURL) } @@ -152,6 +177,12 @@ struct API enum Error: Swift.Error { case apiNotConfigured + case websocketError(Swift.Error) + } + + enum StreamEvent { + case event(Event) + case error(API.Error) } struct Event: Decodable @@ -169,6 +200,9 @@ struct API case favoritesUpdate = "favorites_update" case metadataUpdate = "metadata_update" case mpdUpdate = "mpd_update" + + // Private UI events + case receivedWebsocketPong } } } diff --git a/QueueCube/ContentView.swift b/QueueCube/ContentView.swift index 4cc0b7c..f87686f 100644 --- a/QueueCube/ContentView.swift +++ b/QueueCube/ContentView.swift @@ -73,8 +73,14 @@ extension ContentView do { if what.contains(.nowPlaying) { let nowPlaying = try await api.fetchNowPlayingInfo() - model.nowPlayingViewModel.title = nowPlaying.playingItem?.title ?? "??" - model.nowPlayingViewModel.subtitle = nowPlaying.playingItem?.filename ?? "??" + if let nowPlayingItem = nowPlaying.playingItem, let title = nowPlayingItem.title { + model.nowPlayingViewModel.title = title + model.nowPlayingViewModel.subtitle = nowPlayingItem.filename ?? "" + } else { + model.nowPlayingViewModel.title = "(Not Playing)" + model.nowPlayingViewModel.subtitle = "" + } + model.nowPlayingViewModel.isPlaying = !nowPlaying.isPaused model.nowPlayingViewModel.volume = Double(nowPlaying.volume) / 100.0 model.playlistModel.isPlaying = !nowPlaying.isPaused @@ -86,14 +92,17 @@ extension ContentView PlaylistItem( index: idx, id: String(mediaItem.id), - title: mediaItem.title ?? mediaItem.filename, - filename: mediaItem.filename, + title: mediaItem.title ?? mediaItem.filename ?? "", + filename: mediaItem.filename ?? "", isCurrent: mediaItem.current ?? false ) } } + + model.connectionError = nil } catch { print("Error refreshing content: \(error)") + model.connectionError = error } } @@ -101,9 +110,14 @@ extension ContentView guard let api = model.api else { return } do { - for await event in try await api.events() { - print("Got event: \(event.type)") - await handle(event: event) + for await streamEvent in try await api.events() { + switch streamEvent { + case .event(let event): + model.connectionError = nil + await handle(event: event) + case .error(let error): + model.connectionError = error + } } } catch { print("Events error: \(error)") @@ -122,6 +136,13 @@ extension ContentView case .metadataUpdate: fallthrough case .mpdUpdate: await refresh([.playlist, .nowPlaying]) + + case .receivedWebsocketPong: + // This means we're online. + if model.connectionError != nil { + model.connectionError = nil + await refresh([.playlist, .nowPlaying]) + } default: break @@ -134,6 +155,8 @@ class MainViewModel { var api = API.fromSettings() + var connectionError: Error? = nil + var playlistModel = PlaylistViewModel() var nowPlayingViewModel = NowPlayingViewModel() var addMediaViewModel = AddMediaBarViewModel() @@ -164,12 +187,10 @@ struct MainView: View VStack { NowPlayingView(model: model.nowPlayingViewModel) .padding() - .disabled(showConfigurationDialog) + .disabled(showConfigurationDialog || model.connectionError != nil) if showConfigurationDialog { - Spacer() - - ContentUnavailableView { + ContentPlaceholderView { Image(systemName: "server.rack") Text(.notConfigured) } actions: { @@ -179,8 +200,11 @@ struct MainView: View Text(.settings) } } - - Spacer() + } else if model.connectionError != nil { + ContentPlaceholderView { + Image(systemName: "exclamationmark.triangle.fill") + Text(.connectionError) + } } else { PlaylistView(model: model.playlistModel) .frame(maxWidth: 640.0) @@ -199,3 +223,26 @@ struct MainView: View } } + +struct ContentPlaceholderView: View + where Label: View, Actions: View +{ + let label: Label + let actions: Actions + + init(@ViewBuilder label: () -> Label, @ViewBuilder actions: () -> Actions = { EmptyView() }) { + self.label = label() + self.actions = actions() + } + + var body: some View { + Spacer() + + ContentUnavailableView { + label + .imageScale(.large) + } actions: { actions } + + Spacer() + } +} diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index 6719077..ff6423f 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -31,6 +31,16 @@ } } }, + "CONNECTION_ERROR" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connection Error" + } + } + } + }, "DONE" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index ce9c4f4..a239696 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -21,4 +21,5 @@ extension LocalizedStringKey static let configuration = LocalizedStringKey("CONFIGURATION") static let validating = LocalizedStringKey("VALIDATING") static let general = LocalizedStringKey("GENERAL") + static let connectionError = LocalizedStringKey("CONNECTION_ERROR") } From 3775f2dc7c439736dbc9cd2bd382a3e728feead5 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 30 May 2025 17:06:52 -0700 Subject: [PATCH 05/31] Better connection handling, favorites support --- QueueCube/API.swift | 13 +++++ QueueCube/ContentView.swift | 59 ++++++++++++++++---- QueueCube/Localizable/Localizable.xcstrings | 20 +++++++ QueueCube/Localizable/Strings.swift | 2 + QueueCube/PlaylistView.swift | 61 +++++++++++++++++++++ 5 files changed, 145 insertions(+), 10 deletions(-) diff --git a/QueueCube/API.swift b/QueueCube/API.swift index 449d95a..79cdcac 100644 --- a/QueueCube/API.swift +++ b/QueueCube/API.swift @@ -63,6 +63,12 @@ struct API .json() } + public func fetchFavorites() async throws -> [MediaItem] { + try await request() + .path("/favorites") + .json() + } + public func play() async throws { try await request() .path("/play") @@ -95,6 +101,13 @@ struct API .post() } + public func addFavorite(mediaURL: String) async throws { + try await request() + .path("/favorites") + .body([ "filename" : mediaURL ]) + .post() + } + public func delete(index: Int) async throws { try await request() .path("/playlist/\(index)") diff --git a/QueueCube/ContentView.swift b/QueueCube/ContentView.swift index f87686f..7cd7510 100644 --- a/QueueCube/ContentView.swift +++ b/QueueCube/ContentView.swift @@ -38,20 +38,32 @@ struct ContentView: View } let addMediaModel = model.addMediaViewModel - addMediaModel.onAdd = { mediaURL in + addMediaModel.onAdd = { [model] mediaURL in let strippedURL = mediaURL.trimmingCharacters(in: .whitespacesAndNewlines) if !strippedURL.isEmpty { addMediaModel.fieldContents = "" - Task { try await api.add(mediaURL: strippedURL) } + Task { + switch model.selectedTab { + case .playlist: + try await api.add(mediaURL: strippedURL) + case .favorites: + try await api.addFavorite(mediaURL: strippedURL) + } + } } } + + let favoritesModel = model.favoritesModel + favoritesModel.onPlay = { item in + Task { try await api.add(mediaURL: item.filename) } + } } } var body: some View { MainView(model: model) .task { await watchWebsocket() } - .task { await refresh([.nowPlaying, .playlist]) } + .task { await refresh([.nowPlaying, .playlist, .favorites]) } } // MARK: - Types @@ -62,6 +74,7 @@ struct ContentView: View static let nowPlaying = RefreshType(rawValue: 1 << 0) static let playlist = RefreshType(rawValue: 1 << 1) + static let favorites = RefreshType(rawValue: 1 << 2) } } @@ -99,6 +112,17 @@ extension ContentView } } + if what.contains(.favorites) { + let favorites = try await api.fetchFavorites() + model.favoritesModel.items = favorites.map { mediaItem in + FavoriteItem( + id: String(mediaItem.id), + title: mediaItem.title ?? mediaItem.filename ?? "", + filename: mediaItem.filename ?? "" + ) + } + } + model.connectionError = nil } catch { print("Error refreshing content: \(error)") @@ -133,19 +157,19 @@ extension ContentView case .playlistUpdate: await refresh(.playlist) + case .favoritesUpdate: + await refresh(.favorites) + case .metadataUpdate: fallthrough case .mpdUpdate: - await refresh([.playlist, .nowPlaying]) + await refresh([.playlist, .nowPlaying, .favorites]) case .receivedWebsocketPong: // This means we're online. if model.connectionError != nil { model.connectionError = nil - await refresh([.playlist, .nowPlaying]) + await refresh([.playlist, .nowPlaying, .favorites]) } - - default: - break } } } @@ -156,12 +180,19 @@ class MainViewModel var api = API.fromSettings() var connectionError: Error? = nil + var selectedTab: MainTab = .playlist var playlistModel = PlaylistViewModel() + var favoritesModel = FavoritesViewModel() var nowPlayingViewModel = NowPlayingViewModel() var addMediaViewModel = AddMediaBarViewModel() } +enum MainTab: String, CaseIterable { + case playlist + case favorites +} + struct MainView: View { @State var model: MainViewModel @@ -206,8 +237,16 @@ struct MainView: View Text(.connectionError) } } else { - PlaylistView(model: model.playlistModel) - .frame(maxWidth: 640.0) + TabView(selection: $model.selectedTab) { + Tab(.playlist, systemImage: "list.bullet", value: .playlist) { + PlaylistView(model: model.playlistModel) + } + + Tab(.favorites, systemImage: "heart.fill", value: .favorites) { + FavoritesView(model: model.favoritesModel) + } + } + .frame(maxWidth: 640.0) } } .frame(minHeight: 0.0) diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index ff6423f..fb1bc16 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -51,6 +51,16 @@ } } }, + "FAVORITES" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorites" + } + } + } + }, "General" : { }, @@ -75,6 +85,16 @@ } } }, + "PLAYLIST" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Playlist" + } + } + } + }, "SERVER_IS_ONLINE" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index a239696..1ccacae 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -22,4 +22,6 @@ extension LocalizedStringKey static let validating = LocalizedStringKey("VALIDATING") static let general = LocalizedStringKey("GENERAL") static let connectionError = LocalizedStringKey("CONNECTION_ERROR") + static let playlist = LocalizedStringKey("PLAYLIST") + static let favorites = LocalizedStringKey("FAVORITES") } diff --git a/QueueCube/PlaylistView.swift b/QueueCube/PlaylistView.swift index cc5ec35..51f757e 100644 --- a/QueueCube/PlaylistView.swift +++ b/QueueCube/PlaylistView.swift @@ -16,6 +16,13 @@ struct PlaylistItem: Identifiable let isCurrent: Bool } +struct FavoriteItem: Identifiable +{ + let id: String + let title: String + let filename: String +} + @Observable class PlaylistViewModel { @@ -26,6 +33,14 @@ class PlaylistViewModel var onDelete: (PlaylistItem) -> Void = { _ in } } +@Observable +class FavoritesViewModel +{ + var items: [FavoriteItem] = [] + + var onPlay: (FavoriteItem) -> Void = { _ in } +} + struct PlaylistView: View { var model: PlaylistViewModel @@ -44,6 +59,21 @@ struct PlaylistView: View } } +struct FavoritesView: View +{ + var model: FavoritesViewModel + + var body: some View { + List(model.items) { item in + FavoriteItemCell( + title: item.title, + subtitle: item.filename, + onPlayButtonClick: { model.onPlay(item) } + ) + } + } +} + struct PlaylistItemCell: View { let title: String @@ -97,3 +127,34 @@ struct PlaylistItemCell: View case paused } } + +struct FavoriteItemCell: View +{ + let title: String + let subtitle: String + let onPlayButtonClick: () -> Void + + var body: some View { + HStack { + Button(action: onPlayButtonClick) { + Image(systemName: "play.fill") + } + .buttonStyle(BorderlessButtonStyle()) + .tint(Color.primary) + .frame(width: 15.0) + + VStack(alignment: .leading) { + Text(title) + .font(.body.bold()) + .lineLimit(1) + + Text(subtitle) + .foregroundColor(.secondary) + .lineLimit(1) + } + + Spacer() + } + .padding([.top, .bottom], 8.0) + } +} From 6c183aea032c2be22721a0d7cd33638ff696aa25 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 30 May 2025 17:17:18 -0700 Subject: [PATCH 06/31] adds CLAUDE.md --- CLAUDE.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..6779ac7 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,64 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +QueueCube is a SwiftUI-based jukebox client application for iOS and macOS (via Mac Catalyst). It provides a frontend for controlling a server-based jukebox system that supports playlist management, favorites, and playback controls. + +## Architecture + +### Core Components + +- **API.swift**: Central networking layer that handles all communication with the jukebox server. Includes REST API methods for playback control, playlist management, and WebSocket events for real-time updates. +- **ContentView.swift**: Main view controller containing the `MainViewModel` that coordinates between UI components and API calls. Handles WebSocket event processing and data flow. +- **Settings Management**: Server configuration stored in UserDefaults with validation through `SettingsViewModel` that tests connectivity on URL changes. + +### Data Flow + +1. **Settings**: Server URL stored in UserDefaults, validated asynchronously via API calls +2. **Real-time Updates**: WebSocket connection provides live updates for playlist changes, playback state, and volume +3. **API Integration**: All server communication goes through the `API` struct using a fluent `RequestBuilder` pattern +4. **State Management**: Uses SwiftUI's `@Observable` pattern for reactive UI updates + +### Key Features + +- **Real-time sync**: WebSocket events automatically refresh UI when server state changes +- **Cross-platform**: Supports iOS, iPadOS, and macOS via Mac Catalyst +- **Settings validation**: Live server connectivity testing with visual feedback +- **Error handling**: Connection state management with user-friendly error displays + +## Development Commands + +### Building +```bash +# Build for iOS Simulator +xcodebuild -project QueueCube.xcodeproj -scheme QueueCube -destination 'platform=iOS Simulator,name=iPhone 15' build + +# Build for Mac Catalyst +xcodebuild -project QueueCube.xcodeproj -scheme QueueCube -destination 'platform=macOS,variant=Mac Catalyst' build +``` + +### Running +- Open `QueueCube.xcodeproj` in Xcode +- Select target device (iOS Simulator or Mac) +- Run with Cmd+R + +## API Endpoints Reference + +The server API includes these endpoints: +- `GET /nowplaying` - Current playback status +- `GET /playlist` - Current playlist items +- `GET /favorites` - User favorites +- `POST /play`, `/pause`, `/skip`, `/previous` - Playback controls +- `POST /playlist` - Add media URL to playlist +- `DELETE /playlist/{index}` - Remove playlist item +- `POST /volume` - Set volume level +- `WS /events` - WebSocket for real-time updates + +## UI Structure + +- **NowPlayingView**: Playback controls and current track display +- **PlaylistView**: Scrollable list of queued media with reorder/delete actions +- **AddMediaBarView**: Input field for adding new media URLs +- **SettingsView**: Server configuration with live validation \ No newline at end of file From 13b27a2a1ab66f54239d387376adcc50a2fb8752 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Tue, 10 Jun 2025 11:09:44 -0700 Subject: [PATCH 07/31] project reorg --- QueueCube.xcodeproj/project.pbxproj | 6 ++-- .../AccentColor.colorset/Contents.json | 0 .../AppIcon.appiconset/Contents.json | 0 .../{ => App}/Assets.xcassets/Contents.json | 0 QueueCube/{ => App}/Info.plist | 0 QueueCube/{ => App}/QueueCubeApp.swift | 0 QueueCube/{ => Backend}/API.swift | 0 QueueCube/Backend/Settings.swift | 35 +++++++++++++++++++ QueueCube/{ => Backend}/Utilities.swift | 27 -------------- QueueCube/{ => Views}/AddMediaBarView.swift | 0 QueueCube/{ => Views}/ContentView.swift | 0 QueueCube/{ => Views}/NowPlayingView.swift | 0 QueueCube/{ => Views}/PlaylistView.swift | 0 QueueCube/{ => Views}/SettingsView.swift | 0 14 files changed, 38 insertions(+), 30 deletions(-) rename QueueCube/{ => App}/Assets.xcassets/AccentColor.colorset/Contents.json (100%) rename QueueCube/{ => App}/Assets.xcassets/AppIcon.appiconset/Contents.json (100%) rename QueueCube/{ => App}/Assets.xcassets/Contents.json (100%) rename QueueCube/{ => App}/Info.plist (100%) rename QueueCube/{ => App}/QueueCubeApp.swift (100%) rename QueueCube/{ => Backend}/API.swift (100%) create mode 100644 QueueCube/Backend/Settings.swift rename QueueCube/{ => Backend}/Utilities.swift (79%) rename QueueCube/{ => Views}/AddMediaBarView.swift (100%) rename QueueCube/{ => Views}/ContentView.swift (100%) rename QueueCube/{ => Views}/NowPlayingView.swift (100%) rename QueueCube/{ => Views}/PlaylistView.swift (100%) rename QueueCube/{ => Views}/SettingsView.swift (100%) diff --git a/QueueCube.xcodeproj/project.pbxproj b/QueueCube.xcodeproj/project.pbxproj index bb48242..68ddcd4 100644 --- a/QueueCube.xcodeproj/project.pbxproj +++ b/QueueCube.xcodeproj/project.pbxproj @@ -14,7 +14,7 @@ CD8ACBBF2DC5B8F2008BF856 /* Exceptions for "QueueCube" folder in "QueueCube" target */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( - Info.plist, + App/Info.plist, ); target = CD4E9B962D7691C20066FC17 /* QueueCube */; }; @@ -271,7 +271,7 @@ DEVELOPMENT_TEAM = DQQH5H6GBD; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = QueueCube/Info.plist; + INFOPLIST_FILE = QueueCube/App/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -306,7 +306,7 @@ DEVELOPMENT_TEAM = DQQH5H6GBD; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = QueueCube/Info.plist; + INFOPLIST_FILE = QueueCube/App/Info.plist; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; diff --git a/QueueCube/Assets.xcassets/AccentColor.colorset/Contents.json b/QueueCube/App/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from QueueCube/Assets.xcassets/AccentColor.colorset/Contents.json rename to QueueCube/App/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/QueueCube/Assets.xcassets/AppIcon.appiconset/Contents.json b/QueueCube/App/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from QueueCube/Assets.xcassets/AppIcon.appiconset/Contents.json rename to QueueCube/App/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/QueueCube/Assets.xcassets/Contents.json b/QueueCube/App/Assets.xcassets/Contents.json similarity index 100% rename from QueueCube/Assets.xcassets/Contents.json rename to QueueCube/App/Assets.xcassets/Contents.json diff --git a/QueueCube/Info.plist b/QueueCube/App/Info.plist similarity index 100% rename from QueueCube/Info.plist rename to QueueCube/App/Info.plist diff --git a/QueueCube/QueueCubeApp.swift b/QueueCube/App/QueueCubeApp.swift similarity index 100% rename from QueueCube/QueueCubeApp.swift rename to QueueCube/App/QueueCubeApp.swift diff --git a/QueueCube/API.swift b/QueueCube/Backend/API.swift similarity index 100% rename from QueueCube/API.swift rename to QueueCube/Backend/API.swift diff --git a/QueueCube/Backend/Settings.swift b/QueueCube/Backend/Settings.swift new file mode 100644 index 0000000..ee4de0b --- /dev/null +++ b/QueueCube/Backend/Settings.swift @@ -0,0 +1,35 @@ +// +// Settings.swift +// QueueCube +// +// Created by James Magahern on 6/10/25. +// + +import Foundation + +struct Settings +{ + var serverURL: String? + + static func fromDefaults() -> Settings { + let serverURL = UserDefaults.standard.string(forKey: Keys.serverURL.rawValue) + return Settings(serverURL: serverURL) + } + + func save() { + UserDefaults.standard.set(serverURL, forKey: Keys.serverURL.rawValue) + NotificationCenter.default.post(name: .settingsChanged, object: nil) + } + + // MARK: - Types + + enum Keys: String + { + case serverURL + } +} + +extension Notification.Name +{ + static let settingsChanged = Notification.Name("settingsChanged") +} diff --git a/QueueCube/Utilities.swift b/QueueCube/Backend/Utilities.swift similarity index 79% rename from QueueCube/Utilities.swift rename to QueueCube/Backend/Utilities.swift index 154e7f9..d7a7ca2 100644 --- a/QueueCube/Utilities.swift +++ b/QueueCube/Backend/Utilities.swift @@ -7,33 +7,6 @@ import Foundation -struct Settings -{ - var serverURL: String? - - static func fromDefaults() -> Settings { - let serverURL = UserDefaults.standard.string(forKey: Keys.serverURL.rawValue) - return Settings(serverURL: serverURL) - } - - func save() { - UserDefaults.standard.set(serverURL, forKey: Keys.serverURL.rawValue) - NotificationCenter.default.post(name: .settingsChanged, object: nil) - } - - // MARK: - Types - - enum Keys: String - { - case serverURL - } -} - -extension Notification.Name -{ - static let settingsChanged = Notification.Name("settingsChanged") -} - extension Optional { func try_unwrap() throws -> Wrapped { diff --git a/QueueCube/AddMediaBarView.swift b/QueueCube/Views/AddMediaBarView.swift similarity index 100% rename from QueueCube/AddMediaBarView.swift rename to QueueCube/Views/AddMediaBarView.swift diff --git a/QueueCube/ContentView.swift b/QueueCube/Views/ContentView.swift similarity index 100% rename from QueueCube/ContentView.swift rename to QueueCube/Views/ContentView.swift diff --git a/QueueCube/NowPlayingView.swift b/QueueCube/Views/NowPlayingView.swift similarity index 100% rename from QueueCube/NowPlayingView.swift rename to QueueCube/Views/NowPlayingView.swift diff --git a/QueueCube/PlaylistView.swift b/QueueCube/Views/PlaylistView.swift similarity index 100% rename from QueueCube/PlaylistView.swift rename to QueueCube/Views/PlaylistView.swift diff --git a/QueueCube/SettingsView.swift b/QueueCube/Views/SettingsView.swift similarity index 100% rename from QueueCube/SettingsView.swift rename to QueueCube/Views/SettingsView.swift From c775fa0def06b9a9d78b74499e6f9aef60458f4b Mon Sep 17 00:00:00 2001 From: James Magahern Date: Tue, 10 Jun 2025 14:16:47 -0700 Subject: [PATCH 08/31] Implements UI for adding servers in settings, moves to tab model on Phone --- QueueCube.xcodeproj/project.pbxproj | 2 + QueueCube/App/Entitlements.plist | 8 + QueueCube/Backend/Server.swift | 55 +++ QueueCube/Backend/Settings.swift | 6 + QueueCube/Localizable/Localizable.xcstrings | 64 ++- QueueCube/Localizable/Strings.swift | 6 + QueueCube/Views/ContentView.swift | 78 ++-- QueueCube/Views/SettingsView.swift | 439 +++++++++++++++----- 8 files changed, 514 insertions(+), 144 deletions(-) create mode 100644 QueueCube/App/Entitlements.plist create mode 100644 QueueCube/Backend/Server.swift diff --git a/QueueCube.xcodeproj/project.pbxproj b/QueueCube.xcodeproj/project.pbxproj index 68ddcd4..264f5d6 100644 --- a/QueueCube.xcodeproj/project.pbxproj +++ b/QueueCube.xcodeproj/project.pbxproj @@ -264,6 +264,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = QueueCube/App/Entitlements.plist; CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; @@ -299,6 +300,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = QueueCube/App/Entitlements.plist; CODE_SIGN_IDENTITY = "-"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; diff --git a/QueueCube/App/Entitlements.plist b/QueueCube/App/Entitlements.plist new file mode 100644 index 0000000..ec706aa --- /dev/null +++ b/QueueCube/App/Entitlements.plist @@ -0,0 +1,8 @@ + + + + + com.apple.developer.networking.multicast + + + diff --git a/QueueCube/Backend/Server.swift b/QueueCube/Backend/Server.swift new file mode 100644 index 0000000..74bb288 --- /dev/null +++ b/QueueCube/Backend/Server.swift @@ -0,0 +1,55 @@ +// +// Server.swift +// QueueCube +// +// Created by James Magahern on 6/10/25. +// + +import Foundation + +struct Server: Identifiable +{ + let serviceName: String? + let baseURL: URL + + var id: String { baseURL.absoluteString } + + var displayName: String { + if let serviceName { + return serviceName.queueCubeServiceName + } + + let components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false)! + return components.host ?? baseURL.absoluteString + } + + init?(serviceName: String?, host: String, port: UInt16) { + self.serviceName = serviceName + + // Assumes this is the local service discovery path, which is http + // Bounjour gives us the interface sometimes, which we can handle, but need to percent encode. + let host = host.replacingOccurrences(of: "%", with: "%25") + guard let url = URL(string: "http://\(host):\(port)/api") else { + return nil + } + + self.baseURL = url + } + + init(baseURL: URL) { + self.serviceName = nil + self.baseURL = baseURL + } +} + +extension String +{ + var queueCubeServiceName: String { + let regex = /.* \((.*)\)/ + if let match = try? regex.firstMatch(in: self) { + return String(match.output.1) + } + + return self + } +} diff --git a/QueueCube/Backend/Settings.swift b/QueueCube/Backend/Settings.swift index ee4de0b..f46c620 100644 --- a/QueueCube/Backend/Settings.swift +++ b/QueueCube/Backend/Settings.swift @@ -27,6 +27,12 @@ struct Settings { case serverURL } + + struct Server: Codable + { + let address: String + let port: UInt32 + } } extension Notification.Name diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index fb1bc16..1df70cd 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -1,6 +1,9 @@ { "sourceLanguage" : "en", "strings" : { + "%@" : { + + }, "ADD" : { "localizations" : { "en" : { @@ -21,6 +24,26 @@ } } }, + "ADD_SERVER" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add Server" + } + } + } + }, + "CANCEL" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancel" + } + } + } + }, "CONFIGURATION" : { "localizations" : { "en" : { @@ -41,6 +64,16 @@ } } }, + "DISCOVERED" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Discovered" + } + } + } + }, "DONE" : { "localizations" : { "en" : { @@ -51,6 +84,16 @@ } } }, + "ENTER_MANUALLY" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enter Manually" + } + } + } + }, "FAVORITES" : { "localizations" : { "en" : { @@ -61,8 +104,15 @@ } } }, - "General" : { - + "FINDING_SERVERS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Finding Servers…" + } + } + } }, "GENERAL" : { "extractionState" : "manual", @@ -116,6 +166,16 @@ } } }, + "SERVERS" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Servers" + } + } + } + }, "SETTINGS" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index 1ccacae..ba419a9 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -24,4 +24,10 @@ extension LocalizedStringKey static let connectionError = LocalizedStringKey("CONNECTION_ERROR") static let playlist = LocalizedStringKey("PLAYLIST") static let favorites = LocalizedStringKey("FAVORITES") + static let servers = LocalizedStringKey("SERVERS") + static let addServer = LocalizedStringKey("ADD_SERVER") + static let cancel = LocalizedStringKey("CANCEL") + static let manual = LocalizedStringKey("ENTER_MANUALLY") + static let discovered = LocalizedStringKey("DISCOVERED") + static let findingServers = LocalizedStringKey("FINDING_SERVERS") } diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 7cd7510..326f2f0 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -48,6 +48,8 @@ struct ContentView: View try await api.add(mediaURL: strippedURL) case .favorites: try await api.addFavorite(mediaURL: strippedURL) + case .settings: + break } } } @@ -191,6 +193,7 @@ class MainViewModel enum MainTab: String, CaseIterable { case playlist case favorites + case settings } struct MainView: View @@ -214,44 +217,45 @@ struct MainView: View var body: some View { let showConfigurationDialog = model.api == nil - VStack { - VStack { - NowPlayingView(model: model.nowPlayingViewModel) - .padding() - .disabled(showConfigurationDialog || model.connectionError != nil) - - if showConfigurationDialog { - ContentPlaceholderView { - Image(systemName: "server.rack") - Text(.notConfigured) - } actions: { - Button { - isSettingsVisible = true - } label: { - Text(.settings) - } - } - } else if model.connectionError != nil { - ContentPlaceholderView { - Image(systemName: "exclamationmark.triangle.fill") - Text(.connectionError) - } - } else { - TabView(selection: $model.selectedTab) { - Tab(.playlist, systemImage: "list.bullet", value: .playlist) { - PlaylistView(model: model.playlistModel) - } - - Tab(.favorites, systemImage: "heart.fill", value: .favorites) { - FavoritesView(model: model.favoritesModel) - } - } - .frame(maxWidth: 640.0) - } + TabView(selection: $model.selectedTab) { + Tab(.playlist, systemImage: "list.bullet", value: .playlist) { + PlaylistView(model: model.playlistModel) } - .frame(minHeight: 0.0) - .layoutPriority(1.0) + Tab(.favorites, systemImage: "heart.fill", value: .favorites) { + FavoritesView(model: model.favoritesModel) + } + + Tab(.settings, systemImage: "gear", value: .settings) { + SettingsView(onDone: {}) + } + } + + + #if false + VStack { + if showConfigurationDialog { + ContentPlaceholderView { + Image(systemName: "server.rack") + Text(.notConfigured) + } actions: { + Button { + isSettingsVisible = true + } label: { + Text(.settings) + } + } + } else if model.connectionError != nil { + ContentPlaceholderView { + Image(systemName: "exclamationmark.triangle.fill") + Text(.connectionError) + } + } else { + TabView(selection: $model.selectedTab) { + } + .frame(maxWidth: 640.0) + } + AddMediaBarView(model: model.addMediaViewModel) .layoutPriority(2.0) .disabled(showConfigurationDialog) @@ -260,6 +264,8 @@ struct MainView: View SettingsView(onDone: { isSettingsVisible = false }) } + #endif + } } diff --git a/QueueCube/Views/SettingsView.swift b/QueueCube/Views/SettingsView.swift index 6ea6fbb..afc1600 100644 --- a/QueueCube/Views/SettingsView.swift +++ b/QueueCube/Views/SettingsView.swift @@ -5,133 +5,360 @@ // Created by James Magahern on 5/2/25. // +import Combine +import Network import SwiftUI -@Observable -class SettingsViewModel -{ - var serverURL: String = "" - var validationState: ValidationState = .empty - - private var validationTimer: Timer? = nil - - init() { - validateSettings() - observeForValidation() - } - - static func fromDefaults() -> SettingsViewModel { - let settings = Settings.fromDefaults() - let model = SettingsViewModel() - model.serverURL = settings.serverURL ?? "" - - return model - } - - private func observeForValidation() { - withObservationTracking { - _ = serverURL - } onChange: { - Task { @MainActor [weak self] in - guard let self else { return } - setNeedsValidation() - saveSettings() - - observeForValidation() - } - } - } - - private func setNeedsValidation() { - self.validationTimer?.invalidate() - self.validationTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in - self?.validateSettings() - } - } - - private func validateSettings() { - guard !serverURL.isEmpty else { - validationState = .empty - return - } - - self.validationState = .validating - - Task { - do { - let url = try URL(string: serverURL).try_unwrap() - let api = API(baseURL: url) - _ = try await api.fetchNowPlayingInfo() - - self.validationState = .valid - } catch { - print("Validation failed: \(error)") - self.validationState = .notValid - } - } - } - - private func saveSettings() { - Settings(serverURL: self.serverURL) - .save() - } - - // MARK: - Types - - enum ValidationState - { - case empty - case validating - case notValid - case valid - } -} - struct SettingsView: View { let onDone: () -> Void - @State var model = SettingsViewModel.fromDefaults() var body: some View { - TabView { - Tab("General", systemImage: "gear") { - generalTab() + NavigationStack { + List { + NavigationLink(destination: GeneralSettingsView()) { + Image(systemName: "gear") + Text(.general) + } + + NavigationLink(destination: ServerListSettingsView()) { + Image(systemName: "server.rack") + Text(.servers) + } + } + .navigationBarTitleDisplayMode(.inline) + .navigationTitle(.settings) + } + } +} + +struct GeneralSettingsView: View +{ + var body: some View { + EmptyView() + } +} + +struct ServerListSettingsView: View +{ + @State var model = ViewModel() + + var body: some View { + Form { + List(model.configuredServers) { server in + serverListItem(server) + } + } + + .navigationTitle(.servers) + + .toolbar { + Button { + model.isAddServerPresented = true + } label: { + Image(systemName: "plus") + } + + } + + .sheet(isPresented: $model.isAddServerPresented) { + NavigationView { + AddServerView(onAddServer: { model.onAddServer(server: $0) }) + .navigationTitle(.addServer) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItemGroup(placement: .cancellationAction) { + Button(.cancel) { model.isAddServerPresented = false } + } + } + } } } @ViewBuilder - func generalTab() -> some View { + func serverListItem(_ server: Server) -> some View { + HStack { + Image(systemName: "hifispeaker.fill") + + VStack(alignment: .leading) { + Text(server.displayName) + .lineLimit(1) + .bold() + + Text(server.baseURL.absoluteString) + .foregroundStyle(.secondary) + .font(.caption) + } + + Spacer() + } + } + + // MARK: - Types + + @Observable + class ViewModel + { + var configuredServers: [Server] + var isAddServerPresented = false + + init() { + self.configuredServers = [] + } + + func onAddServer(server: Server) { + isAddServerPresented = false + configuredServers.append(server) + } + } +} + +struct AddServerView: View +{ + let onAddServer: (Server) -> Void + @State var model = ViewModel() + + var body: some View { Form { - Section(.configuration) { + // Manual Entry + Section(.manual) { TextField(.serverURL, text: $model.serverURL) .autocapitalization(.none) .autocorrectionDisabled() .keyboardType(.URL) + + switch model.validationState { + case .empty: + EmptyView() + case .validating: + HStack { + ProgressView() + .progressViewStyle(.circular) + Text(.validating) + } + case .notValid: + HStack { + Image(systemName: "x.circle.fill") + Text(.unableToConnect) + } + .foregroundStyle(.red) + case .valid: + HStack { + Image(systemName: "checkmark.circle.fill") + Text(.serverIsOnline) + } + .foregroundStyle(.green) + + Button { + // Force unwrap, since we validated it at this point. + let server = Server(baseURL: URL(string: model.serverURL)!) + onAddServer(server) + } label: { + HStack { + Spacer() + Text(.addServer) + Spacer() + } + } + } } - switch model.validationState { - case .empty: - EmptyView() - case .validating: - HStack { - ProgressView() - .progressViewStyle(.circular) - Text(.validating) + // Discovered + Section(.discovered) { + if model.discoveredServers.isEmpty { + HStack { + ProgressView() + .progressViewStyle(.circular) + Text(.findingServers) + } + } else { + List(model.discoveredServers) { (server: DiscoveredEndpoint) in + Button { + resolveEndpoint(server) + } label: { + HStack { + Image(systemName: "network") + Text("\(server.displayName)") + .bold() + } + } + .tint(.primary) + } } - case .notValid: - HStack { - Image(systemName: "x.circle.fill") - Text(.unableToConnect) - } - .foregroundStyle(.red) - case .valid: - HStack { - Image(systemName: "checkmark.circle.fill") - Text(.serverIsOnline) - } - .foregroundStyle(.green) } } + + .task { + model.startDiscovery() + } + } + + private func resolveEndpoint(_ endpoint: DiscoveredEndpoint) { + Task { + let server = try await endpoint.resolve() + onAddServer(server) + } + } + + // MARK: - Types + + @Observable + class ViewModel + { + var serverURL: String = "" + var validationState: ValidationState = .empty + + var discoveredServers: [DiscoveredEndpoint] = [] + private let browser = NWBrowser(for: .bonjour(type: "_queuecube._tcp.", domain: nil), using: .tcp) + + private var validationTimer: Timer? = nil + + init() { + observeForValidation() + } + + public func startDiscovery() { + browser.browseResultsChangedHandler = { [weak self] results, changes in + guard let self else { return } + self.discoveredServers = results.map { DiscoveredEndpoint(result: $0) } + } + + browser.stateUpdateHandler = { state in + if case .failed(let error) = state { + print("Discovery error: \(error)") + } + } + + browser.start(queue: .global(qos: .userInitiated)) + } + + private func observeForValidation() { + withObservationTracking { + _ = serverURL + } onChange: { + Task { @MainActor [weak self] in + guard let self else { return } + setNeedsValidation() + saveSettings() + + observeForValidation() + } + } + } + + private func setNeedsValidation() { + self.validationTimer?.invalidate() + self.validationTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in + self?.validateSettings() + } + } + + private func validateSettings() { + guard !serverURL.isEmpty else { + validationState = .empty + return + } + + self.validationState = .validating + + Task { + do { + let url = try URL(string: serverURL).try_unwrap() + let api = API(baseURL: url) + _ = try await api.fetchNowPlayingInfo() + + self.validationState = .valid + } catch { + print("Validation failed: \(error)") + self.validationState = .notValid + } + } + } + + private func saveSettings() { + Settings(serverURL: self.serverURL) + .save() + } + + // MARK: - Types + + enum ValidationState + { + case empty + case validating + case notValid + case valid + } + } +} + +struct DiscoveredEndpoint: Identifiable +{ + let endpoint: NWEndpoint + let serviceName: String + + var displayName: String { + serviceName.queueCubeServiceName + } + + var id: String { serviceName } + + init(result: NWBrowser.Result) { + self.endpoint = result.endpoint + + switch result.endpoint { + case .service(name: let name, type: _, domain: _, interface: _): + self.serviceName = name + default: + self.serviceName = "(Unknown)" + break + } + } + + func resolve() async throws -> Server { + return try await withCheckedThrowingContinuation { continuation in + let connection = NWConnection(to: endpoint, using: .tcp) + connection.stateUpdateHandler = { state in + switch state { + case .preparing: break + case .ready: + // xxx: is this really the right way to do this? Maybe we should not try to turn this into a URL. + if case .hostPort(host: let host, port: let port) = connection.currentPath?.remoteEndpoint { + let address = switch host { + case .name(let string, _): string + case .ipv4(let iPv4Address): iPv4Address.debugDescription + case .ipv6(let iPv6Address): iPv6Address.debugDescription + default: "unknown" + } + + if let server = Server(serviceName: serviceName, host: address, port: port.rawValue) { + continuation.resume(returning: server) + } else { + continuation.resume(throwing: Self.Error.urlError) + } + } else { + continuation.resume(throwing: Self.Error.endpointIncorrect) + } + case .cancelled: + continuation.resume(throwing: Self.Error.cancelledConnection) + case .failed(let error): + continuation.resume(throwing: error) + default: + break + } + } + + connection.start(queue: .global(qos: .userInitiated)) + } + } + + // MARK: - Types + + enum Error: Swift.Error + { + case cancelledConnection + case endpointIncorrect + case urlError } } From f4f3ef543fe958c0f3c003bb1a2a8a3cf2149e06 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Tue, 10 Jun 2025 18:45:34 -0700 Subject: [PATCH 09/31] Started working on multiple server configuration --- QueueCube/Backend/API.swift | 9 -- QueueCube/Backend/Server.swift | 4 +- QueueCube/Backend/Settings.swift | 24 +++- QueueCube/Localizable/Localizable.xcstrings | 10 ++ QueueCube/Localizable/Strings.swift | 43 +++--- QueueCube/Views/ContentPlaceholderView.swift | 57 ++++++++ QueueCube/Views/ContentView.swift | 122 +----------------- QueueCube/Views/MainView.swift | 109 ++++++++++++++++ .../AddServerView.swift} | 119 +---------------- .../Settings View/GeneralSettingsView.swift | 16 +++ .../ServerListSettingsView.swift | 94 ++++++++++++++ .../Views/Settings View/SettingsView.swift | 61 +++++++++ 12 files changed, 397 insertions(+), 271 deletions(-) create mode 100644 QueueCube/Views/ContentPlaceholderView.swift create mode 100644 QueueCube/Views/MainView.swift rename QueueCube/Views/{SettingsView.swift => Settings View/AddServerView.swift} (73%) create mode 100644 QueueCube/Views/Settings View/GeneralSettingsView.swift create mode 100644 QueueCube/Views/Settings View/ServerListSettingsView.swift create mode 100644 QueueCube/Views/Settings View/SettingsView.swift diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index 79cdcac..fe370c3 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -38,15 +38,6 @@ struct API { let baseURL: URL - static func fromSettings() -> Self? { - let settings = Settings.fromDefaults() - - guard let baseURL = settings.serverURL.flatMap({ URL(string: $0) }) - else { return nil } - - return API(baseURL: baseURL) - } - init(baseURL: URL) { self.baseURL = baseURL } diff --git a/QueueCube/Backend/Server.swift b/QueueCube/Backend/Server.swift index 74bb288..acefade 100644 --- a/QueueCube/Backend/Server.swift +++ b/QueueCube/Backend/Server.swift @@ -7,13 +7,15 @@ import Foundation -struct Server: Identifiable +struct Server: Identifiable, Codable { let serviceName: String? let baseURL: URL var id: String { baseURL.absoluteString } + var api: API { API(baseURL: baseURL) } + var displayName: String { if let serviceName { return serviceName.queueCubeServiceName diff --git a/QueueCube/Backend/Settings.swift b/QueueCube/Backend/Settings.swift index f46c620..2d3a767 100644 --- a/QueueCube/Backend/Settings.swift +++ b/QueueCube/Backend/Settings.swift @@ -9,15 +9,29 @@ import Foundation struct Settings { - var serverURL: String? + var configuredServers: [Server] + + var isConfigured: Bool { + !configuredServers.isEmpty + } static func fromDefaults() -> Settings { - let serverURL = UserDefaults.standard.string(forKey: Keys.serverURL.rawValue) - return Settings(serverURL: serverURL) + let configuredServers: [Server] = { + guard let configuredServersData = UserDefaults.standard.data(forKey: Keys.configuredServers.rawValue) + else { return [] } + + guard let configuredServers = try? PropertyListDecoder().decode([Server].self, from: configuredServersData) + else { return [] } + + return configuredServers + }() + + return Settings(configuredServers: configuredServers) } func save() { - UserDefaults.standard.set(serverURL, forKey: Keys.serverURL.rawValue) + let configuredServersData = try! PropertyListEncoder().encode(configuredServers) + UserDefaults.standard.set(configuredServersData, forKey: Keys.configuredServers.rawValue) NotificationCenter.default.post(name: .settingsChanged, object: nil) } @@ -25,7 +39,7 @@ struct Settings enum Keys: String { - case serverURL + case configuredServers } struct Server: Codable diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index 1df70cd..5a26ac5 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -125,6 +125,16 @@ } } }, + "NO_SERVERS_CONFIGURED" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Servers Configured" + } + } + } + }, "NOT_CONFIGURED" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index ba419a9..6bdb9a5 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -9,25 +9,26 @@ import SwiftUI extension LocalizedStringKey { - static let serverURL = LocalizedStringKey("SERVER_URL") - static let settings = LocalizedStringKey("SETTINGS") - static let settings_ = LocalizedStringKey("SETTINGS_ELLIPSES") - static let done = LocalizedStringKey("DONE") - static let notConfigured = LocalizedStringKey("NOT_CONFIGURED") - static let add = LocalizedStringKey("ADD") - static let addAnyURL = LocalizedStringKey("ADD_ANY_URL") - static let serverIsOnline = LocalizedStringKey("SERVER_IS_ONLINE") - static let unableToConnect = LocalizedStringKey("UNABLE_TO_CONNECT") - static let configuration = LocalizedStringKey("CONFIGURATION") - static let validating = LocalizedStringKey("VALIDATING") - static let general = LocalizedStringKey("GENERAL") - static let connectionError = LocalizedStringKey("CONNECTION_ERROR") - static let playlist = LocalizedStringKey("PLAYLIST") - static let favorites = LocalizedStringKey("FAVORITES") - static let servers = LocalizedStringKey("SERVERS") - static let addServer = LocalizedStringKey("ADD_SERVER") - static let cancel = LocalizedStringKey("CANCEL") - static let manual = LocalizedStringKey("ENTER_MANUALLY") - static let discovered = LocalizedStringKey("DISCOVERED") - static let findingServers = LocalizedStringKey("FINDING_SERVERS") + static let serverURL = LocalizedStringKey("SERVER_URL") + static let settings = LocalizedStringKey("SETTINGS") + static let settings_ = LocalizedStringKey("SETTINGS_ELLIPSES") + static let done = LocalizedStringKey("DONE") + static let notConfigured = LocalizedStringKey("NOT_CONFIGURED") + static let add = LocalizedStringKey("ADD") + static let addAnyURL = LocalizedStringKey("ADD_ANY_URL") + static let serverIsOnline = LocalizedStringKey("SERVER_IS_ONLINE") + static let unableToConnect = LocalizedStringKey("UNABLE_TO_CONNECT") + static let configuration = LocalizedStringKey("CONFIGURATION") + static let validating = LocalizedStringKey("VALIDATING") + static let general = LocalizedStringKey("GENERAL") + static let connectionError = LocalizedStringKey("CONNECTION_ERROR") + static let playlist = LocalizedStringKey("PLAYLIST") + static let favorites = LocalizedStringKey("FAVORITES") + static let servers = LocalizedStringKey("SERVERS") + static let addServer = LocalizedStringKey("ADD_SERVER") + static let cancel = LocalizedStringKey("CANCEL") + static let manual = LocalizedStringKey("ENTER_MANUALLY") + static let discovered = LocalizedStringKey("DISCOVERED") + static let findingServers = LocalizedStringKey("FINDING_SERVERS") + static let noServersConfigured = LocalizedStringKey("NO_SERVERS_CONFIGURED") } diff --git a/QueueCube/Views/ContentPlaceholderView.swift b/QueueCube/Views/ContentPlaceholderView.swift new file mode 100644 index 0000000..de3da0c --- /dev/null +++ b/QueueCube/Views/ContentPlaceholderView.swift @@ -0,0 +1,57 @@ +// +// ContentPlaceholderView.swift +// QueueCube +// +// Created by James Magahern on 6/10/25. +// + +import SwiftUI + +struct ContentPlaceholderView: View + where Label: View, Actions: View +{ + let label: Label + let actions: Actions + + init(@ViewBuilder label: () -> Label, @ViewBuilder actions: () -> Actions = { EmptyView() }) { + self.label = label() + self.actions = actions() + } + + var body: some View { + Spacer() + + ContentUnavailableView { + label + .imageScale(.large) + .tint(.secondary) + } actions: { actions } + + Spacer() + } +} + +func contentPlaceholderView( + title: LocalizedStringKey, + systemImage: String, @ViewBuilder actions: () -> Actions = { EmptyView() }) +-> ContentPlaceholderView +{ + ContentPlaceholderView(label: { + AnyView(erasing: VStack(spacing: 16.0) { + Image(systemName: systemImage) + .resizable() + .scaledToFit() + + .frame(width: 50.0, height: 50.0) + .foregroundStyle(.secondary) + .imageScale(.large) + + + Text(title) + .bold() + + Spacer() + .frame(height: 14.0) + }) + }, actions: actions) +} diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 326f2f0..660d606 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -14,7 +14,7 @@ struct ContentView: View init() { self.model = MainViewModel() - if let api = model.api { + if let api = model.selectedServer?.api { let nowPlayingModel = self.model.nowPlayingViewModel nowPlayingModel.onPlayPause = { model in Task { model.isPlaying ? try await api.pause() : try await api.play() } @@ -83,7 +83,7 @@ struct ContentView: View extension ContentView { private func refresh(_ what: RefreshType) async { - guard let api = model.api else { return } + guard let api = model.selectedServer?.api else { return } do { if what.contains(.nowPlaying) { @@ -133,7 +133,7 @@ extension ContentView } private func watchWebsocket() async { - guard let api = model.api else { return } + guard let api = model.selectedServer?.api else { return } do { for await streamEvent in try await api.events() { @@ -175,119 +175,3 @@ extension ContentView } } } - -@Observable -class MainViewModel -{ - var api = API.fromSettings() - - var connectionError: Error? = nil - var selectedTab: MainTab = .playlist - - var playlistModel = PlaylistViewModel() - var favoritesModel = FavoritesViewModel() - var nowPlayingViewModel = NowPlayingViewModel() - var addMediaViewModel = AddMediaBarViewModel() -} - -enum MainTab: String, CaseIterable { - case playlist - case favorites - case settings -} - -struct MainView: View -{ - @State var model: MainViewModel - @State var isSettingsVisible: Bool = false - - init(model: MainViewModel) { - self.model = model - - Task { - let settingsChangedNotifications = NotificationCenter.default.notifications(named: .settingsChanged) - .map({ _ in Optional.none }) - - for await _ in settingsChangedNotifications { - model.api = API.fromSettings() - } - } - } - - var body: some View { - let showConfigurationDialog = model.api == nil - - TabView(selection: $model.selectedTab) { - Tab(.playlist, systemImage: "list.bullet", value: .playlist) { - PlaylistView(model: model.playlistModel) - } - - Tab(.favorites, systemImage: "heart.fill", value: .favorites) { - FavoritesView(model: model.favoritesModel) - } - - Tab(.settings, systemImage: "gear", value: .settings) { - SettingsView(onDone: {}) - } - } - - - #if false - VStack { - if showConfigurationDialog { - ContentPlaceholderView { - Image(systemName: "server.rack") - Text(.notConfigured) - } actions: { - Button { - isSettingsVisible = true - } label: { - Text(.settings) - } - } - } else if model.connectionError != nil { - ContentPlaceholderView { - Image(systemName: "exclamationmark.triangle.fill") - Text(.connectionError) - } - } else { - TabView(selection: $model.selectedTab) { - } - .frame(maxWidth: 640.0) - } - - AddMediaBarView(model: model.addMediaViewModel) - .layoutPriority(2.0) - .disabled(showConfigurationDialog) - } - .sheet(isPresented: $isSettingsVisible) { - SettingsView(onDone: { isSettingsVisible = false }) - } - - #endif - - } -} - -struct ContentPlaceholderView: View - where Label: View, Actions: View -{ - let label: Label - let actions: Actions - - init(@ViewBuilder label: () -> Label, @ViewBuilder actions: () -> Actions = { EmptyView() }) { - self.label = label() - self.actions = actions() - } - - var body: some View { - Spacer() - - ContentUnavailableView { - label - .imageScale(.large) - } actions: { actions } - - Spacer() - } -} diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift new file mode 100644 index 0000000..d8147e8 --- /dev/null +++ b/QueueCube/Views/MainView.swift @@ -0,0 +1,109 @@ +// +// MainView.swift +// QueueCube +// +// Created by James Magahern on 6/10/25. +// + +import SwiftUI + +@Observable +class MainViewModel +{ + var selectedServer: Server? = nil + + var connectionError: Error? = nil + var selectedTab: Tab = .playlist + + var playlistModel = PlaylistViewModel() + var favoritesModel = FavoritesViewModel() + var nowPlayingViewModel = NowPlayingViewModel() + var addMediaViewModel = AddMediaBarViewModel() + + enum Tab: String, CaseIterable + { + case playlist + case favorites + case settings + } +} + +struct MainView: View +{ + @State var model: MainViewModel + @State var isSettingsVisible: Bool = false + + init(model: MainViewModel) { + self.model = model + + // If no servers are configured, make Settings the default tab. + if !Settings.fromDefaults().isConfigured { + model.selectedTab = .settings + } + + Task { + let settingsChangedNotifications = NotificationCenter.default.notifications(named: .settingsChanged) + .map({ _ in Optional.none }) + + for await _ in settingsChangedNotifications { + // TODO + // model.api = API.fromSettings() + } + } + } + + var body: some View { + let showConfigurationDialog = model.selectedServer == nil + + TabView(selection: $model.selectedTab) { + Tab(.playlist, systemImage: "list.bullet", value: .playlist) { + PlaylistView(model: model.playlistModel) + } + + Tab(.favorites, systemImage: "heart.fill", value: .favorites) { + FavoritesView(model: model.favoritesModel) + } + + Tab(.settings, systemImage: "gear", value: .settings) { + SettingsView(onDone: {}) + } + } + + + #if false + VStack { + if showConfigurationDialog { + ContentPlaceholderView { + Image(systemName: "server.rack") + Text(.notConfigured) + } actions: { + Button { + isSettingsVisible = true + } label: { + Text(.settings) + } + } + } else if model.connectionError != nil { + ContentPlaceholderView { + Image(systemName: "exclamationmark.triangle.fill") + Text(.connectionError) + } + } else { + TabView(selection: $model.selectedTab) { + } + .frame(maxWidth: 640.0) + } + + AddMediaBarView(model: model.addMediaViewModel) + .layoutPriority(2.0) + .disabled(showConfigurationDialog) + } + .sheet(isPresented: $isSettingsVisible) { + SettingsView(onDone: { isSettingsVisible = false }) + } + + #endif + + } +} + diff --git a/QueueCube/Views/SettingsView.swift b/QueueCube/Views/Settings View/AddServerView.swift similarity index 73% rename from QueueCube/Views/SettingsView.swift rename to QueueCube/Views/Settings View/AddServerView.swift index afc1600..ecbc2f6 100644 --- a/QueueCube/Views/SettingsView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -1,119 +1,13 @@ // -// SettingsView.swift +// AddServerView.swift // QueueCube // -// Created by James Magahern on 5/2/25. +// Created by James Magahern on 6/10/25. // -import Combine import Network import SwiftUI -struct SettingsView: View -{ - let onDone: () -> Void - - var body: some View { - NavigationStack { - List { - NavigationLink(destination: GeneralSettingsView()) { - Image(systemName: "gear") - Text(.general) - } - - NavigationLink(destination: ServerListSettingsView()) { - Image(systemName: "server.rack") - Text(.servers) - } - } - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(.settings) - } - } -} - -struct GeneralSettingsView: View -{ - var body: some View { - EmptyView() - } -} - -struct ServerListSettingsView: View -{ - @State var model = ViewModel() - - var body: some View { - Form { - List(model.configuredServers) { server in - serverListItem(server) - } - } - - .navigationTitle(.servers) - - .toolbar { - Button { - model.isAddServerPresented = true - } label: { - Image(systemName: "plus") - } - - } - - .sheet(isPresented: $model.isAddServerPresented) { - NavigationView { - AddServerView(onAddServer: { model.onAddServer(server: $0) }) - .navigationTitle(.addServer) - .navigationBarTitleDisplayMode(.inline) - .toolbar { - ToolbarItemGroup(placement: .cancellationAction) { - Button(.cancel) { model.isAddServerPresented = false } - } - } - - } - } - } - - @ViewBuilder - func serverListItem(_ server: Server) -> some View { - HStack { - Image(systemName: "hifispeaker.fill") - - VStack(alignment: .leading) { - Text(server.displayName) - .lineLimit(1) - .bold() - - Text(server.baseURL.absoluteString) - .foregroundStyle(.secondary) - .font(.caption) - } - - Spacer() - } - } - - // MARK: - Types - - @Observable - class ViewModel - { - var configuredServers: [Server] - var isAddServerPresented = false - - init() { - self.configuredServers = [] - } - - func onAddServer(server: Server) { - isAddServerPresented = false - configuredServers.append(server) - } - } -} - struct AddServerView: View { let onAddServer: (Server) -> Void @@ -240,8 +134,6 @@ struct AddServerView: View Task { @MainActor [weak self] in guard let self else { return } setNeedsValidation() - saveSettings() - observeForValidation() } } @@ -275,12 +167,7 @@ struct AddServerView: View } } } - - private func saveSettings() { - Settings(serverURL: self.serverURL) - .save() - } - + // MARK: - Types enum ValidationState diff --git a/QueueCube/Views/Settings View/GeneralSettingsView.swift b/QueueCube/Views/Settings View/GeneralSettingsView.swift new file mode 100644 index 0000000..9851f44 --- /dev/null +++ b/QueueCube/Views/Settings View/GeneralSettingsView.swift @@ -0,0 +1,16 @@ +// +// GeneralSettingsView.swift +// QueueCube +// +// Created by James Magahern on 6/10/25. +// + +import SwiftUI + +struct GeneralSettingsView: View +{ + var body: some View { + EmptyView() + } +} + diff --git a/QueueCube/Views/Settings View/ServerListSettingsView.swift b/QueueCube/Views/Settings View/ServerListSettingsView.swift new file mode 100644 index 0000000..99c2da5 --- /dev/null +++ b/QueueCube/Views/Settings View/ServerListSettingsView.swift @@ -0,0 +1,94 @@ +// +// ServerListSettingsView.swift +// QueueCube +// +// Created by James Magahern on 6/10/25. +// + +import SwiftUI + +struct ServerListSettingsView: View +{ + @State var model = ViewModel() + + var body: some View { + VStack { + if model.configuredServers.isEmpty { + contentPlaceholderView(title: .noServersConfigured, systemImage: "server.rack") { + Button { + model.isAddServerPresented = true + } label: { + Text(.addServer) + } + } + } else { + Form { + List(model.configuredServers) { server in + serverListItem(server) + } + } + } + } + + .navigationTitle(.servers) + + .toolbar { + Button { + model.isAddServerPresented = true + } label: { + Image(systemName: "plus") + } + } + + .sheet(isPresented: $model.isAddServerPresented) { + NavigationView { + AddServerView(onAddServer: { model.onAddServer(server: $0) }) + .navigationTitle(.addServer) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItemGroup(placement: .cancellationAction) { + Button(.cancel) { model.isAddServerPresented = false } + } + } + + } + } + } + + @ViewBuilder + func serverListItem(_ server: Server) -> some View { + HStack { + Image(systemName: "hifispeaker.fill") + + VStack(alignment: .leading) { + Text(server.displayName) + .lineLimit(1) + .bold() + + Text(server.baseURL.absoluteString) + .foregroundStyle(.secondary) + .font(.caption) + } + + Spacer() + } + } + + // MARK: - Types + + @Observable + class ViewModel + { + var configuredServers: [Server] + var isAddServerPresented = false + + init() { + self.configuredServers = [] + } + + func onAddServer(server: Server) { + isAddServerPresented = false + configuredServers.append(server) + } + } +} diff --git a/QueueCube/Views/Settings View/SettingsView.swift b/QueueCube/Views/Settings View/SettingsView.swift new file mode 100644 index 0000000..d6e173f --- /dev/null +++ b/QueueCube/Views/Settings View/SettingsView.swift @@ -0,0 +1,61 @@ +// +// SettingsView.swift +// QueueCube +// +// Created by James Magahern on 5/2/25. +// + +import SwiftUI + +struct SettingsView: View +{ + let onDone: () -> Void + @State private var navigationPath: [SettingsPage] + + init(onDone: @escaping () -> Void) { + self.onDone = onDone + self.navigationPath = if !Settings.fromDefaults().isConfigured { + // Show server settings if not configured. + [ .servers ] + } else { + [] + } + } + + var body: some View { + NavigationStack(path: $navigationPath) { + List { + NavigationLink(value: SettingsPage.general) { + Image(systemName: "gear") + Text(.general) + } + + NavigationLink(value: SettingsPage.servers) { + Image(systemName: "server.rack") + Text(.servers) + } + } + .navigationDestination(for: SettingsPage.self, destination: { page in + Group { + switch page { + case .general: GeneralSettingsView() + case .servers: ServerListSettingsView() + } + } + .navigationBarTitleDisplayMode(.inline) + }) + .navigationBarTitleDisplayMode(.inline) + .navigationTitle(.settings) + } + } + + // MARK: - Types + + enum SettingsPage: String, Identifiable + { + var id: String { rawValue } + + case general + case servers + } +} From 0cdbecc0315b17cbd8eff013346a262bd1518baa Mon Sep 17 00:00:00 2001 From: James Magahern Date: Tue, 10 Jun 2025 22:40:51 -0700 Subject: [PATCH 10/31] finish implementing server configuration --- QueueCube/Backend/Settings.swift | 12 +++---- .../Views/Settings View/AddServerView.swift | 6 +++- .../ServerListSettingsView.swift | 34 ++++++++++++++++--- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/QueueCube/Backend/Settings.swift b/QueueCube/Backend/Settings.swift index 2d3a767..a011233 100644 --- a/QueueCube/Backend/Settings.swift +++ b/QueueCube/Backend/Settings.swift @@ -11,6 +11,12 @@ struct Settings { var configuredServers: [Server] + func configuredServers(_ servers: [Server]) -> Self { + var copy = self + copy.configuredServers = servers + return copy + } + var isConfigured: Bool { !configuredServers.isEmpty } @@ -41,12 +47,6 @@ struct Settings { case configuredServers } - - struct Server: Codable - { - let address: String - let port: UInt32 - } } extension Notification.Name diff --git a/QueueCube/Views/Settings View/AddServerView.swift b/QueueCube/Views/Settings View/AddServerView.swift index ecbc2f6..7ff5eb5 100644 --- a/QueueCube/Views/Settings View/AddServerView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -227,10 +227,14 @@ struct DiscoveredEndpoint: Identifiable } else { continuation.resume(throwing: Self.Error.endpointIncorrect) } + + connection.cancel() case .cancelled: - continuation.resume(throwing: Self.Error.cancelledConnection) + // expected + break case .failed(let error): continuation.resume(throwing: error) + connection.cancel() default: break } diff --git a/QueueCube/Views/Settings View/ServerListSettingsView.swift b/QueueCube/Views/Settings View/ServerListSettingsView.swift index 99c2da5..867679c 100644 --- a/QueueCube/Views/Settings View/ServerListSettingsView.swift +++ b/QueueCube/Views/Settings View/ServerListSettingsView.swift @@ -23,8 +23,9 @@ struct ServerListSettingsView: View } } else { Form { - List(model.configuredServers) { server in - serverListItem(server) + List($model.configuredServers, editActions: [.delete]) { server in + serverListItem(server.wrappedValue) + .tag(server.id) } } } @@ -81,14 +82,39 @@ struct ServerListSettingsView: View { var configuredServers: [Server] var isAddServerPresented = false + var selectedItems: [Server.ID] = [] init() { - self.configuredServers = [] + self.configuredServers = Settings + .fromDefaults() + .configuredServers + + observeForChanges() + } + + func observeForChanges() { + withObservationTracking { + _ = configuredServers + } onChange: { + Task { @MainActor [weak self] in + guard let self else { return } + saveToSettings() + observeForChanges() + } + } } func onAddServer(server: Server) { isAddServerPresented = false - configuredServers.append(server) + configuredServers = configuredServers + [ server ] + saveToSettings() + } + + func saveToSettings() { + Settings + .fromDefaults() + .configuredServers(configuredServers) + .save() } } } From 7e6d449c52393275f0cd5b053a50306d100945f6 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Tue, 10 Jun 2025 23:10:13 -0700 Subject: [PATCH 11/31] Selected server and better settings --- QueueCube/Backend/Server.swift | 2 +- QueueCube/Backend/Settings.swift | 114 ++++++++++++++++++++++++------- 2 files changed, 89 insertions(+), 27 deletions(-) diff --git a/QueueCube/Backend/Server.swift b/QueueCube/Backend/Server.swift index acefade..6260524 100644 --- a/QueueCube/Backend/Server.swift +++ b/QueueCube/Backend/Server.swift @@ -7,7 +7,7 @@ import Foundation -struct Server: Identifiable, Codable +struct Server: Identifiable, Codable, Equatable { let serviceName: String? let baseURL: URL diff --git a/QueueCube/Backend/Settings.swift b/QueueCube/Backend/Settings.swift index a011233..2e31a8b 100644 --- a/QueueCube/Backend/Settings.swift +++ b/QueueCube/Backend/Settings.swift @@ -9,44 +9,106 @@ import Foundation struct Settings { - var configuredServers: [Server] + var selectedServer: Server? + + var configuredServers: [Server] { + willSet { + // Set selected server to whatever the first server is, if we're adding the first one. + if configuredServers.isEmpty && !newValue.isEmpty && selectedServer == nil { + selectedServer = newValue.first + } + + // If the selected server is being removed, set it to something else + if !newValue.contains(where: { $0 == selectedServer }) { + selectedServer = newValue.first // nil if empty + } + } + } + + var isConfigured: Bool { !configuredServers.isEmpty } + + static func fromDefaults() -> Settings { + let defaults = UserDefaults.standard + return Settings( + selectedServer: defaults[SelectedServerKey.self], + configuredServers: defaults[ConfiguredServersKey.self] + ) + } + + func save() { + let defaults = UserDefaults.standard + defaults[ConfiguredServersKey.self] = configuredServers + defaults[SelectedServerKey.self] = selectedServer + + postSettingsChanged() + } + + func postSettingsChanged() { + NotificationCenter.default.post(name: .settingsChanged, object: nil) + } + + // MARK: - Modifiers + + func selectedServer(_ server: Server?) -> Self { + var copy = self + copy.selectedServer = server + return copy + } func configuredServers(_ servers: [Server]) -> Self { var copy = self copy.configuredServers = servers - return copy - } - - var isConfigured: Bool { - !configuredServers.isEmpty - } - - static func fromDefaults() -> Settings { - let configuredServers: [Server] = { - guard let configuredServersData = UserDefaults.standard.data(forKey: Keys.configuredServers.rawValue) - else { return [] } - - guard let configuredServers = try? PropertyListDecoder().decode([Server].self, from: configuredServersData) - else { return [] } - - return configuredServers - }() - - return Settings(configuredServers: configuredServers) - } - - func save() { - let configuredServersData = try! PropertyListEncoder().encode(configuredServers) - UserDefaults.standard.set(configuredServersData, forKey: Keys.configuredServers.rawValue) - NotificationCenter.default.post(name: .settingsChanged, object: nil) + return copy } // MARK: - Types enum Keys: String { + case selectedServer case configuredServers } + + fileprivate protocol Key + { + associatedtype Value: Codable + + static var defaultValue: Value { get } + static var key: String { get } + } + + private struct ConfiguredServersKey: Key { + static var defaultValue: [Server] { [] } + } + + private struct SelectedServerKey: Key { + static var defaultValue: Server? { nil } + } +} + +extension UserDefaults +{ + fileprivate subscript(_ type: T.Type) -> T.Value { + get { + guard let data = data(forKey: type.key) + else { return type.defaultValue } + + guard let value = try? PropertyListDecoder().decode(type.Value, from: data) + else { return type.defaultValue } + + return value + } + + set { + let data = try? PropertyListEncoder().encode(newValue) + set(data, forKey: type.key) + } + } +} + +extension Settings.Key +{ + static var key: String { Mirror(reflecting: Self.self).description } } extension Notification.Name From 51048678bb6150d9b7e43bf9cbe53d7d04787d3c Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 12:12:53 -0700 Subject: [PATCH 12/31] Unify playlist/favorites views --- CLAUDE.md | 45 +++++++++-- QueueCube/Views/ContentView.swift | 22 ++++-- QueueCube/Views/MainView.swift | 10 +-- QueueCube/Views/PlaylistView.swift | 122 +++++++++++------------------ 4 files changed, 105 insertions(+), 94 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 6779ac7..01ffb9d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,14 +12,27 @@ QueueCube is a SwiftUI-based jukebox client application for iOS and macOS (via M - **API.swift**: Central networking layer that handles all communication with the jukebox server. Includes REST API methods for playback control, playlist management, and WebSocket events for real-time updates. - **ContentView.swift**: Main view controller containing the `MainViewModel` that coordinates between UI components and API calls. Handles WebSocket event processing and data flow. -- **Settings Management**: Server configuration stored in UserDefaults with validation through `SettingsViewModel` that tests connectivity on URL changes. +- **Server.swift**: Represents individual jukebox servers with support for both manual configuration and Bonjour service discovery. +- **Settings.swift**: Manages multiple server configurations stored in UserDefaults with validation through `SettingsViewModel` that tests connectivity on URL changes. ### Data Flow -1. **Settings**: Server URL stored in UserDefaults, validated asynchronously via API calls -2. **Real-time Updates**: WebSocket connection provides live updates for playlist changes, playback state, and volume -3. **API Integration**: All server communication goes through the `API` struct using a fluent `RequestBuilder` pattern -4. **State Management**: Uses SwiftUI's `@Observable` pattern for reactive UI updates +1. **Multiple Server Support**: Array of `Server` objects stored in UserDefaults with selected server tracking +2. **Settings**: Server configurations validated asynchronously via API calls with live connectivity testing +3. **Real-time Updates**: WebSocket connection provides live updates for playlist changes, playback state, and volume +4. **API Integration**: All server communication goes through the `API` struct using a fluent `RequestBuilder` pattern +5. **State Management**: Uses SwiftUI's `@Observable` pattern for reactive UI updates + +### Request Builder Pattern + +The API layer uses a fluent builder pattern for HTTP requests: +```swift +try await request() + .path("/nowplaying") + .json() +``` + +This provides type-safe, composable API calls with automatic error handling and connection state management. ### Key Features @@ -58,7 +71,23 @@ The server API includes these endpoints: ## UI Structure +### View Hierarchy +``` +QueueCubeApp +└── ContentView (coordination layer) + └── MainView (tab management) + ├── PlaylistView (with embedded NowPlayingView) + ├── FavoritesView (favorites management) + └── SettingsView (server configuration) + ├── ServerListSettingsView + ├── AddServerView + └── GeneralSettingsView +``` + +### Key Views +- **ContentView**: Main coordinator that manages API instances and global state +- **MainView**: Tab-based navigation container with platform-specific adaptations +- **PlaylistView**: Scrollable list of queued media with reorder/delete actions, includes embedded NowPlayingView - **NowPlayingView**: Playback controls and current track display -- **PlaylistView**: Scrollable list of queued media with reorder/delete actions -- **AddMediaBarView**: Input field for adding new media URLs -- **SettingsView**: Server configuration with live validation \ No newline at end of file +- **AddMediaBarView**: Input field for adding new media URLs to playlist +- **SettingsView**: Multi-server configuration with live validation and service discovery \ No newline at end of file diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 660d606..caf524a 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -31,10 +31,18 @@ struct ContentView: View let playlistModel = model.playlistModel playlistModel.onSeek = { item in - Task { try await api.skip(item.index) } + Task { + if let index = item.index { + try await api.skip(index) + } + } } playlistModel.onDelete = { item in - Task { try await api.delete(index: item.index) } + Task { + if let index = item.index { + try await api.delete(index: index) + } + } } let addMediaModel = model.addMediaViewModel @@ -59,6 +67,10 @@ struct ContentView: View favoritesModel.onPlay = { item in Task { try await api.add(mediaURL: item.filename) } } + favoritesModel.onDelete = { item in + // TODO: Implement favorites deletion when API supports it + print("Delete favorite: \(item.title)") + } } } @@ -104,11 +116,11 @@ extension ContentView if what.contains(.playlist) { let playlist = try await api.fetchPlaylist() model.playlistModel.items = playlist.enumerated().map { (idx, mediaItem) in - PlaylistItem( - index: idx, + MediaListItem( id: String(mediaItem.id), title: mediaItem.title ?? mediaItem.filename ?? "", filename: mediaItem.filename ?? "", + index: idx, isCurrent: mediaItem.current ?? false ) } @@ -117,7 +129,7 @@ extension ContentView if what.contains(.favorites) { let favorites = try await api.fetchFavorites() model.favoritesModel.items = favorites.map { mediaItem in - FavoriteItem( + MediaListItem( id: String(mediaItem.id), title: mediaItem.title ?? mediaItem.filename ?? "", filename: mediaItem.filename ?? "" diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index d8147e8..4e19272 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -10,13 +10,13 @@ import SwiftUI @Observable class MainViewModel { - var selectedServer: Server? = nil + var selectedServer: Server? { Settings.fromDefaults().selectedServer } var connectionError: Error? = nil var selectedTab: Tab = .playlist - var playlistModel = PlaylistViewModel() - var favoritesModel = FavoritesViewModel() + var playlistModel = MediaListViewModel(mode: .playlist) + var favoritesModel = MediaListViewModel(mode: .favorites) var nowPlayingViewModel = NowPlayingViewModel() var addMediaViewModel = AddMediaBarViewModel() @@ -57,11 +57,11 @@ struct MainView: View TabView(selection: $model.selectedTab) { Tab(.playlist, systemImage: "list.bullet", value: .playlist) { - PlaylistView(model: model.playlistModel) + MediaListView(model: model.playlistModel) } Tab(.favorites, systemImage: "heart.fill", value: .favorites) { - FavoritesView(model: model.favoritesModel) + MediaListView(model: model.favoritesModel) } Tab(.settings, systemImage: "gear", value: .settings) { diff --git a/QueueCube/Views/PlaylistView.swift b/QueueCube/Views/PlaylistView.swift index 51f757e..afffc94 100644 --- a/QueueCube/Views/PlaylistView.swift +++ b/QueueCube/Views/PlaylistView.swift @@ -7,87 +7,86 @@ import SwiftUI -struct PlaylistItem: Identifiable +struct MediaListItem: Identifiable { - let index: Int let id: String let title: String let filename: String + let index: Int? let isCurrent: Bool + + init(id: String, title: String, filename: String, index: Int? = nil, isCurrent: Bool = false) { + self.id = id + self.title = title + self.filename = filename + self.index = index + self.isCurrent = isCurrent + } } -struct FavoriteItem: Identifiable -{ - let id: String - let title: String - let filename: String +enum MediaListMode { + case playlist + case favorites } @Observable -class PlaylistViewModel +class MediaListViewModel { + let mode: MediaListMode var isPlaying: Bool = false - var items: [PlaylistItem] = [] + var items: [MediaListItem] = [] - var onSeek: (PlaylistItem) -> Void = { _ in } - var onDelete: (PlaylistItem) -> Void = { _ in } + var onSeek: (MediaListItem) -> Void = { _ in } + var onPlay: (MediaListItem) -> Void = { _ in } + var onDelete: (MediaListItem) -> Void = { _ in } + + init(mode: MediaListMode) { + self.mode = mode + } } -@Observable -class FavoritesViewModel +struct MediaListView: View { - var items: [FavoriteItem] = [] - - var onPlay: (FavoriteItem) -> Void = { _ in } -} - -struct PlaylistView: View -{ - var model: PlaylistViewModel + var model: MediaListViewModel var body: some View { List(model.items) { item in - PlaylistItemCell( + MediaItemCell( title: item.title, subtitle: item.filename, - state: item.isCurrent ? (model.isPlaying ? PlaylistItemCell.State.playing : PlaylistItemCell.State.paused) - : .queued, - onLeadingIconClick: { model.onSeek(item) }, - onDeleteButtonClick: { model.onDelete(item) }, + mode: model.mode, + state: item.isCurrent ? (model.isPlaying ? MediaItemCell.State.playing : MediaItemCell.State.paused) : .queued, + onLeadingIconClick: { + switch model.mode { + case .playlist: + model.onSeek(item) + case .favorites: + model.onPlay(item) + } + }, + onDeleteButtonClick: { model.onDelete(item) } ) } } } -struct FavoritesView: View -{ - var model: FavoritesViewModel - - var body: some View { - List(model.items) { item in - FavoriteItemCell( - title: item.title, - subtitle: item.filename, - onPlayButtonClick: { model.onPlay(item) } - ) - } - } -} -struct PlaylistItemCell: View +struct MediaItemCell: View { let title: String let subtitle: String + let mode: MediaListMode let state: State let onLeadingIconClick: () -> Void let onDeleteButtonClick: () -> Void var body: some View { - let icon: String = switch state { - case .queued: "play.fill" - case .playing: "speaker.wave.3.fill" - case .paused: "speaker.fill" + let icon: String = switch (mode, state) { + case (.playlist, .queued): "play.fill" + case (.playlist, .playing): "speaker.wave.3.fill" + case (.playlist, .paused): "speaker.fill" + case (.favorites, _): "play.fill" } HStack { @@ -108,6 +107,7 @@ struct PlaylistItemCell: View Spacer() + // Show delete button for both playlist and favorites HStack { Button(action: onDeleteButtonClick) { Image(systemName: "xmark") @@ -115,7 +115,7 @@ struct PlaylistItemCell: View } } } - .listRowBackground(state != .queued ? Color.white.opacity(0.15) : nil) + .listRowBackground((mode == .playlist && state != .queued) ? Color.white.opacity(0.15) : nil) .padding([.top, .bottom], 8.0) } @@ -128,33 +128,3 @@ struct PlaylistItemCell: View } } -struct FavoriteItemCell: View -{ - let title: String - let subtitle: String - let onPlayButtonClick: () -> Void - - var body: some View { - HStack { - Button(action: onPlayButtonClick) { - Image(systemName: "play.fill") - } - .buttonStyle(BorderlessButtonStyle()) - .tint(Color.primary) - .frame(width: 15.0) - - VStack(alignment: .leading) { - Text(title) - .font(.body.bold()) - .lineLimit(1) - - Text(subtitle) - .foregroundColor(.secondary) - .lineLimit(1) - } - - Spacer() - } - .padding([.top, .bottom], 8.0) - } -} From ca829dde4cb582d3e9d452f0916722712b50a2c1 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 13:00:09 -0700 Subject: [PATCH 13/31] Implements server selection UI --- QueueCube/Backend/API.swift | 4 ++ QueueCube/Views/ContentView.swift | 27 ++++++++- QueueCube/Views/MainView.swift | 97 ++++++++++++++++++++++++------ QueueCube/Views/PlaylistView.swift | 8 ++- 4 files changed, 115 insertions(+), 21 deletions(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index fe370c3..fc483e1 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -17,6 +17,10 @@ struct MediaItem: Codable let playing: Bool? let metadata: Metadata? + var displayTitle: String { + metadata?.title ?? title ?? filename ?? "item \(id)" + } + // MARK: - Types struct Metadata: Codable diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index caf524a..9d1e02b 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -78,6 +78,7 @@ struct ContentView: View MainView(model: model) .task { await watchWebsocket() } .task { await refresh([.nowPlaying, .playlist, .favorites]) } + .task { await watchForSettingsChanges() } } // MARK: - Types @@ -118,7 +119,7 @@ extension ContentView model.playlistModel.items = playlist.enumerated().map { (idx, mediaItem) in MediaListItem( id: String(mediaItem.id), - title: mediaItem.title ?? mediaItem.filename ?? "", + title: mediaItem.displayTitle, filename: mediaItem.filename ?? "", index: idx, isCurrent: mediaItem.current ?? false @@ -131,7 +132,7 @@ extension ContentView model.favoritesModel.items = favorites.map { mediaItem in MediaListItem( id: String(mediaItem.id), - title: mediaItem.title ?? mediaItem.filename ?? "", + title: mediaItem.displayTitle, filename: mediaItem.filename ?? "" ) } @@ -186,4 +187,26 @@ extension ContentView } } } + + private func watchForSettingsChanges() async { + let settingsChangedNotifications = NotificationCenter.default.notifications(named: .settingsChanged) + .map({ _ in Optional.none }) + + for await _ in settingsChangedNotifications { + let newSelectedServer = Settings.fromDefaults().selectedServer + if newSelectedServer != model.selectedServer { + model.selectedServer = newSelectedServer + + // Reset view model to defaults + model.playlistModel = MediaListViewModel(mode: .playlist) + model.favoritesModel = MediaListViewModel(mode: .favorites) + model.nowPlayingViewModel = NowPlayingViewModel() + + await refresh([.playlist, .nowPlaying, .favorites]) + } + + // Always reset this + model.serverSelectionViewModel = ServerSelectionToolbarModifier.ViewModel() + } + } } diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index 4e19272..0ad314d 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -10,15 +10,16 @@ import SwiftUI @Observable class MainViewModel { - var selectedServer: Server? { Settings.fromDefaults().selectedServer } + var selectedServer: Server? = Settings.fromDefaults().selectedServer var connectionError: Error? = nil var selectedTab: Tab = .playlist - var playlistModel = MediaListViewModel(mode: .playlist) - var favoritesModel = MediaListViewModel(mode: .favorites) - var nowPlayingViewModel = NowPlayingViewModel() - var addMediaViewModel = AddMediaBarViewModel() + var playlistModel = MediaListViewModel(mode: .playlist) + var favoritesModel = MediaListViewModel(mode: .favorites) + var nowPlayingViewModel = NowPlayingViewModel() + var addMediaViewModel = AddMediaBarViewModel() + var serverSelectionViewModel = ServerSelectionToolbarModifier.ViewModel() enum Tab: String, CaseIterable { @@ -40,16 +41,6 @@ struct MainView: View if !Settings.fromDefaults().isConfigured { model.selectedTab = .settings } - - Task { - let settingsChangedNotifications = NotificationCenter.default.notifications(named: .settingsChanged) - .map({ _ in Optional.none }) - - for await _ in settingsChangedNotifications { - // TODO - // model.api = API.fromSettings() - } - } } var body: some View { @@ -57,11 +48,19 @@ struct MainView: View TabView(selection: $model.selectedTab) { Tab(.playlist, systemImage: "list.bullet", value: .playlist) { - MediaListView(model: model.playlistModel) + NavigationStack { + MediaListView(model: model.playlistModel) + .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) + .navigationTitle(.playlist) + } } Tab(.favorites, systemImage: "heart.fill", value: .favorites) { - MediaListView(model: model.favoritesModel) + NavigationStack { + MediaListView(model: model.favoritesModel) + .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) + .navigationTitle(.favorites) + } } Tab(.settings, systemImage: "gear", value: .settings) { @@ -107,3 +106,67 @@ struct MainView: View } } +struct ServerSelectionToolbarModifier: ViewModifier +{ + @Binding var model: ViewModel + + func body(content: Content) -> some View { + content + .toolbar { + ToolbarItemGroup(placement: .topBarTrailing) { + Menu { + Section { + ForEach(model.selectableServers) { server in + Button { + model.selectedServer = server + } label: { + Text(server.displayName) + if model.selectedServer == server { + Image(systemName: "checkmark") + } + } + } + } + + #if false + // TODO + Section { + Button(.addServer) { + + } + } + #endif + } label: { + Label(model.selectedServer?.displayName ?? "Servers", systemImage: "chevron.down") + .labelStyle(.titleAndIcon) + } + .buttonBorderShape(.capsule) + .buttonStyle(.bordered) + .menuStyle(.button) + } + } + } + + // MARK: - Types + + @Observable + class ViewModel + { + var selectableServers: [Server] = Settings.fromDefaults().configuredServers + var selectedServer: Server? = Settings.fromDefaults().selectedServer { + didSet { + Settings + .fromDefaults() + .selectedServer(selectedServer) + .save() + } + } + } +} + +extension View { + func displayingServerSelectionToolbar(model: Binding) -> some View { + modifier(ServerSelectionToolbarModifier(model: model)) + } +} + diff --git a/QueueCube/Views/PlaylistView.swift b/QueueCube/Views/PlaylistView.swift index afffc94..3aecc9e 100644 --- a/QueueCube/Views/PlaylistView.swift +++ b/QueueCube/Views/PlaylistView.swift @@ -9,14 +9,18 @@ import SwiftUI struct MediaListItem: Identifiable { - let id: String + let _id: String let title: String let filename: String let index: Int? let isCurrent: Bool + var id: String { + _id + filename // temporary: we get duplicate ids from the server sometimes... + } + init(id: String, title: String, filename: String, index: Int? = nil, isCurrent: Bool = false) { - self.id = id + self._id = id self.title = title self.filename = filename self.index = index From a98bcd5b6618e67a3aa81c71e9931dbc3bc708af Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 13:32:34 -0700 Subject: [PATCH 14/31] Started working on NowPlaying mini --- QueueCube/Views/MainView.swift | 82 +++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index 0ad314d..010797a 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -27,6 +27,10 @@ class MainViewModel case favorites case settings } + + func onAddButtonTapped() { + + } } struct MainView: View @@ -51,6 +55,8 @@ struct MainView: View NavigationStack { MediaListView(model: model.playlistModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) + .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) + .withAddButton { model.onAddButtonTapped() } .navigationTitle(.playlist) } } @@ -59,6 +65,8 @@ struct MainView: View NavigationStack { MediaListView(model: model.favoritesModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) + .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) + .withAddButton { model.onAddButtonTapped() } .navigationTitle(.favorites) } } @@ -69,6 +77,7 @@ struct MainView: View } + #if false VStack { if showConfigurationDialog { @@ -106,6 +115,51 @@ struct MainView: View } } +struct NowPlayingMiniPlayerModifier: ViewModifier +{ + @Binding var model: NowPlayingViewModel + private let height = 64.0 + + func body(content: Content) -> some View { + let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" + + ZStack { + content + .safeAreaPadding(.bottom, height) + + VStack { + Spacer() + + HStack { + VStack(alignment: .leading) { + Text(model.title) + .bold() + + Text(model.subtitle) + .foregroundStyle(.secondary) + } + + Spacer() + + Button(action: { model.onPlayPause(model) }) { Image(systemName: playPauseImageName) } + .imageScale(.large) + .padding(12.0) + } + .padding() + .frame(height: height) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.regularMaterial) + .stroke(.ultraThinMaterial, lineWidth: 1.0) + ) + .shadow(color: .black.opacity(0.15), radius: 14.0, y: 2.0) + + .padding() + } + } + } +} + struct ServerSelectionToolbarModifier: ViewModifier { @Binding var model: ViewModel @@ -113,7 +167,7 @@ struct ServerSelectionToolbarModifier: ViewModifier func body(content: Content) -> some View { content .toolbar { - ToolbarItemGroup(placement: .topBarTrailing) { + ToolbarItemGroup(placement: .topBarLeading) { Menu { Section { ForEach(model.selectableServers) { server in @@ -164,9 +218,35 @@ struct ServerSelectionToolbarModifier: ViewModifier } } +struct AddButtonToolbarModifier: ViewModifier +{ + let onAdd: () -> Void + + func body(content: Content) -> some View { + content + .toolbar { + ToolbarItemGroup(placement: .topBarTrailing) { + Button { + onAdd() + } label: { + Image(systemName: "plus") + } + } + } + } +} + extension View { func displayingServerSelectionToolbar(model: Binding) -> some View { modifier(ServerSelectionToolbarModifier(model: model)) } + + func displayingNowPlayingMiniPlayer(model: Binding) -> some View { + modifier(NowPlayingMiniPlayerModifier(model: model)) + } + + func withAddButton(onAdd: @escaping () -> Void) -> some View { + modifier(AddButtonToolbarModifier(onAdd: onAdd)) + } } From 9aa55864f87209e29a8db21857a6c3d0f5df0d9f Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 13:48:31 -0700 Subject: [PATCH 15/31] Tweaks to now playing view --- QueueCube/App/QueueCubeApp.swift | 1 - QueueCube/Views/MainView.swift | 38 +++++---------------- QueueCube/Views/NowPlayingMiniView.swift | 42 ++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 31 deletions(-) create mode 100644 QueueCube/Views/NowPlayingMiniView.swift diff --git a/QueueCube/App/QueueCubeApp.swift b/QueueCube/App/QueueCubeApp.swift index d2430ac..eb7ecfa 100644 --- a/QueueCube/App/QueueCubeApp.swift +++ b/QueueCube/App/QueueCubeApp.swift @@ -14,7 +14,6 @@ struct QueueCubeApp: App { var body: some Scene { WindowGroup { ContentView() - .frame(minWidth: 400.0, minHeight: 600.0) .onAppear { #if targetEnvironment(macCatalyst) guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene else { return } diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index 010797a..fd2578d 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -118,43 +118,21 @@ struct MainView: View struct NowPlayingMiniPlayerModifier: ViewModifier { @Binding var model: NowPlayingViewModel - private let height = 64.0 + @State var nowPlayingHeight: CGFloat = 0.0 func body(content: Content) -> some View { - let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" - ZStack { content - .safeAreaPadding(.bottom, height) + .safeAreaPadding(.bottom, nowPlayingHeight) VStack { Spacer() - - HStack { - VStack(alignment: .leading) { - Text(model.title) - .bold() - - Text(model.subtitle) - .foregroundStyle(.secondary) - } - - Spacer() - - Button(action: { model.onPlayPause(model) }) { Image(systemName: playPauseImageName) } - .imageScale(.large) - .padding(12.0) - } - .padding() - .frame(height: height) - .background( - RoundedRectangle(cornerRadius: 12) - .fill(.regularMaterial) - .stroke(.ultraThinMaterial, lineWidth: 1.0) - ) - .shadow(color: .black.opacity(0.15), radius: 14.0, y: 2.0) - - .padding() + + NowPlayingMiniView(model: $model) + .padding() + .fixedSize(horizontal: false, vertical: true) + .onGeometryChange(for: CGSize.self) { $0.size } + action: { nowPlayingHeight = $0.height } } } } diff --git a/QueueCube/Views/NowPlayingMiniView.swift b/QueueCube/Views/NowPlayingMiniView.swift new file mode 100644 index 0000000..a9e68a6 --- /dev/null +++ b/QueueCube/Views/NowPlayingMiniView.swift @@ -0,0 +1,42 @@ +// +// NowPlayingMiniView.swift +// QueueCube +// +// Created by James Magahern on 6/11/25. +// + +import SwiftUI + +struct NowPlayingMiniView: View { + @Binding var model: NowPlayingViewModel + + var body: some View { + let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" + + HStack { + VStack(alignment: .leading) { + Text(model.title) + .font(.caption) + .lineLimit(1) + .bold() + + Text(model.subtitle) + .font(.caption) + .foregroundStyle(.secondary) + } + + Spacer() + + Button(action: { model.onPlayPause(model) }) { Image(systemName: playPauseImageName) } + .imageScale(.large) + .padding(12.0) + } + .padding(EdgeInsets(top: 4.0, leading: 10.0, bottom: 4.0, trailing: 10.0)) + .background( + RoundedRectangle(cornerRadius: 12) + .fill(.regularMaterial) + .stroke(.ultraThinMaterial, lineWidth: 1.0) + ) + .shadow(color: .black.opacity(0.15), radius: 14.0, y: 2.0) + } +} From ce8ece23a5d9a76382343a5865521bce9812274a Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 15:08:17 -0700 Subject: [PATCH 16/31] implements favorites/playlist deletion --- QueueCube/Backend/API.swift | 14 ++++++ QueueCube/Backend/Utilities.swift | 5 ++ QueueCube/Views/ContentView.swift | 18 +++---- QueueCube/Views/MainView.swift | 80 +++++++++++++++++++++++++++++- QueueCube/Views/PlaylistView.swift | 67 +++++++++++-------------- 5 files changed, 133 insertions(+), 51 deletions(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index fc483e1..cd51cd1 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -103,6 +103,13 @@ struct API .post() } + public func deleteFavorite(mediaURL: String) async throws { + try await request() + .pathString("/favorites/\(mediaURL.uriEncoded())") + .method(.delete) + .execute() + } + public func delete(index: Int) async throws { try await request() .path("/playlist/\(index)") @@ -214,3 +221,10 @@ struct API } } } + +extension String +{ + func uriEncoded() -> Self { + return addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! + } +} diff --git a/QueueCube/Backend/Utilities.swift b/QueueCube/Backend/Utilities.swift index d7a7ca2..ae1ef10 100644 --- a/QueueCube/Backend/Utilities.swift +++ b/QueueCube/Backend/Utilities.swift @@ -37,6 +37,11 @@ struct RequestBuilder return RequestBuilder(url: self.url.appending(path: path)) } + public func pathString(_ pathString: any StringProtocol) -> Self { + // xxx: should just fix DELETE /favorites/:filename: instead. + return RequestBuilder(url: URL(string: self.url.absoluteString + pathString)!) + } + public func body(_ data: Codable) -> Self { var copy = self copy.body = try! JSONEncoder().encode(data) diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 9d1e02b..83fb6f7 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -96,9 +96,7 @@ struct ContentView: View extension ContentView { private func refresh(_ what: RefreshType) async { - guard let api = model.selectedServer?.api else { return } - - do { + await model.withModificationsViaAPI { api in if what.contains(.nowPlaying) { let nowPlaying = try await api.fetchNowPlayingInfo() if let nowPlayingItem = nowPlaying.playingItem, let title = nowPlayingItem.title { @@ -112,6 +110,7 @@ extension ContentView model.nowPlayingViewModel.isPlaying = !nowPlaying.isPaused model.nowPlayingViewModel.volume = Double(nowPlaying.volume) / 100.0 model.playlistModel.isPlaying = !nowPlaying.isPaused + model.favoritesModel.isPlaying = !nowPlaying.isPaused } if what.contains(.playlist) { @@ -129,19 +128,18 @@ extension ContentView if what.contains(.favorites) { let favorites = try await api.fetchFavorites() + let nowPlaying = try await api.fetchNowPlayingInfo() model.favoritesModel.items = favorites.map { mediaItem in MediaListItem( id: String(mediaItem.id), title: mediaItem.displayTitle, - filename: mediaItem.filename ?? "" + filename: mediaItem.filename ?? "", + isCurrent: nowPlaying.playingItem?.filename == mediaItem.filename ) } } model.connectionError = nil - } catch { - print("Error refreshing content: \(error)") - model.connectionError = error } } @@ -198,14 +196,12 @@ extension ContentView model.selectedServer = newSelectedServer // Reset view model to defaults - model.playlistModel = MediaListViewModel(mode: .playlist) - model.favoritesModel = MediaListViewModel(mode: .favorites) - model.nowPlayingViewModel = NowPlayingViewModel() + model.reset() await refresh([.playlist, .nowPlaying, .favorites]) } - // Always reset this + // Always reset this model.serverSelectionViewModel = ServerSelectionToolbarModifier.ViewModel() } } diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index fd2578d..dde10c8 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -21,6 +21,9 @@ class MainViewModel var addMediaViewModel = AddMediaBarViewModel() var serverSelectionViewModel = ServerSelectionToolbarModifier.ViewModel() + private var refreshingFromAPIDepth: UInt8 = 0 + private var isRefreshingFromAPI: Bool { refreshingFromAPIDepth > 0 } + enum Tab: String, CaseIterable { case playlist @@ -28,9 +31,82 @@ class MainViewModel case settings } + init() { + observePlaylistChanges() + } + func onAddButtonTapped() { } + + func reset() { + refreshingFromAPIDepth = 1 + + playlistModel = MediaListViewModel(mode: .playlist) + favoritesModel = MediaListViewModel(mode: .favorites) + nowPlayingViewModel = NowPlayingViewModel() + + refreshingFromAPIDepth = 0 + } + + func withModificationsViaAPI(_ modificationBlock: (API) async throws -> Void) async { + guard let api = selectedServer?.api else { return } + + refreshingFromAPIDepth += 1 + + do { + try await modificationBlock(api) + connectionError = nil + } catch { + print("Error refreshing content: \(error)") + connectionError = error + } + + refreshingFromAPIDepth -= 1 + } + + func observePlaylistChanges() { + withObservationTracking { + _ = playlistModel.items + _ = favoritesModel.items + } onChange: { [weak self] in + guard let self else { return } + + let isRefreshing = isRefreshingFromAPI + let oldPlaylist = playlistModel.items + let oldFavorites = favoritesModel.items + Task { @MainActor [weak self] in + guard let self else { return } + + if !isRefreshing { + // Notify server of removals + let playlistDiff = playlistModel.items.difference(from: oldPlaylist) { $0.id == $1.id } + await withModificationsViaAPI { api in + for removal in playlistDiff.removals { + switch removal { + case .remove(let offset, _, _): + try await api.delete(index: offset) + default: break + } + } + } + + let favoritesDiff = favoritesModel.items.difference(from: oldFavorites) { $0.id == $1.id } + await withModificationsViaAPI { api in + for removal in favoritesDiff.removals { + switch removal { + case .remove(_, let favorite, _): + try await api.deleteFavorite(mediaURL: favorite.filename) + default: break + } + } + } + } + + observePlaylistChanges() + } + } + } } struct MainView: View @@ -53,7 +129,7 @@ struct MainView: View TabView(selection: $model.selectedTab) { Tab(.playlist, systemImage: "list.bullet", value: .playlist) { NavigationStack { - MediaListView(model: model.playlistModel) + MediaListView(model: $model.playlistModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) .withAddButton { model.onAddButtonTapped() } @@ -63,7 +139,7 @@ struct MainView: View Tab(.favorites, systemImage: "heart.fill", value: .favorites) { NavigationStack { - MediaListView(model: model.favoritesModel) + MediaListView(model: $model.favoritesModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) .withAddButton { model.onAddButtonTapped() } diff --git a/QueueCube/Views/PlaylistView.swift b/QueueCube/Views/PlaylistView.swift index 3aecc9e..2fd1d59 100644 --- a/QueueCube/Views/PlaylistView.swift +++ b/QueueCube/Views/PlaylistView.swift @@ -51,25 +51,27 @@ class MediaListViewModel struct MediaListView: View { - var model: MediaListViewModel + @Binding var model: MediaListViewModel var body: some View { - List(model.items) { item in - MediaItemCell( - title: item.title, - subtitle: item.filename, - mode: model.mode, - state: item.isCurrent ? (model.isPlaying ? MediaItemCell.State.playing : MediaItemCell.State.paused) : .queued, - onLeadingIconClick: { - switch model.mode { - case .playlist: - model.onSeek(item) - case .favorites: - model.onPlay(item) - } - }, - onDeleteButtonClick: { model.onDelete(item) } - ) + List($model.items, editActions: .delete) { item in + let item = item.wrappedValue + + Button { + switch model.mode { + case .playlist: + model.onSeek(item) + case .favorites: + model.onPlay(item) + } + } label: { + MediaItemCell( + title: item.title, + subtitle: item.filename, + mode: model.mode, + state: item.isCurrent ? (model.isPlaying ? MediaItemCell.State.playing : MediaItemCell.State.paused) : .queued, + ) + } } } } @@ -82,26 +84,23 @@ struct MediaItemCell: View let mode: MediaListMode let state: State - let onLeadingIconClick: () -> Void - let onDeleteButtonClick: () -> Void - var body: some View { - let icon: String = switch (mode, state) { - case (.playlist, .queued): "play.fill" - case (.playlist, .playing): "speaker.wave.3.fill" - case (.playlist, .paused): "speaker.fill" - case (.favorites, _): "play.fill" + let icon: String = switch state { + case .queued: "play.fill" + case .playing: "speaker.wave.3.fill" + case .paused: "speaker.fill" } HStack { - Button(action: onLeadingIconClick) { Image(systemName: icon) } - .buttonStyle(BorderlessButtonStyle()) + Image(systemName: icon) .tint(Color.primary) .frame(width: 15.0) + Spacer(minLength: 8.0) + VStack(alignment: .leading) { Text(title) - .font(.body.bold()) + .tint(.primary) .lineLimit(1) Text(subtitle) @@ -110,17 +109,9 @@ struct MediaItemCell: View } Spacer() - - // Show delete button for both playlist and favorites - HStack { - Button(action: onDeleteButtonClick) { - Image(systemName: "xmark") - .tint(.red) - } - } } - .listRowBackground((mode == .playlist && state != .queued) ? Color.white.opacity(0.15) : nil) - .padding([.top, .bottom], 8.0) + .listRowBackground((mode == .playlist && state != .queued) ? Color.accentColor.opacity(0.15) : nil) + .padding([.top, .bottom], 4.0) } // MARK: - Types From afe985661a961f78907563b61c36272a74573ea1 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 17:42:26 -0700 Subject: [PATCH 17/31] add server: show progress bar when resolving --- QueueCube/Views/Settings View/AddServerView.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/QueueCube/Views/Settings View/AddServerView.swift b/QueueCube/Views/Settings View/AddServerView.swift index 7ff5eb5..f788238 100644 --- a/QueueCube/Views/Settings View/AddServerView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -75,6 +75,12 @@ struct AddServerView: View Image(systemName: "network") Text("\(server.displayName)") .bold() + + Spacer() + if model.resolvingServers.contains(server) { + ProgressView() + .progressViewStyle(.circular) + } } } .tint(.primary) @@ -90,6 +96,8 @@ struct AddServerView: View private func resolveEndpoint(_ endpoint: DiscoveredEndpoint) { Task { + model.resolvingServers.insert(endpoint) + let server = try await endpoint.resolve() onAddServer(server) } @@ -104,6 +112,8 @@ struct AddServerView: View var validationState: ValidationState = .empty var discoveredServers: [DiscoveredEndpoint] = [] + var resolvingServers = Set() + private let browser = NWBrowser(for: .bonjour(type: "_queuecube._tcp.", domain: nil), using: .tcp) private var validationTimer: Timer? = nil @@ -180,7 +190,7 @@ struct AddServerView: View } } -struct DiscoveredEndpoint: Identifiable +struct DiscoveredEndpoint: Identifiable, Hashable { let endpoint: NWEndpoint let serviceName: String From bde29e7e988a41f1a035a06fccbfb55b9404c5be Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 18:41:39 -0700 Subject: [PATCH 18/31] better error handling and server switching --- QueueCube/Backend/API.swift | 1 + QueueCube/Localizable/Localizable.xcstrings | 20 +++ QueueCube/Localizable/Strings.swift | 2 + QueueCube/Views/ContentPlaceholderView.swift | 1 + QueueCube/Views/ContentView.swift | 77 +-------- QueueCube/Views/MainView.swift | 146 ++++++++++++------ QueueCube/Views/NowPlayingMiniView.swift | 1 + QueueCube/Views/PlaylistView.swift | 44 ++++-- .../Views/Settings View/AddServerView.swift | 2 + 9 files changed, 158 insertions(+), 136 deletions(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index cd51cd1..46ac48c 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -177,6 +177,7 @@ struct API } } catch { print("Websocket Error: \(error)") + continuation.yield(.error(API.Error.websocketError(error))) } } diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index 5a26ac5..58f910e 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -104,6 +104,16 @@ } } }, + "FAVORITES_IS_EMPTY" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorites is empty" + } + } + } + }, "FINDING_SERVERS" : { "localizations" : { "en" : { @@ -155,6 +165,16 @@ } } }, + "PLAYLIST_IS_EMPTY" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Playlist is empty" + } + } + } + }, "SERVER_IS_ONLINE" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index 6bdb9a5..bb9a6b5 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -31,4 +31,6 @@ extension LocalizedStringKey static let discovered = LocalizedStringKey("DISCOVERED") static let findingServers = LocalizedStringKey("FINDING_SERVERS") static let noServersConfigured = LocalizedStringKey("NO_SERVERS_CONFIGURED") + static let playlistEmpty = LocalizedStringKey("PLAYLIST_IS_EMPTY") + static let favoritesEmpty = LocalizedStringKey("FAVORITES_IS_EMPTY") } diff --git a/QueueCube/Views/ContentPlaceholderView.swift b/QueueCube/Views/ContentPlaceholderView.swift index de3da0c..4bc548b 100644 --- a/QueueCube/Views/ContentPlaceholderView.swift +++ b/QueueCube/Views/ContentPlaceholderView.swift @@ -48,6 +48,7 @@ func contentPlaceholderView( Text(title) + .foregroundStyle(.tint) .bold() Spacer() diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 83fb6f7..28b87a0 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -9,74 +9,12 @@ import SwiftUI struct ContentView: View { - @State var model: MainViewModel - - init() { - self.model = MainViewModel() - - if let api = model.selectedServer?.api { - let nowPlayingModel = self.model.nowPlayingViewModel - nowPlayingModel.onPlayPause = { model in - Task { model.isPlaying ? try await api.pause() : try await api.play() } - } - nowPlayingModel.onNext = { _ in - Task { try await api.skip() } - } - nowPlayingModel.onPrev = { _ in - Task { try await api.previous() } - } - nowPlayingModel.onVolumeChange = { model in - Task { try await api.setVolume(model.volume) } - } - - let playlistModel = model.playlistModel - playlistModel.onSeek = { item in - Task { - if let index = item.index { - try await api.skip(index) - } - } - } - playlistModel.onDelete = { item in - Task { - if let index = item.index { - try await api.delete(index: index) - } - } - } - - let addMediaModel = model.addMediaViewModel - addMediaModel.onAdd = { [model] mediaURL in - let strippedURL = mediaURL.trimmingCharacters(in: .whitespacesAndNewlines) - if !strippedURL.isEmpty { - addMediaModel.fieldContents = "" - Task { - switch model.selectedTab { - case .playlist: - try await api.add(mediaURL: strippedURL) - case .favorites: - try await api.addFavorite(mediaURL: strippedURL) - case .settings: - break - } - } - } - } - - let favoritesModel = model.favoritesModel - favoritesModel.onPlay = { item in - Task { try await api.add(mediaURL: item.filename) } - } - favoritesModel.onDelete = { item in - // TODO: Implement favorites deletion when API supports it - print("Delete favorite: \(item.title)") - } - } - } + @State var model = MainViewModel() + @State private var websocketRestartTrigger = 0 var body: some View { - MainView(model: model) - .task { await watchWebsocket() } + MainView(model: $model) + .task(id: websocketRestartTrigger) { await watchWebsocket() } .task { await refresh([.nowPlaying, .playlist, .favorites]) } .task { await watchForSettingsChanges() } } @@ -138,8 +76,6 @@ extension ContentView ) } } - - model.connectionError = nil } } @@ -196,7 +132,10 @@ extension ContentView model.selectedServer = newSelectedServer // Reset view model to defaults - model.reset() + await model.reset() + + // Restart WebSocket connection for new server + websocketRestartTrigger += 1 await refresh([.playlist, .nowPlaying, .favorites]) } diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index dde10c8..c1a0fcd 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -33,20 +33,71 @@ class MainViewModel init() { observePlaylistChanges() + configureViewModelCallbacks() } func onAddButtonTapped() { } - func reset() { - refreshingFromAPIDepth = 1 + func reset() async { + await withModificationsViaAPI { _ in + playlistModel = MediaListViewModel(mode: .playlist) + favoritesModel = MediaListViewModel(mode: .favorites) + nowPlayingViewModel = NowPlayingViewModel() + } - playlistModel = MediaListViewModel(mode: .playlist) - favoritesModel = MediaListViewModel(mode: .favorites) - nowPlayingViewModel = NowPlayingViewModel() + configureViewModelCallbacks() + } + + func configureViewModelCallbacks() { + // Now Playing + nowPlayingViewModel.onPlayPause = apiCallback { model, api in + model.isPlaying ? try await api.pause() : try await api.play() + } + + nowPlayingViewModel.onNext = apiCallback { _, api in + try await api.skip() + } + + nowPlayingViewModel.onPrev = apiCallback { _, api in + try await api.previous() + } + + nowPlayingViewModel.onVolumeChange = apiCallback { model, api in + try await api.setVolume(model.volume) + } - refreshingFromAPIDepth = 0 + // Playlist + playlistModel.onSeek = apiCallback { item, api in + if let index = item.index { + try await api.skip(index) + } + } + + // Favorites + favoritesModel.onPlay = apiCallback { item, api in + try await api.add(mediaURL: item.filename) + } + + // Add Media + addMediaViewModel.onAdd = apiCallback { [weak self] mediaURL, api in + guard let self else { return } + + let strippedURL = mediaURL.trimmingCharacters(in: .whitespacesAndNewlines) + if !strippedURL.isEmpty { + addMediaViewModel.fieldContents = "" + + switch selectedTab { + case .playlist: + try await api.add(mediaURL: strippedURL) + case .favorites: + try await api.addFavorite(mediaURL: strippedURL) + case .settings: + break + } + } + } } func withModificationsViaAPI(_ modificationBlock: (API) async throws -> Void) async { @@ -65,7 +116,15 @@ class MainViewModel refreshingFromAPIDepth -= 1 } - func observePlaylistChanges() { + private func apiCallback(_ f: @escaping (T, API) async throws -> Void) -> (T) -> Void { + return { t in + Task { + await self.withModificationsViaAPI { try await f(t, $0) } + } + } + } + + private func observePlaylistChanges() { withObservationTracking { _ = playlistModel.items _ = favoritesModel.items @@ -111,27 +170,26 @@ class MainViewModel struct MainView: View { - @State var model: MainViewModel + @Binding var model: MainViewModel @State var isSettingsVisible: Bool = false - init(model: MainViewModel) { - self.model = model + init(model: Binding) { + self._model = model // If no servers are configured, make Settings the default tab. if !Settings.fromDefaults().isConfigured { - model.selectedTab = .settings + model.wrappedValue.selectedTab = .settings } } var body: some View { - let showConfigurationDialog = model.selectedServer == nil - TabView(selection: $model.selectedTab) { Tab(.playlist, systemImage: "list.bullet", value: .playlist) { NavigationStack { MediaListView(model: $model.playlistModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) + .displayingError(model.connectionError) .withAddButton { model.onAddButtonTapped() } .navigationTitle(.playlist) } @@ -142,6 +200,7 @@ struct MainView: View MediaListView(model: $model.favoritesModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) + .displayingError(model.connectionError) .withAddButton { model.onAddButtonTapped() } .navigationTitle(.favorites) } @@ -151,43 +210,6 @@ struct MainView: View SettingsView(onDone: {}) } } - - - - #if false - VStack { - if showConfigurationDialog { - ContentPlaceholderView { - Image(systemName: "server.rack") - Text(.notConfigured) - } actions: { - Button { - isSettingsVisible = true - } label: { - Text(.settings) - } - } - } else if model.connectionError != nil { - ContentPlaceholderView { - Image(systemName: "exclamationmark.triangle.fill") - Text(.connectionError) - } - } else { - TabView(selection: $model.selectedTab) { - } - .frame(maxWidth: 640.0) - } - - AddMediaBarView(model: model.addMediaViewModel) - .layoutPriority(2.0) - .disabled(showConfigurationDialog) - } - .sheet(isPresented: $isSettingsVisible) { - SettingsView(onDone: { isSettingsVisible = false }) - } - - #endif - } } @@ -290,6 +312,26 @@ struct AddButtonToolbarModifier: ViewModifier } } +struct ErrorDisplayModifier: ViewModifier +{ + let error: Error? + + func body(content: Content) -> some View { + content + .overlay { + if error != nil { + ZStack { + Rectangle() + .fill(.background) + + contentPlaceholderView(title: .connectionError, systemImage: "exclamationmark.triangle.fill") + .tint(Color(uiColor: .label)) + } + } + } + } +} + extension View { func displayingServerSelectionToolbar(model: Binding) -> some View { modifier(ServerSelectionToolbarModifier(model: model)) @@ -302,5 +344,9 @@ extension View { func withAddButton(onAdd: @escaping () -> Void) -> some View { modifier(AddButtonToolbarModifier(onAdd: onAdd)) } + + func displayingError(_ error: Error?) -> some View { + modifier(ErrorDisplayModifier(error: error)) + } } diff --git a/QueueCube/Views/NowPlayingMiniView.swift b/QueueCube/Views/NowPlayingMiniView.swift index a9e68a6..b245ebe 100644 --- a/QueueCube/Views/NowPlayingMiniView.swift +++ b/QueueCube/Views/NowPlayingMiniView.swift @@ -21,6 +21,7 @@ struct NowPlayingMiniView: View { .bold() Text(model.subtitle) + .lineLimit(1) .font(.caption) .foregroundStyle(.secondary) } diff --git a/QueueCube/Views/PlaylistView.swift b/QueueCube/Views/PlaylistView.swift index 2fd1d59..08969b4 100644 --- a/QueueCube/Views/PlaylistView.swift +++ b/QueueCube/Views/PlaylistView.swift @@ -42,7 +42,6 @@ class MediaListViewModel var onSeek: (MediaListItem) -> Void = { _ in } var onPlay: (MediaListItem) -> Void = { _ in } - var onDelete: (MediaListItem) -> Void = { _ in } init(mode: MediaListMode) { self.mode = mode @@ -54,23 +53,34 @@ struct MediaListView: View @Binding var model: MediaListViewModel var body: some View { - List($model.items, editActions: .delete) { item in - let item = item.wrappedValue - - Button { - switch model.mode { - case .playlist: - model.onSeek(item) - case .favorites: - model.onPlay(item) + VStack { + if model.items.isEmpty { + let title: LocalizedStringKey = switch model.mode { + case .playlist: .playlistEmpty + case .favorites: .favoritesEmpty + } + + contentPlaceholderView(title: title, systemImage: "list.bullet") + } else { + List($model.items, editActions: .delete) { item in + let item = item.wrappedValue + + Button { + switch model.mode { + case .playlist: + model.onSeek(item) + case .favorites: + model.onPlay(item) + } + } label: { + MediaItemCell( + title: item.title, + subtitle: item.filename, + mode: model.mode, + state: item.isCurrent ? (model.isPlaying ? MediaItemCell.State.playing : MediaItemCell.State.paused) : .queued, + ) + } } - } label: { - MediaItemCell( - title: item.title, - subtitle: item.filename, - mode: model.mode, - state: item.isCurrent ? (model.isPlaying ? MediaItemCell.State.playing : MediaItemCell.State.paused) : .queued, - ) } } } diff --git a/QueueCube/Views/Settings View/AddServerView.swift b/QueueCube/Views/Settings View/AddServerView.swift index f788238..6eff779 100644 --- a/QueueCube/Views/Settings View/AddServerView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -100,6 +100,8 @@ struct AddServerView: View let server = try await endpoint.resolve() onAddServer(server) + + model.resolvingServers.remove(endpoint) } } From 601ffc4a75127c90e40463625fb52667284f4ba3 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 19:33:20 -0700 Subject: [PATCH 19/31] Implements updated nowplaying view --- QueueCube/Backend/API.swift | 6 + QueueCube/Localizable/Localizable.xcstrings | 3 + QueueCube/Views/ContentView.swift | 5 + QueueCube/Views/MainView.swift | 26 ++++- QueueCube/Views/NowPlayingMiniView.swift | 13 ++- QueueCube/Views/NowPlayingView.swift | 108 ++++++++++++------ QueueCube/Views/PlaylistView.swift | 10 +- .../Settings View/GeneralSettingsView.swift | 2 +- 8 files changed, 126 insertions(+), 47 deletions(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index 46ac48c..e4804f1 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -76,6 +76,12 @@ struct API .post() } + public func stop() async throws { + try await request() + .path("/stop") + .post() + } + public func skip(_ to: Int? = nil) async throws { let path = if let to { "/skip/\(to)" } else { "/skip" } try await request() diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index 58f910e..a2c0bde 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -154,6 +154,9 @@ } } } + }, + "Nothing here yet." : { + }, "PLAYLIST" : { "localizations" : { diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 28b87a0..309c6f0 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -17,6 +17,11 @@ struct ContentView: View .task(id: websocketRestartTrigger) { await watchWebsocket() } .task { await refresh([.nowPlaying, .playlist, .favorites]) } .task { await watchForSettingsChanges() } + .sheet(isPresented: $model.isNowPlayingSheetPresented) { + NowPlayingView(model: model.nowPlayingViewModel) + .presentationBackground(.regularMaterial) + .presentationDetents([ .height(320.0) ]) + } } // MARK: - Types diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index c1a0fcd..5b76ada 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -15,6 +15,8 @@ class MainViewModel var connectionError: Error? = nil var selectedTab: Tab = .playlist + var isNowPlayingSheetPresented: Bool = false + var playlistModel = MediaListViewModel(mode: .playlist) var favoritesModel = MediaListViewModel(mode: .favorites) var nowPlayingViewModel = NowPlayingViewModel() @@ -40,6 +42,10 @@ class MainViewModel } + func onNowPlayingMiniTapped() { + isNowPlayingSheetPresented = true + } + func reset() async { await withModificationsViaAPI { _ in playlistModel = MediaListViewModel(mode: .playlist) @@ -56,6 +62,10 @@ class MainViewModel model.isPlaying ? try await api.pause() : try await api.play() } + nowPlayingViewModel.onStop = apiCallback { model, api in + try await api.stop() + } + nowPlayingViewModel.onNext = apiCallback { _, api in try await api.skip() } @@ -67,6 +77,10 @@ class MainViewModel nowPlayingViewModel.onVolumeChange = apiCallback { model, api in try await api.setVolume(model.volume) } + + nowPlayingViewModel.onSheetDismiss = { [weak self] _ in + self?.isNowPlayingSheetPresented = false + } // Playlist playlistModel.onSeek = apiCallback { item, api in @@ -188,7 +202,7 @@ struct MainView: View NavigationStack { MediaListView(model: $model.playlistModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) - .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) + .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) { model.onNowPlayingMiniTapped() } .displayingError(model.connectionError) .withAddButton { model.onAddButtonTapped() } .navigationTitle(.playlist) @@ -199,7 +213,7 @@ struct MainView: View NavigationStack { MediaListView(model: $model.favoritesModel) .displayingServerSelectionToolbar(model: $model.serverSelectionViewModel) - .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) + .displayingNowPlayingMiniPlayer(model: $model.nowPlayingViewModel) { model.onNowPlayingMiniTapped() } .displayingError(model.connectionError) .withAddButton { model.onAddButtonTapped() } .navigationTitle(.favorites) @@ -215,6 +229,8 @@ struct MainView: View struct NowPlayingMiniPlayerModifier: ViewModifier { + let onTap: () -> Void + @Binding var model: NowPlayingViewModel @State var nowPlayingHeight: CGFloat = 0.0 @@ -226,7 +242,7 @@ struct NowPlayingMiniPlayerModifier: ViewModifier VStack { Spacer() - NowPlayingMiniView(model: $model) + NowPlayingMiniView(model: $model, onTap: onTap) .padding() .fixedSize(horizontal: false, vertical: true) .onGeometryChange(for: CGSize.self) { $0.size } @@ -337,8 +353,8 @@ extension View { modifier(ServerSelectionToolbarModifier(model: model)) } - func displayingNowPlayingMiniPlayer(model: Binding) -> some View { - modifier(NowPlayingMiniPlayerModifier(model: model)) + func displayingNowPlayingMiniPlayer(model: Binding, onTap: @escaping () -> Void) -> some View { + modifier(NowPlayingMiniPlayerModifier(onTap: onTap, model: model)) } func withAddButton(onAdd: @escaping () -> Void) -> some View { diff --git a/QueueCube/Views/NowPlayingMiniView.swift b/QueueCube/Views/NowPlayingMiniView.swift index b245ebe..6bfed43 100644 --- a/QueueCube/Views/NowPlayingMiniView.swift +++ b/QueueCube/Views/NowPlayingMiniView.swift @@ -9,9 +9,19 @@ import SwiftUI struct NowPlayingMiniView: View { @Binding var model: NowPlayingViewModel + let onTap: () -> Void + + @GestureState private var tapGestureState = false var body: some View { let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" + let tapGesture = DragGesture(minimumDistance: 0) + .updating($tapGestureState) { _, state, _ in + state = true + } + .onEnded { _ in + onTap() + } HStack { VStack(alignment: .leading) { @@ -35,9 +45,10 @@ struct NowPlayingMiniView: View { .padding(EdgeInsets(top: 4.0, leading: 10.0, bottom: 4.0, trailing: 10.0)) .background( RoundedRectangle(cornerRadius: 12) - .fill(.regularMaterial) + .fill(tapGestureState ? .ultraThinMaterial : .bar) .stroke(.ultraThinMaterial, lineWidth: 1.0) ) .shadow(color: .black.opacity(0.15), radius: 14.0, y: 2.0) + .gesture(tapGesture) } } diff --git a/QueueCube/Views/NowPlayingView.swift b/QueueCube/Views/NowPlayingView.swift index 65dde23..764659a 100644 --- a/QueueCube/Views/NowPlayingView.swift +++ b/QueueCube/Views/NowPlayingView.swift @@ -11,9 +11,11 @@ import SwiftUI class NowPlayingViewModel { var onPlayPause: (NowPlayingViewModel) -> Void = { _ in } + var onStop: (NowPlayingViewModel) -> Void = { _ in } var onNext: (NowPlayingViewModel) -> Void = { _ in } var onPrev: (NowPlayingViewModel) -> Void = { _ in } var onVolumeChange: (NowPlayingViewModel) -> Void = { _ in } + var onSheetDismiss: (NowPlayingViewModel) -> Void = { _ in } var isPlaying: Bool = false var title: String = "" @@ -26,52 +28,90 @@ struct NowPlayingView: View @State var model: NowPlayingViewModel var body: some View { - content() - .background(background()) - } - - @ViewBuilder - private func content() -> some View { - HStack { - VStack(alignment: .leading) { + NavigationStack { + VStack { Text(model.title) - .font(.title3) + .font(.title2) .lineLimit(1) + .bold() Text(model.subtitle) - .foregroundColor(.secondary) - .font(.subheadline) + .font(.title3) + .foregroundStyle(.secondary) .lineLimit(1) + + Spacer() + + HStack { + ForEach(Buttons.allCases) { button in + Spacer() + + Button(action: button.action(model: model)) { + Image(systemName: button.imageName(isPlaying: model.isPlaying)) + .resizable() + .aspectRatio(1.0, contentMode: .fit) + } + + Spacer() + } + } + .tint(Color(uiColor: .label)) + .imageScale(.large) + .frame(height: 34.0) + + Spacer() + + Slider( + value: $model.volume, + in: 0.0...1.0, + onEditingChanged: { _ in model.onVolumeChange(model) } + ) + .padding(.horizontal, 18.0) + + Spacer() } - .padding() - Spacer() + .padding(24.0) - controls() - .padding() + .toolbar { + ToolbarItemGroup(placement: .topBarTrailing) { + Button { + model.onSheetDismiss(model) + } label: { + Image(systemName: "xmark.circle.fill") + .tint(.secondary) + } + } + } } } - @ViewBuilder - private func controls() -> some View { - let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" + // MARK: - Types + + private enum Buttons: Int, CaseIterable, Identifiable { + case backward + case stop + case playPause + case forward - HStack { - Slider( - value: $model.volume, - in: 0.0...1.0, - onEditingChanged: { _ in model.onVolumeChange(model) } - ).frame(maxWidth: 100.0) - - Button(action: { model.onPrev(model) } ) { Image(systemName: "arrow.left.to.line.compact") } - Button(action: { model.onPlayPause(model) }) { Image(systemName: playPauseImageName) } - Button(action: { model.onNext(model) }) { Image(systemName: "arrow.right.to.line.compact") } + var id: Int { rawValue } + + func imageName(isPlaying: Bool) -> String { + switch self { + case .backward: "backward.fill" + case .stop: "stop.fill" + case .playPause: isPlaying ? "pause.fill" : "play.fill" + case .forward: "forward.fill" + } + } + + func action(model: NowPlayingViewModel) -> () -> Void { + switch self { + case .backward: { model.onPrev(model) } + case .stop: { model.onStop(model) } + case .playPause: { model.onPlayPause(model) } + case .forward: { model.onNext(model) } + } } - } - - @ViewBuilder - private func background() -> some View { - RoundedRectangle(cornerRadius: 8.0) - .fill(Color(white: 0.0, opacity: 0.4)) } } diff --git a/QueueCube/Views/PlaylistView.swift b/QueueCube/Views/PlaylistView.swift index 08969b4..5b9b3a4 100644 --- a/QueueCube/Views/PlaylistView.swift +++ b/QueueCube/Views/PlaylistView.swift @@ -64,6 +64,7 @@ struct MediaListView: View } else { List($model.items, editActions: .delete) { item in let item = item.wrappedValue + let state = item.isCurrent ? (model.isPlaying ? MediaItemCell.State.playing : MediaItemCell.State.paused) : .queued Button { switch model.mode { @@ -76,10 +77,10 @@ struct MediaListView: View MediaItemCell( title: item.title, subtitle: item.filename, - mode: model.mode, - state: item.isCurrent ? (model.isPlaying ? MediaItemCell.State.playing : MediaItemCell.State.paused) : .queued, + state: state ) } + .listRowBackground((model.mode == .playlist && state != .queued) ? Color.accentColor.opacity(0.10) : nil) } } } @@ -91,7 +92,6 @@ struct MediaItemCell: View { let title: String let subtitle: String - let mode: MediaListMode let state: State var body: some View { @@ -105,8 +105,7 @@ struct MediaItemCell: View Image(systemName: icon) .tint(Color.primary) .frame(width: 15.0) - - Spacer(minLength: 8.0) + .padding(.trailing, 10.0) VStack(alignment: .leading) { Text(title) @@ -120,7 +119,6 @@ struct MediaItemCell: View Spacer() } - .listRowBackground((mode == .playlist && state != .queued) ? Color.accentColor.opacity(0.15) : nil) .padding([.top, .bottom], 4.0) } diff --git a/QueueCube/Views/Settings View/GeneralSettingsView.swift b/QueueCube/Views/Settings View/GeneralSettingsView.swift index 9851f44..7f37230 100644 --- a/QueueCube/Views/Settings View/GeneralSettingsView.swift +++ b/QueueCube/Views/Settings View/GeneralSettingsView.swift @@ -10,7 +10,7 @@ import SwiftUI struct GeneralSettingsView: View { var body: some View { - EmptyView() + Text("Nothing here yet.") } } From 937a061cddb0599f8c97afa4a4f41be092210ed0 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 20:13:37 -0700 Subject: [PATCH 20/31] Implements add media page --- QueueCube/Backend/Utilities.swift | 6 ++ QueueCube/Localizable/Localizable.xcstrings | 20 ++++ QueueCube/Localizable/Strings.swift | 2 + QueueCube/Views/AddMediaBarView.swift | 38 ------- QueueCube/Views/AddMediaView.swift | 110 ++++++++++++++++++++ QueueCube/Views/ContentView.swift | 8 ++ QueueCube/Views/MainView.swift | 12 ++- QueueCube/Views/NowPlayingView.swift | 2 +- 8 files changed, 156 insertions(+), 42 deletions(-) delete mode 100644 QueueCube/Views/AddMediaBarView.swift create mode 100644 QueueCube/Views/AddMediaView.swift diff --git a/QueueCube/Backend/Utilities.swift b/QueueCube/Backend/Utilities.swift index ae1ef10..975147f 100644 --- a/QueueCube/Backend/Utilities.swift +++ b/QueueCube/Backend/Utilities.swift @@ -6,6 +6,7 @@ // import Foundation +import SwiftUI extension Optional { @@ -91,3 +92,8 @@ struct RequestBuilder case delete = "DELETE" } } + +extension Color +{ + static let label = Color(uiColor: .label) +} diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index a2c0bde..df780dc 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -24,6 +24,16 @@ } } }, + "ADD_MEDIA" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add Media" + } + } + } + }, "ADD_SERVER" : { "localizations" : { "en" : { @@ -178,6 +188,16 @@ } } }, + "SEARCH_FOR_MEDIA" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search YouTube for Media…" + } + } + } + }, "SERVER_IS_ONLINE" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index bb9a6b5..c7de132 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -33,4 +33,6 @@ extension LocalizedStringKey static let noServersConfigured = LocalizedStringKey("NO_SERVERS_CONFIGURED") static let playlistEmpty = LocalizedStringKey("PLAYLIST_IS_EMPTY") static let favoritesEmpty = LocalizedStringKey("FAVORITES_IS_EMPTY") + static let addMedia = LocalizedStringKey("ADD_MEDIA") + static let searchForMedia = LocalizedStringKey("SEARCH_FOR_MEDIA") } diff --git a/QueueCube/Views/AddMediaBarView.swift b/QueueCube/Views/AddMediaBarView.swift deleted file mode 100644 index 8ef535d..0000000 --- a/QueueCube/Views/AddMediaBarView.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// AddMediaBarView.swift -// QueueCube -// -// Created by James Magahern on 3/3/25. -// - -import SwiftUI - -@Observable -class AddMediaBarViewModel -{ - var fieldContents: String = "" - - var onAdd: (String) -> Void = { _ in } - var onSearch: () -> Void = {} -} - -struct AddMediaBarView: View -{ - @State var model: AddMediaBarViewModel - - var body: some View { - VStack { - HStack { - Button(action: model.onSearch) { Image(systemName: "magnifyingglass") } - - TextField(.addAnyURL, text: $model.fieldContents) - .textFieldStyle(.roundedBorder) - - Button(action: { model.onAdd(model.fieldContents) }) { Text(.add) } - .keyboardShortcut(.defaultAction) - } - .padding() - } - .background(Color.black.opacity(0.4)) - } -} diff --git a/QueueCube/Views/AddMediaView.swift b/QueueCube/Views/AddMediaView.swift new file mode 100644 index 0000000..d73f3c1 --- /dev/null +++ b/QueueCube/Views/AddMediaView.swift @@ -0,0 +1,110 @@ +// +// AddMediaView.swift +// QueueCube +// +// Created by James Magahern on 6/11/25. +// + +import SwiftUI + +struct AddMediaView: View +{ + @Binding var model: ViewModel + @FocusState var fieldFocused: Bool + + var body: some View { + NavigationStack { + Form { + // Add URL + Section { + TextField(.addAnyURL, text: $model.fieldContents) + .autocapitalization(.none) + .autocorrectionDisabled() + .focused($fieldFocused) + } + + if model.supportsSearch { + Section { + NavigationLink { + SearchMediaView(model: $model) + } label: { + Image(systemName: "magnifyingglass") + Button(.searchForMedia, action: model.onSearch) + } + .tint(.label) + } + } + } + .task { fieldFocused = true } + .onAppear { model.activeDetent = ViewModel.Detent.collapsed.value } + .navigationTitle(.addMedia) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItemGroup(placement: .topBarTrailing) { + Button(.add, action: model.addButtonTapped) + .disabled(model.fieldContents.isEmpty) + .bold() + } + + ToolbarItemGroup(placement: .topBarLeading) { + Button(.cancel, action: model.onCancel) + } + } + } + } + + // MARK: - Types + + enum Page: String, Identifiable + { + case addURL + case searchMedia + + var id: String { rawValue } + } + + @Observable + class ViewModel + { + var fieldContents: String = "" + var onAdd: (String) -> Void = { _ in } + var onCancel: () -> Void = { } + var onSearch: () -> Void = { } + var supportsSearch: Bool = true + + var activeDetent: PresentationDetent = Detent.collapsed.value + + enum Detent: CaseIterable + { + case collapsed + case expanded + + var value: PresentationDetent { + switch self { + case .collapsed: .height(320.0) + case .expanded: .large + } + } + } + + fileprivate func addButtonTapped() { + onAdd(fieldContents) + } + } +} + +struct SearchMediaView: View +{ + @Binding var model: AddMediaView.ViewModel + + var body: some View { + HStack { + + } + .navigationTitle(.searchForMedia) + .presentationBackground(.regularMaterial) + .onAppear { + model.activeDetent = AddMediaView.ViewModel.Detent.expanded.value + } + } +} diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 309c6f0..042ebf6 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -22,6 +22,14 @@ struct ContentView: View .presentationBackground(.regularMaterial) .presentationDetents([ .height(320.0) ]) } + .sheet(isPresented: $model.isAddMediaSheetPresented) { + AddMediaView(model: $model.addMediaViewModel) + .presentationBackground(.regularMaterial) + .presentationDetents( + Set(AddMediaView.ViewModel.Detent.allCases.map { $0.value }), + selection: $model.addMediaViewModel.activeDetent + ) + } } // MARK: - Types diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index 5b76ada..116a3fe 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -16,11 +16,12 @@ class MainViewModel var selectedTab: Tab = .playlist var isNowPlayingSheetPresented: Bool = false + var isAddMediaSheetPresented: Bool = false var playlistModel = MediaListViewModel(mode: .playlist) var favoritesModel = MediaListViewModel(mode: .favorites) var nowPlayingViewModel = NowPlayingViewModel() - var addMediaViewModel = AddMediaBarViewModel() + var addMediaViewModel = AddMediaView.ViewModel() var serverSelectionViewModel = ServerSelectionToolbarModifier.ViewModel() private var refreshingFromAPIDepth: UInt8 = 0 @@ -39,7 +40,7 @@ class MainViewModel } func onAddButtonTapped() { - + isAddMediaSheetPresented = true } func onNowPlayingMiniTapped() { @@ -101,6 +102,7 @@ class MainViewModel let strippedURL = mediaURL.trimmingCharacters(in: .whitespacesAndNewlines) if !strippedURL.isEmpty { addMediaViewModel.fieldContents = "" + isAddMediaSheetPresented = false switch selectedTab { case .playlist: @@ -112,6 +114,10 @@ class MainViewModel } } } + + addMediaViewModel.onCancel = { [weak self] in + self?.isAddMediaSheetPresented = false + } } func withModificationsViaAPI(_ modificationBlock: (API) async throws -> Void) async { @@ -341,7 +347,7 @@ struct ErrorDisplayModifier: ViewModifier .fill(.background) contentPlaceholderView(title: .connectionError, systemImage: "exclamationmark.triangle.fill") - .tint(Color(uiColor: .label)) + .tint(.label) } } } diff --git a/QueueCube/Views/NowPlayingView.swift b/QueueCube/Views/NowPlayingView.swift index 764659a..677dc3b 100644 --- a/QueueCube/Views/NowPlayingView.swift +++ b/QueueCube/Views/NowPlayingView.swift @@ -55,9 +55,9 @@ struct NowPlayingView: View Spacer() } } - .tint(Color(uiColor: .label)) .imageScale(.large) .frame(height: 34.0) + .tint(.label) Spacer() From 0e7305baa450312f107b250cd8ebd10067fc7770 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 21:16:59 -0700 Subject: [PATCH 21/31] implements youtube search --- QueueCube/Backend/API.swift | 22 +++ QueueCube/Localizable/Localizable.xcstrings | 20 +++ QueueCube/Localizable/Strings.swift | 2 + QueueCube/Views/AddMediaView.swift | 176 +++++++++++++++++++- 4 files changed, 219 insertions(+), 1 deletion(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index e4804f1..be6a54a 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -31,6 +31,22 @@ struct MediaItem: Codable } } +struct SearchResultItem: Codable +{ + var type: String + var title: String + var author: String + var mediaUrl: String + var thumbnailUrl: String +} + +struct FetchResult: Codable +{ + let success: Bool + let results: T? + let error: String? +} + struct NowPlayingInfo: Codable { let playingItem: MediaItem? @@ -130,6 +146,12 @@ struct API .post() } + public func search(query: String) async throws -> FetchResult<[SearchResultItem]> { + try await request() + .pathString("/search?q=\(query.uriEncoded())") + .json() + } + public func events() async throws -> AsyncStream { return AsyncStream { continuation in var websocketTask: URLSessionWebSocketTask = spawnWebsocketTask(with: continuation) diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index df780dc..31ceec3 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -145,6 +145,16 @@ } } }, + "NO_RESULTS_FOUND" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "No Results Found" + } + } + } + }, "NO_SERVERS_CONFIGURED" : { "localizations" : { "en" : { @@ -198,6 +208,16 @@ } } }, + "SEARCHING_" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Searching…" + } + } + } + }, "SERVER_IS_ONLINE" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index c7de132..22709d7 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -35,4 +35,6 @@ extension LocalizedStringKey static let favoritesEmpty = LocalizedStringKey("FAVORITES_IS_EMPTY") static let addMedia = LocalizedStringKey("ADD_MEDIA") static let searchForMedia = LocalizedStringKey("SEARCH_FOR_MEDIA") + static let searching = LocalizedStringKey("SEARCHING_") + static let noResultsFound = LocalizedStringKey("NO_RESULTS_FOUND") } diff --git a/QueueCube/Views/AddMediaView.swift b/QueueCube/Views/AddMediaView.swift index d73f3c1..2bc1f6a 100644 --- a/QueueCube/Views/AddMediaView.swift +++ b/QueueCube/Views/AddMediaView.swift @@ -96,15 +96,189 @@ struct AddMediaView: View struct SearchMediaView: View { @Binding var model: AddMediaView.ViewModel + @State private var searchModel = SearchModel() + @State private var searchText = "" + @FocusState private var searchFieldFocused: Bool var body: some View { - HStack { + VStack(spacing: 0) { + // Search field + HStack { + Image(systemName: "magnifyingglass") + .foregroundColor(.secondary) + + TextField(.searchForMedia, text: $searchText) + .focused($searchFieldFocused) + .onSubmit { + performSearch() + } + + if !searchText.isEmpty { + Button { + searchText = "" + searchModel.displayedResults = [] + } label: { + Image(systemName: "xmark.circle.fill") + .foregroundColor(.secondary) + } + } + } + .padding() + .background(Color(.systemGray6)) + if searchModel.isLoading { + VStack { + Spacer() + ProgressView(.searching) + .progressViewStyle(CircularProgressViewStyle()) + Spacer() + } + } else if searchModel.displayedResults.isEmpty && !searchText.isEmpty && searchModel.lastSearchedQuery == searchText { + VStack { + Spacer() + Text(.noResultsFound) + .foregroundColor(.secondary) + Spacer() + } + } else { + // Results list + List(searchModel.displayedResults, id: \.mediaUrl) { item in + SearchResultRow(item: item) { + model.onAdd(item.mediaUrl) + } + } + .listStyle(PlainListStyle()) + } } .navigationTitle(.searchForMedia) .presentationBackground(.regularMaterial) .onAppear { model.activeDetent = AddMediaView.ViewModel.Detent.expanded.value + searchFieldFocused = true + } + } + + private func performSearch() { + guard !searchText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return } + searchModel.performSearch(query: searchText) + } +} + +struct SearchResultRow: View +{ + let item: SearchResultItem + let onTap: () -> Void + + var body: some View { + Button(action: onTap) { + HStack(spacing: 12) { + // Thumbnail + AsyncImage(url: URL(string: item.thumbnailUrl)) { phase in + switch phase { + case .empty: + RoundedRectangle(cornerRadius: 8) + .fill(Color(.systemGray5)) + .frame(width: 80, height: 60) + .overlay { + ProgressView() + .scaleEffect(0.8) + } + case .success(let image): + image + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: 80, height: 60) + .clipShape(RoundedRectangle(cornerRadius: 8)) + case .failure(_): + RoundedRectangle(cornerRadius: 8) + .fill(Color(.systemGray5)) + .frame(width: 80, height: 60) + .overlay { + Image(systemName: "photo") + .foregroundColor(.secondary) + } + @unknown default: + RoundedRectangle(cornerRadius: 8) + .fill(Color(.systemGray5)) + .frame(width: 80, height: 60) + } + } + + // Content + VStack(alignment: .leading, spacing: 4) { + Text(item.title) + .font(.headline) + .foregroundColor(.primary) + .multilineTextAlignment(.leading) + .lineLimit(2) + + Text(item.author) + .font(.subheadline) + .foregroundColor(.secondary) + .lineLimit(1) + + Text(item.type.capitalized) + .font(.caption) + .foregroundColor(.secondary) + .padding(.horizontal, 8) + .padding(.vertical, 2) + .background(Color(.systemGray6)) + .clipShape(Capsule()) + } + + Spacer() + + Image(systemName: "plus.circle.fill") + .foregroundColor(.accentColor) + .font(.title2) + } + .padding(.vertical, 8) + } + .buttonStyle(PlainButtonStyle()) + } +} + +extension SearchMediaView +{ + // MARK: - Types + + @Observable + class SearchModel + { + var displayedResults: [SearchResultItem] = [] + var isLoading: Bool = false + var lastSearchedQuery: String? = nil + + func performSearch(query: String) { + guard let api = Settings.fromDefaults().selectedServer?.api else { return } + + isLoading = true + lastSearchedQuery = query + + Task { + do { + let fetchResult = try await api.search(query: query) + if let results = fetchResult.results { + await MainActor.run { + self.displayedResults = results + .map { item in + // Convert relative thumbnail urls to absolute for loading by AsyncImage + var copy = item + copy.thumbnailUrl = api.baseURL.absoluteString + .replacingOccurrences(of: "/api", with: "") + item.thumbnailUrl // xxx: ugh... + return copy + } + + self.isLoading = false + } + } + } catch { + await MainActor.run { + self.displayedResults = [] + self.isLoading = false + } + } + } } } } From 751261ffc4005905d030e7a3140fcbf53936a1d5 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Wed, 11 Jun 2025 21:24:25 -0700 Subject: [PATCH 22/31] Bonjour services to info.plist --- QueueCube.xcodeproj/project.pbxproj | 4 ++-- QueueCube/App/Entitlements.plist | 5 +---- QueueCube/App/Info.plist | 4 ++++ 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/QueueCube.xcodeproj/project.pbxproj b/QueueCube.xcodeproj/project.pbxproj index 264f5d6..48fbb56 100644 --- a/QueueCube.xcodeproj/project.pbxproj +++ b/QueueCube.xcodeproj/project.pbxproj @@ -265,7 +265,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = QueueCube/App/Entitlements.plist; - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; @@ -301,7 +301,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = QueueCube/App/Entitlements.plist; - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; diff --git a/QueueCube/App/Entitlements.plist b/QueueCube/App/Entitlements.plist index ec706aa..0c67376 100644 --- a/QueueCube/App/Entitlements.plist +++ b/QueueCube/App/Entitlements.plist @@ -1,8 +1,5 @@ - - com.apple.developer.networking.multicast - - + diff --git a/QueueCube/App/Info.plist b/QueueCube/App/Info.plist index 6a6654d..94a4297 100644 --- a/QueueCube/App/Info.plist +++ b/QueueCube/App/Info.plist @@ -2,6 +2,10 @@ + NSBonjourServices + + _queuecube._tcp. + NSAppTransportSecurity NSAllowsArbitraryLoads From 82b5c886cb21183cc0a93f95300b5b0bccf1b0a6 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 20 Jun 2025 14:55:55 -0700 Subject: [PATCH 23/31] More granular websocket error handling --- QueueCube/Backend/API.swift | 22 ++++++++++++++++++---- QueueCube/Views/ContentView.swift | 1 + QueueCube/Views/MainView.swift | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index be6a54a..a7e717a 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -162,8 +162,7 @@ struct API websocketTask.sendPing { error in if let error { - print("Ping error: \(error). Trying to reconnect.") - continuation.yield(.error(.websocketError(error))) + notifyError(error, continuation: continuation) websocketTask = spawnWebsocketTask(with: continuation) } else { continuation.yield(.event(Event(type: .receivedWebsocketPong))) @@ -204,14 +203,28 @@ struct API } } } catch { - print("Websocket Error: \(error)") - continuation.yield(.error(API.Error.websocketError(error))) + notifyError(error, continuation: continuation) } } return websocketTask } + private func notifyError(_ error: any Swift.Error, continuation: AsyncStream.Continuation) { + print("Websocket Error: \(error)") + var shouldNotifyObservers = true + let nsError = error as NSError + if nsError.code == 53 { + // This is a "connection abort", caused by backgrounding. + // Don't notify UI, just silently reconnect. + shouldNotifyObservers = false + } + + if shouldNotifyObservers { + continuation.yield(.error(.websocketError(error))) + } + } + private func request() -> RequestBuilder { RequestBuilder(url: baseURL) } @@ -247,6 +260,7 @@ struct API // Private UI events case receivedWebsocketPong + case websocketReconnected } } } diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 042ebf6..30eb7ab 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -122,6 +122,7 @@ extension ContentView case .favoritesUpdate: await refresh(.favorites) + case .websocketReconnected: fallthrough case .metadataUpdate: fallthrough case .mpdUpdate: await refresh([.playlist, .nowPlaying, .favorites]) diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index 116a3fe..5d8a5f1 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -346,7 +346,7 @@ struct ErrorDisplayModifier: ViewModifier Rectangle() .fill(.background) - contentPlaceholderView(title: .connectionError, systemImage: "exclamationmark.triangle.fill") + contentPlaceholderView(title: "\(String(describing: error))", systemImage: "exclamationmark.triangle.fill") .tint(.label) } } From 0d2eb229cf29238b2668efdb5b35e829beb4fcf7 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 20 Jun 2025 15:16:58 -0700 Subject: [PATCH 24/31] Resolves on-device Bonjour service discovery issue --- QueueCube/App/Info.plist | 2 ++ QueueCube/Views/Settings View/AddServerView.swift | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/QueueCube/App/Info.plist b/QueueCube/App/Info.plist index 94a4297..5c034db 100644 --- a/QueueCube/App/Info.plist +++ b/QueueCube/App/Info.plist @@ -6,6 +6,8 @@ _queuecube._tcp. + NSLocalNetworkUsageDescription + QueueCube needs access to your local network to discover nearby jukebox servers. NSAppTransportSecurity NSAllowsArbitraryLoads diff --git a/QueueCube/Views/Settings View/AddServerView.swift b/QueueCube/Views/Settings View/AddServerView.swift index 6eff779..ba2422a 100644 --- a/QueueCube/Views/Settings View/AddServerView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -116,7 +116,7 @@ struct AddServerView: View var discoveredServers: [DiscoveredEndpoint] = [] var resolvingServers = Set() - private let browser = NWBrowser(for: .bonjour(type: "_queuecube._tcp.", domain: nil), using: .tcp) + private let browser = NWBrowser(for: .bonjour(type: "_queuecube._tcp.", domain: "local."), using: .tcp) private var validationTimer: Timer? = nil From d87d6e038e0cc49b071bb70ee12a8c1e6277d14b Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 20 Jun 2025 18:22:31 -0700 Subject: [PATCH 25/31] Appearance tweaks --- .../AppIcon.appiconset/AppIcon.png | Bin 0 -> 587479 bytes .../AppIcon.appiconset/Contents.json | 1 + QueueCube/Backend/API.swift | 7 + QueueCube/Backend/Utilities.swift | 1 + QueueCube/Localizable/Localizable.xcstrings | 56 ++++++++ QueueCube/Localizable/Strings.swift | 6 + QueueCube/Views/ContentPlaceholderView.swift | 6 + QueueCube/Views/ContentView.swift | 12 +- QueueCube/Views/MainView.swift | 23 +++- QueueCube/Views/NowPlayingMiniView.swift | 29 ++-- QueueCube/Views/NowPlayingView.swift | 129 +++++++++++++----- QueueCube/Views/PlaylistView.swift | 45 +++++- .../Views/Settings View/AddServerView.swift | 16 ++- 13 files changed, 273 insertions(+), 58 deletions(-) create mode 100644 QueueCube/App/Assets.xcassets/AppIcon.appiconset/AppIcon.png diff --git a/QueueCube/App/Assets.xcassets/AppIcon.appiconset/AppIcon.png b/QueueCube/App/Assets.xcassets/AppIcon.appiconset/AppIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0354a5e8e1b0616b62fe6c3aaccfc01ef40833b GIT binary patch literal 587479 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

XS$3}FZ<`Y=67-V5f>d%tXIh3&e4iz1r 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

lpR%y{kprHewWr%&JV_5s0%i#dJvDq|7~;4f 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%0D7CaK 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

|h^JN=RJ%$K#+`KHz$| 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

2WW@a~~hUoj)DVE~)k_O)Bv_Z>ak`?p)W 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 z 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%0Dqh*F0l9

T?nXBr>SOZE8_K`qqFb7=!t{ojXJ^>Ru6+bKW*`M zT%8(R^@rGsP#0EmwuA>n1s(mK)x{Nz?C3XOq*Z7nKRN_2NMlyHlU5zg-9IshXjg-h zb{@kKBVVX-#qd%;V>Y~~@p=BruXKp&HIEoxff-i;X!}`IOw+){J@tIkz{7JTwr3W1 z+17d)p9rp{Cs&PKQ_mWdrAg2?~EnV;`Q&7o`WyKuUtClzXFtGGD zB&DbtM;h0bF*H9B`G*%ZT<EI9>GE&zg@M4G4i~-tS5|-#dJepk(oB&D9in`#nOGlCOeE8 z5k}KAWm$iU?j0sXb1jYGx$t}>0J?5;dYqOMnUIQxDDw4{x`uWyLr@#W*IFl($!Fv! zjgTZ!_~r8cLyz(%qeBIuUD9XDdrBk0^l#d}uyWGCl;t-JaSD4FrUVPM2Csve;-#e3 zyGd&xAqem8??8=GH!ce9(oWEdFn(-cXPHt{TNl4CE#LR!`u2ZG>qA}m@2l-Rsr;%A zkqa~ppKEylKHD0^+Tib)hcj9-ZRxlV5oItXLGaYMeS%O2QY4NCMk?+yamEM&zK^hQ z$*ATkGA4`+Y?R;Mze9YuWL!OtyfLXYu7Y48i=f+;Z*N53WZgZ0>$u=eGVDTzG}b}h ze$vk}l)Z6!p*`HznQFhK$P(@`Zmih<^zv9w)$)&VH@x)=;NE5KC!roR00ZfSczF2! z3Q?ai`(WId`n?%Bv;_*M?;oFU;a&U0rayX#Y_OC84=BlyJ{I`Wqi;{_V6!HWmya37 z-V64Vid{TKd?L-Bq*oTkX2#+(D_3Fir%+(AIByPv)2>9E37&kqgeMwgX|K&W=lA>n z=&bInsWb;Xf_7c^T@NRu%*y@| zRry2mu`2IXYIR5AlWG~{ie(7pdkR}I-6Y!-9MYRYq?pvh#az9l{=2{>m44C`4-Nne zX9EfX{wzE(6=}%ak>Z}<)#DHo`uTjV$AQl5Z9wSqKB|J88igs)wiS?JcRp8- z=M$&fg45|1KB03q+gxjFSqmg4%_iAN++hU<9`p=8PnrG+&K-MeC=)vb{_Z1THM2fk zuSn}D5x$)f6UpRpPc2m`}4RYg^n@)T3~Gek0EMpOtW>2GiIKe{_=%&R(|hr)D`&e&|}k(A?VRlZ|ifeCXY z8-CjD1t54F^m+@+@C~ZEtf5antLg7+O|qZ3wh3rlOjj<-yP3G#fEC_1Sh_84`HXjs z8FyLCcm@7l=u-^S9H6`uv8}f%e=Cn>UT!^eNVA^hV0<^Et|$;(gvav3W}uZdlZWYT zbE{!FP5vg3_12^^ZuG zL7-o8A0^D#`UDlX(h)fu0n}Sr5`6l9pU!2}tnWVT&Hs-D054#L1>gM(3IBU-qIYa| z+S?0!2Bp+e14|EWaXV|@*EQc0vGlfCd>!6q+IA6Ec<>sq-#(L76~Q6e&@#5|4aFQO zJPVej&bMQow#^kQz*Ds(kpG!QYjd`DFDRvv( z#h+242&RAOW?VzDe*c~f zM+@ipu{+DGg)2MTjfK{1T3tF4VQh+^B?C4S(lkd4XzH}ZBN&pPB^|PraLnQ!5;(V` z>WEa_?Z~yOAHJQ$iJ;tpW1m{kg{}fjXFmSUspMM2y)N?O^CpLc38`-UtM8|XKb24> zmkB~g1D|2KEuMQWJxqz??#q2F#%|{vJ4X3;|Mtsb=u?JRYr7YTIwHtRFqoZ&@_J{>QpC)~K;9>7RsGa_5}a)`7w0 z-7FZM#uRcPKP!%1tmua*@(iP34(gfpu-3(_f6alQ4N8Rwd7GB;a|k4~#%dLg?7`b6IW z7XRYU)uPpW3_V}Snijr|raIpZpgRlyrythy|c3TV=L>dH8J%VviSJ;){{uzK2vd zj~MHBH`RKslbo^4vJfoz=?zhZhFX0_N$Ij1#Y7O_+XvNP#8HARDKvkB`D5su*JF&6 zUrKLa~N1z}biOHM|Ly)EY^(FeUz%+{$n}DOYA4Fh z3K+|5gcM(bS^<~_`{nwr0H5}j<9Z_2t*#m;6fKY_itN#!eo@XB<+Bxzeq`GQ zs;Go)gHQ5NUg(EUb1$X)y@Eh{+X|aKXW0GKPt5yq$F1I**k{pC8#tK2pAO(W)lD$) zR4_Z1x-N`?aWtN{?Xcq48^w!myiAa8At|eoU4V>&IQQws!U{5KPV)bAO+gH|PAS(i z&+%efh09W%&MiC-SyE}JtPx+JeIOt(Hwf*EjX`FI@OeUS5r?=kqa5Bz9Zh6EBe_-Q z$T<5(a=T6)sV07nT6#J;jEcqKasfZS46J<+ne!v|D96FN;z;pAPi_pLEz2XN2KZNX z&xQngXo3p=lGSf1`!HocBR3ZAoC^m1x3mZb!T)jQh45dt3+ zP}a{2$o=0pG?rJz<`J}bAO{H&1RQ_FFpTu3O@dg>H0w>@@Q#E#+Tv=5{>B=(afKO> z(sA|O7PCjSjvb8jU7Dii`Px;5UrHcfs2mRyNgTn99xqih4X%5~H&=DU$VZ;FUm=>k z*VY}bW<_bK`gp)F*e@t=l!sdrUQu+VVBJ(;+2cV(DyE-C9Uglnc1d-#Z(kA^w^HGK zVdhH;Wphg10o)@`w~he6M;1Xx>!*|adAI%0pJeP8O`I)_nk~Ma1NWF~U(~S2ehi{Ci0@&yD;_x(bll_kWrDKB222C% z@nkATw;mYVIUzTvk@V{n2lYwnn3$D^Loo%A9ZLgqg(PkoQc3y2pq@_uoqn$_?3jUIw-k9L)Fb?eNNS4+uNzrZI zXO_n*SEY-~^#ZQ!gupCQ2P@ocXLpNu#j0jfZXIesa$}+MDOjRF}^OTScomZSTzzzuS@#C+gaM3 zRiH3I$nt@i%TT2)O8%>7ac@<%1lQ9x+>s+6L;G5$!lr^@^EE?=>Vg)g(G3h)%V6gr zqpC;T6}0o(cKrW6QFfgX7k893pBehxq2E(HKtk@evjwiSR8vBh765|wHYy0xdg|_D zd)7Db_I|H-*+Cgb%PIZ>8yQvBpcytDCgMtZ>9kj2pHNBlf$o!{``n*zA52cSOd_dE zN9(zs!xn%>14y%b4q8B^Gpwy4T>}hSF3&T3s5pT2epbdS(0w!&aG;<5UJw+GSTxAo zBRZwh6Fexen6!FoXlJI3P0aKtKFbNQc(ND=%<}=|*e)$m!uTbNWAtp=kk{FDGIcsR zZ6nzmrp1}9>LnM}1Pb?d(#te;kGY==m&G>j^m{V%WF`JJH#D!?rQ7|b9a1APC!_b~ zL43mNAXhg1{ycc!*=sHA7{$Kbft(by?!Oi_$i(m_*v+X2r{Q%S4C7J0Gvq0l!Zjz+ zay#hq*KC}?#HAQbMaK6Ga=7r2Bo^Q8yc4D&A3vw5^3*;#YE)X37YhEnjxE@Uk!xXs z>=8Knjc2)H28gC6?`Y)O%y5-cSV%9-wsj+agb^GagUFxhJ;TG(uOYywcQQRTmg-m4B|Q_Q=u7e^m`2eaHbb0BQX4eF-iAttG_;-u@9d z6ungbA{)=fGh-ltf6S0H8x$t6C6rB~jPsPyJjG8t=4*LImtXuf!qbFHI{@f~z&X$|{i0htd{0WgIuzofwnCSO|Ub6z9 z43VhKB1?5d$;~)n3H*JDvMR9x)O;6I2(R=XSBcohR;+!yLOLau3}fqBr7|S1N}3Fm zvNTzX{N&mHQL6pwSoZGEaqG@z>|Ckh6eRHDztIv@!XAwGRtIVzcrEC$#F%=xdaMNC zkr~2xJroeJhbAJ|D+H*x;jUi-M5W#+xX~>8`l3xNYw41M9qj$Pr2OZs! zY4C?mpc^C;)iLb!wQT*(a7Q7^BR*_A_u;7M^v#&SwV(D&>*Z`4C#t`{;F4j6VUmwq zLet_Jk~#Twb#Y2GnxAQE{iAZ5o?A<~aF5`*ou}yt%T17UXi*VAz6# zy{)pf z?rOl44g}2l8GoSzYz^g-x|<1ZCT=4mXtxw%E6ADbPDvjeOZ1KvM{lj7Yj@;VNYnao zUx%C!9D(=LXG)?K-e9~FMYz+*eLyn&A@1l1Rs>&V(&;pijV8wLG9v;;SeYT=noZ(Q zH!=YEURWo)ik9RetkP)aOBHFEi~&Oq##$(ERLkRU-sbE|H$_oaUHQcLly_HFLY7o0 zC8h#8RK_N}XYrB!NLTfTjTQyK`scFI5Ax+uTP*Y}81{4L*Z?KFZ-YAqcS?vPhr$oZ zK=ViT+XR!qr|noH zQiHuSyf1h<(Ts$2TrL=uZCY`pllCc%r&J&6iB6Ax>S#mD{<8%Ot>op%y-s#x9J)gY zdr^x+22H)-4m4Drb}jKff8n2}>#w^A5UUBn6nQ990^6u4m-C+8Mo=-O2Q=(;i%!LH zWv@dRa7pDz@|U7=}a+aNR2PgwKi!&?fN+rr^tjkLu6^UcAMwvNhZY_)?)SfzMuTa-h7qV zTNWYV6t`?9@Ka84i3(+y;plkjA5_jswM)q7qBuUmXKPu>cc`!=((Ig~ckx`6Ioy3G zrRQ=vm=TZPq!cl~dPOzvXrZ7S%L5~cX#nX#oM;y3x>Aq3PARW`oio}xIYF|lLuoQ5 zVHOr!YT~6Wr_tb;2_qhEWe;a2dlwc%+myEi1Q^scdIIVhfWUZ&8?F=OQx%-d4DP_o z!Qh?88!;cGv&)4AWGhc6*kP2oVIM478r5d!d41Zb*5)|za`PW(Ry-m?ik1-gE9py| z1cJ4x7G*sWnm#Tu2N_r0F`}9_DOF+Ua(4*g&x^RvAN#1{I$uOFc3-0v-%1O00AE;U zsr!ZM8AMP_oh8UOi`gY5q5Zm;1!R#DX&! zZ|Gc)clWy_JV(_um))998ByQRfOI`A%uI=UXgQh5C}%TY z+PXyECg7bm5k8asU*;*{Br)XX+s_QTrvUKMLy!-mcWB@3+7m5F4|90Uo;tdvL_R*h z4XTg;R!5h0yzf_w!6*OSeW#j5Z}{XQ*Zi`NMYj2MMaPRkkH#DDc5bWfzJnkC=za-8 zRNWBamm&YwQ(d$(!OTu~upH_jT|T4WF{D2BuYK6VoJ4%?qJ~oc)uHu=ln1|>&cNCh z`doB%{^P>cmd<^r|-i=_aQxWd+<{8G~U;wsJ|^U=6`$Nf*4HM11RqM!Wf z>CbuF6I?2~zITU3Lf;V)kbx;;cH$~n5Fjx;%g!KL_|4DDlTWnAtG{$)qBI$$lk1o= zy{SQ%1#?wS?K4%w&mm+ySDYhzk?sZQ_GCh3hRJ$`Li+QlD4#rCOcyR8nzXua3c$D% zj*7wJ0{z-OQIL1U86n3OojiJxhXEdrS%1rF*`*mQY<8sI4HwEl0@;eKC zj1Ha4V+*--wiw>RQV}LFezQv}>LD^&5CX(o@2D99T;?K~>n?!p18nmKjD!FU73r_u zysq01n+?kk813%MJR~CO^LaFiT&0u6-f6b$_`xNpLG|D$cE=EF`Ee`7^RI_Y&w*FT zgqyMfo7pkRmtZsG1>(mJm5+Lqr~H-Qvg#wwQqGm<10;fus=*7S-pjF1|~E49Dv zM?RU_ZL?T^$+%82NB5gqF&tZ}@tF_$Hx8l{TV>;>7D_uWsZpkH3i@>!6iJyQj}nx3 zs$SqiIUs-UT5+uE)2RFVROI z$!ccGi||l>32^54`-y85Ue?V@9O~J0)LT*Ho|KR@=0ofJo_wzxV>l(N7!1>8qA*k0 z^l2J;(^Mo@dDh!}Z5M5!GE|;U4f?63T=gs(L*h&NI4mUP+p2ti{c3Z_+FQ<8aGdWR zZrx}Sn6-lJQN^>N;CobajnRrUb;1Ams={d-Sv&sr3l`29NK{bc0R&HM?ZrF@Vy35c z3j+_}knL%LW7RSMoP3N$Mo}L3YOFN7JVBFmhbvgxY+M;V_hfZQE0cteYb%FZLosC- zH}B|pS>dHp_)&>X&z?XOzEDsM98bZX!`Sl3SwiJIX$fA13v*GC=d?>yA4_T%D}Orkf9=@?I8oBFG1$*Onw1Sqc4TuxEW-!SC>BE20ae)xvAxr zL%Xil)+15juYOcUSS~!Cos*BN-=fJ23y&pfoL%gUv9Lg%|A1aL(;SFn^2qkO=-XP) zj61#b!8xE8sF9bC1vwO6oYt4G#OXEnyg1q{voEu2{!tWrv}`zeTs)*lx~Z(Hv&hKv z_8X7}0Q?}ppM0LD-{%>1p~9;}2FLT)p@%Vj$36h?oAKR4@UX4AQ^A#???q%1<)VIc zo+-f6WX93>h%*lN-v2hdr~|{8>J5fz>@&hXT34W;q07$JmYy&m<(0!1-?SY~B5Qs0 z&B#bOt4|~|O|(9uf9NR6bP&;r&w>!wYkiYKf;*$W|LKUAz+P7;ES@g2mRC3OwZ6#J zP+{nNLaCiPIU@lEcYHYQ-#s}-nryv4dSjQ2GAmZT;T;T5H}7APbr=w14BEUL?_51i zSP2{@Dqt(Wlgg3Dd)^AcSC%bE&jD%_;KtF`R}=_sP=RptItlLkf&yVNqjARsbTr>( zwYr6yIi({nir>)ozVn|=f?c=+M~1RS85|jfQdUPbNJWuXDRgQ2R^eX!MlanK4B8p5!`3P zbuzxe?g^W<&b|7>4ykO(nbAdj$>uU_>1reQ5HB=M;PAGNnNjHWIwm3o-L$+uW zjs*0V(ZkP@F3z)TRIb0ea#5JrMX_y>l?v<>XM*(>t+=3rkygTx_P0EB&VpDEg@!*@ zXGb1g4L@T%cl*g43yM#mO5*EfshJ_}EqMr?#~H{7e|aKZ4=a9=6k%rO{ANQhn<;5C zd{f1wQm%$>{+W^GK}rclmvF)5Qj@+p-;0dOuUnHM@QXs*h+_}X7Y-c2u&US5iYn7x zKwZ1Ij+hNk?r>*IxrUGHy)H+5()?~8=B#53SP$psLlZFWl4>KAfJ;YP`keChGoBjZ z$Zba)d`Mv6^1vtOy#9xpWa6Ems`Xc|a|aI-b`X$aEDGrp`l$6C;q3wp;$!sjL&i6T z+{;-kR)y8r@!A4cZ2AO#HaShiBEWIFLjg8bO!ApTIL2o!vvgd2Ob+(j=U?MVVt^cC>-tX@- z0}S2W-Q7rcD_u%=3P|_Rosx<$bP5Pk5<|Cu3Ic+Jq=aIKM`RVM(zV@}& zdM@{rGWFa&hvSeYK({q@I%bz#`7G5GK>cF;f0cMiKMq*{T@!+G0(oObsBahmtPM+O zFJ#ud>I_Al9Z_PQr)$X$t|L%ms_owSG8G;p_v^*LLBh37t%>M8Kb5IKDXNFw+oWLY zsAZA9FDcM1y>y5kTBd%qTtBzQq>#v^oe`_L z0jRmwb>k}zCfExVQ*+R&$q{cszthBE7|wOF*|9f=y_bptj0bH1jj|+bgOi)eG?Lc) zcZm<0x_edx9y(4saom)&*BjenTJybc3i4Ak&oBMze$@TgdYwj z^@vZcY%0%wJQtX zpIQ>H^L=%NZ&^iJzFG{=SOrZY+Bz8fsYXfkAaJvmPfhXfaPcr;24e5YC9Xq)%#1wL08nrLjlvkf+C|v#nUy3lN<@ zWJ~?iz{<4&%Fq=~a(3ZqI*1#XtNeX2Z6ny(HlHouL)A6bLT8mdJJZy`5B9vQf#-mG z!@+PH^D?Pe73CWVhGGV0bg&1spJRQN*aW-8`zLzZ9A>oDf5Kp4rGzp4WW`LD8&>|&&EBS5mS%YuMVTjMlYF0#qgW#Qj5aOX`zWtL*bzVe5XoeqBGfUUDofv(Q`k?8 zD^H#6R~p2C_gv6A^+T534_rXsFf!a|*18$+(!0)E2fu|Bw?qq-r7IeZZL#%@jbRwn z7ES6u2=Gwh%hfej#H^u@7Z@T@!CsoTI_doHHUd<`r@zO@!++x6i=5L%6a@XWl4ky` zOKpnOy;jSXM)dZthCC6i4Yp5y4hd>Cgr_@G__zU6Ie+a4@^NagMxMa0*`#4XN30hD^7>sPqQN5 zcU#%q42D)F7K`giuJR)2+nW~_n^tplI@aQ3z*nd_=i;9vvX@N7S&zrU~MD>BIX8-cqXmeE!WQs;% z-S)cX!dS?xOK#4Th;P~)RbqRW`jwQb56SN_iMX)*sb6BcvOCVdZ7}&4;x8<^LkaO^ zuQ__pCI&n9AuH$O_!~oz5-W(qRFRd3=*b&RB4il(Jm?Q8IBlMg9~{q0#h(8x%8la1 zVzd*HM4cmW4wSH(@_wcgAN_Yl!{5`HoM#nIZQ{?rk=C_v5*^?tA@XW;JK$ya#Xh+4 z-|LONL!$7#BD(f9MN@iX?*@9Wf3<^?c{I~DegFP}=YZrMx&<#ve)uCt+m$6)yo-zS zgQ{q0P|GiC9c@Fj+^0%`{2xo{5$Hf)432ryMox3Q#N(A+}4XN2+x| z*w`BW!}zFV-Ag#dh*27q!727{@ib70 z2l2Tr6H@euiF&vVqB8^0LVxpwe1GhMp_-b3j2ED{kftCS3E!!E1ah1nX&`+vWK~ke z3TZzf`%-_d<*KEdeXa#c?+h)@CLJ=nYK)>I{!4gehWcLlbEHrlhZyEml7CD&MFJUa z1>bXH!k^LbW=z!evHr%t`P5Cm`Fin}uhW?8r~~i5qXhcwZb$e3?{4ZLe-b$3=p|1# z7r*?n^Rzz13!!k9=P%lzpAA`)yQElu4~l^Rr`%DZKtJ9rJJf<9Xi1d|L!bdyxdzCx z!Yc7GBjIG?q!BQ}p`vFw94Os$ugv0{jePOtya1I)>+oVZa4XhxUGA|)=g-)o<7dzN zcyj@UXln}TZF;xcl$-QYP5JB?%c_IjEfc(&R*tuUezb(7gLWGx;^g>0g!)|jVT(Q~ z!f5K8=u=@eIN0{W{&&gx9nM~F$!&U08=pMo;x+?*$8_neMa>&occNQMmGj^?1r=K4zG{A1D0qL(3vR-3 z?l<-BmCZyK~O)Y5xTy`^}5FoZQ4R*aG@#8qijy#1hhPM6~e*t%*SC|zCx0E`~or*^N= zNSS(03CL2UUKv^Io|-AQYWjxK{lb?(8NuZYj;lPtL&O|d`{XxkE%}VhnR#fo2q3U) zSTEjwugP@yJL*?M)+F?WiEA#TslFQ1@*|CraZYJ8+Cfsi_kLygwK>P*JM+-B42`(zTpOYf|NA4q6`LneJX*dC zhoM3@)}$whj|U3YI2sGO(W%YG!2&+X&Q^%p;?%vs#p{;^O=#lmFx@MdiB~syW&Bc` zdSRwwUX42SL4zup!i`Qij#|KL$mPaa*F~Na^5@7T zaiuMzs^GkYNvBymIcs9>X((Epj73T!?>$@ggHt8HL=Y;rzZv^ll|P8oT8XPhwshH0 zNUk$3({?>;h*9=_M4pjDphi(Qu-b+!{TH^!5uQB17EfLmU14I5l%Y)o8zf6_Y)w7t z)t$g4OePn)?5fIY#Xnd-2C-L28bLE4e0J6S0*{E*g{Pw2!Sw`okc1g?<|O*!Qi!Li zt1H!H8Xm(hgJ3A?y%0*Hd6tA9e&a}UMi~{p_7D7>$t5^zhRBAIY?axqfD08D^Ci<1 zO<$_j=dJV_luj59rhmC}9%v`_aidHw5S6|+h?a#~0zSXd+72<_ zYxg?8LtF8A=XHG)lk-6o>gX&LXE*Y~2jsLG2rN&EM}ry4wnpVC(E2k05eDZ8!1P}k za8f+#NCKwN+0d_ks|yf)ZiGPDLUtRMYs85lD+#|~4lv>m*9`arX=xI`T1CXj84>LF-kDcl1l)R;LS;r1Dx8wg_5L4L5@Lh)ThO#e_4)zu04>us`{G zXal2)?!wGVvOrT&6|Tw_5CFET>$nI*d;y6#K!o#V19QQ=N~ zD`^wkf)wpc_ev6%OHc@8o9)fB0cvW^&Q;c9q6BD;-LleNxMG?5@V_@`pf$QyH zOse-xeus+cCr{Mbg^QUbU2fr-NVAQJ^&%MZ{?sHEtx`d>64C;~yV$ndiZ;ajC5>gl zG`t)n3f&Y#T~7evX;&9-Nq*|sBau;8cnjH2zWgB2d0jOxJK@St ztdW)Do1`eCU(-j8hDNpyH6}aUyp4xBD^k>n^Jpfz@|ONC-k--x`V-?VYXAMX#)j*< zOxPF0op+FaeseMIiq$HhMw{UBSFGw1`Zhs)(h7Y}qo9tpc~=$qE@R2c*u7aNJau2m z2_b8AS8;3>2@>0Y?_bB`-kj%z3rm~=@@0`w-Sgdo2u-?(QM(=Z#)D|vcL|93CcI5= zpPmG;I6y&u$)UMv52BFprI83_Kl#g!pn^Z#!@(m)JTBOCf%?Od$q#rh(3@SbagD!r z6xsYZ8;U(kHz0*Ya2U&rS8S|l-Siw0fjD$Z#!I=fN=V9oy`+MYB=sjdhrX3JcZ;Ke zjCxFf_5#rkj;O?T-2%g||Dqs~Pr)^>5dPn&QBvYBHg6^@I@*}`(EEkdk<1tj6x|o} zC=gTzK!zdmG0$=vl+fI+ai-+ZYk(tMm<>LSQ9n_y4Gwb=BnmHz)1aJFR5^n^kFEPe z!O`;zs;XtF&-oPvcQ0i9`||O+)>=4;+?he~5atSM=~KK5R?k>H<*%%Z6DDY0Tl|*| zXt=m^Tr#nTN7EP^;u4rCo3UdpZ_~bSqKcN~mRBebO?5Be9R8f4Sag1$(gwxT=3`j5 zEjI8ZJ`c20<;GvNOl&s4GrY*p$*{DF{f$1c8Oi3_J`uYVu1&MFVA+YRK9L^>t7{C8 z3xp?4SDC*z@xD7c(Ql?|oieoV`I1WANzXjYV*R2o?Z*Y12J#C2|Gc8$~dXj*1(} zMnB<>Ro%nPy8LCVkKz&@!~U6ut%i*(a{;<~Jvx!U-$KD$eWeYTWnhVNO#Cj&eJyyz z>952TmLM#KZ`N+lq<_Q+G1X}cEecmuGW?3aB)`wsSpCWuc=qfwsoP|NC`SL-KMh7V zvn8jw5C{cdgEFT{oKIL$!y9T&jK!ZPe_<^if)~dMo*8c`$jObbPJw}iJZoNY+-mT z{u;XYmaUHL<1&;6}mHJwE@4A3&)!rHp1{%u#gZ-dLS-sE;S%wCq1~G^R66t zaJN)>EqkU3(uAcq7Nl|Eqx)~r@N-Q_%v&j<$?q_z6~j06{h`U1$)LhSGf+($Azlhu z>Vbey-D3Vn8y~+kHU4lya(^o+ig*7_Z-0MYpgd(d>8-CVM*h9&6AHXV$B664-&Ml6 ze_IkiD|Ca57r7V}_;eFy`(4o#rt27`Qcf|ZVpO%&#G#y(nB#5)Li?s8^@m@ir$QJV zM^ve@!E-1NVibhZU-6qabUP8=4@Vl%5Az;W&3fD>>!lOWB$UUX+hB+(YyABjL}7?6 zU#h1VGJy_oQWjYTayZCq?pH)ba)d;E6}E@dJ8V(7GUz<^Y0?s)k;C4t81hoJn&1** zU?d22Ek44=?!M^TeKsYlu*R^8FHu{&4o~oZbrr47iDu@i*?K#u1X-#+Yd4&8ASA9njf~_z^zys6koMjY z4Bebpi)`z^mkVdd^ALlrI-z#RdUoCD7l5#qRMLE0g-0*5FeDxpqGq2iMFLb#@P!OV zIU|05%8WLF_!9!(v|-~<1*!D;AH1R~+5;Ll&N|z@12+l2 zTpD$EUqUPcH{BK~r(>y}%Kfs{*O@6}l^-#<3as976md7RvVC8C`wsC1fHnhjB!G|# z7WoyLLeD_ASTy1MkDW;z)LLad2+#*-Z)lo4tpovdxTTcqG_R7UK=FUSL+oDN{9}6z z1BxCUPxOo6Iz-4hZ$T=rYY>nWEcZ4M{9|C$13LgNaKveZ05No%);V>Mc zh^g*{V#m%^{Fb2`wMKYy;>8$ggtkgGJ!cJ^>fys(0rq@&D%OLWh594@AaX*o=?#X2 zFUF!YX8kJoVNFLaA>wQqNn+x^3O*N`y>Ux5u*uFQ(KVdV!jiI?TC*m8K;I$*hK9m( z?lV6YcWy*Rix*>&VzP5r%BdE**smLc_R{0omVl=Ko@4~hVLRMSNy0jL0~;7EXF^{nMid(2iEO-P{LsBdgn$QxB*f_F+qNe<$UlEdM(%DUoA|W+=@r z^HluUs*-Er@H}5da6X=ki+ok3!ZdZZ?rRi+0$&Wa4fgB}!?Oy$bGx}K82$G9OXLsn z;*k<&OSGmgY#co2T&PGN!B2kPfj?hoj+{Bu!eY`ea0#h^k2h-p&vkL2k(P=QFqCTX zWjAYRA&N6?9-ovn;=9xnl%3rBViB4i_J^$7^BkkW(qet$r&!v@hRwsXCkGD#@W1o1 zZg~-)yDh9I z_4{rNv@jS4nwauzz0rFvF9 z7u27z>YnelJR_9FTy$n#}HEmTJmBC_|XC5#j~!+iZ`I=y%x ze)XF1Gf}y-7BVFn7I<iO5(#vBBK)v)GdWI^&`HcbUKD-(-h|zW(~&1B}Vrsb1Bt*BVPpd*WMbO zE3fejz|f^;Fsj08SON|4xE;e9ew>V=MEO8mu|j@BZz^5(xEcBA>+@ieIhCR%h9+VWpZF1v z_0~E!iSq%zX^X{vUiP1-i6K8fDf%3G9IZbba`pOMO)d_;Vp#ne=^smE%N5oi71$Tf zbx2LmPYMWJ?8WySJh>c1sDMTMZ=KW0o&Pd*pY>j!f6n6t2Ald|LO`|9Rs|09Y5m5< zpdhm3<2f(fx^ao*24D~&1KK?ns-96AIx}jd&rw}l=;HaCaCahHDlTMqh7IHBBc|aq z$T(N5HrHJYSE;Tc;gawDW4p!Q_lAI?`HB%1p7Vv1N%6<;kL{gftz2M~|s@%r#z zql%308QXc4ZMk2s`4*~XVVd<9xHF;DJ#ggJ(@XC0iwQ~icfJ;I0N;EWj&s^`j=Q|2 zIXLi<4%^@kw7Wm-Z~E_6Nfx&hlJ!5=vEJRM^RKvu0405QS`*+CET}{E<$(fYiVg`u z2J2%d6UVS~rX`}f7QXeE_ZgP#AC*rCWf9JcsRXP4u4@f+EVU)2(V1rX8&Eb;_kHbo z6o`?=I{-c6Zmg%{b7voZ=$2ZO|5(XUw0tp$N_ybH*P6}%0ELcgeI{4V0XRn_?>9FY zNZuxJj-#+z+zhG|e8|F&1IaHsqB{4o{G3U#-~ENGAy05uTlvgA`e9@fZMMTi<}OFZ zj`He5c65xn_>|x=vqtprn@(*%DVhg=!B6m9qL2OM=A$v1fu?$_E^+>K#XB1GbryS6 zsvbj?MsZ{))mv(LuK)Ud=L;-XCzZn(t|$}L!_uPZ=-2722b$WGJ&QxokXK9SCtL5= zMn*oUoklLdu<`qf|2TQn^!Lsk#hDsj?S|ou%IIs@rx>0|-p+{qFo=jrz|BDx5KEYFtox_`Ecniis> zww$6Rg0ipU6GvZIEUis3zb65}An~sr3= zfZ}H$7^n{K9o?s&Y>VIzN$IV+Pn*HhFVs1_Vp7LTD0}&N_ok3Txv3PY$&583M&jn6 z7eP!KWNXz(IW&3T`0Rd?BoHbIFo+p{u}pdI4e?TOCkFvIlP+< zKdZhUgolZkZkh_eIsSe!^S$2&EzJ?J`#rcoE+`$2U*Mz1y-qKKgM7aD@;UED@j&Z9 zY6UVaXGIPN>481v)EA0oYJvVU9e6Jeq80}oR6!?y^M!BoN6;b8;s9Eya8S^lW-ge)Y8Ndb{8tL~-5!BBc_b$BWDvD?iU3$ix?f?(qx(dlCUMYZEnDwqB$T@un`R*BAXxNcTn3&F;gf(X_{E^Gc% zGstpbWO((Kv>OKDp%Bco8XT?eB`H?^p$Iyikd5sE@jFf+SJ72QpM|f+%JYU ze|vrS7q1a2!>pJJvw>a*cR%cyNnac;c!f)(zk0En_BO!X_9v+0Pd`8hRcN`UijP zwa}|%)7c9$O-@ukcFhG~{~=}?MJ zC8SolQnQk3f{H;+^)W*ZeL406;EayKmrstm|2hJi#n1Z0u|Oh`g_j@n`~%l+EbpYi z*hKlJS~oxZxxV(Ae8y^(RO5 zFIewBzL6J|VlYCD^JpAEA#5j-@^kOP!OOHrzg_#Q9oH1mIle?l!$moM>!+vxRb^5& zI#AQzl zJ=ABfO3ZL1&L=2CHxffWO@`czjUM-(zTW9^LFo(eK1p|vFa)FW3vasv#)B;69w6=9 z)U9eB7!6G}KgN<=E;u}9bnwu5{Rx^vvSlwx<2^<3$pbPrtx-k=efi+bDMkJftyi#b znNqp?SNRCblB6uxR&O?o4~Y@`AW_(HB9NM7JZ8)YwZ`6#xsr%{&6Lr%w9Ly|`kN4L;mIk3qu zoqBH>is5O|lOQGM%f1?5kGq1BOlNv{n?sL_;ZF_kIEb2R!PF+GOK)n7ViLfl!k`hR zTG(o;UtP;g1YKC4T1TRzNQx-!UVEaO@ALn8#lI4d_91@OA8f&*B(~rZTF0_W*ud>r zM29${;Setc5_o}?m&i|uDeb9x<&MZ}Q*>ZTfR}<>gYAjzSq@Y$=~8@57KL^)F9U!G z2uLZvXnN*Bflj%)Xjuv$CiTaPshl`1pOcZ)shCR8O+45CcOc|pg}W||g=le7{ASIW za}j3N>N=xfutcWsLNYti{OuF7ord;TgoxvV%zESFqrU{+0{^GW_U&N#kcV@(sm8pV zBs{7Mv63(`5drZ#lALfumYd`kh+W@QHTz(LtPqF@5sG={ts1p_%!`(KxmS!??9%f? zqAmg{gYYtrODDO9(U)?kMd7LxH$ic1Y=}XVNl`u9hAAvul|V-IyRs>{=KJi&NAFpF zGh`d4)vIAd{IL^vUns5V8tTvV+a&nBQr`q`pOtKo9O8WKf&XL(8{awyg42!unu7zq z2Ar1pY`0v%E)xBPMBo)`EwIGFi$*ndt<)2|dvD>zu zFiN@LT^%L9nWi2B9(e*D29`Y(0Lt(qPZyhl8yJqc-+o*EFZqgHTM#AbHUMWW?eB8w zkERW!$Ao$&hEN9!bW?{6n?69Z-bOp5k##U{(zy}U8Y3Y@0C%w`m=wP_2t(&X80zu; z?DLN8IhXorkbhtO3@;G2r{Y9pr1$a9wLS{egEskq(AX6kC`U_$+R^ty$_G?6N1_WG z)4-CrYD~2_aLCDYkgpz?RBmL7O!De3Z4ls9ejJ_-m~DP0#uk!WVc#Y2#T5U0SsohX zZ?vaHE1k2y)v;d-hVndqotkq>8$|)%QD#eS(kx%8t4f~DnGN^Unbll9kqWNkaGj+r zGLT})lYpeIhy@{G(5NyJ4H9*WSlNMhTg7MEe8b5q*&{U2rTj&)f#kUDc zfG-%=_?Rx(D82&Xa=%bzQ)G9O9%^Jv>P=f8VvUBVwrWhl~sh8Gnivz-q;b>hK z!SYAChci)`<(Mu*L$ciM2DGwzQ(0*Wi~|BZo)Rcfi{wM@IJ8OK2pPru^x7B~Y(NvO zZx1(HjWG&rUE&J3&?spDxOliTEns<*AB3t{g+!=z^9?W8qq)z5?vPG5YA%d5=H((C zHG_L>^Qv~#%G*2wcX()H&bA6Jibtgf+{Ejemj@qHX4ZCs^`x3AY~8BykSc*N23)I8 z{J+s>vN|2}Mdd@~hDfQJa-ohJz(!eZw?m1 z(L6Dc{E7e0tbp>lIxe^??pQem!_wM_~3VTu5k0qk~|2ll-4Kaf1;@vRg^)@AN)d|RJqR7s%GUBUr znlYFo5~JV9^YW;VBlJ}P?hz%e$Me$I(uL1LD{f@WW>4*x)8;obHPuo{$en@Wwnw~hpHdu1L$!tq%Ey5` zEo9?EW~8IgXJpVm3$Hw8c6puCWK_^2K3%jPpOW;GP!#v!v@%L54LB7Qd?V~X1=OO_ zAoad@7Mo!MxP)IuO1u%Wyr?Y-0#y)hAM1Gk)44jU0nuPe7;URZ&|HA0I0x5qrO@mG zn3Y`t>ir9WYX(@80+l;o)jK@h8-DAQRDhtFdm(aYz!5qy7xx7Qtk09=SIX=ani}WN z#K`K*ZiTRNA3xF+MBFx5M<(_>zkdpj$yPD37-fAZyx>ZeQ!2pqYI)U1N?1pD!nFEk>f{wE7p{XAE)N zI{DzJq=$E_YTCNYG}&wSG%M4$&SGmcs^xJLygwAez**rjlFpBKm0+zF<|k? zCob4=YZlS z<(d#J4A)l603Iz`S|Nb9hFZUd+3_CQ=qVFx^{^n9tP^(ILa?NurG@hvv@0>szk4pL zy;md?z@8v^bUz1XP~RtrtgTMFXU4hA0(+v|7YotBco>VS6Di4lk}0Yz77N4hN;J51 z;rwAYR`qepLRk_bE3psx5M00fA6R%F>;HHK;CS*_^=%%n1PIXl@5CI(Q+p@t&>#iP zd%i?l*zhzB$wwcrTVCs!yrDynCMH z@Q(hoAf2I&L$*At{5wqzhs>fCf&^4yTb?_#rzMVe=;JnAL7d)eX7u%7s2{1@v{r#d zpbd&c87i~E`z@BHM@yG=47!4}Xt~&+q-L$Rih}^BE(6<;>Q!+zO;&Pj^ovL~16~6* zLZ?pqB?}y*i1K(g%t2(wu0#}FHhDoAS2d5;B$d9N@na^mmr5c(jgXuK^d$8+H4@wh ze=r;@BM;G4*Nu(jJ|a=&l{YLPa*YEjqBw+}c2IJ*3<>)t1Y>b)wI+ES06aSS2_K9Wg zP3`RHexO~gvWx9H^IIviN#n-YUKaw@tuAL!H3#52fLCiRBU0l14Yi@~3CQUfE{Wf7 zucFNbXeMLc6ZAQQtlN}qF|M>jVD?kVEy29bKPu;Sjt8lCFX8baST*V0M(>pcas}oy zY#CKN9qdT6ohMPos^ceSI8$q`|E8LL`x?!t4Yya1(<2G z(O>Y0*7V6}nrIByYZd5~wV`cK`~NHu%&Aqv=G#l5(Ny~4qCxQf_h7JBI;fXx9p5$K z+TH7ILu%(tUmWlYv{tce{U#DLoj%T~2CK)$L9x5(Os;vH3rd&k9$l;8l9RjHm6YSZ z4LJ0{E&R?T5_zi=-JOf5OM=Jw)JB*cFT^y#r$N7`T97Sxdq1H|5U)J}uPqj@L$dW7 zm-UZ177sgl5$N!XE~E@y*k4TFW)yENXr9f@^u1nXwv{gACx|hBi4@>05Y3 z&fJ*62^asTPxSbJtOEaV2c8V8H3bKw1QZ6!rO~kYep66@9?1OoOAW$E3ytEAKWW^$ zjBf=bCZ?(#!aj2I1kCItQ@bJQU94cX7u+=?<>c=3kp?Yng=P^<^WqlGyoF}^wk@AU zQ?#=Q^f%EJPPK(d2f1@-XUpXwiWpHi^D=W~$31E?yi7`0Plb4U8G@60Y1lBrfEyh!{X<=L5=zR=_e8wWmv)6l{ z+S{XBJbR)1a`yy9YeBT^>AzFD-YUSTV%e6__3ZM$_ z3b;{aoO5N3;4V7T;>}3bx206l_W6w1@vkLwpE1Q;@%V~J#;dn7y@7v{uH$2~Uo-gr zcW7YM8G~W4lMi1`e@(6;IBDz7v%(!#rild)BFNOcDMz?p4T7Vc0ocX?VJgR>#%$FPZA%JskMuQv@!O!bit-*Q5hx+T&mdPSP*@pB@7tUQCJb3G_z`Daga=S|}lMZ|wn$I7G+|{A=a*S_vtQz0Vjo zd|8e)Z?_>q8hLhbu=c43GP;6iqiYIh_=yp}Y09m}Qlm5=`-km!9tr_W7%043r9Un) z(}{}@*ArpStUvkTa_f^c>nx^+wNsIu1L%Zlu4w?B4rV z%U;(qRkL5AVt30V_x(zE66Zm{AO06v(ZFUF<2FY1Le&vU4V!Af_W{acis9F02C*c> z&Sn+!5UofO?1Bt^?!SLVD^X0)867a$>$s@-a?`|Ot%Q%fKmF;zwGsCoBak^I?^#4M zC<^_=C>+(J?7750J4r-y2Kuw^nY*6l)>MtfIe&)!d8WnGIoD-DMICmOQ}u0K$Tp1| zb7dY&#ei2e$1W^5U#&u*e)`SN?ty($l{zic7*U?ZrKN!%{Iap}mI%q!rR4!y`c4$~ z*JfybeYTh#Ju76e@c=a_u_AX&F6Q$^PeGOm!AQZrQ|SD(%}2_n5xhEWXH$mH$^jUG zdxyKH(*xYVgDr(?ALm*bEH|tPNl^{3P=&Mzie{m~F5?t|adaBTCD+)v;wHZzsUqaM z4G}Dc08|LIsTwlZ3F*NEp^n&DI*+FTz=$Z6S!OzBz>VbvcE)0H965$%Xv$V4K z-r4mg@3e^?$@_$mOx=2^0c3aL8&s4TazMst1cGnKaZ^Z>*az!Pj_4>pT~dS%j6?== z!qPrm>P(W@S>1MGna=InQ-OYqNr36T2=oYkq@TZlIdDrbfn*yuxqIm zrm6Qx5O3==K`vcs3Y;^5Jl8r=NaR>v#;gKu{rq6gg31 zMY#R6GP)CevVl<`O^?K}Ws$d30#EPvG{B8LlDQpa^cZaHi9#2?$rFBc9YF|3#6~2x z^TSi7dBY}?i3MZCl*6|9Mkz)i9)jK%X+^$iS9QTZY`8_oj2rxe%GDR zC42vuI17{eJ#7_4DR>Ke?_;JKHeD|fdn)y{{8U@jw)#!i~GnrK2 zzf1BH_L&FLqE25jc3EGnfR#{i-GMxD9AY{s1VGoIX?cy2zzZhCm>rZe6R+CJ-rbVp zF?-Tw^7%NpBE_7F-SEq~2kxzpP;$yQ^+>Jt_)Upvu}K6NIKY_9Sx4VoneYlo^l_;C zbt}KYNb1T)w67Nq0+nRyMIzm0K-~`Q%m0?{kz$iEEw%H+A&m zK>6_X_2tYe=zOSz??s)RL>jRSNvYT<_o(jiPw%IH0{ii82rqnKYA`CthTUA~IZNxr zH>L=_WBzx#BM%=bk<S5Riv$Kze7-ee)kWkglmgx~ec4n#%@wQ03oZShbbm-@O zR5td}+FKWqhh?s~Qojn@k3t#m?eRZf-$;p?N(nzCgXqqJe(hj+otm3N3GRBxBipe~ z9BoPMCu4c6;GRdzJ41H|3Pnaxep1W_y`3Ygkd5nw=mY;h7eI z-0EbPA~pq@f{2@fsGEYhXIIdqPp8jsa%LVS!;jJtZqn!bZ=C}Zr!S$eqRJMm@E=6@ z-li1C`kHGRixBzvGZQ(*S&Dj>Um9%Ow(o8Tpxzr{Y2%fz?ES_iZ@Vn7D zjKCSj+0XAtJG-CdmNZ`B!h14J=mwBTJ@EYtJO5!iHr+4(KjpEv__fJBZ{e?Q?0_lR zgx@{1hj>a^zwrkNM#8PW(>`&3P&2j=vzY%%O;IX{2&9BEG#2n0EU#QaoR1yeZ#1)J z_2XPa)+&C5)XS`SOUw-tvqhCUXFC>~aF>eQhc8PIeNLuxvI@b&m-gf56Wu*UbR7?Q z1kgq?TRY6)3-IBnMZe=U;09RGfG+@QQ!^w(A2Z`@`AxREPj<3G(9beK^f{>Ic-%SX;xlyyd^G{+5wM5<_EJXW@mfuvX{5fDD{XoixF{kCNIqtgBk&4 zx9Agp9b7#?@pWp!p(=XY!R$bz2*@qm=Gfv$}Y!QcUCYdJhXv%o4qqp^*Ij zL+eiUT&|gBn&raCHV_Z+@6n6} z@c2&=ZrJ)=o90z|NO8lDdCFa3rr7=~K8I44UIHoJP}zDCayE z2{FbZQ01i?^r|bcELd!_1FZEpfc-4LEN76{Wo9N;P9llv&(CRgF{lJacYBjFZr z;)LAD+~Yt7!7cohWHB|nW{hx)j~rB!If&Sc?%STXco-p%z=l7Bz@y^fm%vr7$wnal zcN_++1)r#KdZsTRv<%dI4YUI)hwW-Up_q$LS~zg$R{082CN8u>tOn)!=9DAct&vf^ zCUrKb+PsARMCi$L3Yr$Sf$Owa669x8A)C1HD!ImeE0x-RlCtBj>jI_`U-cr1tK)iYD zr4_tkFh*uXnvp9yFm{i96?0{GHE$~v%feZ{5+iAI5fGKw`DzYfkOMiV7(sX|&yIRe77Y)AbYwc9r&nL$A?W@<)bXFNmiu zIA)tqe6@_XQ$#oIre8wGSMT+1Lb1;3FNTJnC5E+D^IVI(T?r2i?w8GBjcyLe#fpx>A`j*!6{ z7hBU;iV*OhTd@z~D)<*FU*MS+23Z>issx^-UX@q^b?ZXTFH|H-I(w5QYr&jK_wSxy z5w0j0y^kU{$sSnpnt}MOa6KD_7p#3gni1k}PBQS8r3dK;kxx3D#Q39y zb(+suarBI!=5S=}g4O-wD`UC{qtnr8bYv$1AaNjlAcsGWIC$STLb$&7{{XWy(eU&4(2LW-TYMzSV9Xl$7ivB$iGmW|xlXCSy#$ZSf=Cl_4i3*aS z($L2nlOO*5dap%?70jDCHdi*V*{)-6*uq!d_M2aP4rmV{~ia!~PVw0qh_s8Kx%T7f_ z2a;lhEknywjRQu9tyzDmR|f$Tz1js6rPhE1&r%W(01Y54v9)yx-+cZXxc`|iVf|Ex z58U%n+;qYZGTqW6<|J7!!75iVC;eL`I;&Zfl~6+41(IltbX|~2Ax@sbR{6{n>!jGB z(vO%F1M&A|&$7-I&}x7hOH~`F!kbH#hv9+fz7dykH006M94TG}x7`6V5v&W+$WC}|l zvUv&ow*dg`zL_Mgulp9L-WpJo`HxP17`L~RU>QOH4d^?1F);*iEv2K|*HEaq2=(KS zrT~EJCI8cP82{@WivCkil%ispipqZ2bnG%-KbA^_C81$ZJDv1lit zeLlyg$G&0&KfWm0zd07oF_4dy1V%}2Vak9GL53J|?AKf|BY?>s16tDWfzHyd(SW3| zjYNe<-2aqA9%Jf1QG*5@R%nK`*(wgVN3gom;>maK#dB95Iv9cu0DuDk;QRUZ#^tm4 zk-L8ew6}@9-368*cx`}SIr#9u=<6L)H6XkyfS~dKbnKNV#waH{TeiJeey|Pu6KI)x zsGLi_tO*Y@)l!P}Vn#*_BB}W}M=Pnajk)6DQ~`9}$||6cq44I_H}IEFeHr&(cm#BG zj`x4!eK^vRm%t5P?#wQR|ApZw2J*9-UDfxj=UFP2aO9Etw7{ZVkrWpp{oIek-*w|;cW{7`->@e06B>G)(V2(XjBdxRGW?b zR*8WT#00^B<#HE8zYIVUr}`fwJ1z$by(m|U=H!=Eb!K_7T(YnQ6Nn;>Ua^~rn~%Yi zH5E%*?1-W6M>zpBElF1ii*}GG<=jFyz?zTe-!u=gK!_6ZwYRg4XI_5^_r3geyt@4s z?)unWIDOMPn$~|tme+v3^U9eR0`B1DqultPxyCa>t^wLkFh5Lq?8=k)^G7}l*X%)P z2n*@}KI&j6y(QE+BUXw{roHP5Nup}$UFnB5fq~ye4WPFGPsko{-PGov3`IV zd;IP2M&^8DwvpI;8dC!pq2MUPCYx_F8uFDIAzg#YXd;l?5QH`kdr{yD0f5AL^G={@dj9_aT36QeU{RZyd$1Vd#ft`JKyI zMhOTAgMRDAa{u@@ZRaKb^A%uy4Org*Hjnyb|IM3#&C`G!1s=ToD1PNLzl>k~+^^x) zx6WXO0n!LuOJEvuz7ds5L;Xq7b&#A^f3abLnUk8*cVR(+Mv4G26_5(}3dgcn1h|~w zuhv@3xvEbTFy>-ipTxW#4)uN-5b*51f83_X#Aws~S=mYA@b5DLe8qA@9aft;4zI3Z zvpt5Z?rnVWwco=+whsoN0|4Lv0Qi2sU0Ghm;n^{K_{b-5?dmr6dSL0bPU!n(VEDCU zUXmF=NQzNLF%-!6&9jQ6g@_FX98z*S)WGQF{fcRhi*=F85J_ecUP{ZUtkjE`0oeeb zl8LTqXZ3=r42Clv)Xwt79-agsdQSy`s;4x&`nDPDo#rJraG7{W5Pyd zkQc?SxSt&<>@9lfS~%CikqbeU@faHICEE#JW*5ZcfeAu_WxvEAJ;?bmAR}=t88sQx zto9g+HHj7V$(T1C-2*0DL3f8kSpy1LG?hK}WEe{^AVK+zQm8S?O3nB|E`lJV=Y5nC zP*E(Dz3fEr`I7{%!W8UnZ{wLap2Y)C-VYoRyzl*Y;rOWz&H?>3bv|*Sxx@kD1F`*M zMA_*|kLG5^=brwzcnP>Kq{!lw#&4%-wu0(smR0(09;Q2kdIkY z0|+WTQg-++@PYjt>gJm=i={fimTD+v-C;p5i;w{TO!X-E@Txi5W;G2#qQG2~$sQW? zqLM|gdE9IJrf!0`aR6Yd@{cATkxFlR`I^Z#sf^#bdi65WWK6sZ8XY}k0!?da`D5@$ zP*z>?cy9_-&t2yEqaQz|`}?q0O5tin20^NbrF3i<3z`m|rOI_Ev8)`pPm|H!Nla*-ejDs?yj}`d96odNM%KXFQra-t@0f#1~`)e@3g@8Zr z>-SRsEctJP6`=Eee{OT`g2XyM^$IBu_$j@gv~4l_{97gYj}rgH_=n-Y>wwuDSX~2F zH-ODeVDo0r`X9ancu_9lfBf@*f&cCg|0g{Boo}L%T{I5p-6B*cBikmXR7zzdL;)E3 zdOl5Dz)1JYbG)rljsbpT_9v^#M+(1Z%0s;;u>9k>7|1MSj}yeTmkZU5VLdi9A#Y%O zj1gS07I<}tW3TLBZj;@k;}sn0)^TL@5O~euo3G!8v)kV|7=8|J2LQmq4S40!^Z1F| z|07^A!``xo42>T|WxyZ;8N{sFV?CP>S|4Duonr;ykeEcP$`TkaKcer@|D4%+6H_ub z*|8~s0L5e;7ehQspO&IpO0idxS=DjOmkRX)_LW)Yu6P*lwy@u3+%K`aw}WS2eGY&5 z=zaM1@;f+w@)+*C=M+}=f)aq>wazZv3Q|h|LVEygu$NZ1gT_I0tTO_VOfp|c!&2PX z1X2>MW>yN;WZb9A1<1nV-^YG$T_30(FUwqM)R~RK@9*WKUb-mo$6U;zAbsqZ?ID$V zH!_NqL6%tbdyrv(bIuGBQVxREMK@W%iL&~{08SOwf-3ccR2yKmE3O?|W zyK!pnl^?=@EdAiWkPMiS1GoiN=D^0Bac*`I|JxV;6|QW*4&r6_{NxM(JJ`x7wVo#S zZ*6+k`XW*?dNUrCA`+(W&H}()PK8h8__zO#c%Jzl*tpX+_Z_=hg)o?&l zQHpx2iXF014G}HF(4@>PDR}#wcCJ(&qyzahP*mig=&PYtg@q;>r@&^BLdGxC76ZmO zWKnzksR9I8c0ON|xFYFC@pINJz0M3kY~9gT0cU`8h%+7STnzuZLBQWvRk;;Ge>vdK z+X`H24`|ZBACvwa8qe&LmigyY|0byb+Fa`whX3^H0{id7{#0#W&F>$F{t(9M0wCKc z$$#4cO$T%z;=dtr_-}&Zz}Gys=&(Lp#gVlmSf6j;{O(J5@byn& zj}DUm4{iqlz`+f`p6sH-HGJ^ozX!QG!(!26DS;J*U>H1QCTS=e5<{wvvDj6^x96msX3_!J*b#)F7$0<>I5>|!Mq&?T0vp@PY;vPhJT1E}??m%|#B7<6PY z!eH+P5cTK?SngiKx6ghHUwiR>ytTN9yFPw5j-S}T+T1^4vn+^4gc`w;=|@%qq-+4) z7LY)hs21QPiyZk6DfJO;C&UScDd>wEQlNLHKI{l3Y9f) z8UPp;7>31lSa=Trw9Q(UK^vgW4wu)5Fe=00^q$#g*q``2*&iT~Dlkmub0$VjQ{=8x zKdY4-lBwhoD%wP79I#rmr4Wr-e+yo4B@ZPW6N1s}(}T5U{5d3`=OGRG9IsVcRI?n7 z&)yiN?Fw8bhFS%X6W#sak3IgJ z!h3U~e+q^R0e{KcPaPODCHD^!f9jOqKg<0c7%b$a{><6qU;Y<{e^x&K$ojXOng7Ox zRDT!P{+Va|=NrKMFtC0M*gORsyA3#T8dw|$KKJyO@e7~&d3^foe}KK6^XRyT&`!vR zL9#KLbwx#SA~ipxM_Ci=&++`P2`Cg{$RVgvuX$`c02@Gvii$};{JUUlQh7jO_!qIq zkA5E3zJAf6k1-PcK=LDkW~NsBqpvAMR6qiaXu<_mo3JDHHcdmpxMBHVHM12}d|hm~NBZaED8p=O7b{EiAs0L9-)WeF)T zGW#gMv}ylZJ{f=j9nK^wV5u1TbO0cTEX!Pm1DeFhh_`<)$)hloL`acSVWTI;sVdTUJ zi$l5L!BKAP1Y7fqClc#=HGtUy&~T>~tCAG})8z8Lm;{QP`Y8^3 z0RX4~0L@rYpwA!bl?!TMYzZ(~(69z?+!zP|`#Im|Z|YlzOwNR9i6}w78t^AoJwdIw z!#rO)pX*~oRJiJBua{+t`kYOL)uCo#B9lpwGh2eZoSmsq(^@Pu?2`@Ci`NQ40T56< z+|R5jQaBr#LCsd9=2|`!p8jkPa0UplQvODz^M|2O!oW_}=N}aYENmHmCFiEmb8%`A z;86R<5}4sI_$7}&W?%`-e@OUm!r-40{!^V_f)sW8s@#4FW;i2{ljizSSh{|cWp=3_=HK2i0DS`}bDi|Kmf z1VTMJ0J}Ty;<2Z{hG*V-6q_dw;m(iTj?FcPwE>tB(1i$eQL~>b0s-SiI^_dI+W?7T zSi-UDW#{)a0-Lv!6`;B6+Jz-!IYkJ)9#jlL;#`xe(CDWsy={gqvwwfPOwJ z&qw9hEvo%S+LNLtO!u~nPNKJs1EWR)%8G{((Huc2DRC7lWXs6Pp$ey2N_$4K>Bdh& zEi?A^w(;UC&*PDoAH|jJcW~#2Z^6k^n>e%qw5x=T4WK>Fcxv}q{PREg7kKWK$HBY@ z@Q}p2c4jQI#2IC%<99jT-_YHRb^p2{fN^{IO3aZ0pr-M!Lk8%2b5e6zFkdKUcXndiqt9p#^KS|YH3YH^NiAc%9V$b}#fA2wp z{1}|JL6g1V3M5GB{-N3}G5nYX0H9O;{x%K&UhW?Ue+S2$)BQR4`{U5BLj82;U#q13 zO~LrbkiWJCx;XsLf%!VHwh62s_v!veZUxqE1HOIbHT>#l{u%z4zxY>p<@ImFxdEVE zi0i@Z8+xK;kx94UsNly6SZb63GR}iApti&iK%O|7U7-~Gf7yHUVB4~@KJ52>YwvT; zo$q_E2X(i)H6bKKM40u5i-b6_Ng%dUE;|*d#HyrZDC5KhCO{0K z3|M9o6i8sEfIt%(z?!9&)RMX-wPv-t`}G^{z31$`zWlMK?^|n~+YOOz3ZGqd`@X(s zK6{^i*7qCPu=qI$IRkC6&4L|lWoEHg1~!c|Kww&$;(m3K6dr1=MI}%&D8MxHAFe;} zm@Nk^0~WHt{^9_qs}o#Z9pWke0)FemKZV=!tH~b<)60;7}CsWH7*$cu4EPu zR4)^yjv=>;;`Bu$b}k_U3|OCUgGkg9Qu?QsWlC9*hk0{`7Y|J5_{8Twj^BIl@8eyc zd>2mdKgE~b`&{hr1LHa1*6|BE_M!u^R~KPTRpR@UJs=_I)my2D+!Tnzs6ua8*V7ca zW%**_R#aaF?rEcdVQr|YVWPHHicC0`$_+4!Xti&uD!tTwOvItMQh7$|UUQ=!B(llE z`i&EhX$ci7G_^QIm(E>B?3KARVE&{k#+T(E8xlcdQzRk?EBF^t^uO9006xqJ1YQW=nvDiZKBiUf^HogHDaG< zwsYudnST8@=?vslRc4Ag^n2luorZ|4@M#a6*60%l>ePfn)J^Hvpsh&t88ritKE9~Q z;3-8R)+Ups{#<?S$CX7c z43s5^Ey?ylRhS<%kiix-7kgWs`p&S|EljZbk)JeG4$3VRRngDP*^#1|*Z6qZ&t=x=D46lC3f>?0OmgQ;$RV ztT^bLiUgjORDH@C0ny5o6c{N`1P6h50LP{QWWvjpAisDFI<`sw5Um6m8s#O!ser#x z*+g7S`yawF5kUoq0V75n3+n-@}9v9OE*7F5s*?@S)>@P6MdHC_?n6btr7Z7Y9 znBwmlUM2`lm@&orz!@GJc+Bv!iGTC)?=wVZh)nR}L&zXW_!~SBFALWX$?qYoaEdIi z4@@H^gMx?mGbmmrar*V*^W_vP4NH!JWQ&8qmmnF%Cc`uxh}BJ3t7vOsNErx{RS*<< zXu`wJ0QnIU98UJH;#5WxhYIW$9%kJpL&p5_qr7oL5{r^xN_Y2U|vOH$r* znlWRISuQZm=eeIeg#wDQr0D4=G+n^tSETEw+zRJLjBWvrwS;;>(K|LIOJCIEhyX0H zBiLG4((#vWBWSOanDzL~)bUomwg|#O#2oJ-P!lRZQOrFce#T&qV`cdfd724J+l3@% zG<3L4qVino+vkT3wT&_ZP6kXKSbM?3tuSB&vEcgVHkj5}Egb}#xS*?J`YxI41l@fm zI(VdKq~Cf+(mtM2sCqfa#rj4BTx7cfKn5&^0}u@+|HPb*u>GO*OxXhfqyYgmKvDnz zsl!*)0-c3GEV!6&U^AUXvX^5nO9k@?W67u3U)~9pWw7nUV>P`Goa@_q&ziOj$E6A8 zY1Ivv?KV_zT2I~9<;Ax#|7x(WDnqRWrJ?uDaVsL7%no!c8qx(gh|tZvK@H83Z5^o9 z8R6up1}AnIM6M7n6=vl1j76NMeFvs|dooRM0! z=FDv&m9ikI*F-nZu)0m9Cg_Fi>Rf{qASfjRAbG(l2K%v$od7|n#OeXycM0rAr4&rV zK9})1hy8K+VUE|0%zvs{bwdCFlGlI#5I8siP7i|L|L9)e@eAN*{_q#^6R-OzeB`qa z!r>f_H<+2=SmNugj^@tsT_4j@scp>hLiTuSRG67iD51o8$WK6>Xp2gzgv_=R-F!q2 z;uEk|ssTw-C?FTBM+B4d@E_G3y4o+dK}eDM6OA$KZvaQ7fa3)mt58Vqus7`Ecs#vTXrORgj?iVIA6+lW(;|m2;Co4nQK?lbjY>mQ^VY0M?+v#tvYD0CnY) zmiOlSVkJ$si|N)DK)E`QX#s$8yM<+dd+QF#SpXyiF%o`(_zBZIK}6tOssK{qlXazJ zRzsjlT9=khRyt~?`!0M>4EYk=t~01AMm znLxU9@P}fgiJzYH?~Cc}8zjy3fUODq&tUjRr2uN`Yq8x>P?SDY0U}g=pWzZUwW);ovCb*zC=Xx){L0SAYHbP_^4-7sWC}uQ}*yANz z19*(d{zEi!j2K*C{xjSo!S{c#cYveCH5@NaaNB(zuYTkQae>>r;byn(0D#^0^xGHC zKa2YgR=D^0C2$ujY-EEA5zLt5;wmy?ddMQpY)W3hY56`C3dt@zbof}}iFEjz@=|Mm zeIZ=M%vq#7ktPi|Cb^6B`eVxiBn|A6k$lVK+2ElvV412yYXrY!AVM>WM`d9^?n$t@ zeFN`#^qqLi`(BU32UfWMc`v}}H3xRUavi>;v+~Tm4}n=G5)c>bh7Jwnj!K(VN3_lc z$b-5{M9y_J*&F9nWs^$tCuz)xZ`k zc%T;HC2PWVZHorTG*d>sPI@v6F~G87!Jk_XCekF!XSS0%Ddh3<3=U@-W{SH%R*Gg% zuAc4al7YXxCvAoSY{2Iwp^}9vZ~gOiC|;-m3~H)=YP~&AF)s=Lu)T${#S&;c@BMT| zb|#6R+FKX^ARb?{6bk@hI{@V>06?pysLIIL&fu$aJ#n?zf2M+dx&*$V4o1?kk5H>T zs9?y-uTH%&zY9~;tq1^D!1rbFL>nr)txKe*rZBHxDBHjW9-`FWMNqy1%PJ5!d{2;J z?8CVf`8{cv@Lt|beK~0$z*%d8l*>#*jf%pv13Vk)b*l2)_MDnDe{fUbmu3Aipp8Y@ z4`k38`RR&E2L z8J;&m=1<7#1P%D2$-L14(dt~30XS#<001BWNklyX~284?g~0y!5_rz#-p< z$unk|F#F)~&kHQk45=m$LJb?4)-f{Y^i&0iIsh=^}g|9DC3KcozqGj_?OjW&s#mhJUiHVq6XFdJxayG|}Uh zJ8?Dp!mJty+9EzCXMusb9?$?YY|`!vxKpz_XqL8GW~xJe90gQe0L(H)UV$xmQ|)(~ zxu!D;!u3;7U{Gb)kRhsNB)W#nfJ&*#OD`5W!I64B3?*LA&2A}`w zJ;2^o;6eE!e&ARB5x(mez8CL&=nug28pJc$c`!{mr-Ew*5$TY~PUWw_=8;4YGz`?p z%Aat`?uYA&8t^IS1W?X>%4ZOzeuS_Ej3{M4P)_tOM1?Cvg%6d>gI13Cq8=y-{~_0b zV!dBd2>^rf{HL`4fkNFe(*WWaF6bFcT48^2goEWVu8v1II$YtkpZ-Za{M0*l!_02m z0RX%0kGIX3@yO#J#GiZa%P{aUXgy**Z7>S~*$+&4n6Kr@Lh7X5w4K$R;b?P^B0Glq zdPO&Fg1w{)|C35O-bycP7P;kQnuJ-RKBHyAlF$tWr0NUKER+OQ5R+C43&;sTGe#1y ztnsPOJ&ZSh^!51IV;{f+FL^fZy6c-^vN2Mlcl5DkJbp|j8wsb%5 zsLloL->Bo?H;-A&%ULN>&K;-#zNjoB0%XGEFI0u;HZ=zq1%PNqxOaz;nnBcn#C^;b}=fOA|!h{Sj6Tc^gQ|+ zr0#+!&9iFt2AysiG&O%uyH)2D>K85cLKOVTm{^uqD2Q0W$`i;xr@!#7I zQvaiCz|kGR@x8#c=Kyy+06e)b_=z|FEWZ1de+R$&!QTefPhfB}z!xC)V3PPg))lbS zDAo$VT?2e22ZE^%8ZIglTN}zod6g6XDYi18LqNo}im29ye2mZ#$t0Z#P-OdvwUZeD zsz4-8p?${luhveI()~ve0s!Es1U!zs%%OiA)h;8J*y982FAi|UUBlJW1>U=UE#COa z*X#zF-L?Y&cH5t9yD>e1+ZUh5S3c((;ihBw*~8B>!~>p6z?l@CzB$=u4>fcJAj-f- zRj8QpGfKo6;z?NzQJP&z@;(9L;8MVW68_R~H--Jwi*|MW%&wAUV4A?CtgfsUamm-# z^;iORcYNLVY(4FX@|;8cpLopc3q1Il2k~1Ud@VjfpT!;b-G^tt_!?I6yJ^9|FvoTP zq8R!^h56@@s?KDa0!l`Jls6XTm}tMe1{|m!R}J96U@(t4VcmOy&+IeD!K`K{q~Y??P{t`}(tFJF2I3{E z0ZIZl&`KPOOkYd}1u03lkwvTFh`D125NcckRIzg)sxk$XT1PIUmSKlbA_Gn|Y`1nL zOPQ!uhB#_X0J`HFp(j?zPfLK1Kk{^`?PA{l)?lF2MOJ!YKf+pTAXNgq>aa%BDv>1s z@R%{r7hBvM`V&%T08n@EvcRPDl?6@CK|}gC?+H!$E6`%m918$&mEY;r#m#Z(NJ~!74v~+|M#`?l&!Ubg85JX8_S3oeLuH@gK4pOOE z+H`^rOjPmzCa{Bx`8qf+!~1L$0VUg{9^Q*}r#Rkg z$$t6XB302>y4A@H^x8Vs+5pOZz=ZX=Trt?*&J{K}dA#E=AAU#XAIm)CYo>q5p8sfP zOX>bpYW*B+vi}fVQf2s0ss2^1U;5jaJpKc)ScXc!{X^jR3UGQSaB>%Lct5au7VzoA zC-KTRy%K-tXTJ--`qo$C{QLv z4glC~f5Pq2+aJfut?+N%@ls$4N%QM@122?A>&o=g2CQ4?X-YyyFvZ#_jn!Uiftn;M%n#91Oq+U^T~#fc*Ls<1Z0dfEw}>+b?m6 zBuXt%UUR5=ioYxAEl4vmrMH+=@DoJ8x2krqx-aJB#j{xe#zR`E1xl3^tK&&^V^>~6 z+W;SG)|^{L$zTDtY%q5Cbl)8 z+vh-+47Su|G8J&9hkv4WGE|{T)SVhzNpU+oi;*PPs+{_^)RWrh_g`l-G-FYt8!*fz zRCEbZXCx%kpVwtxb?uz0`J^r4Y-y*!xrhi^aKB-8eXXa0;&0Iks3nk z{0_ZuwgFCU@MQ6@8|jA4o2>`!^m(8vY>;XYv>(n$QL5}xSA9-FFXvxT)|M=hCpO>R zhE)~&{h%3os(~gQ6i93X*`S%%#PE}0|Lg1YB6%DpUdjv$e!!CO_Cc2BRn`{{N8bpZ=YKARUbuX%U})RIzx5^CMP#i2da; zPR1)ZJvhKqtIy!)Kk$9n$i;4W*=;)jV7LAM-#+rhd+?m2`*F|F^C0UnRLl98>QBC6 zwW_6z^79(bRLbz57gwAt1+`>LE#cz8FA439ToF_KH6e<5fmuY=&w(l#u@#ZmD{L#7 zCB@!1%$Znr)C>_+CpFVH3eNJVdSS~myv!iK!IL*0!ykU=t$5@6--ylCH6D1@1GxL{ zeH;LA0yq!2O(yJPHb9iCrQsi1?yna9>iLxX0Lq9vQ|JlG-sEf*aM@4CY9U7T0?;t^ zHWW}VxS3reakoKGYN4BtAtejV%>m*0iw1wxF_-IgVluGz9wJ_Ol51&sd}LOGu{o|0 zY7YGjKgX;ADvRFiX{X9}t60`@oRJAkV%iqwg)MxaVyi1K%v`6EFlP_BR&AI7r}nc` z4;*b+2s(Xq9XT@T=ZyYmL)yVkT7I*<6GClfg4lDHttu?pApKA{t*&T6kd_`+PaQL+ zd95q}muCQErm8cTn!2mJBL&p!k$>7&05WX0QFRb0V5S17h++%CR2>`jkr@F1caZHu zR+~Xp20$PBLOmo?pYhLjtIj-5m#7O2bf$-TDP&~^l8y3=(X^N-P?@#@J++74exEeY z302)oCvZ}SiCQC%RWM|hlm|FBmXJSCR(I8aXHmYeZIGxNVVDf-np5-@ip3cW)=By` zc+m?1q|C}{kH7hzAZNgV^qs^8G;p?~T@Cy?3@)i5NP!BuicJ9uoa)?E;(HqETx9&2 zMmUaA|LpUR*Wr}vA7%c+CB85M@G0nT*y8aYD#qWbbbnWQ|CfuH?0*o3{(~dn@M=i* zKRgA7dx1ZC^nLj6|JirrpT7Es@Y%;d0j3#_X9$Oo=#)KVEo{m%Lu@~zI{!ffOFAUj z4D%=+{f_M<=Lt}(+sh2T$`8uNN%8I%6-*q;(-2QOk-)8@7D$(os%{+N zcm!gr10gm7Bo#ok285wMN&gqY^G{(d5>$lYSadRAk~NSIjw5*p`m9TKAlaLu^ro>x<8B;CaFvRILBXjC_~ne1yb3#*)7TUQlQGgzYm z8lV#Io8?~l9wmh79y3M(p1AQjy!E|r!Mi{I793wWz?XgH^RTx!U@1WnFltqpSBe0# zo?D7OaV8tG2H2p$+%2ry0oeE}UG`um-=mgc7O+662&DG+aTWGNM&_TduWSXnp2rLk zMj-;ANgB8L0FFmEH^haB&$btBEhr26He13BGmZfG5EO_h$RoL0v^U(GsxTtk?M9lJ z)-_6iX&opFWS9WEp4Oxr4<-u4+B!0py#x_6xMX%uE~!(a&R8QoMGv7rgV(8cw3ShB z7~2LMkpf0^8$4u7kQ-^e(v}CWI9DQgOv(a4mpt2~02nS&UR0_kL93|f-8>q?=|HSy8-U(cL062Xf@TvJpeBZDCef-^D`rq-1Pre`Q*6_Rrcn+0*C{{r> zDlx_CO9+xSpeYp(zoZ5zRG$A%8$@1DLLVEHm4G>9FX@SaSJf7fm zc>q2<$1gqf3Oqi2emAh}wjBVl+rG5h1{-|n@ps~@?t3Xt4(^7m_aK`Pnie{_B}=Pe z7(zSPNT++5G+?0U!<-sSY~TpP#8%l$StXF!Wm`{WJluv+)oJcFeKvimY4%67nSoF( zx=U7p)(c3(8J5LcL+*3}q|m|-s%?QFG{XZB+2GN~KZjp`@b!4xr{9C4=U>C~?|BaP zk3&cx16VkKeGLDLL3M@ISMv5M`QEe#7+XNPy;H-d^>u3RenQt#^)uTv|5PEUB>tw` zKHVo}`CY!Jl^N+kc>*&ae#Sg+ z;JweRg2kjN^+*mXqso)c9cYT0Rt=CPiXhTn+zrz;|uUpYruX>Hs$d5+rq+ z0t(XY!vIev+&1^Sivj{v;=if#Ly`Pv={GGh>(3a$GMaF|%>HMYf3RI-!-7N@fjETx zrD0x&_i?HEO96lBIt(lKA0z9(ScJj`U>E+Ky>&jJqb0uH_c_{j7*{Das1C|>b1 z--$PW@QrYCj)5n5H-TOJ?q@3B#bj$=4Op$!Gdc%=Y~xbe2dRz7oYSgvVmaVOmuT&}d6KR+a$D>kzB-wu&_C9d? zq+=oG1IU1-+rz=)6o>oAI9}WdUd(v)$NnBZbMf)rpt9R`0Kjhhm$RMu8+hdLcjG1Z ze*^9qt^%7G@D7uo;Zv_SOF{jqC*-0+7I1dwXF4ShnN>P4qO2@e0; z6pJFjsJp+YPS20QmLeY0G{eJ#IK5{uJ=V}{t`6H%HjI3qjR_p4>Ii07*Fc?R`Ke-_ z^N>f>WiQKTQ73yV>jG6=rw%ofbl6kJ^B)-<>FE@-U3cJFg$8bz$%*j5!%BQ&_| z+4Q+ys&YSdD*aSt08sZgf#F=p01#ZR#-M7rZvjZMc5&Eq7iuVyFH z6Z{9>1^}qzL^_p|>N8H4s!6t`>R$$Uw8Ov2yV!E<^(zZy>uc}XH!@J(bA%}nTZ6P( z9aK~V>h_BHxAJO^(&908iaYDo7Yi!r!9E42C2us02Rkw9&Zhip-!-uf@@-P}$@aLD zstVL~ebsl2^;Q?Ze-5ZsjDF4h2e4sKHG(CX9n>lTisZlexEY%HAF_9!X@rwS4*46f z$QA%c@!vcasXxl_KT!JNCefd%4E@X&1juZ^tA_tEg#0a*z;X}R-vKX3a*{Et8R-FV|Weh;@d*Wu^_v-1E=**?g+s<&$L(aM$LZqq@*tiGRn z*%UgckJXw?w?4S60AX_We4&CS^Kf5jj2NdX5HPRz6xH zwyb_p3gp00}13uY2b^BS|C<9p7X)H_s47(2*jZ!y`w>6$kEsnEU3 zJ+MT}h12`fFJxmCsA!8_iV|p{nQ}YG8z7AI zFay+8pGNUQww0u98Hk?r?D3D1c%fENu;u+=VvQQ*h8C_fUex!T7*!Zx{rviT9`8qV z{A^M?rTcZ&`_8eUpdCP!@_qr62V=s;&FgsQLw|@jJ@f_~J$HrYz3|02y(3KY zizzG^K!A^GaP}}&fUN(mhkXj{L!A-8Ibg7@-iw*V**i&6{BSAg1_}&-u?OgdGt5w* zyLnO2{_y^lFY_*&WzzH8)N$(pjy=D;2uZ+H1{|uWR}wVrza1n4_{1E5fX%$dKT=)NPjM+es)dxrTwmIAQe#oq0*`{00xW0;I!(>qC#{@&O)mM(BPc) z*k_=>&Ti3Q0dXVyuYa5D03+chGwhoIo(eOo6#`sa1IXSM;xf3vq&(r|x&uEck2%G9 zK90jZ=Q=;_^Iv4if2#Fk$zpG1(tEd=Lh- zvd4G{;}dmwabFQ9Q0HSZfzCR}*R*0}a6f@1&gKNAYCi=Up~)5E!uqF-0NCS2=R}m@ zU+@1>sX@k=@E?YFk|8S`bM+qz+n+K492OX40j4D!Elb)zh5(1ih$SzvKOW#@ae_Nm zhd4L^Uj4CG;NhDO?goOX|;*@ogvuY+qqWa7P zjk7F0?vpseEyCYcJ}^*JY9P#y9>y07_uO=gJF3!E=7fKi{C$$73S?Js6~J?k=1&dR zT33#*gGS%H0F~=198PVcM@Agzou)sj9RkCumj6H}XhW_voQfKNGJ<@gBB_ToYi4<) zo%r7fdDr?FhX~fJ2=Q2#r1>P%BPw7t^AAoWX*%Wcik}JIZ+5leH0>TTUMb}(@K?HL z=H9gGfubSYFSw#mPLdybC;aUf9k0A=KP_fg)L}mLPN$En6MK6vLP{Ba?n)^9X^a{# zEfZuUuvYs(%T;ehrTFz_R=`SFXE{Tghe-vaa{)n|;jQx94*93Mkk%Q1r(ObyBhgQb z@JuOx2ITPAXYCku2~T`QWMoTc3m-6;?^AAh&!X$HU{95Uk;x3e;!koDd^9Ug3(ilMS2<$JU=q|>=k*71UAd=Yh?4i6n4T;&XzaepO`7Q;mqD3&x~;k z{{s`h2xnNZ(UL^-X(aAR{a&c!^k*x>gq(t`&JJjM51*`7lQ}qh{~;zkBjT}}+jhxhVK*saBe;F~X?y-YZvC7ggvsob0(;KNdK9j^9*j~RC+75(HU3F z#m|MSIjcz;&h^j?peI@bmHV+}(=SnuIi=o~Z;?0Y=<3i%(td=AD^U*oV zXJ0RVzaiVhP5bZt&)-knF6b`z3ZoZoyB72f48+N$_j;cDH7-?BPwU9Rcl}azmfh|% zX*NG!@4e41H^=+)I@W=P(n)ro%t7=&W~3PE^*jEaI-W;)4~0iQJg0ev4F)fWnwC2|$g zsm*U)$VOLws}dVzsQO4)Df(%E`9pM3Y=EheEw1dJ<#$hZecHG`kPg^C@W6XpPVo6U z-TUMuMO8Zfju=9R6owSyCYTTbB@H6oABWkfC%21MuMA9h zORpqLf+{A~o<zPy}!UN$v+h!4iB}aRLTFs3X?f-6bp1m;Vfx8-x+UKi;G;A|` zxT^Cm!HdX!sd5@xs&%YSc>e@_(4i8}-_KIH{S5*7yd$m*)B%uRM}*@|`^C-l zq_Q9Wg|&$4Cp(>UWqATn#KXUMe}jM^k9joj>do{;NZm`E@bj-o$m1o1f6UuC^}lRP zj1nM@fY;!WDuwi&Msm@anD2hPg|vh|qFe}*$9zNy!wCDpPIob+g~vuIb_TYFp3kx$ zZpxob(Je9gMr`b9NqJ*K{C5;(_Q!+I0b$IJN`J&=LH~s2+b*AU)EuZz|H^XlI|TVX|BD6qb~u?gyKzV>y&3S5NZh>8#kuekJb z8}AZ1uZKDBQc;<_1x8d2)lWVsrj=f|FYZ+5$rk=VstxxJ&|E+2k}?|YCgOIX?Mm45 zrd!H}8auz)pN%cdpqu=NO(c9e4MaUA~@U?zfVR$q1m1%+UU#tbbOU7&&9&qyIF9euu0F0a);9Cm3AL&?U z+mk##EOHYPR_*?lsCdNkj8f_F|9311m=p#W5irdnO3W<){GCCgZMWjsSyA(hPIUrP zWQz5DP)7lk^^9Z2;4WO7NFm;3^EI)U=k@mxKTMS)t&HiQg-i>xhtA{+g_vV?XByoK z1_|=X`JjrSyg(kf;3zNWx?z{Q8K|AH-r4`{H$vEEoh$rRHzUGA0IXt8^RcMluH8Wb z{e}7L2g6y=1e|)#OB&J2d_k-Q!;xM`V)Db8x~{C_q*C6 zp~8G1(pdZE1H^LpcA2~svrdkSHBY}Th>5|j3!<{VAlAPib_Y=tU2Aklt#=pczhtq$ zw|&BoeF3Tz`3mYkUy=VMnrJ6gb748$VYrb05Cd{7YdG$30x~#f)f;-(Tc>K zIsOplxZR8wmj75u2b}iaXx=%%)&hd@o*XbEPliU1h8NiuNLc@OAXR2r-2X!mx{-L$ z11X;v_?%J)zflVM4DO8E&Lv2V6>yYVQ|8~4WgiwG79qQIl!VrtP*%AQ;mT$i(T_}p zzGlGb_*>(vlJQOWH$}odb|x!NQ7#fHCsb5tR~hN3H(ujC6iGAW3#*p4_*{&EJ%<%{ z^D*q5I57V>Z%s8tA-*;2grx0N`QfH$7^^`FnJ>J^DM((`iuV^e-w;Kj9yeQI-+l$R zJyQpGiKIV&D2ICfji*)o3I%AX9_`mM6 zO7cWl5y8oTNujQ0Ygu{P=Jyrn?jpepS8bc0+Q}?Vr4n0!)JkIE!Pn6xE>Ix0@!a25 z@O<1ci;Z>mMfY<=+{;wr)VP$Dh93*jeT$%cjeTRhE(>kU>@;@(BkjGe>oe~%T+yNT zc4iiXk-ya{s*l=$Hdwbrd3NJ(w$t!UJS)2OFMOAgy&0^6hK%@ zVhWx@LkX?~X%L&d%w)P^7W7YX21CU0r}}pW$!XgHuIHIZ>lrQNvZ)>~EaDl|t#7kk zv4;M=$@miK^uN<-IWhE5_Go2rC33n%Rblt9n}hE){c#hJBB?>ZyUNunK%?=x;aA?) zyJwc~5@fhHaWzvE-}e)n+x&YJp6%kw@HLrLntva9Z&G6}*?6zLIXZ4$R8zk}^&I)I z+kOdr{$gK~7rX4Ig*&UZ##g-MkG$tDq!7K} zEv8TBn>-neOGD&I&vai)$4!kggK)yS=ZJ3hZLaaV5tTF*W|RIht6*psbK`tWFy;f}TWjl=)~Tp5>+&S#(i%1_itYk}j7qqYrwlWNq%K{7w(z zB|-GBT~e|PXL80Ke&OZ9RP)i=atc|7i)YrT^k^241%;Oi;AQP8U?PTbChfZm8$lKI zH}YyeM&E9JuUp(f6>`MalrP#cO7D~0a&y`b-O(GEFVgN@G6f!Ct8ng!L9T1Tx5$!< z1NIvsI+QyDJ+^oK&_7gq=r-j5^t&C!q;x71y8X;Hk}dr7{Fmun5mnzaIa!q@+zpdm zvW2yR3iBv#^1HF&7J9olVu+(BYhh$U0`gsr{}z<4!=BFMQStMfHgwwqiw1AiC%S_- zjx{Z)QJch(&Ta(33{I>!Yy44g-_&jOlid`Htpa!K6fy&hz%_EkoQt=acYbO~6RKxC zYd|XW<=;nP9LWX~@B8?lYIpuCI_SxGFZvhv&41RgZ=OB!N+%Z~Fom^I);7A5Jo~@~ zfDBy3&LjSi@;4vWFud|{87GY{JUen&#f#;#Y7HGDrQ#mys1dFmXb{%C$FcZ&yj@5C z6ZW$S$i1hs>Rr-aqhze{xSxe5!Lmu~=*C3-TGWT|03T zwh)~;k^1iyJML}CMx(}+IY*Z7!r-hrntBt3x#s#2ko}gkgrmH8@ zdW_~ZU9M#PA$t6LlfG6-#*2CE?y$<;)kn|23(&mt`8ZGo`=o!E5nd+2>{v25J1@R47N3~vPj^lj$LpS6O%7K)gIxG82M zF3g8B1pN;S`n8L^^aACpo42$+jeIpCv};TG2oMcs>j?^;x9|1zH=7)0G0R@r=AfJ* zqC5^ea;}_=;vmIdhkW0Tpr5)mtc!KVX3&Az+Kw1HZ)R8H4kE_M&_!{pMD~zwhR*jY zQqj33Q7OlaxC4Z$gzu~U(`#s^ooNY@PC2<2tJk~!9VT9d$N6+BRTFbNKQGX~;A*Bx z!EX#V2&P5f+@@o^5L}JVDF!3^=?sJ0*n-Biv0UPtcDOLGQqiy$9%jL5@Vjm1ttgQZ zFaRe?YC^fo_4&;YPQ8)KHf7#t`;~Z2wzkcB#hQ0*{RQOI8a6C@ZzE^;ujjm{-BdJT z5}obs%bPM$tf=qyX%6~|q=!U)aG^iu^Cfuq63pZQ)>UH~3y&Iv9`KGybnCWx49L4a zwjW@W{Iuo*fjy?nU2}=DkJY>orp5|WLD?1bp9}~|c6z|1AX2JgkPUXq@Xk^sC_d-a zrJ~K&`o01_Sk#}@?|3tnK7m{1-y8B*YzpY7uPnoR{E41Jzw2>iHL6h5b*|_K2ZrnA z?#^RPRP|}L+gyE*n?nJS&Ljk{2f98YNVe-wSp;ju@p}wySNL(3Wdx}0h#!4Lg<2ra zvjeuFV^m^yNiloM$n!NUuVJpD*rk#9Z*GhY)c@u@DTo2z7W!Yv@RC7N<~f^_z_p#s zp=Gb>&6_}Z9x)ZJmDsJDmFvU!!y`GJLCsJzK*=uU*Q!EK7wPrlppyo0bZL2Gts}@Z<{Laigm1isS5lPi(_nuo!|5C~9P<=I+T|u(hZHG)ImsH#-M6TuLElICA;j zQXqxsUyN~;=7KUi=|P3Mm#FPC+S>(Mn+g8zVhwj?ofd6vrF;oKJ~Pn!BROLMiEo2Z zrUEU+sP)pAM08k&gNncsnSdmBq*mpXc$Im-KS6jY+yKYChx|;Dj6q7L@|Jm#MJpZ0 zVMv~0tQwzKEf7r4Nk(7a=V$34{}<-~$>iJE8I|%YFzA#M8}~@{Z_9Fv>7A^leEJ@p z=ynI9Rz4S5dND}z_{HDpTJ+Y>Fo1M??X{GOv>r8sqHPRc3>J85 zkU!n+ErxNHVjJUni96(aHI*+xoquoZ`Y*dpgV2|veJtn9P##B8qI6?`4KFk~QJa?A zpe&ON?&FItyRo+6wOw`Thrgtwd7o*?Vp5Yz{o|vv7IpB`Gzvd+UNcM1jdy%3Y83)8 z^KaeRcZ&YK8T5z&-LgbeK}8GeK>Wofpk&h4)ucJ-1jAk z?bD}8@5XQ?746aukj?2SKleassUZ7V&QCosK7iKvC`xx_+H(i@WR}1T$$FYxvHr=W z?7Nv5Psn$n-FYyOQQ}Bq)PRFxk&;Hte0o+REI%PtT~y**`4-C)U7Y?|)@|y!rMIqV zbrV*A`Lm2#;G#^`K&(gm>q?9sY2P;iu)t!{cuYmCzv7MY@REw2)!czUV~e(q0h#&m z)q+KFGlh=;ceHWx*3A=!_VX=x7QhW=Kw?Vr!hh7FUZ3WG#GUI`9Fc$3M= zK}qWX%@^Q@e{pM-@Y?=y*oT2T|FP8dytuu=Ce3x-&iRNdzmD`)4Wa^L^q!Gz9_&iY zx4u!`mv_>=C?%ZIQ^NX@8qFEDD0~Nf<&NWo?pM|iFBx=ieW5Vh)W}^*+_BWL#m*b0 z0$iG^mCsAX*%Bk$MLojnBTH|+Zf}#s=WnNwE`11Yji0?**YrVTLPW4flzGIKZ8Wq^ zeeO%W?su=hkWWv!oT3eS8IyCk%XUi<`Z{&zzu@dyT{u&HTwVM5;^FuUEKS}o)}>I# zzBiI7{tM_|p*`{k-@FNnSs zq*FAbrFj6fGUK-P$%&}^Lc3LbBo4cI;`+1k>a{rCGxu)=anBtnMI`GUR$Jg7$y>OC zzNZvq;_^u;@xO|CQbzo4n`l;z~qM=v#rD$1Uf33`VB^VQAs{czC8@yHdu1-7^9glAX@) z#peju8uKse!KS-D-!Y1R9x}|3`Wlwk{uA;{Rz=zi=9+I@4F$`}95oDHShVn%V{;Hp zQw(6|Pmk8J+IARxpw~vyZEeKloA9}hu9@p-GoZ?m!sI!;sLJ9;rPLK5=uaXNkJQ`O~h8Q+(rsU#xt#03a6p$XR(Penyq z;=HE3$`!zxd{hM!f%#A$dBkRJNCcpM1Oxa(_#1N)j@`ORohZM@j?MH9zi=!RexaRT z&xNgFdlr??L%ysz{O|DY=5(JS{}uLk@M>fo@_e=X)1ZNG_y-^Vu*moC3AU#hM2flX zivt^=L(rk51;gA;FzYkDHdGRkUR!+hGWA_5oauG%+j1SuhqxvN4%5&)SR7TD74uEs zL}Z^9#JGio>pdcFf^u65q1~l$*W)N5P4Z+xUbGv0N39BB{LM{f{{f^9B&cQ^HhQRh zmS|SZu0YEy+Cbqq09zvhK0@Kfa%WfjI3uGYkH znBdS51y8iPH6+tTEfhDNFgFAKD#+?yzOz>f)rDBwGXS9m0x4N*P~tF(U z)wxlgfZ^4YTi;ETBac>aa&erUujLfMS%g|Q(jG zj<PE z$8}Bt^(i<0AH+PtNZsZz3aG#Wx%R(_LcYz3LJC}?+6$u7lo)Y02>h`}f{!I}h~?p( zQfA+;Tca`XeFYSR)xP;xvYK)yrlGy;=l`d7yuH74nAe;0tFG$=*`wHMo3Lw0+}57& zd+j*zHqS}Y(??~y8$0nV=%BZLi?o>&*<4DjmqA?wj^2E!yzN4GHM zDYw3^ogqR_(g25`IR@a}tzN4rX6xjBCEf!Am7{Pfqu2-hXh4lD+6AT!F$B}psLtlF zzkY#1Biw2;p}v9@V2rpU?)MIs(8hZ$5EjL zJDTri%>QvIM+on(iM=f4OU=VUAEWK&!$X+)PZ1s*a%h^~I+ZAV)+c9qO<2XHxfl|e zV+NiG3tUnEo6H)7LRDgJ5$jQhN+0D^Vw?lTgB~=@b|mmiv`00E_6|5hKUD?tr&L#q zm6a+UpxpJ(d5I=F0MEK-emi1;Bc30U!VsEwH=jhy@_?VlVuiVy z%wVxSAXJRiH=mX+(&Bd3>f<&B+-^|y5jiyopnhWn!3MS;26$+t+#U=qelB=8(q62g zm045B2Oye}uby_;Z1h&VJp-Ny5d($2Qp3EIPQMF#OccxaB6@HwVHpHQ9t1<@qrpK=Ecoxs zu)c^4V{_=hxgtMks9W7!#o@+ygpkwp1K!Igm0=7g8BMF)Us&j9fWZQ12)(9#JDAi0 zwZnID{SXf|EN$1SQ z-5d!!*@I@oRErmV%}JnGIWTndLi;J^DzAbG$h8W?m3PxFbdM2mn5bz~eP9VwOQ7tt zBz*iW9A1;WVY#Y_zY;cO8%~W>=7eI)_V5y9$hWw0g&>8QJ+Fr&Z&GIg-PWGF)f529 zP6Xk}b+3%9ZLMe?R*~JEZNri zPS^Rac{>&ByB_rdE#D}yRzGq#I3S>?K-ZV*BZwS4`GuJ4*Xc(Jsp^$4NOKc^L{gLH zxGc>@`%nBoFTmTitT8mv$Z3)d%r+kp9l*xV!j{DiTQ*F8^4>_f4404n_(+MbF)sm! zh7%dx#O1g}W0S&;WxMduujg(`))z7wb_b*1OAiH+pcl%1erhE~& zY#XW-FmALtM0aWnQi zTcBD+NYxvBrKgnG%tk(2gqVR|cT3IspW|6=d2V9Z-zxuT9R`ZULpq5@y?60@SBHqP zPwUzIqV<_C%!R$GMp>%h$`6#tI^lx&xPKaDPm7Ed|YgZsd z`5zV|7ykE?ay0LRQZ%mV4pM<*V)AX3I^ca4NdzY(KVCboSHg;wmV$Q3%3U z0qK_5Ooj${3$@y$Ln$}zBm3@aOA_50TGH#zxahB-#A;oIn~j6@9OWCbhO|>Jx&OA$ z`vw+b-isExP&`||t52zewZFDZQNj!88^>tLh~zgl;@^3sfJq!zB!M2% zkPE@dFtDUxy&i2Utn_>%)r*Fs+;9yo~Ow!AhG#dondgTd9)%a4lLdf08 zYqHJwmyqsmKp32x>VmBoRX~8qjj)G|tUoRsm&;6A;B~Lopq%9jC_C$DNH*yUV?fBr zt1j}w(uJI#;!Uceftk2(1Rm`9=r7iJ`%*NX;q=bV!Auy!S$J{N{S+S^oW3Q-pPey^ z^$f7JCVKuPTYCR|CW+KsQ43drk6462)*cuWs}%tJe+%eUA#n%^KYMUti(QsZ_osXg zIPSWNaZ4i$B;QZ?UKqlGVRFctNkpg_{>D2;2|w)P{T%uT)2G(-5jN{N8CZ(ATfS>H zPCzUP)pnQm#8CJI5$_d%Lna85u;sJ`y`nc~%H4*@KjuLSv*JtcjCYP&&J~xY_8|FGV*22|o=G|DCoCV#v~eMxZLF={ugl8Xx%R8q>s4l$C4y_hYSC%1hxJ^eHzDY zm8EOjm$e*a_|a=+fBqDrJXo|+z9t;gHSR}&7xsZHl?%-jl-&EiASvhmWoyPy)M$rT z2Xz#d65n1D2*4?Ps2V%r=cC=|N1X}`@aEsl_|s6v{XTxPgQ$?Wqh(Yv>d%mKyHeNm z6%F6{SPIc^%z~?PEFbv>UA+(Lf$5G(0a9rB^RGa}{w`JklTn8mosZbFMNgx~Cm^l0 zaiNI!tdkl)`llaA-`EDhc*WwGTZtR!QvvyTM!`@xyqBRtpruAaO~KNG%T2 zr2`zXk=EfZ?C_qUsc z(UP;izv>yu1cAbsaRPHxit)824xm2lb+DO;B2MStjr@7}!;JVNTDtol7?4q6{%95H zjEYLGM|Mzst4rWQ((=W7%8GjjlHrpt2Yeq{)^`v7unl`9{b?;zfqr`;ene$XI%?)0 zW-ItqBx{B;y|g!Bt#*&~4+(7ffrAv;TNNC7dlCHGG%$SQfh!61G~4aXQ@H<@_Z_zG9f6K1 zVuyipST*7i*59@H?L z3!UaLk6G3#tEgN_FKYqr`?lB$6Ng3ya)x?J33+f07^4$ZkO;X(q+cB*=*JWf+C}9l zTLJ@9r0hiGDL$R?Ba!0KYRMYJ^bI~CmTlbGUax6H>n(-qk#c?AX@gYNnn&->F$F;< zKSG{EQ2*Eb;@KLu{1waEwf}Q&9Qyz24bX$`9>dDJ&mPRC2whjG1U97KPs4tf>mT?K0eU+Qk%N0jC z_37qg%`XhGzgBx%nZuZB^Mrkle9?(15ZP~t&(C^xdO1)&baHG!(wD^-F5XIG}Ky4U{S)|=5jJM1M z9u2Yff!@k5zLeGmQ1aho3^%;~e(DUx1+v}I&bPxgW(q&RMZBT!Sqf>d7^2Y3)I2&< z2IJKYwrlnFcp_U&xgV{&t1`2o2v1^sT151$4Galw0RdT>U&9~2QGJ3$YXA2311db9 z!&zd>gCdHP_apVt`4j>HaJ)3zZ_58r5{H&G1U(x5_LB57*T%Cn>A>O+`|0glv{I^r z{--zakUc>ZLLeAf-@sH)xT^ajs$)QQ0Z3I?yr&Dtfx7prC~ml@s~9+!*FgEwz20va z*6Vqv-{v6c#MIst_@a0-HV%GybDqDrBW&N=;M|ft24iRw$^W&^lZ|0l2z*`=-qnB6 zy?}VX#Im9BRu3cA!`MPOU4w$Q#V4VYnaVkjTFbJi}s~heK|T6i$D0=lXGB5kbm6#6?d{el2mhC)es28}m+_D;|CZ%q;0uxkQ|Y898~ItPLUAC)gJNg6V0F_f7^tJo8pM590g3j z<#BCnw7L3|kh7DF7&tPX{# zX%h0n5nO8$=n36Htxyre28nuiGPn&v1uW|6I@>aPu?_4ouU~IL8}MBpuGD1TreAT7 zt6b$-5`kJuKT9EF;q=!JWEoEuPo8+vd9{TWsnGdrIne0+KBH+$ar<}svzsF(x*Zo> zm2Yix@RDi5zYuk`Zn`$P{mu|w-D+!*hj=+upfFCX=#_4SZ%#rV%wi2J1)P~%cfbJ4 zY0Vd@OaEqX1M+hGR8Z{S^~%4hoZ1?ZeyvI~?%?Fvwp$8fvcI2C4T42?$&p1d$03tN z)If#Pnf=3eKcm@i)%&@`KYZS-!@G7DtJT6D9~er;_q`k|z%D%{ZQ@-W!Ts?_r7vzs z{9%FV?TuvbRpwTqHMLfle(?`O((A@?IO!f$H@nNObeS>{2s}f}`cTpC=4BQH;cg4x zHxLURlB`@*oCWcKU=KToNg|+~z8S|im0NW)7q8us7lAnScFa`z%xB!oY*`Q(>Dg11 zp$wMC6I(Kiq(LCPXi(vaiKsPo^sjMv1m|Jp_1|7((1h~f7v)P^)Q4h8PUbiEPWF|Z zAGL3MhE+SZbn>yP`o`x)%iNd2Tkf3AR0t?}y%;3ni@J;!y+ko%y&ulduJ&DYA+?0I z8n(ilZ%XN?!g1!$DTCFo_`U(Y;QRx?nO5sw8=-*Mrr-7znyRC~dg;)2P;VhguX48K zJJ!VKkt;2~f70sugGPHv&vFl6X-423eAzDd32u84QG!%H1EVnWY}+hx<2apXf4m3$ z-#v5)+Xog|>g6E@A9{ZlIF2$UDP-P*6E=I>m_dt}K@cHhv)E(J%C0dL9FJe*=R~k| zB^MAW5az8AJ-#D>kf6LsJi>gyNz8d5(lSL<*-toIUnGix?=+HBn>d~`$es9*6>?wh ztmjuj%}rpS{ZqoBv3O{yUU6i61hp4@g{O%{p$$8c{`@Q;a=hU7M2<5Rw?fO0j1DkGW z?jt=_DF&K;WL3k)ln(h{!_7M}8Wy^#g-8~yF9?nJ-RX&OURKEHaC;KDnb#)!dd-{= z*p9%Zeg>2P=%Rlu$I?Mj5LkBvR|__DWsX1A^XLJY>{f>@b(NRM$%p+VhS(!6j9wC( za8$R>=O`6Jx&|FEBI#uUHk4b(ltO&1# z@lef`J%Lv?ih1r=df`?G-tNRAPA(rwm&Q31NU$hP&YQ+?Y+iegdC9i_nkdbSz`f>f zjHvo2Sg4$Jq{)Gan^5pR6dS`e*b{bTSbr@b$+kQeYS5z$W4 zcD*KwUX9qxIqY5y<7I7sPM}6CLF$p`=svmEOjk@8UuR02TnPPV8U;#{vwOApz?>H8 zab>KospmUn6wJ~{o7zK0C=jf$VgdtA-VE8^~cl zgHhFu2L-;#0GqJTxx=xcqEH|OF1;h9@@=tt%1Uj0ldh0wT$i+^l;DYHT=?u-*FM|2 zD%s7mrI3Haw{LDS^F+Y4Q$%Rtm-urlihS z<@)p}zB^=&97N%uXMlQf339;i89IFy!Pm=jA4DWH4)iOcbq?-pPenv_xy)O$?huZN zrj+-MfKunddM@+2;}Fx`M%JM8visg|`~^WXZ%P<(rw6h=+8k3A!Aafi)++Y5sBu89 z;7;{k!Fo@h+rUMIGw=-xOAQNvw$-nl+iHL- zns9u4h+_Bvv=y!Lz!L;rbEJ^OZM&!AP;@9Q$RrGg+l_bFE)DBf*a%z?9upx;@s-$+ zOmqbnI8v*i3vTSgiT-z$o?0|HoZez>(h9L2CA<&%@egUHYbl`sO08jtD(UI>pR8{@ zb;c<_4=EFos!LZMEukLwgPZik3MNGT3nzY2Zu3AFs=9lAexv&8&iE>gL*wFIr~4$j zE;LJ05M$m!vHe=NkbIFLeTbjaC-Jmi$KF=dQj5Ihav9;hPpS%WQk6t0e>8)7`MKhNFC5>3HUhHo!YCoQTV{o zXzkCItrzRI>_7kKB>fWw!v=#_if<{?5K>i-$Y$pVUCenJ#dscI+MZM8b}|&K8$TJc zy-X^jD|sxd@x+$HTl6PL3q|)@yB#87sZZ+s?c9qmVDtlcECoHf21RqPv zL}9duvHC+7t-_Nh@Ht4e3*yE`4wuvmht?2aJ%NP(aYDx1UA?jEizZuv=rWPx1~F;8 z7~bSN?s^_H){?trpk&<6+gIz+MoE)r4`#4}+=HBR-ig&^2-Qb7x(e_gCOVGFmE+;{ zyS(KHKgQDY@rhNlzcf@VEK!Gs`du=7txEIwr@B$*rc3NIuY!OVVoiu5^`V>hBGDqR z8Bx;pJkB?C&m+tJO#UQ|lk3}w>i_2$UA=CHzCG_Ei8vd=<7sZXo02^o#BGCe*T}ln zpeU;P;KFyQK8(@8AX1RHMiw>TE!IJTTeEgUTCy-86j%u*PDTLu0rTBQA{s!f35#VS zApZG76*Q0&MP3amb3(Z^hP)(|--{F1wCpnd_&6YEd!+58>*=xKy$9%Ni`h(-c(aen z3&YbSd5DtDl;72V&-`&O>rz{lA`As~eohts=_M(8(J)1*=oNDFA*lD*E>Sl0mdST8 ztkph@mKI;hRA7_`sQw*wa@@CB3c#p8h8NkaR7efg`$2s6-3Shzioz08Yh|~ zhc_t{An!=XFMvj+$t)h=AMiyk>B|L1WbrC2DQ{y$3kN?yfE2~>DA$qw&r7~vh77KW zREXh0_c0O;6t?qlZw#4H-koVoA^qlT}XED}NQ*(wRW@)1u{3Np} zoNrBFZfdwnrOF9vYZu{POgpC!mV6)bU{ecCpsGShv~9QHFODNFH1#mtg^yFE7F5Fw zOxb22SGa%^iVdxw`s5z~m!Qqz+-hg?A7?BBNq-c7WQ<@AFHbv{Nb&H|UUF|xI`0t2 z^oTWF78{hGFICb(mdah$Y^w*>4jkoSHb(x^yM z*0;g$gFZ9iwprq=*856sDZy12)Wo%k#MiYjx>R?4U+L$QIui5@pGhB6yQ1v2|A~H5 zFrFy`acHc5HrKNMi?9L}DUBxMSSMQ((PF^1-5N$AD6;pZZpvOSYs?{p#JUlUZwerdO{xj!$x7eEQtQug4X>kEKj-@h$9} z;v5}!Z+v{!b7IdgBLx@vW#-R|W4&iFWYfeM6?PEOF zrPF_7a0uz$Z#%>;O5*w{f1JRkD+gtr?Y|d&7Caee&kjJeaG!L-SDWM>F(mEBufE)K zJHjKokzkI!9l!o>q1>1=V-K_E(A;xa`l}-j0|Ue|?R*mIhi3zmL4$sF#QnZ+XCTf4 zbTCoQE+i3#ZV*fYXvyW${ye8Im-+h`N7gw97zBNI8grh;l-k;tw>#hCUoKo5j|-Q< zQ~M30L)ia3{M-~((u9lXhxgiAR$4WO)9gwLXhyQqp2`i*#%8+W<-M#SmhJCpAa}Dq zqosb`Vc4?#&JGK=7~pQtqm&m zRbEjwTIGiPCPTj||(N~9nGEuW+2&*V`7)ve7XQ$;zIp93b*R6xdLChz}5h{N8tg338oJx0f)VyYb}ZCgpu&Zn(z@ zfJtG%4CUYNfdX28|Dmtu1L~8EE8NxFH`nDwD(9Q#6o1LN9UJQSAb!@2JW-dvdARy& zVeG4ihJBQHnWpVlDNP96(`OTwA6`2#b5uE|EJZE$Re4wsc|$mw{nfdtYK=}yM zil!>KrPt^Jt8%sx{PE+I#i-HzZlwJsP{^%)=;ENm^<7jK&qNLOrzH}GC2B>CT|7kV zafEpe&6TNCxyA$~^K>xkCE+q0F-tf`^>`ZDqxhuijm^V1UkD0Za*1=y$~O@o1=~1GZhZ$xERh0<9r|+kzTlF<<8lP!8us6^ zz*MEgGKNmCcQJ`}{?SKgB+A_fwE(fgK3fJ2$8Pjb5-A|_#4g7NFF<>PoElsjDBAp1 z9q1(W1$)NIG*6B{CyK8a)F2IW>2j*Qr?N_k5V^sdO=R!dt002c6Tc>hu*+H8^})hx z8Jq(X8JR(qFO=HJPGbGiE0ta}75uSz*xD<#z*ntbvo!BFj~}85(*zjz06BkzoANF9 zMQz z7iYi{&_=DNGEj*~f;EiA-&%sB*wZGw6ClJKSUX2NZV3t30kztkq}dF6-YPEjH>H$_ zbU8$5SaN4S`Ui+Qo&%1f5W{>Un4-zEyi44*4fsEMukJzo#E+}+jQYt-B>e?X$kXmx zSlXK5O?0QRzG^{*P7Mox@bk>scQx5o+*J2_xnOoDP=S!0u?eF!5B){ncbq`u$`0+$ zM~rKR58&MG`q4y;2p9x|rl>`*WGRCX%y{h8+%?cL!6zG9;+ z@Rdnx)0S@;>^2H`s9Y4TOF!GV<#CohhwQm4&$@S&zh=g&i(LmZYQ$pofeh*Iab&1M z;l0ISzRCB=4D{?8@sY|J;G~}zx}xriZseP{SZYYT&0c-OXGKcP`nE>9-*-I;j8(n^ z$(in3jD`p16aPj86ASS1O*U3$I&iZD7P1!-vn$`#xOPb{@z1JCB1I z-DU&Wfi6!fHCmfPk4=^=H4ZhCrs+QqA+ZpnHo!JXz_j-21Yx=6aD15akS_C_G=?ck z=gm8Yfg1OZy6k{V}?T}$ql0~Y^N}_Bq{rgo@)A>OJ?q(qCIPkXeD=hBPs>_Rs-j$$Nn=ukwrR$NamtB#@O${3T$e;*vM z4BaMM{g798F%Cw@02!F8k84JnO>phn8u*>+BGQ#yE}>BJ~Ep@8#5#?X-c{s;*@pA&d^Lme4;eslT6S_ zv2hx8@5bII&8>~n9FcGLejR+nE=g}5{rE1FKa{KTHC4Gf@1Bz$9Nr?=2@ z724N%yp{w}=wqkZHKDz;Zg$1nsnd^0ZRepcynMW&ald{2krZtx8dB9AfL{}1=W}cw z0lo)C8(OgS$3s^xXpL8{^RmTo43_sk8n^Ixv|+z}{a5?E5MM-8wlN8pQhh&Up)8&B z=~Kix7C(ztZE10YE)dq3!bav$jI#%QJ1rxr&F}+z%%@afd<-`!;tNNzpfOjG8158! zyEsrQt8`}x-~u9Zc4&Rf9ezS{E*wZSlX<-X3XY?qeIU@wmo~9B4heUFMs4&sMU_)L ziRRZN;}HpF@bmDt0zrOEd7kk>k?lBk%5bWkSXa4Nmd)TBV{{(*kW5>S(4ZX$ntB=5$j3b5@Mk0Fei zA@wJZ)^6ZGJ)!5XS2csG+HNKd$C3h0qvGnpBX&x_UZL{Hnkms5qW(y{IF2TSFxYDU z8JtU<^Z7=X&U<<3I)FwR&(^jLHM+A4^UEa|xN!W%)JMOCpWpl^LZyzvhB`%IRyOFt0&8 zl3M)2{al6XIl=n?fU_aLkXUCAM)FS5@bU2urE}-U1<~~x=W{n(wlVP^J<;}YvwmEpG}pNQ4rw$p{VC-nC+Pkcj`ut`f9nk@ zRdz+$pv5mHo$Pi8f?-|z&Ftg$4RQSt-1}Jc;iGx+Jy49y4X|GNnaL4~I|tNBNlt10 z{2Dnmz^&J|4DGfBcHU|iQvS`4Q9Mso5?u^pzRKf~RI-rzSH)r)#V3^~5Um1;&H#7N zx3Y{#{|KA93+f6y>V%mAAzb-z%5cso^ttK?RUqq7!y+^;p-I*#M9ayhrk~FnNjh7- zMq3fhCjvK6Ad`+K!`t4(acowMKK7UJ{%F<0fbUwb{F;ck4bPLfEG>-f%gN=PyWeAf z_Z2_PfFlzEL|KV}gY0LH{Iuyl}>-nbC4>GwBahyYo( zg>ZG!-W>Y|LW`C)m+xkd?Yz!u9vzXKh6wT~DxG(!YFy7j^&L?BY}N!duC%28eC%>_ zzQXhPmNJk85Xo|zY1_gh&gA4h&qwCxju6ezDG2f@>1S_B*2_c%Na`U@1$C^k;MIIm zO*ptfMZi^9*okMFV>r5Y8tU{Osfz4V#{Qez%py|^Er{_Gi^g!j{PvBw+fjnAuEfE6D7n8(hBUEbgbG!4T#;lThe$ zIja`42?D!&WLX;%UP8Riwa3wc8Y?R%KE;@I1SCecw1C&7fYgI*eEQ(IDsjK9nT@~b zf6XSMi|r6k;{jPki^ewszw}0~uNNfm4R0annTqEhCTbhSDaU0Q&+`kK*g7lLZjYo! z*oSq5s01jE-NwX;iDtBu>HYB^{!yyi_}tHAMoanTBU;AKBIc6JKkJ6_2G>|O1H7kdG8O*Q)o;FLM@-L zyt$F@b*1!>h=hwAyE)<`~c~2Lv+%6UlP#!Dr77bS(1k(wlG2$O7G!2B) zaCbeo?{PTOJjFmbejQ3D+{PW8nLYrzJE~P&^lt^J_n-`RnE7}xO6hETwkztp4Wedr z`_?+JUs5L2DI}Z!QPOCov=Vxy98<3$MwZkM+E!55jhhdq-+G-I*w@~iM)grI&|}at zBkCCN@aNf1dfGDEiiGRg9Fn#yAX#fVk8sWR39ekg@{x@K<=WPdCnVTe9s0Hts)4{% z5X<8d)Jc!E_%sE!Hg(cIC!9NI+oIR~ncZxnXjUx8ov&yIGZVFS*(!mB4}A);q&Qz= zP2jH2U^Qf3&&qCjJiPYDr#_Wz<;t?35oKOSGlN`l#;#cIjh~6UJRSmY*YdYeM|O4+ zL2W9^*TU|vHVx2phP@?$k|X_9GHBO~g#rW{%*b?Pq-csn>wZpx0hmtqnb~W1wRR8F z0_eWT0OIS#cmwL!kIh!rLizKE0edd)*icajcO~>HL)YJM6*0;{XM~1jh%liT;_R6~ z87ub77wls2@DoDKZXIGANR+1}{^1?s2DV`H^LmBfsV8Qn=j${M?aoJi8mS5{`nraT zF*pCSr|67ueAhmRQ!-{32lUb9-H^m9Vc_;oUuFs`UDI=SU;PGSJH;4~w&X2L9 zZNI=wBv>n8CfcU~M0xCr)zYWnsG;~g1!Ho-l+-B}!+&1Keh-S6J4r0)+WB+Iy>K3g zdi&$Q{}1<4Qyw%P-I_~fp2cq|et*Il^9k3(g7n|mrL^&s{skY{oWEe%0O?Eb%m!`yJVWJSRDrc^N`hktuo_K!OGOrL>W9~0MX#5DuuF?fx1}WB9V{tWd2*rnc zx;-y%&8&hR>d`yDbg11Mya9HMeJ+6>dU94!dwNo$M((CFb&CdRyAaG#t2nLxfCVrU zO8e?R>p00}0z=<&1}izrSPlwvl4d?s)@(VAd#e71)!oMW0c(4q0d9T}JN*XeG*Osy z6B}TX;EW~(j%7l4Y#5eHXm5XZ7`+u=>ldVepL zo>^&K7{LgJ?5M~a=XDa;q`=D+(2zZpS_=4S0}7zPlc0zn2>-4%!kRBWUTg6xFZxOg z^$=E>ifGoZnjxK8ly@peTXk0A zxjph!2g;O8+w#|bKGAd(mA?D9ckxa=7vF>lmb(>Qpa{tC^X!drd!7G|P0~1YSW1Oa zhR{5~R%1t7GBiCbtzI!Q1x8sU6e0g#{&0JB1tq1Z2|`Q=$E$?gE; zexM3A$YN)97(qc&0_=dhCXIuFjpPE1B2M#*LHI}YgC{=rR2x-7vx%6yqisD!!aq>u zyyEgM_Yw6kL}Ei!3_3y16hOb@at+J;R8wCd6)IJk_~4yR@SjFGLf)u@*5$g z1C26LH?AenP?P;Q9CS2%GZ{1Bni(h5&D*TQXZG+xhh%p#y65@7jB}~junXeK^QQyN z#TP$8KJYcctxF{#$+{n-oypDb>Pd>5XMya?$@-7A!p@g99fMh@xX;ZZU&A{SgwZ@_ zHa76f4zN`@I#P1Jgt+|1-{;W5W@GrHAk^8h;#Wy&V)mb&k56$}1!syi=M=4zj z51;9~4*t%Ai_Cp}JN9>?;tlNtoqIZLqx+w%6b(t4IvFtWtn2$}l%(w;9gBPz--0-0 zjoWCP|Bvf+`lXETf~aJ9cYJbgedX@iAJ7#RZA1AMT5mhJkr|3vt+!sS>Xger|+wqF%^pK>7D1=T^!LViKt{o`fd? zX@waa9U!@h)m7I0w4Hze^d}bjj*B7(%r|AT2H>4^yPeJX+gx5HuwFC8xK^#r{u3IP z`)?SH-bKBW)uoeLyE2k$46>Z^ZOK&wwqAV6>b(fq;=}8<(@~=ZpxrDHCHn=d5yNdw z(2I|Ujpu!zc6w@b?~qantW({iDztaHX$O}!O1cy$k@vwGfYI4)Cw+Zlf9QW>b3dLN zC9I~2K{I|vx<-uNYY&lJ;5MTMItMCbC_hvNJ96dgdk+1Qp+3#kqAE-Zr!kga+S4bE zH-7%h-#<`ENxXeXd?7L*4E=9Ss_IPq<`BG7b~n^n(8l(}_I47FnYKnpPR++H8BSYu6FcGGP`y_% zy5Lx53_CTtjUCX14oHg`y&t_o-I!%{_+GU~2?p}%z3@&l1ou{R-RlET4n zvOU!VX-uw*FOO?-PRQ^{BKHQF)d`6<{NhM$!q z`A3%Kl?#7x)nD#0;|rPy75I*k%g3mt#{Zf~KR5=P@ZiQp5sjGKI|b1m*=P@HD<4d< z5+=YVX~F>~NeXJR`u4DIKeh2{@ih@a3;5=dG?K;|-uJ!B`fA>9;m+^XE$mX!)WoT3 z_sgv&OG*qKnQ$TE>u!H!k>$lsQUiv7;CAT$1*S9aEHOl%k%+FN7@>!)kO_2l= z@95b_ORi;O(kQ^$rt5gqMQJDR$Si0Xwj%1;6 zP}gT5QyMWWk={W*{A}l(ZG-m)K>F(I1sGsI=%>xu1k%6{9*HqWAOg3gp&#wMuYEea zbheVR&rEXZzUEeH)xxS?bB9u>7lg1LinE3K3@@^fB<5BFg{%HlYhrEG{hr$&CDVkJ zp6w2An9|*{sonzt?Jc!=0E$K~Sb&4(`aP+QlLVC_hI@UFY7b*jwQtZm#@zQX!exr+ zfd|=NRLwi>lZ$D~@57bMvbGkb({_BKgpoRt5g+Bx8H&7q!H^WOXycfZo-fVDZKzt} zwBp2vFFx_CEH`$&L=00KPX@t z4swVzF>0>VZu}=i>#{QT8lM{yG!c?x|P@f2*IC?6o$AaedZb zhp30wp){{c?9C(bk9!=`irKTrV`<`A<(yu!>qPQ@q+_7-!DYqiH*PC7`3N3%?faC1 zCR&T*2S-SMHTTG0@-RK^*c&8q{U@zO%)vLDQ8RIhE37?8Z2E_7mpQF%lL_JYjBeY& zNTnVxj_;tvw!_!7Z>sVCpL#yBKj4`;Z1-s~ObKTpdHigC{T4Q*;G0CPcjA{hWFaR< zAd3hVq{@-U4NCG=#rY+{coIMiqAR@MQfkqm}+vd>CPpcAb%@r+}n8=Bhah7wY{1GY%!R?f9!*YzuGyf=d>B#|o9I$*h;IiK z@}T#E;}(LFtGAp0Do6SXlwBnqz%&dp_1WgFJq{U`XttbGu7Digqg~|yp{1$LSorRO zn4suC+t7Sl8j=@eym1=sOq?l|4`w)6fRj+egjr!KmUr@7_L#kj8$(qV;E=-dwNvxe zCHle?=o2a32hv?)Lwdv>Y!)Yji~FjJL?g}Xp0l(h4rz#Qv^yKTO-^T_Cn4N8Z?i#P4MBA4*}6sdSI#A#VjH7m zD6Fa@T5iY#vOL#n0x?-<$YTX6Ca=WAZDCTSafo(ZN5$M_CZR1f{JQeSQP+PdjAzfE zlyq!tU+L2M)?Dn5v4trz-$iu4H!f?8#r8AInM7YZ=IqhB%7;!gz~Gz-Z~78sTY2`O ztnS>$94=n~idaxe`*NASIrvCBQFb$ZW}ciDc&~0M1KX>WqYTTp9wjR#C2?fo%g93Y zkRoQuO~h8$8{Rx7Mo0e$t5Pqo?RBj0soj=l3O3=58YDW zfcF3-GdD67&ADw4e`T|^L}j~3cdg@=NlkGY&%ft-9HT|j(mpw$?)OL@{m&SS5(fzK!t(#-Ytle0f~QU?vnyZucyAp z*WXtXk$${Yz-9Y8LuMWHa&IuQW<_q-;>W%R-_+q-p53*V;9|EON*Y zq~28Bh#3Z3F$DR4v1jl}@^(j#`9b~(@K&YoB3j3M+Q*vPO$_|ue5x6aUQU5@(ksRq zMbWwugqJKpy?X?j%K4Jz8rDjudk!3PA6pA41=&ItnW&_$VAdzKx;|M~nwX@fwG5V$ zjVph2KJfe5ywfp}Lq4pknfHHHu}4?(pX8v65fq1scQftuC;0dsOg~)lPqNh#1NCFy zh9jSL7OxqHplOF?IrtPZ=?h4N31>S2TxXL08-s2Ld&Wj{6O?Z&KnNW^*@g-a#B=zt z5h&PsC_w&@KBva!wBMm3O!H3O%s9%gYM$CZx@D`Uj@-d2pOR#M7bCV`6bJ^a$Xofu zZ!CzV+*kK3nqXC|am~^X8h#_ylG?c0A9S?GUDyE53u9G$&Z77yYN9KIoddL~#zEgW z@&!myx_q8QjUGB%^K;BU{`{DaWw@N8Q!ee*TJD6l7nJ^O|+V2DqQLv3}kyXiNo;4; z<6y~ndBttvaB2a&nBF}T_)CS`kDu(Fk#@xfsrY?eQYZl{-yaVrPSRCWu8ERr$S>(N z`)8N-s+UPzyl>EK?!3*R_f?%|SCq0_;BF~d$`5h8tV}L<1&QW?5F^NK|Er_ZdwUk5 z)0YCWTvV}cX?}F1F7r)dmz6x{>Fhk9Z*`?q#zB9;gh>6l)N5f!AAA?Nrsja1)E@v= z?@HLh ze5-NLzx^i0IpWMt3kCP3?R+(Eg#-fif6l7Nt}TEI#x=A8EU)`Yc+@DAa)=D5XzZ=m@ZnAiV zpF=zo050|;4o$UhPCqMEbF)wo28EhW@7=OUXUzd`l;Aa$&Ru1+skc_1ySgY+Kwi^A zzC{t;G~bp5IC%{U#d(Rzw%B`xR7*7DF81d3YsZ*e5Qoo&S53yhr586OCSB^#2(!

OHe@fAQ*F0(p;fL^JP?t?XrDXF^i5h@)l+(WcNCz)1qcZ;V)Fa)=`e zWTj4Bs6D^^hZ(;;M|{+{|MrTZ;Qme`@qkhmCu?VJYj(R+Q|!;X94?+Xp@r-0*3>#L zwGmD4jNKk-VxE<_t6%K5yH>`xmNY5;CC}8{sCw~TO?aA+Sk3Qw-XV9T@ov4eX=lnu zI7av~jMp!pwIO|U%Qdu4C&1+R@z%e|SEV;L@Yd#kh|!38l6qJJ+-n3m`59XkYgHpA zZX8+rOmSPHPX_OH97^cdxVWX-c(O>0dG;SS=>L28W7X~O_1W``Cg*p>D^#hrZv(LW zdeDYLSX2}-?M9m!>B45ApSnJ5(|4YRt##8E7SqMyT@Ze7UB|g8>~qOPFT9C@X1@b20?96A}2*P zofxSM2Kn6u#PrbFmt6dUAKkQWfL}SnuD=va;F~AZSN;{33|`Vw?X2LR_=Tagltbn0 zn>K&({L^+UdNiw}iyxGA^?G%A-HjEL}r@!WgF zYjxaN4T_VwVwf2~i0SNm(83N{Y9@sig8KN&$0V@d4MCMHmh)P40_Vksac`Q7*Rw&1 zduch25IUqFJBbzb6Z3ftjL_A)Zr@7nAC!IMDRZuENmlkv{^jKOk#`0l&&t{znfu0% z;+3^GE^1kd1m)-5c5F3PH<@u+{^`8FXZjDeKeYiRKMbSsnEN%R;d3dcH;~p-sLsC- zF3gG&bHDJ9<|Ye8od!TbwM?!mh1St|mkU?W^-bShLF7|t$;6nEnYQqjBr9rBkMjKA^Q(MqgsVe+v}SBfh-@Qp zxAf?y3z^fmHBo@_scTs3EEjT8ywa0dvGDpSm!d1?_fuTk&$Hcpjf=V6e_i1_Qp}pi z|2y$>hC86~#wMroGfxR73nr<4ZX{QCmL98>>_ zK&&t{4IB1h9Y+~KKcp^tRZ=I(b7QV*U1GJN1xDQk2C~z&!t3kpl00({N8mWN{227E} zALtAvbd%z%z;qE}n$c3U1IMo_UM{nAN20v5@fNy;gM%A4Z}Rx_n?<4<^$hMCtpAN~ zO^f5FVpIupw5H@JgQ)E|+5lHToM=HstOL{7nJfc4c?!C-mUnDnW8d!D$s^K%?7nvn zg)UHR?Z4GC|GVk0ANL&?UAMbA{xH43P?|BW%;RR4pz!yHTG07)9>A21>3t(j14VJXR1n+9ulv1d@d2yjW-E3`H@v`x&ue1P`n_bs!Tq`08%Ak&Bpz+_fO@PF& z=Yt~M2tKz1a}B+6jU9n(Q4MQ~SM5=b#}xodm=VQ*s;fm1e|64jd0skwvA?o}uI>&n z9h%)|$IPvNQGOt+IpBPZyZPGXp0-A$)Wr#R1faNqG^SDBKYm@a19_)F(2e3dR8Fs` z?DI8!Ul5;~F2D7lOM69~cjdlFg{32oFC6 zar%-L?qEhb&~ra7KU{@7&e9h3{>SL~pJB(+k0XcC?jnl2ty-!P{{0hYpb%~nuE>c# z42t=p1k07n`_s~u{A1~19LU!h%CiS@CDEU@Wq;KGsQyj%Vj3O^z~S zBFyny`WyE1PxB{F_(k7>s9kL-u0dWg=I@WLE|Ay}`0F=5Rsd>4$WU(IBVk{E^1My- zA*tuXQVM9-=<}+}Pg|&Xc#^P>(+ewv10+hGBvnQhE|3yAul=GQ_2k7nkLwM9Re*s1 zc5~HfH4Bk~yO0zbT%YRm6M;}%0UI1*-f>)yPT1*bbHJ_1`-W4+^1iI%ubbEpljD92 zLQwVr6E|OxCc6#Gb5edCzTKM>CgFg3x6}CA>ROb*7SYbu?Q;~g19(L*9W|}HU-u3= zpBReX2)0nVG8*ISwQ@U%?!*q3s8iBhX(#1+qCg-G&O zLgM|W+eLVg0cC|z((so`c9X@gE`qF&;4RpAYBak;J!Hb%n3}OjLzfcx1LdK=eVeJY z>KJ?{Yh$Or7x9x^!~Au4%vABcht}O+RWLPw?7orzayL9J4{_|3p+_Ntw?j4&gJl-#$y1m&NM;Xj^p80!@ z+(V<15IS|9TeTnrI;p0^kGESPD8!i@@EW!tl5tSiI3!j9v`tDNtP-Ig8KMpwH1~gZZTSxRk25<7Ok2g2Ui*6w3jrjy+ml{QG%u`bE3qKLHTl#^Yh(ih8 z00Y8%XTn=lbbAKY%fH6&bM{>2eb(CEq&?8@bV+P3lD88|j*Dj4K>32AT;p_^5vVn! z8z$yHX4^z9sS>}eITI0`Pju!_c&-Fi33R6)Em7|9Sf0g6ps)t2qYu=w&>}HK%DzCC z6;K@q5tc`6Mh&JlyK<*$BZIuJX?6248KPLpEwlk=iM&BCpn*TnN|u3;uqGw4-r~PK z`Kj*ZZXBZ`m5fO_iSVD?e6Oj0f^TYmf5*awT{?@Z>YjSpoct4vitm;@@C2Dm6v2+W zf`;$eB`EyZJloyt_&HPne6RamjUD6 z_@81=|Gq5JLCqHbO8X@9F(z*%`4i*w)mPt0txy*$FXA!QW7WU=pscy2F)r_~_nRL* zqRC@05=A)pixp1g{2Vm7|CO<_)kUS5iPeY^WB_S+69J!eMsOpw9u}Ypu%9R~QKIMU z=7ZZ=KKBfWqW&}m4Ohr0`=!xYDg-6AfAP=n{^;p-P$3!nWd|QXq`rpv9Ssm{Y)R_7 zAlxSv&9Mb%U+mk3h(AdxIRmA$wE1IMd%L}O2BJkiuW|g9Vt$@zrOjbQvd`zs_ zhSdWuBlyK@vkm43AWHgx-7czSE^3bI5X2P6gkK1qL`FXfO^W=>LQv;vt{Kz}UO6ir?bZGK9^1Avqb&pQD<)gNaxygu&A=UpQz$mb8~lxt)PvMJ z6Gh0$StUu|95P934%!VZZS<-$rRvV`Y^*rOQ%3#Jh`*ap+8gtwYm|^RITY`!!CX&bm7|KYv%3to2`5FswBuKvq4Pyq{Q zppBOtP(R;pP=w_Xs$-d;T8|1-cLB>8?&8i0X^@_D;4m!>2(xgrdsRgj+z0?6^<{jf zdN4g&&X2lp%`{$5L9A-Xmxak3rr2mWLEm>N-_AvO*6gm^z72Hm?tiZKBGPH)jjl&% zO>O^lDT8kMV&;{B2||DR61I5Pp!bqe1EF>;(ci~@)?VkH>|aBoVev|JPFFlS-2;R` z#kSt(L~^qL$w&Y@MPDq+$uP%#6i`7k`Ze4g|NFuj@yKfIYeb1v1QiLdD7_#M&nDL;bk)Y=!? zExg#QIe9+vuH=h_97->ap;KT3)l-~H_{vVsi0T@G+)`MwEbZ zbPJofxqz!>E(J4s$p%BDo*&8PYBg!xkRZHFZKm)JfPMJ`YK&Gu$MY%O`aou7zHv+c zc1sBpuN!%Rz;H%7AAbX%X$u#K)h?%%WrLgkMfA(|@w7oF0Rg&>t@L$CMucfA|1DD4 zj9avWLRPKZP89BpUOq)38ONno*t z;?vrn*JvoF7g=z7aHJnSzT;;>`{hLg3Zp-;Jv&#roqAEp3|v|HgbgLTCv6H#>^{W1 z9B*bKs&CGdvusc;Q3_4$!XaKuG|m02M4jg*e24^C(5#;6Jhf3gmGrWMq)+V97_)CB zBeL)0`5>g*JQ(jOBjtz5xC|`5(a(H_8aN3B@gF=g_@H(7*mer08p`r3xuc91L1_)+ z**?sw+J08RX=Q~Y9aK?y$zd7*c4SryjyR?QknLdRie}D=5Te*_rw_qS^&(x!DU48bLcg9j1{z;aH46n zZw;p_$sqSGwHWp`K_=J|&FKRSkSyERPqoe1)4aLb{!}1#VzYpeE%Pc7W-q`z1v7;z zbd;7|0%*Kr)5ooLxDwg*C*R$L58=NF)8IxY`)?@Neuvj9O4o-!?`V0s|G`!3ul+Kc zJLes*rv2j~=3K=NRYjS=@JI(rIrJl%4kbCXLaPoOk%FPoVYIer%huq2t3Y5B9!%pv z8ZSqXPRqHSHE%y+9)PcX3ESGw@`GgYL5&X2d!+AJ7rvsjr3>kPMCzpbK;hA}*aU^a z>RmMONI$gfw|4LG&5tcrp6Eo6LPhe7-}aOtqk7DUPkTgbsKFMw=Uy;YmgMAZ#xyfK z%I%+zW4OHx$n5VN(@&IB#P8;-(_zsE#8fneKCXp!NP{eB-Z>d{rr#W8fBB_uX+N6? z{&MIl-J1K*b%xfWSfHH#hH`n!$){Jb=N~;RCog__+(a=$U2j~T_r6Se|3K!_+-W$A zzPVY?&c|qxTyn=I=F(TKTeNRk9pq9jWMHQqMlJuSZICJ1ZRzX%R{-l#Y&)qd#d7Kc zt8E7?B`fLyrVl(;1DgH0;Nf21R{U_GP^F!`Yb~VpmyP(8=_CPU&S2CnmK*+IS|r2rl};$HLm1c8Lf;4?a;NE(18n!QCJhB>`RlKutyEWYRirTL?g zJdzLJa;TIy25%J_oKn3O=Yw|LdU#^#bE>P$m+5a_nr>;nb?Z~}yU)yV1+<*IjPLE$ z^#@)h@)m4#$+d>t4On7M8H=>X&R!p^$_{me2l7`Db&TVoaSQgFrw-jrQlNCc6CrFt z)g{GG)aNeLRTg&JIV-np_SO18*&oJUvcN|CqsAKwH(Y{zno?1w6CdsQ!XFe`B+P* zVZVZx3HvvE_C7L&l#<>OuLpf5xuSRtWK!Vxe_?g4Fvlkx$f_-$x26p47i=7@IS{Mr zs3N9WnmBfBwW}*;){5f^iPcxNZzXN8y4F1~wvo18SvBg}mGv98jyaA$!~Ey2<$sPJ zn}_{|IOe}TYh)d?{=t>&A!e%r8t8Vao_5$!U)&f@p%JKz_|C^iBWdA9@w<*&3i zVpVCpPkzx}We1yyuRWgk?AW|Q;7hrd4nG^b3;ER`Y9%=w={j`e5C>I2(gc=tZJ7`s zG;Vv$p~q1dbxUN|>{F{r&?B+vOb?t35F>{TaQwLgksW%UtP$V`8|6bYry+uZOc}t7 z6#`IfYGgRujA62~|BI;orbJXAt>A}PVk>FfqG<|+;%}ZbCCK^%k#QqmC@Bb&(Dv3` zZQTHPwa^pouJ{bzrCr;)s-tLO;~r<+2wh!i83AEiXp!1Nvi#)ACxSLU+lLZod1r-= z&^U=7OyGln40qa6ov7RG!oFHeG&tip07=spLdQ@VM+g`zD`+AaVC3BauU zTsiwjb2%HC*=)l>9=o-5R=|F7r<9MoH7WfKt-|>8GEPmZ;CGntL;QycXi3>sxb-XW zxlH@mnDaQ00potBJoVBBF+}7oy%5wSnm;Q1U8wLPxf%NXWsxMcpIc<2`4UsW934KJ z4`SX5i81>7ll|775NKEX(V@xobN+BpnWE#bvN`qQ^?3Y;_7d`~Gi z3G1mV)GEVo;LwGO>3)aqATF?mm-)60V7zF6cqGi~~dT_LeW zUJ1(oVEQ@N*&ehk0x{XZQ?vro(aJ9Bc5`5KWNnwDrj@+fRF+?jwAD0~`uUp8ZtU^7 zJxlP+9Qyxem&@ZIThz^_t&f-dT&b3hjXL$;t|GX)CW8_rd}Q#{Z^_y&3{-*?z#pm8 z>U5zvc}0-bD6Yp95!0R=Y?!Aqo5`q}2*k6SR!xW8v=u+>nB8((N#_U*3s&W5EYqfE z^m9A=na2t8R~6B|A3>Xt7qD%=`Y)!yqx8Y=RGpk5_3wRopD35fdAfi`&|Qi}uE2)& zH_yVTW)Jpu+8)+5F?9(^NTO&bR9VU(gSDEJ69gJ67FFqxRNAOv5(nN&kh?mro1+8c zOQBqq`Wd|pH^@WFBtYLPAB%@K2(v|(cBj4NzkaEa0MZyU62zcKoCNOSK2F`bgSg!b zjg04k!m`AZfMw8Jivw<6f#nYyS7k_sfKzeperBV#BqW4`MU}*(v67Q*q@~2zlB4NE z@F6P*-JFw*;uLxnQ0P05A~s>)bVR;cXn~4^AuRAa_LQKiU%d z%2=!PEe)1zepym`+)?!~MwPxx-FoXWEK$?vlD8hD=lN_u>vi->0maIkbEysge0Vav z>F!(4%Xg(9w`m{br!UQ)kAMCS*BiOGZZkgFrv9=PJ6jb|P8;|U~=X~27t zrxtd`11LsWA>65ikvK1|ZD$U2&*NI4i(HHJQ=mJYfsG@JwV1HyOfQT_zIAi|NKTW` zTcSvPx%o1(u+|_{GS|T<4j&TAQG4WXut(2~Q_?jIS)=uWn#aTPc4o?&Gd-^Zuc*3d zRc(T3a*n|H$Dgz3N$d`O5IR-tF;_|8Ur8|4pKz08zRKWfUTJV=J1NZ2zMLqwhXXMo_K1(9OT`wU-j*+KzSgiXFQ`SN?TnwVhlwVW%=jLE?z4dO2WUOUcay;OCH&ucEz`CN70i@`-`q-`x0-a z6JXo#w=qVy(nyDNr@)XF5flljk;C@Y?r=RTFZ7Qo{f`&G{amua;Nu*fTqv~{q^M%i>9GDCUW&!NITbdnV))vV z;3AU_gUUQZ-%zhZnnM{?-7uo=GWT#%45uAt<4`2-uD9XVz!yf-jB)CrV29A-HRw_T zu6a(|FBH2G0hD!EIuA(eURW~h<`H(R`c?-s55EGmBg3O=>1!jLy2tZ^E%_|=!il=< zRYh#o>q3gv9&KLHYE5zx4xSUfjB0!(Nqrjn@N(!Y;e9WBqMf1Q-jWv^4ie1bWalN` z^@CqYz2YF?QjIkH{N7M#$#q6k3^kGVjLokMR(jUjMVreMS{-YX7X*N+dE_N+u60QZdd!{surjj_hWt)xvl0<>xXp2jf5O<2R3x4vcg)SO2oAEaM1EeAzbJvxkRa z&Ko)GwF*8IWK9KZ9%p%5$%){nE9v6cq^#c$nrSPwL8R$g;P`Yq$p`fZc~mi=CFCrw9#AZ_c|C9!=V;{o`A593-^inOk(@bGBKJhp`m>W!R$hUSy8=Y(@}0NJK~)rb-Fo(1g-3 zSl*O97IpK&gHCY1fO=Sq{vD%qJie?w9~;oE;qKsl00p8x7H~jsG|~<(`X~3x-82|w z%d;9J+hgNM9c_r7=8hO=U$=@stC~B`CG|8dgnZ+bGef&|^P{_B{>zNzV zyc!m{HtqbEhRjm-Ji%{)#k8?TwcQYsoKCQk(6GJ25l|GNNAV8%`yQq&|BffgAC%M< zB|OJGA7BI9m50XR1tducrhwj)_S~k#+|+G}q=p6GZjOb{-N}yH>x!$?BHfb2v(bo` z4>LOlUf2MYh@W*l*ohI)P~;FM`}#23>_LXX3)Htk)dYQ6#(6*W1;N6ovsPSr_RCv) zt$dkt`?Hk>K%S4AZ`YIQo0kUNUowyaoZnky*T26((;qMmGOCkPJLAp!+?& ztlg!YbRTVY7|(Gg{m6bQjfB@@s8Tcq4ER`3xBHr z_S(D{xr|UV7h&?I^BLXB<2C$;ls3(VgqIyp=sMs1E1_QBmK$%)Ts`mH7Ehf>pQ*M}3*%fk1^C=PNbGW(}4r2ydSY|fkq z1!FJabWYep$RV%A?4?VLt%`sSBOL@6O_m5AhVLFQ- zB0Iy>A`5??hp9YRWzp;Sv@&-llXo@hKnwUSk%vQ!C!Qx%2b_){&+Qp|`PROM1N}8y zPBqUrxPzK|e5_o_6O?99iC%5xwNeO{2(S{=2J{u8!bbXbhAhPuqnZFo_yv)r@D{sZ z^&wNo71fQqWZC{zYvcz1O_%P8=MX^ND8H+2Z+CRk@cey0k+QFJxiWMO7zr?_3AKW8c4D! zkdCG|NJ1Ft5LE1H%{X%|M+=9K_!omvV%wpgq&BK33NCZQC@#GqNjPhM9V3N)y&?cJYZZHW%ui)r6X1*FWBgJI@oszUaA~ zJX~qHK5t*kU_3-O{G^(Q{tItIoKdGU&ALB6xJe{fojFThc3mXjANdLkyNfLja(5PTL=V~$%zBTDp6gEai->m2nh@&_p(QD83f?&oRl-*!uQBJ-mX%WmUv zs^0tSUpE<8-;-J%XErqXKl-*~-)u{%#&uH)wmDtsXSw7BjcTDE3XfRkT?2oT;Mia| zZg^I8@Q$9R&p}JD%wnkcF>BT83oCjn%0t!7o#a}GXQYZn<85^r9*r`ful!zuEj0*3 zKhG-8=Q)~4x!F%RLa?J#-^)d7WdYcdr+*R*u9T(fBctriOJNW}zt1x#S&r3mwqa?K zf-=Zn>RfxV_I-Ovxy{>g{_sL6G306g+vfTWfXbp%t7fJjf3}^n%kG* zyLJlNclSN;p=qpb?)6uNYi#)Q>l9d1gy-@}+aMqywqHcNh;7U@N>1b8i0o26CwMe6;jxFIo>Ml% zY*4p1M&fwLZ^;C0zN~nYEZEmXdK^TI>C!(4gN0)9PLy${u#LMqdI7QrE2OeA2-2%< z-bS+6%mQ=jM?VSW#jgT;Hg8K)$rLWP1$sXTA$wU`J z7XQI1GOwH^L80YQ(xVN3X3YH#g?^=gwnj3%#U20CS|K(Q4Fl& zY0J2&QrPgdfmSmBZLPt@iB(~QJR|YQ3jH?5bc!xzIiGW&R&zE#LAQKHlG!L-B6Ko^=NEF1uHPHl#9Zv*iK~uQ~ z2C1qwH6A_#@aIO}2d>|80rE{>Bl1M?-`yhJvk!sh+)4@tt^#UXAngP~4UIo?d+!%7UN@NWFXff#zt0n6i{urMB&cPoMC8 z<+aib=2w20?2ZWpVNJ1_>v`Yv$-xD4GF^f=c)oQ8(S8rOBWv3hn$llAT(T@MujTft z+Iw;e_bjH~CHn2>LvUFO-dT-gpv5Re4h?(~w)b(|rhdMpi%s<&iZ(F>CLwip?F})i=Upi7FbyE%|d}PImTcFE&;qU zT)s+bbJ)q^EP9|% zkT~U7O`&W%ceJs{wIM=7RqGz2#WDG2!vj~%6=(RAk&}3;%UnSF@RMcsLsJ_UE}F~< zaUOmxt8=rLpfEQQLUies?8m2PdT5Z6Qq}94@lWtXbUYUw)H`xE0mm_YU0Y~R6Af=x zGmiyJR`p3t)L4x%Ed1ul_UkL7`B7}^i?ZG5!M{&} zHrh|ujE~hRkV*Uh0{{L)MRou3T76M1dr64@;eiN2`#I%zK+$=vkk$BC0*yI>V}$`e z#^P91FV^iZW=ac1-xr=Tq?aNCa|`XD0#BY>uGiQIY^hCJA{S$1YLtsNzp5@k>wJ@G zta3IJUEkA8N`L3U(8+YY0k^sbNTdZfNTMxHhR7`xs7K+pmajHq0$0`=y6THNt|&#W z@L;1d9qY>5eg7n!+elZ{-=KIk<2WAkWJ2C9A^>f%$W+LEqXwFXA{=UGjrCwWcsHkt zq=`7wRA|+G0Ke>lHWPwj`WRxl`vi)|RiWbXd*24-%Kr;l4_i7h#69#st2Zqaagi~3sMBcukdaxO^a{YGsSV#Fs-`e|rsekJwj9Y)_a{of!Ewe{02#P&3ln|*2PoeU8xvv-Qn-`gvck1&g zCNz=!o)B8Y*`Mt(TRkCHr5B)hkCPk=T+tNB*1CXAY0*W+u-(fSim$TnFsWb5u}9Z> z36!AxZ!A z_e!?)go7}YUiki*?Kjp0<}fgDI+N(4tpAm0mURaq$cBJ6aaDG0Uif1A8D+)inZo_C zRRhJKY?Jy#9YB8BqnuUr@j&i7V4!V}=}`^`-h$HOAQ_hBdN9={D}lf46& z$qyoe=sf)i=m=y3=wnv9=rviTakh-d+@hctU?@=%p!yTTY9b}2IbbbFky;IbBB3Xp z6(K*Fl<-av9qM#`H;7hwn`85`cc6eZIu0S}M#5KtI1FKlr?*3-nOYcM3l;)iB```J z0h0=b3U{0GUM_zg-IbDk!L7JR7VoFMAY9h^y_-<>KJBh+NQeb(ja^{d%U%pM_h4Z< zvn_blQCMCmWIb@|z(m^N&Dh)bHyJKl!X(UsctIU=&HDs1NfkW5J=X!KEw~OtgUwkc zMV|jEYAt|5MAaJ4j}LFmHDCM$CP;N+-ODZxjP46n#Xk~*|=(*E;m)%s?`m3tbY88pr9pbXG~iCp3&uz49W;zGC|-rJ-McVO=C$)k*$KUK>PNC##;dD=$b& zn$bs+AxFIlRBG=K`WSI9ANKVyI~>c%Rm;}!@=8kZasNtGC2}xp#?7;$=f)*I;ENZD ze7azp(1_nqotxZ6ygs@mto)z!oe>h*TdjOlay7IP{9A$qaPnz9*xgU&YF87>A!6DY z95AivLxxE>m0bSy0z*jJMouxSwWPTZERq9jSw#H^+UG}(dqBe1K~4IccbNEPL>#F)|>#zA=b)RTUC<90AV9m5JP5bFU1wLds~ z4+szGqt?2@ra=(0ncFjjapbANiQIfvaim;9aKPY|AiqflipZ>64eya^O~#GR%b=4* zxj1F?!JiT8h3hAhtups`lho-L@$|nrjb&Nl~S*oBdKBge4WFs5P5+T6cDte31kzy z>l&W9ry1ec^B50Y^Xuc)u)VmQ1Os+&ZOQa-Z>`cD{8bwBeGBF8!<`0te`xa!_iUG6 z$$y>D3S?g{bME(5L=D$X#J2)7?)X>bLo_&je&8LCkodlD^T$JXS=s$9cSogIxXSQl zsVltf)WTpZJQ zTw5;t+~7%yvx%=S#in_ap>@fL?=R&s7u6O%=N@$m+tH1|>UU`e2a_^z-9FunCfFUI z=*g^E?>*pBn|q?1C5X_b1~yVAW~Bw|DUJ>2Q;S0cNb@fK`ndknfX%#MiH`&?s_ts2AQib4fR>2Bjh1sC?Voi6UbZZ=V8w`kvPlXWERTKjLn`)N-H)%b82NgYqQ!;_fs*J(9Y%EY ze3MondUR{*uTd>}MH>VYYm91~Qs)IL-#rg+b^wDB&SiZKOhMLjIa5;Q0Ug^zg&5mL zLRy0^ohmA|<3=HyYw4o=!WTpYr68!YU94?PgO?eLGk{_s=uSL2^!&p~9IqSoY+Mee zm@s8eOYjZ=l}dp*tTk`I=b8*?aAW>Z9xLgD)s$@TwCi8F%D)0kXxYC4R6kxHtdRcJ z_wdz?vQ#|%)Xd9-e3}J#df&>BL`$Ofp!xoU5SdS+7l3O5h5$+PtihCQ=?}mBIAe;1 zsbl;hml@0;-K(G}jS=`ATI&PNn3=4EXK#CMSj*n=zl6i&pKSBsN`w$+APMsCljB7=+xY4<&BECl7fI;MvSSw3ApC_yh_z#jj* zvXN6)6$F;u8A_LKIV{Q_dw_l!o?mi%T5L;$Ad2EoX0gft5NOVT@xjzw&WL{ua~pEt zXsGkO{FogOJtvtGMGzxFU4v>;&kTJwAu3}{Nd{~(-zM@a+^J^xjenjkp8X-e*(Qp2 zuw*-DL?nWX0W8CPo#FMLC|z52YuQ*6?G_`yiMV63mb$uDagdjfq3^(s zL>`fjfLbv&HPGMamH4oyJQH^Jz;&u@Ucf?1s5>)#S=b5_TFcu54A@G!qGYFi;luZ$ zNA0)n*J@@id-Jn7mdA&9o~Op&#i070S#s2+W7K{9FbJ5_sIRNlh4xNxenzV@s(s{P}aOj1vC=J^=G5bWFQgB@vI!JjoztM6w=cSuF)h3=FEYA>yEU zhdmt%XYh7W(rlm|uofo-7^?uR)XZJj5ctk~mL{GNCucpf$O=^A+LAdpV0vlq1#mp) z+n&IMbvfp%^cTZ1t5#gYlAfoG@7ayM_>b{r>qGuXUE9cINyr;;UMyK0QizP z2y0YuzK_AO0bE%l+5$p%6_tmQv1teExKPYzS@cxW@C37$u4j&%z^-G#jSkNqoi^Wq z*>o&kT9_rj*qt$sP9lFB0t|Z54||FaYkeR&H1wyb?shzpvSm2zap5Re80HeCs`=Ba_kC zJGY=8B?~oP-8Mi6ofMy~ePfSJhtQ2`Z@J~%yovwdyV32H&Gx^k#z%E#IBxGN(VqK@ zC!XW1bIA%xZ;S8Dy%m=QK@=yF6*S;b z`^<@(YCKiOfQc=s;s|%%2+8<`EkUkXKK38OFH{{_UXr zxBgYvf4l$yc;JYO3uayGTioA+-Rn;9xew2QGVp3^9~p&x-h{It8Ig9sm6>o`>!)>B zr27XaUDUn&bAcnlp6i9uc?4}Q%u+PJ`njP_MMNg;v zM$wezl^QNrFk75f;E3|;(!n$HxE=E6caJ726ce2`<80dO`$F!!X-k&eI3bjEk>fts zWH$d{9DPcRUs;zar*4}I?VEjSUbl+XY;xRC3rrSlU7lM=ptSv`vguw`e{TH7fWBO2 znCZ9Q=O%b9u0M9>4gCNqFGb_0zpl!;Vjtc$c#D z^zEu=3lq4vY+jhOLuDftgjxqOroa4f`czLZLdl*|ra5oA`AgV1sea)4l#@uSxr8IP zzNrO+2}Igh;j_Q)iP?%$l5EJA1#35<;&)yvnnzsoGzU>c2B6n12v{;70B8i zg0r^7MI(omg9r4)ne$%%VU9SJbO$pG+j44r{kXm<>Qs@{>(N4|uIBA)5SgXZL+Ga6 z@JSp-$$3iORWjW(Q$gUM9u)vT?^Mqs{3R$vE_K3T!8sOJ-upA(v*a`|lB8o=mv$Y{BJQ z*vU6(VYAzwl9tWuyO}%w!*J(|wse&DR-CCYWx~P15sl8-2a5cUpOF<7XN(5EimO|L zUT-1a47L%|MMm!+0gfRtWj$^8la&tAuI4k^)6tlM>aD-$a>lG-3wo$Nx0VFbSXGJ+ zYMTd7XaRMUR$&O@2~}7*-WkMb$eXe!o8fU)Ac~9D&wi)87BW`9+ zg}MSobqR2zX>zudq6qRWu^bDTulDj5>-%H>MpKxa3MAWjY}|r~wr~65V)RF|o6&9ypB!aCp^m{m8H2a2LofDqB z==LMM*6h(5tvHC$wr5k+Sx?wsxSw*cRrB@@{NEYoFgrAbS44U6Ns?n)lQN)sURSSk{>L(7ezqKNbfTSNE>ZzwniD+3*NB_K0)(yTOjkoOz5Fj+kt7t)!{Vu``06U#-UrAnL@P zWv{Js2+xJE#>g(vdRiE@(GuB#2nF-%O>XrTK$EXe?IP4HSoz8V+){q7{gG`FP`bLx z8-gE4!S0L)rvicQKJn!%kq)_$8~4pEP=@coe56NPvOIwN^$xXi_!{T~ni~&~L;zY( zC|c(5v=-5_#rqxTEtwC+`}Gd|@bP1+cw*K3<;#pFqCEgTe~leCz^-}FL;>Ut<_^`X z7rj@=otwLSAbTy)P97%2{(2Sd5)D70XCw%&_(F<@^kK1RD|C~e;E@HXz2mcE;uah) zWK}^bq7UP2Vci*I=gI~Q54dpLz2F;`$%NunM zN5uCIOeD$rr5Gl)ZU?l-(6J)ycS)rbL-#^dOPPMiQ2g8>KBHRyR_g28Cb$DwH0;i!q4P4(;QH#%eEK$8O*?;`xAYM@CE#q z6=$+N3E4IV!L@SD{O_zvvxcTZ#nk>tw6 zvR`b+n%cTb6m1vYR2b#zPSu*KAol|oVqoLh%9x0RZy)XdXS@&ujNUXXPKh`F{Svnzz32*}I4pG0B*k+YH-=GuER}LM!F-SETfEqA$G=z4-L+6rd$@ z?q))02YR+|96u0?PpX5NkEi;Lb!CF@^J+yf2WCI*6oEOkZ`^QE0d+xYjE7vy>5wmb z%)qqy2D|dt>tM=fC~rryavB58FXN^<#%iEnfPlR>QLX8H$2sGeTan*;mdB+5eWf7} zkJre0f>xIeYT5|=gIeexOXgp!4%F;ZNQD7ucTNsP0uNd5LE!u#M=*ZU$DQiaKE{THGy979UcU_%?Px zM^71|pD!MMvL!}qrs%{v6e!7g(48)l1O5DNcxVXFe6d&2z0jB4$qB}BzZ+hl-*>i+_q-Ntz|n~dwGjTX zZ7BJ9|IJ*5@|_1o8~Z_-=rY3@ikJTXT(8b}8i(CHB51g3nPZcE}r2~M5zta~0odcvzOL^WM%lhMo&62l`OHMXC{x$QJ(g)pupF~Xe>*&`8B5tZRG~D$qL2DjpD)O zEYnro0M6fUW9cex_J46RHY6uQ@i6ZgUk0Y>ACOYcVjeKd`hg{b)Ld*(nAGkc;-aYb zmOykhpPgLPbMSeXKC7ePiWqIad@s8Y`R}f8n)dZgb)U)x~2?4V0|2 z7uXKSMvCnaNkVV{B9)8yBcc!X=~<~RNuM?#Htn!jyX?AjeC1NFl{EwV0J|IBX-qP?&t8@9Wi+aFa z)Jhu-9;smSRfzP>u+xA!0Vu(DknTD;iV-3Y?jPa^d# zRz4EivjAQUuBQiD`~0-e_Y(`+e||v1Zo!SY328YGQUn9p!~r=^KK4*(fHemg9QFvD zFycFoHm&%Ad?FP8oLd^UB!a+u>@6j+aIc%(C+xoQ`R_ipj^%6uC^|} z%yE=*z(mAEKS!P3JJpGe7Q*lcn|=d*6D}!Cj`6z56UTB?#>Kr!-C=FQ>Vh$iu8vEL zUINS{`KrM>s;cEAGx0)u=Q)Y6sYAo34!wOi?l>`B7s~aOk?!e}{|}hle_r zS8?zpx+Yju+kDMJPgTs)gwKS427G9Bef8j4%ZHUdB$gPQ~9PzBI_bDaHw?dE$XKpB-_N?>u^Ry0h95rG{*?>&`73tuV(Jn*sswK$wQEXWCsE|K=4FvRu0M zsVV4qV0-`YRB34lk?chiJBHycRWl^Yl*W}bD=xGwJU&U5gQxm+1GG|P90ai?642tN z>$b`IiP;?F2UBIu#Y7C_<4E2QbveCUf>aZ8%593MbBr20`bF|JFVRe3#4xszXag~!l5>h z9Acnly$ENpF(+rfUM+y-keZW~(G<{L%s<2~uQPm@R|GUQo?Ft`f8aFa1`WXD)64tlU{_r-`171=J1h}MC_K5z76-!w|TaNVjIhiI<2oi z3k<*HwL zyxld}v8Y4LqeM^yjWG~o#}6nb?sUpkrieQ8gsuD*w-cf8lm`;_11IMAoBu)_6ZYHU zKHWY(*OPMlF>~cKcN*Vc0e=8WJYXa5OVk=VA(=tzcir9?g7rFZ?K~~;%Exj*6>Fbx!JL8j z7lU$du^CTN!Q-@=&VBw?1NQfJSgaoSIO7|e(I2TRE#=XH}yh|k>V-1+y&MXT1>V%KcvCVqM1g^Rod-dsw zF1NM42;I}~)Lmk0JQP)9|cfxwHT z0x7Ffd|KHg>kFj-edbU>)w`RK0Oky?2T*c?c!L4acP*SN&8^%}Aw0Gj?dwfSEkUBu z0bYWkNTSsZL>};i4KtT`)_!NQ8_3oxi@wIr`LkAX2s(u;<}OURGIh3**`GN1%d;6jP!)k2w=N!+Z=`TjBwBk5mh)XQ1l#Lf9A1K zf(*wX7D+3f548_su6l<{y`Rc``hG%UY zC)vjL-5=lYka43~rj8sjz|`$zYD1HIA$`QG?qu`jfOtgP*v3YgisBIXYJRBj!wW#D za6CcO*(&MRx~lh&yb_D6`{W%7^HDGNGZr5t3VMU{%|+biE(ctS;0^IP7EoXu!Nt7bcotJx8!{dQu zGVpqP9M@tS$@pSaJXMmWtW^|3_AvR|V@f;{!6ZPQdk>Z<;*?Syp)#;@On;KTLj1VE ztuQ$!mN4x@*z?3RwTf8L=mFt2)&AZ6PZFtSV2JHfGdT#>iC*`q2OJfVtkzBwaNL=- zPeV189~{neibL3;e~Zd!bRO}Zg?_wIi<%L-t1e}19;GPJ>j}ZokEf1conDfAWede# zicfD6Lf-%y$_GDBr`d;E8PNyoym==hxJWG3(=fIyp}UZA;lZT>NYpBMVK^3ty5rRP z(Vp2){IrV6JUjv5|7mJqwrmiUp>FyCxVk4qi}^OD+zG1!jH+HWiDsFty7G$>zaz5b;VTrDv(`1%WnTE1VYT6$M-m~-^92f1+qiM%&^*D z@`@|q29byva$KSpq``gzX@Wn3+hunD+~r5IpckpYiHY#X$>IjagDH^Lz117V4(xbE zr?Dr5N{nSsdeo@#h;@}gSn;0j;Ub#`Q8_R8rqTU}ZukGa3QH}~gC+>E(x~W9kweE4 z2$KcWJ%`aLm1iXAe8zJ4Hx5B}S_fy2pZD^dhzG}|KJ6ZeuU03rqVJun(#Furrc2i4 z{{mdnG!um*D#Z2cj;wcJL+OS-{oZrl($NXHCcM^E*dF}Oq>X~vY>WKn)&DPgNWN;v z$icJdRxZdAGMeeDS8HNOR_a+rWQT%(dgv3}+GZjxVcKc-@GUXIaRfICSlB zu-R@~vf71O%J_$i={UT?DYBpb?bN6H61P# z6MZ8Krh{QrRO-c9iin?2jxBIF4&T~Tg*VMVc08&hdE7e$Z@$+2^U*7j>&KmE_V9F( z_5+Igb`rf#R$(RLjG&gCwOLi=@PmyKWp&_tz^aQTDw7$Q=?ER2AP7Y`oDNZ??6QT_ zVsE-LCZ^d^`N5nf;)IV&6A+A8<9NU;fK_J0(`gX&ojczH`1(C9SHR~-SVmi*=3AsK zeUDTwKX2bV>HGBhJ{5|Z^6vvSyJuj(em0TNj=e8&iYV%dA(-x?MU-R7a}~dMypXuB z+%B{@Ubi&aR6e=MOKa|AIilL&+g&`Oqo@8=a$4WRzH;LWAt3RO8KM6~?;3~OpP+N* zq>DpRZW3MK4*p4)ZGqX3843cz{8r4>aFgLEtyJpzCiu5>)J0UY%qzaHl~=C?TqG7A z4&1sf%+pw-FpBTUeyHK~k_HS_?Tb@&4oyfK69G~;tK9$?Z8IRy!Un7cM8!4UGLhiG z$LQ9fnU#-;a1c(4>KNTnFjMV@H-|Lq@+OIA@(hJ+Q}o;>BcuVGb;%e{FJ5_IQ9|=Q!qvO!*>hC`ndJm75)0&m8B$DeR)bk*SoOr8Z#JLwLIUK=^2i2{npDSYSL1g?n z=okv&1+tUxQ4<^wlF*-6?dT-Q%j30kcW+nL7g2Ve6dZWvWr)@!9Q6s z-j+A7s<%#9Zyzmsbbn5cG(r6%CfB4-DtMUBYRiPO+sNYtb`k!*q1LZq*1--zRCzt{Qb~dst(*aQX1z}Rts|jhHoIO;8f%P<=@vTIFT<=`3A^Ks7 zmG@8A2t2Et7H$3%J8iiPX+U22W- zI}sr5odo#c9s>)>4_PxsJ2r$7n~x#yTl&s*lMJg!Q;HJ~`<>?R*x~DH?iW_g_4cX? zRKTZ9VYc!ua~E#IuhFg%J?LLXv>tJ)p+j!XV)aXF#YARiLKhi@c*4iv7nQK^8~b=< z);_ZQ57uebqp*Q!L>wGqcpPF=4r8KfaUn^}_n=#n60+)r2Ca zf(Chj-0BwxtqElYe(GR`+4kC93T_%pH^dk;Lja#WTE%DUY!;a6@zJb6VVVRfvB zmpf72de_Z^wd9UVfxt1k_Gry&%fU9wDVYFlFI7G%KPfFO zJ@Ry(#%}&UUI41YvM8$j0s+*WeX}azX)==DU9D4tTCirk`L4f5@KNkfLM`7)D{Bzf zw$>Ehx5S#R0pyBB^L(3QWuIl#KW!8L>8XWg(ALM|bNK#(-hB7skI zZuwc=HTU?zyU%7WB?y+|J$_}|rD}Jd*Yuw|J06k)#CqV%t1@!vJWFXYG%Etm17VB9 zr!0g#n;K;Or{IBk*b|B;b*Se&ktdOjD`A%a&C|Ai_&-$rg+tR}ANCDzu#Flm9UCDb zjkLl>NQjgHh;#_j9TFSeEuexDqJ*>(QXA4DAxKF#NSD;u-d*?eUeA3!f5Xn5zw>*1 zkI!+OT18b7oWY-|^W1Ds>GB9FPOu1+--dd~0tY5HAHODl@DopwJ=*JH17Lws;<><>W3c7O=!fJ8d~1ZEBmC%83d>g@*oXQG(N0t9&Q4TcL9Z%y{a8!2@fYWak6(gG3A)N-lj$?nBEmB6kcCCf*wI4K^U&c?U^V`G^_mOpD)a7l zpQ$#gy)e$Il$w^PV9H+LOC%#7RtsqT;7K_9EfB?N#D{3G@oD&B`lu8Mshu6VGCog| zBtw_Kk=#1^gNh|_Pv58BdM?C%aZ4@@K$JexfxJRQMJ(|_`P%j1%A3z1M*D|%?;Gr& zorLvnrlM2Td;RK?szuMubmSF7Q_r}ydh0C0g?d@<(8V7afwv`g!mFlhoF=E2Ii(LN z;&hk-h9=YR&h!vgw~*ZJ6>$!TB67e@Gs#^g13GNyl6w?j!vB&Vps>G5^ub@ildGf? z;ZI8k3_Sp$4G%}$9qOwNMMz&iChljWVVyv_+y#SVvaCKs=`)H0V}R$NeJ6~UJlXVN zaOUlq_)T$VpIHk5yx<`=e&89ArXE(GUs%0-V}Id5@-I{EA}5}FL~d!VC~{5uIj+&O zAw>d)-eYbJ2+EPi9nl_zdR*JQ54&s=eZgv;>T?u>5H#2gv=kBxAz?XX)vQc zDWY^iLX#1hE>j}kn0Vcf?%j%s$7~Va9V@*zSYcDFpl$GQssV@C;qf<&GnnZ zoL`0MFTa%A;k%SE<6w`=&D4YS)VBEpcj9~CzYF1oM;kt{Fhz+r0%kcRkeh{N#0uL+ zYThgY38394;dHBj;3R9P!-lc%!$~7&dQGuX84Fjp$o6DuqHMSDAHvCKZmzr&K9E~c zep@)WA%=>;e`F?&_iRkUk4dF$+Ms{3I){Wrynu(l&TD#Q)80Bag}?1;sQ0gRWKwVZ zvY*b%*gAXJvUyp|(DRR=2jjxU9EIY{^BqH_KkkDih|8_kbstQ$#MO1R?P2ZBYpum2 zHe&KqHdNPR7rD$z3@fplZqeoM z13@atq}z3(!<{zFR1DMeHR|Xi#sZTi(yS(h!D`47HX~c zyrVG;wtq3@v3P=ZiR62bmuMCFDhX3ONbp^hkofUYu--O0c;Y?==g&b=iez@@m3hS) zSDEmY6#rZ7VHH&pW7ivj*oGRAC@m7~HKd>>U=HYv65>TNf(lk?;&TbV@o)+}%NIN~ zRbEscsx!e@UdGjPP}&5qI9a4L+MmGW==vu&Pgd7hS0Nx}S8TEUeIw!D@KMZJ=p8bY zEaH%eUHt!TVK zt3dYIdw&PRYU)$6EbgZ6DHUF6ouPNr5MY8$`E;Lp$`tgXOF2!Y*dMeh8wKDa?~)*b z)C^~$tjvxf6IAVKlh=oY2#IOD4Rb&ThSnW*V{d2a2oTE(-n7FbD1a|k5E}IG+ayUu zCuEQxs8xbNk61h7W^D`NSB;yZDbNA*75z%%AdybW;F%<>

Kfe7Slm`a?Y2TknP@ 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 literal 0 HcmV?d00001 diff --git a/QueueCube/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/QueueCube/App/Assets.xcassets/AppIcon.appiconset/Contents.json index 2305880..ce8e776 100644 --- a/QueueCube/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/QueueCube/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,6 +1,7 @@ { "images" : [ { + "filename" : "AppIcon.png", "idiom" : "universal", "platform" : "ios", "size" : "1024x1024" diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index a7e717a..6dd5ebe 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -118,6 +118,13 @@ struct API .post() } + public func replace(mediaURL: String) async throws { + try await request() + .path("/playlist/replace") + .body([ "url" : mediaURL ]) + .post() + } + public func addFavorite(mediaURL: String) async throws { try await request() .path("/favorites") diff --git a/QueueCube/Backend/Utilities.swift b/QueueCube/Backend/Utilities.swift index 975147f..dcd2e9a 100644 --- a/QueueCube/Backend/Utilities.swift +++ b/QueueCube/Backend/Utilities.swift @@ -83,6 +83,7 @@ struct RequestBuilder public func websocket() -> URL { guard var components = URLComponents(url: self.url, resolvingAgainstBaseURL: false) else { fatalError() } components.scheme = components.scheme == "https" ? "wss" : "ws" + components.host = components.host!.replacing(/\%(.*)$/, with: "") return components.url! } diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index 31ceec3..4982176 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -43,6 +43,9 @@ } } } + }, + "ADD_TO_QUEUE" : { + }, "CANCEL" : { "localizations" : { @@ -74,6 +77,26 @@ } } }, + "COPY_TITLE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copy Title" + } + } + } + }, + "COPY_URL" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copy URL" + } + } + } + }, "DISCOVERED" : { "localizations" : { "en" : { @@ -94,6 +117,16 @@ } } }, + "EDIT" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Edit…" + } + } + } + }, "ENTER_MANUALLY" : { "localizations" : { "en" : { @@ -104,6 +137,16 @@ } } }, + "FAVORITE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorite" + } + } + } + }, "FAVORITES" : { "localizations" : { "en" : { @@ -175,6 +218,16 @@ } } }, + "NOT_PLAYING" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Not Playing" + } + } + } + }, "Nothing here yet." : { }, @@ -269,6 +322,9 @@ } } } + }, + "TODO" : { + }, "UNABLE_TO_CONNECT" : { "localizations" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index 22709d7..df79547 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -24,6 +24,7 @@ extension LocalizedStringKey static let connectionError = LocalizedStringKey("CONNECTION_ERROR") static let playlist = LocalizedStringKey("PLAYLIST") static let favorites = LocalizedStringKey("FAVORITES") + static let favorite = LocalizedStringKey("FAVORITE") static let servers = LocalizedStringKey("SERVERS") static let addServer = LocalizedStringKey("ADD_SERVER") static let cancel = LocalizedStringKey("CANCEL") @@ -37,4 +38,9 @@ extension LocalizedStringKey static let searchForMedia = LocalizedStringKey("SEARCH_FOR_MEDIA") static let searching = LocalizedStringKey("SEARCHING_") static let noResultsFound = LocalizedStringKey("NO_RESULTS_FOUND") + static let copyTitle = LocalizedStringKey("COPY_TITLE") + static let copyURL = LocalizedStringKey("COPY_URL") + static let edit = LocalizedStringKey("EDIT") + static let addToQueue = LocalizedStringKey("ADD_TO_QUEUE") + static let notPlaying = LocalizedStringKey("NOT_PLAYING") } diff --git a/QueueCube/Views/ContentPlaceholderView.swift b/QueueCube/Views/ContentPlaceholderView.swift index 4bc548b..df33000 100644 --- a/QueueCube/Views/ContentPlaceholderView.swift +++ b/QueueCube/Views/ContentPlaceholderView.swift @@ -33,6 +33,7 @@ struct ContentPlaceholderView: View func contentPlaceholderView( title: LocalizedStringKey, + subtitle: (any StringProtocol)? = nil, systemImage: String, @ViewBuilder actions: () -> Actions = { EmptyView() }) -> ContentPlaceholderView { @@ -50,6 +51,11 @@ func contentPlaceholderView( Text(title) .foregroundStyle(.tint) .bold() + + if let subtitle { + Text(subtitle) + .foregroundStyle(.tint.opacity(0.5)) + } Spacer() .frame(height: 14.0) diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 30eb7ab..cef63bd 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -30,6 +30,9 @@ struct ContentView: View selection: $model.addMediaViewModel.activeDetent ) } + .sheet(isPresented: $model.isEditSheetPresented) { + Text("TODO") + } } // MARK: - Types @@ -50,13 +53,8 @@ extension ContentView await model.withModificationsViaAPI { api in if what.contains(.nowPlaying) { let nowPlaying = try await api.fetchNowPlayingInfo() - if let nowPlayingItem = nowPlaying.playingItem, let title = nowPlayingItem.title { - model.nowPlayingViewModel.title = title - model.nowPlayingViewModel.subtitle = nowPlayingItem.filename ?? "" - } else { - model.nowPlayingViewModel.title = "(Not Playing)" - model.nowPlayingViewModel.subtitle = "" - } + model.nowPlayingViewModel.title = nowPlaying.playingItem?.title + model.nowPlayingViewModel.subtitle = nowPlaying.playingItem?.filename model.nowPlayingViewModel.isPlaying = !nowPlaying.isPaused model.nowPlayingViewModel.volume = Double(nowPlaying.volume) / 100.0 diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index 5d8a5f1..f6936fe 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -17,6 +17,7 @@ class MainViewModel var isNowPlayingSheetPresented: Bool = false var isAddMediaSheetPresented: Bool = false + var isEditSheetPresented: Bool = false var playlistModel = MediaListViewModel(mode: .playlist) var favoritesModel = MediaListViewModel(mode: .favorites) @@ -90,8 +91,21 @@ class MainViewModel } } + playlistModel.onFavorite = apiCallback { item, api in + try await api.addFavorite(mediaURL: item.filename) + } + // Favorites favoritesModel.onPlay = apiCallback { item, api in + try await api.replace(mediaURL: item.filename) + try await api.play() + } + + favoritesModel.onEdit = { [weak self] item in + self?.isEditSheetPresented = true + } + + favoritesModel.onQueue = apiCallback { item, api in try await api.add(mediaURL: item.filename) } @@ -230,6 +244,7 @@ struct MainView: View SettingsView(onDone: {}) } } + .tabViewStyle(.sidebarAdaptable) } } @@ -251,6 +266,7 @@ struct NowPlayingMiniPlayerModifier: ViewModifier NowPlayingMiniView(model: $model, onTap: onTap) .padding() .fixedSize(horizontal: false, vertical: true) + .frame(maxWidth: 800.0) .onGeometryChange(for: CGSize.self) { $0.size } action: { nowPlayingHeight = $0.height } } @@ -346,8 +362,11 @@ struct ErrorDisplayModifier: ViewModifier Rectangle() .fill(.background) - contentPlaceholderView(title: "\(String(describing: error))", systemImage: "exclamationmark.triangle.fill") - .tint(.label) + contentPlaceholderView( + title: .connectionError, + subtitle: error?.localizedDescription, + systemImage: "exclamationmark.triangle.fill" + ).tint(.label) } } } diff --git a/QueueCube/Views/NowPlayingMiniView.swift b/QueueCube/Views/NowPlayingMiniView.swift index 6bfed43..e2c0715 100644 --- a/QueueCube/Views/NowPlayingMiniView.swift +++ b/QueueCube/Views/NowPlayingMiniView.swift @@ -12,6 +12,7 @@ struct NowPlayingMiniView: View { let onTap: () -> Void @GestureState private var tapGestureState = false + private var nothingQueued: Bool { model.title == nil && model.subtitle == nil } var body: some View { let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" @@ -25,15 +26,25 @@ struct NowPlayingMiniView: View { HStack { VStack(alignment: .leading) { - Text(model.title) - .font(.caption) - .lineLimit(1) - .bold() + if let title = model.title { + Text(title) + .font(.caption) + .lineLimit(1) + .bold() + } - Text(model.subtitle) - .lineLimit(1) - .font(.caption) - .foregroundStyle(.secondary) + if let subtitle = model.subtitle { + Text(subtitle) + .lineLimit(1) + .font(.caption) + .foregroundStyle(.secondary) + } + + if nothingQueued { + Text(.notPlaying) + .font(.caption) + .foregroundStyle(.secondary) + } } Spacer() @@ -42,7 +53,7 @@ struct NowPlayingMiniView: View { .imageScale(.large) .padding(12.0) } - .padding(EdgeInsets(top: 4.0, leading: 10.0, bottom: 4.0, trailing: 10.0)) + .padding(EdgeInsets(top: 4.0, leading: 14.0, bottom: 4.0, trailing: 10.0)) .background( RoundedRectangle(cornerRadius: 12) .fill(tapGestureState ? .ultraThinMaterial : .bar) diff --git a/QueueCube/Views/NowPlayingView.swift b/QueueCube/Views/NowPlayingView.swift index 677dc3b..66e855e 100644 --- a/QueueCube/Views/NowPlayingView.swift +++ b/QueueCube/Views/NowPlayingView.swift @@ -18,60 +18,101 @@ class NowPlayingViewModel var onSheetDismiss: (NowPlayingViewModel) -> Void = { _ in } var isPlaying: Bool = false - var title: String = "" - var subtitle: String = "" + var title: String? = "" + var subtitle: String? = "" var volume: Double = 0.5 + + fileprivate var isSettingVolume: Bool = false + fileprivate var settingVolume: Double = 0.0 { + didSet { volume = settingVolume } + } } struct NowPlayingView: View { @State var model: NowPlayingViewModel + private var nothingQueued: Bool { model.title == nil && model.subtitle == nil } var body: some View { NavigationStack { VStack { - Text(model.title) - .font(.title2) - .lineLimit(1) - .bold() - - Text(model.subtitle) - .font(.title3) - .foregroundStyle(.secondary) - .lineLimit(1) - Spacer() + .frame(height: 1.0) - HStack { - ForEach(Buttons.allCases) { button in - Spacer() - - Button(action: button.action(model: model)) { - Image(systemName: button.imageName(isPlaying: model.isPlaying)) - .resizable() - .aspectRatio(1.0, contentMode: .fit) - } - - Spacer() + VStack { + if let title = model.title { + Text(title) + .font(.title2) + .lineLimit(1) + .bold() + } + + if let subtitle = model.subtitle { + Text(subtitle) + .font(.title3) + .foregroundStyle(.secondary) + .lineLimit(1) + } + + if nothingQueued { + Text(.notPlaying) + .font(.title2) + .foregroundStyle(.secondary) } } - .imageScale(.large) - .frame(height: 34.0) - .tint(.label) - Spacer() + Spacer(minLength: 24.0) - Slider( - value: $model.volume, - in: 0.0...1.0, - onEditingChanged: { _ in model.onVolumeChange(model) } + VStack { + HStack { + ForEach(Buttons.allCases) { button in + Spacer() + + Button(action: button.action(model: model)) { + Image(systemName: button.imageName(isPlaying: model.isPlaying)) + .resizable() + .aspectRatio(1.0, contentMode: .fit) + .scaleEffect(button.scale, anchor: .center) + .tint(button.tintColor) + } + .disabled(nothingQueued) + + Spacer() + } + } + .imageScale(.large) + .frame(height: 34.0) + .tint(.label) + + Spacer() + + Slider( + value: model.isSettingVolume ? $model.settingVolume : $model.volume, + in: 0.0...1.0, + onEditingChanged: { editing in + if model.isSettingVolume != editing { + model.settingVolume = model.volume + model.isSettingVolume = editing + } + + model.onVolumeChange(model) + } + ) + .padding(.horizontal, 18.0) + .padding(.bottom, -12.0) // intrinsic sizing bug workaround? + } + .padding(.vertical, 44.0) + .padding(.horizontal, 12.0) + .frame(maxWidth: .infinity) + .background( + RoundedRectangle(cornerRadius: 14.0) + .fill(.ultraThinMaterial) + .stroke(Color.label.opacity(0.08)) ) - .padding(.horizontal, 18.0) - - Spacer() } - .padding(24.0) + .padding(.horizontal, 15.0) + .padding(.bottom, 10.0) .toolbar { ToolbarItemGroup(placement: .topBarTrailing) { @@ -96,6 +137,24 @@ struct NowPlayingView: View var id: Int { rawValue } + var scale: Double { + switch self { + case .backward: 0.7 + case .forward: 0.7 + case .playPause: 1.0 + case .stop: 0.8 + } + } + + var tintColor: Color { + switch self { + case .backward: .label.mix(with: .gray, by: 0.5) + case .forward: .label.mix(with: .gray, by: 0.5) + case .playPause: .label + case .stop: .label + } + } + func imageName(isPlaying: Bool) -> String { switch self { case .backward: "backward.fill" diff --git a/QueueCube/Views/PlaylistView.swift b/QueueCube/Views/PlaylistView.swift index 5b9b3a4..9f312df 100644 --- a/QueueCube/Views/PlaylistView.swift +++ b/QueueCube/Views/PlaylistView.swift @@ -40,8 +40,11 @@ class MediaListViewModel var isPlaying: Bool = false var items: [MediaListItem] = [] - var onSeek: (MediaListItem) -> Void = { _ in } - var onPlay: (MediaListItem) -> Void = { _ in } + var onSeek: (MediaListItem) -> Void = { _ in } + var onPlay: (MediaListItem) -> Void = { _ in } + var onQueue: (MediaListItem) -> Void = { _ in } + var onEdit: (MediaListItem) -> Void = { _ in } + var onFavorite: (MediaListItem) -> Void = { _ in } init(mode: MediaListMode) { self.mode = mode @@ -81,6 +84,44 @@ struct MediaListView: View ) } .listRowBackground((model.mode == .playlist && state != .queued) ? Color.accentColor.opacity(0.10) : nil) + .contextMenu { + Button(.copyTitle) { + UIPasteboard.general.string = item.title + } + + Button(.copyURL) { + if let url = URL(string: item.filename) { + UIPasteboard.general.url = url + } else { + UIPasteboard.general.string = item.filename + } + } + + if model.mode == .favorites { + Button(.edit) { + model.onEdit(item) + } + } + } + .swipeActions(edge: .leading) { + if model.mode == .favorites { + Button { + model.onQueue(item) + } label: { + Image(systemName: "plus.square.on.square") + Text(.addToQueue) + } + .tint(.blue) + } else if model.mode == .playlist { + Button { + model.onFavorite(item) + } label: { + Image(systemName: "star") + Text(.favorite) + } + .tint(.yellow) + } + } } } } diff --git a/QueueCube/Views/Settings View/AddServerView.swift b/QueueCube/Views/Settings View/AddServerView.swift index ba2422a..498b52d 100644 --- a/QueueCube/Views/Settings View/AddServerView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -111,6 +111,7 @@ struct AddServerView: View class ViewModel { var serverURL: String = "" + var validationURL: String = "" var validationState: ValidationState = .empty var discoveredServers: [DiscoveredEndpoint] = [] @@ -152,6 +153,7 @@ struct AddServerView: View } private func setNeedsValidation() { + self.validationURL = self.serverURL self.validationTimer?.invalidate() self.validationTimer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false) { [weak self] _ in self?.validateSettings() @@ -159,7 +161,7 @@ struct AddServerView: View } private func validateSettings() { - guard !serverURL.isEmpty else { + guard !validationURL.isEmpty else { validationState = .empty return } @@ -168,14 +170,22 @@ struct AddServerView: View Task { do { - let url = try URL(string: serverURL).try_unwrap() + let url = try URL(string: validationURL).try_unwrap() let api = API(baseURL: url) _ = try await api.fetchNowPlayingInfo() self.validationState = .valid + self.serverURL = self.validationURL } catch { print("Validation failed: \(error)") - self.validationState = .notValid + + if !validationURL.hasSuffix("/api") { + // Try adding /api and validating again. + self.validationURL = serverURL.appending("/api") + validateSettings() + } else { + self.validationState = .notValid + } } } } From 6e5e587998ecc42526090066317703e9576e9b96 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 20 Jun 2025 18:50:06 -0700 Subject: [PATCH 26/31] implements editing items in favorites --- QueueCube/Backend/API.swift | 8 +++ QueueCube/Backend/Utilities.swift | 1 + QueueCube/Localizable/Localizable.xcstrings | 40 ++++++++++++-- QueueCube/Localizable/Strings.swift | 5 +- QueueCube/Views/ContentView.swift | 3 +- QueueCube/Views/EditItemView.swift | 60 +++++++++++++++++++++ QueueCube/Views/MainView.swift | 16 +++++- 7 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 QueueCube/Views/EditItemView.swift diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index 6dd5ebe..bb9822f 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -139,6 +139,14 @@ struct API .execute() } + public func renameFavorite(mediaURL: String, title: String) async throws { + try await request() + .pathString("/favorites/\(mediaURL.uriEncoded())/title") + .body([ "title": title ]) + .method(.put) + .execute() + } + public func delete(index: Int) async throws { try await request() .path("/playlist/\(index)") diff --git a/QueueCube/Backend/Utilities.swift b/QueueCube/Backend/Utilities.swift index dcd2e9a..f4d4d00 100644 --- a/QueueCube/Backend/Utilities.swift +++ b/QueueCube/Backend/Utilities.swift @@ -89,6 +89,7 @@ struct RequestBuilder enum HTTPMethod: String { case get = "GET" + case put = "PUT" case post = "POST" case delete = "DELETE" } diff --git a/QueueCube/Localizable/Localizable.xcstrings b/QueueCube/Localizable/Localizable.xcstrings index 4982176..87be220 100644 --- a/QueueCube/Localizable/Localizable.xcstrings +++ b/QueueCube/Localizable/Localizable.xcstrings @@ -45,7 +45,14 @@ } }, "ADD_TO_QUEUE" : { - + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Add to Queue" + } + } + } }, "CANCEL" : { "localizations" : { @@ -127,6 +134,16 @@ } } }, + "EDIT_ITEM" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Edit Item" + } + } + } + }, "ENTER_MANUALLY" : { "localizations" : { "en" : { @@ -323,8 +340,15 @@ } } }, - "TODO" : { - + "TITLE" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Title" + } + } + } }, "UNABLE_TO_CONNECT" : { "localizations" : { @@ -336,6 +360,16 @@ } } }, + "URL" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "URL" + } + } + } + }, "VALIDATING" : { "localizations" : { "en" : { diff --git a/QueueCube/Localizable/Strings.swift b/QueueCube/Localizable/Strings.swift index df79547..bc73ee7 100644 --- a/QueueCube/Localizable/Strings.swift +++ b/QueueCube/Localizable/Strings.swift @@ -9,7 +9,7 @@ import SwiftUI extension LocalizedStringKey { - static let serverURL = LocalizedStringKey("SERVER_URL") + static let serverURL = LocalizedStringKey("SERVER_URL") static let settings = LocalizedStringKey("SETTINGS") static let settings_ = LocalizedStringKey("SETTINGS_ELLIPSES") static let done = LocalizedStringKey("DONE") @@ -41,6 +41,9 @@ extension LocalizedStringKey static let copyTitle = LocalizedStringKey("COPY_TITLE") static let copyURL = LocalizedStringKey("COPY_URL") static let edit = LocalizedStringKey("EDIT") + static let editItem = LocalizedStringKey("EDIT_ITEM") static let addToQueue = LocalizedStringKey("ADD_TO_QUEUE") static let notPlaying = LocalizedStringKey("NOT_PLAYING") + static let url = LocalizedStringKey("URL") + static let title = LocalizedStringKey("TITLE") } diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index cef63bd..08529cd 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -31,7 +31,8 @@ struct ContentView: View ) } .sheet(isPresented: $model.isEditSheetPresented) { - Text("TODO") + EditItemView(model: $model.editMediaViewModel) + .presentationBackground(.regularMaterial) } } diff --git a/QueueCube/Views/EditItemView.swift b/QueueCube/Views/EditItemView.swift new file mode 100644 index 0000000..8dd1194 --- /dev/null +++ b/QueueCube/Views/EditItemView.swift @@ -0,0 +1,60 @@ +// +// EditItemView.swift +// QueueCube +// +// Created by James Magahern on 6/20/25. +// + +import SwiftUI + +@Observable +class EditItemViewModel +{ + var mediaURL: String = "" + var title: String = "" + + var onDone: (EditItemViewModel) -> Void = { _ in } + var onCancel: (EditItemViewModel) -> Void = { _ in } +} + +struct EditItemView: View +{ + @Binding var model: EditItemViewModel + + var body: some View { + NavigationStack { + Form { + Section(.url) { + TextField(.url, text: $model.mediaURL) + .foregroundStyle(.secondary) + .disabled(true) // editing URL not yet supported by server + .contextMenu { + Button(.copyURL) { + UIPasteboard.general.string = model.mediaURL + } + } + } + + Section(.title) { + TextField(.title, text: $model.title) + } + } + .navigationTitle(.editItem) + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItemGroup(placement: .topBarLeading) { + Button(.cancel, role: .cancel) { + model.onCancel(model) + } + } + + ToolbarItemGroup(placement: .topBarTrailing) { + Button(.done, role: .destructive) { + model.onDone(model) + } + .bold() + } + } + } + } +} diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index f6936fe..9d4c806 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -24,6 +24,7 @@ class MainViewModel var nowPlayingViewModel = NowPlayingViewModel() var addMediaViewModel = AddMediaView.ViewModel() var serverSelectionViewModel = ServerSelectionToolbarModifier.ViewModel() + var editMediaViewModel = EditItemViewModel() private var refreshingFromAPIDepth: UInt8 = 0 private var isRefreshingFromAPI: Bool { refreshingFromAPIDepth > 0 } @@ -102,13 +103,26 @@ class MainViewModel } favoritesModel.onEdit = { [weak self] item in - self?.isEditSheetPresented = true + guard let self else { return } + editMediaViewModel.mediaURL = item.filename + editMediaViewModel.title = item.title + isEditSheetPresented = true } favoritesModel.onQueue = apiCallback { item, api in try await api.add(mediaURL: item.filename) } + // Edit + editMediaViewModel.onCancel = { [weak self] _ in + self?.isEditSheetPresented = false + } + + editMediaViewModel.onDone = apiCallback { [weak self] model, api in + self?.isEditSheetPresented = false + try await api.renameFavorite(mediaURL: model.mediaURL, title: model.title) + } + // Add Media addMediaViewModel.onAdd = apiCallback { [weak self] mediaURL, api in guard let self else { return } From 839ec53c17372a4502d901fd0f24cec681f600c2 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 20 Jun 2025 19:03:33 -0700 Subject: [PATCH 27/31] fix volume slider --- QueueCube/Views/MainView.swift | 20 ++++++++++++++++---- QueueCube/Views/NowPlayingView.swift | 3 --- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index 9d4c806..eb501b6 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -38,6 +38,7 @@ class MainViewModel init() { observePlaylistChanges() + observeNowPlayingModel() configureViewModelCallbacks() } @@ -77,10 +78,6 @@ class MainViewModel try await api.previous() } - nowPlayingViewModel.onVolumeChange = apiCallback { model, api in - try await api.setVolume(model.volume) - } - nowPlayingViewModel.onSheetDismiss = { [weak self] _ in self?.isNowPlayingSheetPresented = false } @@ -148,6 +145,21 @@ class MainViewModel } } + func observeNowPlayingModel() { + withObservationTracking { + _ = nowPlayingViewModel.volume + } onChange: { [weak self] in + Task { + guard let self else { return } + await self.withModificationsViaAPI { api in + try await api.setVolume(self.nowPlayingViewModel.volume) + } + + await MainActor.run { self.observeNowPlayingModel() } + } + } + } + func withModificationsViaAPI(_ modificationBlock: (API) async throws -> Void) async { guard let api = selectedServer?.api else { return } diff --git a/QueueCube/Views/NowPlayingView.swift b/QueueCube/Views/NowPlayingView.swift index 66e855e..3de33fc 100644 --- a/QueueCube/Views/NowPlayingView.swift +++ b/QueueCube/Views/NowPlayingView.swift @@ -14,7 +14,6 @@ class NowPlayingViewModel var onStop: (NowPlayingViewModel) -> Void = { _ in } var onNext: (NowPlayingViewModel) -> Void = { _ in } var onPrev: (NowPlayingViewModel) -> Void = { _ in } - var onVolumeChange: (NowPlayingViewModel) -> Void = { _ in } var onSheetDismiss: (NowPlayingViewModel) -> Void = { _ in } var isPlaying: Bool = false @@ -94,8 +93,6 @@ struct NowPlayingView: View model.settingVolume = model.volume model.isSettingVolume = editing } - - model.onVolumeChange(model) } ) .padding(.horizontal, 18.0) From 4021881f116a2d86f5c16d84c5ed0566d6a35289 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Sun, 5 Oct 2025 18:19:51 -0700 Subject: [PATCH 28/31] Resolve various connection issues --- QueueCube/Backend/API.swift | 23 ++++++++++++------- QueueCube/Views/ContentView.swift | 21 +++++++++++++---- QueueCube/Views/MainView.swift | 10 +++++--- QueueCube/Views/NowPlayingMiniView.swift | 10 +++++--- .../Views/Settings View/AddServerView.swift | 5 +++- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index bb9822f..5e42b21 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -54,10 +54,12 @@ struct NowPlayingInfo: Codable let volume: Int } -struct API +actor API { let baseURL: URL + private var pingTask: Task<(), any Swift.Error>? = nil + init(baseURL: URL) { self.baseURL = baseURL } @@ -168,17 +170,20 @@ struct API } public func events() async throws -> AsyncStream { + let requestBuilder: () -> RequestBuilder = request + return AsyncStream { continuation in - var websocketTask: URLSessionWebSocketTask = spawnWebsocketTask(with: continuation) + let websocketTask: URLSessionWebSocketTask = API.spawnWebsocketTask(requestBuilder: requestBuilder, with: continuation) Task { - while true { + var pingLoopEnabled = true + while pingLoopEnabled { try await Task.sleep(for: .seconds(5)) websocketTask.sendPing { error in if let error { - notifyError(error, continuation: continuation) - websocketTask = spawnWebsocketTask(with: continuation) + API.notifyError(error, continuation: continuation) + pingLoopEnabled = false } else { continuation.yield(.event(Event(type: .receivedWebsocketPong))) } @@ -188,11 +193,12 @@ struct API } } - private func spawnWebsocketTask( + private static func spawnWebsocketTask( + requestBuilder: () -> RequestBuilder, with continuation: AsyncStream.Continuation ) -> URLSessionWebSocketTask { - let url = request() + let url = requestBuilder() .path("/events") .websocket() @@ -225,8 +231,9 @@ struct API return websocketTask } - private func notifyError(_ error: any Swift.Error, continuation: AsyncStream.Continuation) { + private static func notifyError(_ error: any Swift.Error, continuation: AsyncStream.Continuation) { print("Websocket Error: \(error)") + var shouldNotifyObservers = true let nsError = error as NSError if nsError.code == 53 { diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 08529cd..218cace 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -98,10 +98,17 @@ extension ContentView for await streamEvent in try await api.events() { switch streamEvent { case .event(let event): - model.connectionError = nil + await clearConnectionErrorIfNecessary() await handle(event: event) case .error(let error): model.connectionError = error + + Task { @MainActor in + try await Task.sleep(for: .seconds(1.0)) + websocketRestartTrigger += 1 + } + + break } } } catch { @@ -128,10 +135,14 @@ extension ContentView case .receivedWebsocketPong: // This means we're online. - if model.connectionError != nil { - model.connectionError = nil - await refresh([.playlist, .nowPlaying, .favorites]) - } + await clearConnectionErrorIfNecessary() + } + } + + private func clearConnectionErrorIfNecessary() async { + if model.connectionError != nil { + model.connectionError = nil + await refresh([.playlist, .nowPlaying, .favorites]) } } diff --git a/QueueCube/Views/MainView.swift b/QueueCube/Views/MainView.swift index eb501b6..2116278 100644 --- a/QueueCube/Views/MainView.swift +++ b/QueueCube/Views/MainView.swift @@ -149,10 +149,14 @@ class MainViewModel withObservationTracking { _ = nowPlayingViewModel.volume } onChange: { [weak self] in + guard let self else { return } + + let isRefreshing = isRefreshingFromAPI Task { - guard let self else { return } - await self.withModificationsViaAPI { api in - try await api.setVolume(self.nowPlayingViewModel.volume) + if !isRefreshing { + await self.withModificationsViaAPI { api in + try await api.setVolume(self.nowPlayingViewModel.volume) + } } await MainActor.run { self.observeNowPlayingModel() } diff --git a/QueueCube/Views/NowPlayingMiniView.swift b/QueueCube/Views/NowPlayingMiniView.swift index e2c0715..bcb57c1 100644 --- a/QueueCube/Views/NowPlayingMiniView.swift +++ b/QueueCube/Views/NowPlayingMiniView.swift @@ -12,7 +12,11 @@ struct NowPlayingMiniView: View { let onTap: () -> Void @GestureState private var tapGestureState = false - private var nothingQueued: Bool { model.title == nil && model.subtitle == nil } + + private var nothingQueued: Bool { + guard let title = model.title, let subtitle = model.subtitle else { return true } + return title.isEmpty && subtitle.isEmpty + } var body: some View { let playPauseImageName = model.isPlaying ? "pause.fill" : "play.fill" @@ -26,14 +30,14 @@ struct NowPlayingMiniView: View { HStack { VStack(alignment: .leading) { - if let title = model.title { + if let title = model.title, !title.isEmpty { Text(title) .font(.caption) .lineLimit(1) .bold() } - if let subtitle = model.subtitle { + if let subtitle = model.subtitle, !subtitle.isEmpty { Text(subtitle) .lineLimit(1) .font(.caption) diff --git a/QueueCube/Views/Settings View/AddServerView.swift b/QueueCube/Views/Settings View/AddServerView.swift index 498b52d..bc861cf 100644 --- a/QueueCube/Views/Settings View/AddServerView.swift +++ b/QueueCube/Views/Settings View/AddServerView.swift @@ -175,7 +175,10 @@ struct AddServerView: View _ = try await api.fetchNowPlayingInfo() self.validationState = .valid - self.serverURL = self.validationURL + + if validationURL != serverURL { + self.serverURL = self.validationURL + } } catch { print("Validation failed: \(error)") From 3a5c285511e5e4bb3d9a0c763b2df13113eeb125 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Sun, 5 Oct 2025 18:23:16 -0700 Subject: [PATCH 29/31] version 1.2 --- QueueCube.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/QueueCube.xcodeproj/project.pbxproj b/QueueCube.xcodeproj/project.pbxproj index 48fbb56..1fceea3 100644 --- a/QueueCube.xcodeproj/project.pbxproj +++ b/QueueCube.xcodeproj/project.pbxproj @@ -268,7 +268,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 5; DEVELOPMENT_TEAM = DQQH5H6GBD; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -283,7 +283,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2; PRODUCT_BUNDLE_IDENTIFIER = net.buzzert.QueueCube; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -304,7 +304,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 5; DEVELOPMENT_TEAM = DQQH5H6GBD; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -319,7 +319,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2; PRODUCT_BUNDLE_IDENTIFIER = net.buzzert.QueueCube; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; From 6110f712bd12eaea3cf5266e2174df2bb34503c8 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Thu, 9 Oct 2025 11:42:13 -0700 Subject: [PATCH 30/31] Fix WebSocket reconnection after app backgrounding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add scenePhase monitoring to ContentView to detect app lifecycle changes - Implement handleScenePhaseChange() to force WebSocket reconnection and full UI refresh when app returns to foreground from background - Update error handling in watchWebsocket() to suppress UI errors for backgrounding (error code 53) while still triggering reconnection - Simplify API.notifyError() to always report errors, letting UI layer decide what to display This fixes the issue where WebSocket connections would permanently disconnect after extended backgrounding, as iOS terminates background network connections after ~30 seconds. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- QueueCube/Backend/API.swift | 16 ++++--------- QueueCube/Views/ContentView.swift | 38 +++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/QueueCube/Backend/API.swift b/QueueCube/Backend/API.swift index 5e42b21..a4bdaf4 100644 --- a/QueueCube/Backend/API.swift +++ b/QueueCube/Backend/API.swift @@ -233,18 +233,12 @@ actor API private static func notifyError(_ error: any Swift.Error, continuation: AsyncStream.Continuation) { print("Websocket Error: \(error)") - - var shouldNotifyObservers = true + let nsError = error as NSError - if nsError.code == 53 { - // This is a "connection abort", caused by backgrounding. - // Don't notify UI, just silently reconnect. - shouldNotifyObservers = false - } - - if shouldNotifyObservers { - continuation.yield(.error(.websocketError(error))) - } + + // Always notify observers of WebSocket errors so reconnection can happen + // The UI layer can decide whether to show the error to the user + continuation.yield(.error(.websocketError(error))) } private func request() -> RequestBuilder { diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 218cace..49c510c 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -11,12 +11,16 @@ struct ContentView: View { @State var model = MainViewModel() @State private var websocketRestartTrigger = 0 - + @Environment(\.scenePhase) private var scenePhase + var body: some View { MainView(model: $model) .task(id: websocketRestartTrigger) { await watchWebsocket() } .task { await refresh([.nowPlaying, .playlist, .favorites]) } .task { await watchForSettingsChanges() } + .onChange(of: scenePhase) { oldPhase, newPhase in + handleScenePhaseChange(from: oldPhase, to: newPhase) + } .sheet(isPresented: $model.isNowPlayingSheetPresented) { NowPlayingView(model: model.nowPlayingViewModel) .presentationBackground(.regularMaterial) @@ -50,6 +54,22 @@ struct ContentView: View extension ContentView { + private func handleScenePhaseChange(from oldPhase: ScenePhase, to newPhase: ScenePhase) { + // When app returns to active state from background, force reconnect and refresh + if oldPhase == .background && newPhase == .active { + Task { + // Force WebSocket reconnection + websocketRestartTrigger += 1 + + // Give the WebSocket a moment to reconnect + try? await Task.sleep(for: .milliseconds(100)) + + // Full UI refresh + await refresh([.nowPlaying, .playlist, .favorites]) + } + } + } + private func refresh(_ what: RefreshType) async { await model.withModificationsViaAPI { api in if what.contains(.nowPlaying) { @@ -93,7 +113,7 @@ extension ContentView private func watchWebsocket() async { guard let api = model.selectedServer?.api else { return } - + do { for await streamEvent in try await api.events() { switch streamEvent { @@ -101,13 +121,21 @@ extension ContentView await clearConnectionErrorIfNecessary() await handle(event: event) case .error(let error): - model.connectionError = error - + // Check if this is a backgrounding error (connection abort) + let nsError = error as NSError + let isBackgroundingError = nsError.code == 53 + + // Only show connection error to user if it's not a backgrounding error + if !isBackgroundingError { + model.connectionError = error + } + + // Always attempt reconnection after a delay Task { @MainActor in try await Task.sleep(for: .seconds(1.0)) websocketRestartTrigger += 1 } - + break } } From 2220a0d4f2bb0f0ebca509581c21d6c90359bd14 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Fri, 10 Oct 2025 23:10:10 -0700 Subject: [PATCH 31/31] unconditional active scene phase change --- QueueCube/Views/ContentView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QueueCube/Views/ContentView.swift b/QueueCube/Views/ContentView.swift index 49c510c..8aa9769 100644 --- a/QueueCube/Views/ContentView.swift +++ b/QueueCube/Views/ContentView.swift @@ -56,7 +56,7 @@ extension ContentView { private func handleScenePhaseChange(from oldPhase: ScenePhase, to newPhase: ScenePhase) { // When app returns to active state from background, force reconnect and refresh - if oldPhase == .background && newPhase == .active { + if newPhase == .active { Task { // Force WebSocket reconnection websocketRestartTrigger += 1