mirror of
https://github.com/Jellify-Music/App.git
synced 2026-01-01 08:22:20 -06:00
171 lines
4.9 KiB
TypeScript
171 lines
4.9 KiB
TypeScript
import { Api } from "@jellyfin/sdk/lib/api";
|
|
import { JellyfinInfo } from "./info";
|
|
import { JellifyServer } from "../types/JellifyServer";
|
|
import { JellifyUser } from "../types/JellifyUser";
|
|
import { storage } from '../constants/storage';
|
|
import { MMKVStorageKeys } from "../enums/mmkv-storage-keys";
|
|
import uuid from 'react-native-uuid';
|
|
import { JellifyLibrary } from "../types/JellifyLibrary";
|
|
|
|
export default class Client {
|
|
static #instance: Client;
|
|
|
|
private api : Api | undefined = undefined;
|
|
private user : JellifyUser | undefined = undefined;
|
|
private server : JellifyServer | undefined = undefined;
|
|
private library : JellifyLibrary | undefined = undefined;
|
|
private sessionId : string = uuid.v4();
|
|
|
|
private constructor(
|
|
api?: Api | undefined,
|
|
user?: JellifyUser | undefined,
|
|
server?: JellifyServer | undefined,
|
|
library?: JellifyLibrary | undefined
|
|
) {
|
|
|
|
const userJson = storage.getString(MMKVStorageKeys.User)
|
|
const serverJson = storage.getString(MMKVStorageKeys.Server);
|
|
const libraryJson = storage.getString(MMKVStorageKeys.Library);
|
|
|
|
if (user)
|
|
this.setAndPersistUser(user)
|
|
else if (userJson)
|
|
this.user = JSON.parse(userJson)
|
|
else
|
|
this.user = undefined;
|
|
|
|
if (server)
|
|
this.setAndPersistServer(server)
|
|
else if (serverJson)
|
|
this.server = JSON.parse(serverJson);
|
|
else
|
|
this.server = undefined;
|
|
|
|
if (library)
|
|
this.setAndPersistLibrary(library)
|
|
else if (libraryJson)
|
|
this.library = JSON.parse(libraryJson)
|
|
else
|
|
this.library = undefined;
|
|
|
|
if (api)
|
|
this.api = api
|
|
else if (this.user && this.server)
|
|
this.api = new Api(this.server.url, JellyfinInfo.clientInfo, JellyfinInfo.deviceInfo, this.user.accessToken);
|
|
else
|
|
this.api = undefined;
|
|
}
|
|
|
|
public static get instance(): Client {
|
|
if (!Client.#instance) {
|
|
Client.#instance = new Client();
|
|
}
|
|
|
|
return Client.#instance;
|
|
}
|
|
|
|
public static get api(): Api | undefined {
|
|
return Client.#instance.api;
|
|
}
|
|
|
|
public static get server(): JellifyServer | undefined {
|
|
return Client.#instance.server;
|
|
}
|
|
|
|
public static get user(): JellifyUser | undefined {
|
|
return Client.#instance.user;
|
|
}
|
|
|
|
public static get library(): JellifyLibrary | undefined {
|
|
return Client.#instance.library;
|
|
}
|
|
|
|
public static get sessionId(): string {
|
|
return Client.#instance.sessionId;
|
|
}
|
|
|
|
public static signOut(): void {
|
|
Client.#instance.removeCredentials()
|
|
}
|
|
|
|
public static switchServer() : void {
|
|
Client.#instance.removeServer();
|
|
}
|
|
|
|
public static switchUser(): void {
|
|
Client.#instance.removeUser();
|
|
}
|
|
|
|
public static setUser(user: JellifyUser): void {
|
|
Client.#instance.setAndPersistUser(user);
|
|
}
|
|
|
|
private setAndPersistUser(user: JellifyUser) {
|
|
this.user = user;
|
|
|
|
// persist user details
|
|
storage.set(MMKVStorageKeys.User, JSON.stringify(user));
|
|
}
|
|
|
|
private setAndPersistServer(server : JellifyServer) {
|
|
this.server = server;
|
|
|
|
storage.set(MMKVStorageKeys.Server, JSON.stringify(server));
|
|
}
|
|
|
|
private setAndPersistLibrary(library : JellifyLibrary) {
|
|
this.library = library;
|
|
|
|
storage.set(MMKVStorageKeys.Library, JSON.stringify(library))
|
|
}
|
|
|
|
private removeCredentials() {
|
|
this.library = undefined;
|
|
this.library = undefined;
|
|
this.server = undefined;
|
|
this.user = undefined;
|
|
|
|
storage.delete(MMKVStorageKeys.Server)
|
|
storage.delete(MMKVStorageKeys.Library)
|
|
storage.delete(MMKVStorageKeys.User)
|
|
}
|
|
|
|
private removeServer() {
|
|
this.server = undefined;
|
|
|
|
storage.delete(MMKVStorageKeys.Server)
|
|
}
|
|
|
|
private removeUser() {
|
|
this.user = undefined;
|
|
|
|
storage.delete(MMKVStorageKeys.User)
|
|
}
|
|
|
|
/**
|
|
* Uses the jellifyClient to create a public Jellyfin API instance.
|
|
* @param serverUrl The URL of the Jellyfin server
|
|
* @returns
|
|
*/
|
|
public static setPublicApiClient(server : JellifyServer) : void {
|
|
const api = JellyfinInfo.createApi(server.url);
|
|
|
|
Client.#instance = new Client(api, undefined, server, undefined)
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param serverUrl The URL of the Jellyfin server
|
|
* @param accessToken The assigned accessToken for the Jellyfin user
|
|
*/
|
|
public static setPrivateApiClient(server : JellifyServer, user : JellifyUser) : void {
|
|
const api = JellyfinInfo.createApi(server.url, user.accessToken);
|
|
|
|
Client.#instance = new Client(api, user, server, undefined);
|
|
}
|
|
|
|
public static setLibrary(library : JellifyLibrary) : void {
|
|
|
|
Client.#instance = new Client(undefined, undefined, undefined, library);
|
|
}
|
|
} |