import Foundation public enum HLSManifestGenerator: Sendable { public struct TimeRange: Equatable, Sendable { public var start: Double public var duration: Double } public static func manifest(trackId: Int64, duration: Double, segmentDuration: Double, token: String? = nil) -> String { let count = segmentCount(duration: duration, segmentDuration: segmentDuration) let targetDuration = Int(segmentDuration.rounded(.up)) var lines: [String] = [ "#EXTM3U", "#EXT-X-VERSION:3", "#EXT-X-TARGETDURATION:\(targetDuration)", "#EXT-X-MEDIA-SEQUENCE:0", ] let tokenQuery = token.map { "?token=\($0)" } ?? "" for i in 0.. Int { guard duration > 0, segmentDuration > 0 else { return 0 } return Int((duration / segmentDuration).rounded(.up)) } public static func segmentTimeRange(index: Int, trackDuration: Double, segmentDuration: Double) -> TimeRange { let start = Double(index) * segmentDuration let remaining = trackDuration - start let duration = min(segmentDuration, remaining) return TimeRange(start: start, duration: duration) } }