Files
audioserver/GrooveAudio (iOS)/Mopidy/MopidyEventStream.swift
T

60 lines
1.9 KiB
Swift

import Foundation
@available(iOS 15.0, *)
final class MopidyEventStream {
private var session: URLSession?
private var task: URLSessionDataTask?
private let onTrackChanged: () -> Void
private let onVolumeChanged: (Int) -> Void
private let host: String
private let password: String
init(host: String,
password: String,
onTrackChanged: @escaping () -> Void,
onVolumeChanged: @escaping (Int) -> Void)
{
self.host = host
self.password = password
self.onTrackChanged = onTrackChanged
self.onVolumeChanged = onVolumeChanged
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 300
config.timeoutIntervalForResource = 3600
self.session = URLSession(configuration: config)
}
func connect() {
guard let url = URL(string: "http://\(host):6680/mopidy/events") else { return }
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("text/event-stream", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
self.task = session?.dataTask(with: request) { [weak self] data, response, error in
guard let self = self, let data = data else { return }
if let text = String(data: data, encoding: .utf8) {
self.parseEvents(text)
}
}
task?.resume()
}
func disconnect() {
task?.cancel()
session?.finishTasksAndInvalidate()
}
private func parseEvents(_ text: String) {
for line in text.components(separatedBy: "\n") {
if line.hasPrefix("event:") && line.contains("tracklistchanged") {
onTrackChanged()
}
if line.hasPrefix("event:") && line.contains("volumechanged") {
// volume data would follow in subsequent data: lines
}
}
}
}