78 lines
2.5 KiB
Swift
78 lines
2.5 KiB
Swift
import Foundation
|
|
|
|
class OwnCastService {
|
|
static let shared = OwnCastService()
|
|
|
|
private let baseUrl = "https://stream.rockvilletollandsda.church"
|
|
|
|
private init() {}
|
|
|
|
struct StreamStatus: Codable {
|
|
let online: Bool
|
|
let streamTitle: String?
|
|
let lastConnectTime: String?
|
|
let lastDisconnectTime: String?
|
|
let serverTime: String?
|
|
let versionNumber: String?
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case online
|
|
case streamTitle = "name"
|
|
case lastConnectTime
|
|
case lastDisconnectTime
|
|
case serverTime
|
|
case versionNumber
|
|
}
|
|
}
|
|
|
|
func getStreamStatus() async throws -> StreamStatus {
|
|
guard let url = URL(string: "\(baseUrl)/api/status") else {
|
|
throw URLError(.badURL)
|
|
}
|
|
|
|
var request = URLRequest(url: url)
|
|
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
|
|
|
|
let (data, response) = try await URLSession.shared.data(for: request)
|
|
|
|
guard let httpResponse = response as? HTTPURLResponse else {
|
|
throw URLError(.badServerResponse)
|
|
}
|
|
|
|
guard (200...299).contains(httpResponse.statusCode) else {
|
|
if let responseString = String(data: data, encoding: .utf8) {
|
|
print("Stream status error: \(responseString)")
|
|
}
|
|
throw URLError(.badServerResponse)
|
|
}
|
|
|
|
do {
|
|
return try JSONDecoder().decode(StreamStatus.self, from: data)
|
|
} catch {
|
|
print("Failed to decode stream status: \(error)")
|
|
throw error
|
|
}
|
|
}
|
|
|
|
func createLivestreamMessage(from status: StreamStatus) -> Message {
|
|
let dateFormatter = DateFormatter()
|
|
dateFormatter.dateFormat = "yyyy-MM-dd"
|
|
dateFormatter.timeZone = TimeZone(identifier: "America/New_York")
|
|
let formattedDate = dateFormatter.string(from: Date())
|
|
|
|
return Message(
|
|
id: UUID().uuidString,
|
|
title: status.streamTitle ?? "Live Stream",
|
|
description: "Watch our live stream",
|
|
speaker: "Live Stream",
|
|
videoUrl: "\(baseUrl)/hls/stream.m3u8",
|
|
thumbnailUrl: "\(baseUrl)/thumbnail.jpg",
|
|
duration: 0,
|
|
isLiveStream: true,
|
|
isPublished: true,
|
|
isDeleted: false,
|
|
liveBroadcastStatus: "live",
|
|
date: formattedDate
|
|
)
|
|
}
|
|
} |