From 981c9123a1b6ebbdd81e68b976115aeb684b7328 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 27 May 2026 08:34:07 +0200 Subject: [PATCH] feat: add AppRole, StreamingConstants, Routes, APIModels to MusicShared --- .../Sources/MusicShared/APIModels.swift | 21 +++++++++++++++++ MusicShared/Sources/MusicShared/AppRole.swift | 19 +++++++++++++++ .../MusicShared/StreamingConstants.swift | 7 ++++++ .../Sources/MusicShared/StreamingRoutes.swift | 23 +++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 MusicShared/Sources/MusicShared/APIModels.swift create mode 100644 MusicShared/Sources/MusicShared/AppRole.swift create mode 100644 MusicShared/Sources/MusicShared/StreamingConstants.swift create mode 100644 MusicShared/Sources/MusicShared/StreamingRoutes.swift diff --git a/MusicShared/Sources/MusicShared/APIModels.swift b/MusicShared/Sources/MusicShared/APIModels.swift new file mode 100644 index 0000000..813fec4 --- /dev/null +++ b/MusicShared/Sources/MusicShared/APIModels.swift @@ -0,0 +1,21 @@ +import Foundation + +public struct AuthResponse: Codable, Equatable, Sendable { + public var hostName: String + public var protocolVersion: Int + + public init(hostName: String, protocolVersion: Int) { + self.hostName = hostName + self.protocolVersion = protocolVersion + } +} + +public struct DBMetadata: Codable, Equatable, Sendable { + public var checksum: String + public var trackCount: Int + + public init(checksum: String, trackCount: Int) { + self.checksum = checksum + self.trackCount = trackCount + } +} diff --git a/MusicShared/Sources/MusicShared/AppRole.swift b/MusicShared/Sources/MusicShared/AppRole.swift new file mode 100644 index 0000000..0d1c39f --- /dev/null +++ b/MusicShared/Sources/MusicShared/AppRole.swift @@ -0,0 +1,19 @@ +import Foundation + +public enum AppRole: String, Codable, CaseIterable, Sendable { + case local + case remoteHost + case remoteClient + case streamHost + case streamClient +} + +extension AppRole { + public var isHost: Bool { self == .remoteHost || self == .streamHost } + public var isClient: Bool { self == .remoteClient || self == .streamClient } + public var isLocal: Bool { self == .local } + public var usesLocalAudio: Bool { self == .local || self == .remoteHost || self == .streamClient } + public var isReadOnlyLibrary: Bool { self == .remoteClient || self == .streamClient } + public var needsNetworkServer: Bool { self == .remoteHost || self == .streamHost } + public var isStreaming: Bool { self == .streamHost || self == .streamClient } +} diff --git a/MusicShared/Sources/MusicShared/StreamingConstants.swift b/MusicShared/Sources/MusicShared/StreamingConstants.swift new file mode 100644 index 0000000..fd63c8d --- /dev/null +++ b/MusicShared/Sources/MusicShared/StreamingConstants.swift @@ -0,0 +1,7 @@ +import Foundation + +public enum StreamingConstants: Sendable { + public static let defaultPort: Int = 8420 + public static let segmentDuration: Double = 6.0 + public static let protocolVersion: Int = 1 +} diff --git a/MusicShared/Sources/MusicShared/StreamingRoutes.swift b/MusicShared/Sources/MusicShared/StreamingRoutes.swift new file mode 100644 index 0000000..71e568c --- /dev/null +++ b/MusicShared/Sources/MusicShared/StreamingRoutes.swift @@ -0,0 +1,23 @@ +import Foundation + +public enum StreamingRoutes: Sendable { + public static let auth = "/auth" + public static let db = "/db" + public static let ws = "/ws" + + public static func trackManifest(trackId: Int64) -> String { + "/tracks/\(trackId)/stream.m3u8" + } + + public static func trackSegment(trackId: Int64, index: Int) -> String { + "/tracks/\(trackId)/segments/\(index).mp3" + } + + public static func trackManifestPattern() -> String { + "/tracks/:trackId/stream.m3u8" + } + + public static func trackSegmentPattern() -> String { + "/tracks/:trackId/segments/:index" + } +}