86 lines
2.1 KiB
Swift
86 lines
2.1 KiB
Swift
//
|
|
// JellyfinClientController.swift
|
|
// Jel
|
|
//
|
|
// Created by zerocool on 12/12/23.
|
|
//
|
|
|
|
import Foundation
|
|
import Get
|
|
import JellyfinKit
|
|
import Pulse
|
|
|
|
struct AuthHeaders: Codable {
|
|
var Client: String
|
|
var Device: String
|
|
var DeviceId: String
|
|
var Version: String
|
|
var Token: String
|
|
}
|
|
|
|
enum JellyfinClientError: Error {
|
|
case badResponseCode
|
|
}
|
|
|
|
extension AuthHeaders {
|
|
func format() -> String {
|
|
return "MediaBrowser Client=\(self.Client), Device=\(self.Device), DeviceId=\(self.DeviceId), Version=\(self.Version), Token=\(self.Token)"
|
|
}
|
|
}
|
|
|
|
class JellyfinClientController: ObservableObject {
|
|
private var api: APIClient
|
|
|
|
private var authHeaders: AuthHeaders
|
|
private var authState: AuthStateController
|
|
|
|
init(authHeaders: AuthHeaders, serverUrl: URL? = nil, authState: AuthStateController = AuthStateController.shared) {
|
|
self.authHeaders = authHeaders
|
|
self.authState = authState
|
|
|
|
self.api = APIClient(baseURL: serverUrl)
|
|
self.setUrl(url: serverUrl)
|
|
}
|
|
|
|
func setToken(token: String) {
|
|
self.authHeaders.Token = token
|
|
}
|
|
|
|
func setUrl(url: URL?) {
|
|
if url == nil {
|
|
return
|
|
}
|
|
|
|
self.api = APIClient(baseURL: url, {
|
|
$0.sessionConfiguration.httpAdditionalHeaders = ["Authorization": self.authHeaders.format()]
|
|
|
|
let decoder = JSONDecoder()
|
|
decoder.dateDecodingStrategy = .iso8601withFractionalSeconds
|
|
$0.decoder = decoder
|
|
|
|
$0.sessionDelegate = Pulse.URLSessionProxyDelegate()
|
|
})
|
|
}
|
|
|
|
func isJellyfinServer() async -> Bool {
|
|
let request = Paths.getPublicSystemInfo
|
|
do {
|
|
let res = try await api.send(request)
|
|
if res.statusCode != 200 {
|
|
throw JellyfinClientError.badResponseCode
|
|
}
|
|
} catch {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func signIn(username: String, pw: String) async throws {
|
|
let request = Paths.authenticateUserByName(AuthenticateUserByName(pw: pw, username: username))
|
|
let res = try await self.api.send(request)
|
|
self.authState.loggedIn = true
|
|
self.authState.authToken = res.value.accessToken
|
|
self.authState.save()
|
|
}
|
|
}
|