summaryrefslogtreecommitdiff
path: root/Jel/Controllers/JellyfinClientController.swift
diff options
context:
space:
mode:
authorShav Kinderlehrer <[email protected]>2023-12-12 17:09:15 -0500
committerShav Kinderlehrer <[email protected]>2023-12-12 17:09:15 -0500
commitfbb37567460b689f01eb8a8717b9ac8673652c28 (patch)
treeb6517179cb849732efb8660edfa9899456420d3b /Jel/Controllers/JellyfinClientController.swift
parent02fc87fe2588cdca5188cf1a6d338ce83de65a43 (diff)
downloadjel-fbb37567460b689f01eb8a8717b9ac8673652c28.tar.gz
jel-fbb37567460b689f01eb8a8717b9ac8673652c28.zip
Implement signIn flow
Diffstat (limited to 'Jel/Controllers/JellyfinClientController.swift')
-rw-r--r--Jel/Controllers/JellyfinClientController.swift66
1 files changed, 59 insertions, 7 deletions
diff --git a/Jel/Controllers/JellyfinClientController.swift b/Jel/Controllers/JellyfinClientController.swift
index 343efe1..b50157e 100644
--- a/Jel/Controllers/JellyfinClientController.swift
+++ b/Jel/Controllers/JellyfinClientController.swift
@@ -9,22 +9,74 @@ import Foundation
import Get
import JellyfinKit
-class JellyfinClientController {
- let api: APIClient
+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(serverUrl: URL) {
- self.api = APIClient(
- baseURL: serverUrl
- )
+ 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
+ })
}
func isJellyfinServer() async -> Bool {
let request = Paths.getPublicUsers
do {
- try await api.send(request)
+ 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()
+ }
}