From 530b4dc6381ba3d7842a93e21c4543dc5eecf81a Mon Sep 17 00:00:00 2001 From: Gauthier Date: Tue, 9 Jul 2024 17:29:37 +0200 Subject: [PATCH] feat(jellyfinapi): create Jellyfin API key from admin user --- server/api/jellyfin.ts | 17 +++++++++++++++++ server/index.ts | 2 +- server/lib/settings/index.ts | 6 ++++-- server/lib/settings/migrator.ts | 16 +++++++++++++--- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/server/api/jellyfin.ts b/server/api/jellyfin.ts index ff5144ce..5710fcaf 100644 --- a/server/api/jellyfin.ts +++ b/server/api/jellyfin.ts @@ -405,6 +405,23 @@ class JellyfinAPI extends ExternalAPI { throw new ApiError(e.cause?.status, ApiErrorCode.InvalidAuthToken); } } + + public async createApiToken(appName: string): Promise { + try { + await this.axios.post(`/Auth/Keys?App=${appName}`); + const apiKeys = await this.get('/Auth/Keys'); + return apiKeys.Items.reverse().find( + (item: any) => item.AppName === appName + ).AccessToken; + } catch (e) { + logger.error( + `Something went wrong while creating an API key the Jellyfin server: ${e.message}`, + { label: 'Jellyfin API' } + ); + + throw new ApiError(e.response?.status, ApiErrorCode.InvalidAuthToken); + } + } } export default JellyfinAPI; diff --git a/server/index.ts b/server/index.ts index 2d90f05c..ef20674d 100644 --- a/server/index.ts +++ b/server/index.ts @@ -63,7 +63,7 @@ app } // Load Settings - const settings = getSettings(); + const settings = await getSettings().load(); restartFlag.initializeSettings(settings.main); // Migrate library types diff --git a/server/lib/settings/index.ts b/server/lib/settings/index.ts index 7c117c11..173eb732 100644 --- a/server/lib/settings/index.ts +++ b/server/lib/settings/index.ts @@ -47,6 +47,7 @@ export interface JellyfinSettings { jellyfinForgotPasswordUrl?: string; libraries: Library[]; serverId: string; + apiKey: string; } export interface TautulliSettings { hostname?: string; @@ -342,6 +343,7 @@ class Settings { jellyfinForgotPasswordUrl: '', libraries: [], serverId: '', + apiKey: '', }, tautulli: {}, radarr: [], @@ -629,7 +631,7 @@ class Settings { * @param overrideSettings If passed in, will override all existing settings with these * values */ - public load(overrideSettings?: AllSettings): Settings { + public async load(overrideSettings?: AllSettings): Promise { if (overrideSettings) { this.data = overrideSettings; return this; @@ -642,7 +644,7 @@ class Settings { if (data) { const parsedJson = JSON.parse(data); - this.data = runMigrations(parsedJson); + this.data = await runMigrations(parsedJson); this.data = merge(this.data, parsedJson); diff --git a/server/lib/settings/migrator.ts b/server/lib/settings/migrator.ts index 9d709590..856016e1 100644 --- a/server/lib/settings/migrator.ts +++ b/server/lib/settings/migrator.ts @@ -1,10 +1,13 @@ import type { AllSettings } from '@server/lib/settings'; +import logger from '@server/logger'; import fs from 'fs'; import path from 'path'; const migrationsDir = path.join(__dirname, 'migrations'); -export const runMigrations = (settings: AllSettings): AllSettings => { +export const runMigrations = async ( + settings: AllSettings +): Promise => { const migrations = fs .readdirSync(migrationsDir) .filter((file) => file.endsWith('.js') || file.endsWith('.ts')) @@ -13,8 +16,15 @@ export const runMigrations = (settings: AllSettings): AllSettings => { let migrated = settings; - for (const migration of migrations) { - migrated = migration(migrated); + try { + for (const migration of migrations) { + migrated = await migration(migrated); + } + } catch (e) { + logger.error( + `Something went wrong while running settings migrations: ${e.message}`, + { label: 'Settings Migrator' } + ); } return migrated;