import Foundation enum SentenceBoundaryAPIError: LocalizedError { case invalidHash case hashMismatch var errorDescription: String? { switch self { case .invalidHash: return "video_hash 必须是 64 位 SHA-256 十六进制字符串" case .hashMismatch: return "服务端返回的句边界哈希与请求不一致" } } } enum SentenceBoundaryAPI { static func fetch(videoHash: String) async throws -> SentenceBoundaryDocument { let hash = videoHash.lowercased() guard hash.range(of: AppConfig.sha256Pattern, options: .regularExpression) != nil else { throw SentenceBoundaryAPIError.invalidHash } var headers: [String: String] = [:] if !AppConfig.authToken.isEmpty { headers["Authorization"] = "Bearer \(AppConfig.authToken)" } let result = try await HTTPClient.getJSON( SentenceBoundaryDocument.self, baseURL: AppConfig.serverBaseURL, path: "api/v1/videos/\(hash)/sentence-boundaries", timeout: AppConfig.readTimeout, additionalHeaders: headers ) guard result.value.videoHash.lowercased() == hash else { throw SentenceBoundaryAPIError.hashMismatch } return result.value } }