From 5b10da40730f46cdb61d853ac869bfe82f1347f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20Bart=C3=ADk?= <63553146+sambartik@users.noreply.github.com> Date: Thu, 13 Oct 2022 23:08:20 +0200 Subject: [PATCH 1/3] Revert "fix(backend): fixes Jellyfin/Emby links if server is initially setup with a trailing /" --- server/entity/Media.ts | 10 ++-------- server/routes/auth.ts | 15 +++------------ server/routes/settings/index.ts | 5 +---- server/routes/user/index.ts | 5 +---- 4 files changed, 7 insertions(+), 28 deletions(-) diff --git a/server/entity/Media.ts b/server/entity/Media.ts index 48b04c78..ed8e588b 100644 --- a/server/entity/Media.ts +++ b/server/entity/Media.ts @@ -205,16 +205,10 @@ class Media { ? externalHostname : hostname; if (this.jellyfinMediaId) { - this.mediaUrl = new URL( - `/web/index.html#!/${pageName}?id=${this.jellyfinMediaId}&context=home&serverId=${serverId}`, - jellyfinHost - ).href; + this.mediaUrl = `${jellyfinHost}/web/index.html#!/${pageName}?id=${this.jellyfinMediaId}&context=home&serverId=${serverId}`; } if (this.jellyfinMediaId4k) { - this.mediaUrl4k = new URL( - `/web/index.html#!/${pageName}?id=${this.jellyfinMediaId4k}&context=home&serverId=${serverId}`, - jellyfinHost - ).href; + this.mediaUrl4k = `${jellyfinHost}/web/index.html#!/${pageName}?id=${this.jellyfinMediaId4k}&context=home&serverId=${serverId}`; } } } diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 35f569fd..4b22943e 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -263,10 +263,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => { // Update the users avatar with their jellyfin profile pic (incase it changed) if (account.User.PrimaryImageTag) { - user.avatar = new URL( - `/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`, - jellyfinHost - ).href; + user.avatar = `${jellyfinHost}/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`; } else { user.avatar = '/os_logo_square.png'; } @@ -312,10 +309,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => { jellyfinAuthToken: account.AccessToken, permissions: Permission.ADMIN, avatar: account.User.PrimaryImageTag - ? new URL( - `/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`, - jellyfinHost - ).href + ? `${jellyfinHost}/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90` : '/os_logo_square.png', userType: UserType.JELLYFIN, }); @@ -345,10 +339,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => { jellyfinAuthToken: account.AccessToken, permissions: settings.main.defaultPermissions, avatar: account.User.PrimaryImageTag - ? new URL( - `/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90`, - jellyfinHost - ).href + ? `${jellyfinHost}/Users/${account.User.Id}/Images/Primary/?tag=${account.User.PrimaryImageTag}&quality=90` : '/os_logo_square.png', userType: UserType.JELLYFIN, }); diff --git a/server/routes/settings/index.ts b/server/routes/settings/index.ts index 2d9fc2ff..3a7cb6df 100644 --- a/server/routes/settings/index.ts +++ b/server/routes/settings/index.ts @@ -330,10 +330,7 @@ settingsRoutes.get('/jellyfin/users', async (req, res) => { username: user.Name, id: user.Id, thumb: user.PrimaryImageTag - ? new URL( - `/Users/${user.Id}/Images/Primary/?tag=${user.PrimaryImageTag}&quality=90`, - jellyfinHost - ).href + ? `${jellyfinHost}/Users/${user.Id}/Images/Primary/?tag=${user.PrimaryImageTag}&quality=90` : '/os_logo_square.png', email: user.Name, })); diff --git a/server/routes/user/index.ts b/server/routes/user/index.ts index 258a3eae..a875ca1f 100644 --- a/server/routes/user/index.ts +++ b/server/routes/user/index.ts @@ -525,10 +525,7 @@ router.post( email: jellyfinUser?.Name, permissions: settings.main.defaultPermissions, avatar: jellyfinUser?.PrimaryImageTag - ? new URL( - `/Users/${jellyfinUser.Id}/Images/Primary/?tag=${jellyfinUser.PrimaryImageTag}&quality=90`, - jellyfinHost - ).href + ? `${jellyfinHost}/Users/${jellyfinUser.Id}/Images/Primary/?tag=${jellyfinUser.PrimaryImageTag}&quality=90` : '/os_logo_square.png', userType: UserType.JELLYFIN, }); From 0faae20bacfa68931c55df281d14877f15c51ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20Bart=C3=ADk?= <63553146+sambartik@users.noreply.github.com> Date: Thu, 13 Oct 2022 23:24:09 +0200 Subject: [PATCH 2/3] Fix jellyfin external url basepath being ignored --- server/entity/Media.ts | 3 ++- server/routes/auth.ts | 9 +++++---- server/routes/settings/index.ts | 9 +++++---- server/routes/user/index.ts | 3 ++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/server/entity/Media.ts b/server/entity/Media.ts index ed8e588b..704a5f10 100644 --- a/server/entity/Media.ts +++ b/server/entity/Media.ts @@ -200,10 +200,11 @@ class Media { const pageName = process.env.JELLYFIN_TYPE === 'emby' ? 'item' : 'details'; const { serverId, hostname, externalHostname } = getSettings().jellyfin; - const jellyfinHost = + let jellyfinHost = externalHostname && externalHostname.length > 0 ? externalHostname : hostname; + jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; if (this.jellyfinMediaId) { this.mediaUrl = `${jellyfinHost}/web/index.html#!/${pageName}?id=${this.jellyfinMediaId}&context=home&serverId=${serverId}`; } diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 4b22943e..0bce293d 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -244,10 +244,11 @@ authRoutes.post('/jellyfin', async (req, res, next) => { } // First we need to attempt to log the user in to jellyfin const jellyfinserver = new JellyfinAPI(hostname ?? '', undefined, deviceId); - const jellyfinHost = - externalHostname && externalHostname.length > 0 - ? externalHostname - : hostname; + let jellyfinHost = + externalHostname && externalHostname.length > 0 + ? externalHostname + : hostname; + jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; const account = await jellyfinserver.login(body.username, body.password); // Next let's see if the user already exists diff --git a/server/routes/settings/index.ts b/server/routes/settings/index.ts index 3a7cb6df..2fcc1a00 100644 --- a/server/routes/settings/index.ts +++ b/server/routes/settings/index.ts @@ -307,10 +307,11 @@ settingsRoutes.get('/jellyfin/library', async (req, res) => { settingsRoutes.get('/jellyfin/users', async (req, res) => { const settings = getSettings(); const { hostname, externalHostname } = getSettings().jellyfin; - const jellyfinHost = - externalHostname && externalHostname.length > 0 - ? externalHostname - : hostname; + let jellyfinHost = + externalHostname && externalHostname.length > 0 + ? externalHostname + : hostname; + jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; const userRepository = getRepository(User); const admin = await userRepository.findOneOrFail({ diff --git a/server/routes/user/index.ts b/server/routes/user/index.ts index a875ca1f..349cde07 100644 --- a/server/routes/user/index.ts +++ b/server/routes/user/index.ts @@ -497,10 +497,11 @@ router.post( //const jellyfinUsersResponse = await jellyfinClient.getUsers(); const createdUsers: User[] = []; const { hostname, externalHostname } = getSettings().jellyfin; - const jellyfinHost = + let jellyfinHost = externalHostname && externalHostname.length > 0 ? externalHostname : hostname; + jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; jellyfinClient.setUserId(admin.jellyfinUserId ?? ''); const jellyfinUsers = await jellyfinClient.getUsers(); From ab09664d418e07198ac72e7f342b53ba441ab7c3 Mon Sep 17 00:00:00 2001 From: Fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Sun, 16 Oct 2022 03:50:22 +0500 Subject: [PATCH 3/3] fix(backend): fix jellyfinHost to not be undefined Fix jellyfinHost so its not being treated as null or undefined fix #237 --- server/entity/Media.ts | 8 ++++++-- server/routes/auth.ts | 11 +++++++---- server/routes/settings/index.ts | 10 ++++++---- server/routes/user/index.ts | 4 +++- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/server/entity/Media.ts b/server/entity/Media.ts index 704a5f10..cf6f5a28 100644 --- a/server/entity/Media.ts +++ b/server/entity/Media.ts @@ -204,12 +204,16 @@ class Media { externalHostname && externalHostname.length > 0 ? externalHostname : hostname; - jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; + + jellyfinHost = jellyfinHost!.endsWith('/') + ? jellyfinHost!.slice(0, -1) + : jellyfinHost; + if (this.jellyfinMediaId) { this.mediaUrl = `${jellyfinHost}/web/index.html#!/${pageName}?id=${this.jellyfinMediaId}&context=home&serverId=${serverId}`; } if (this.jellyfinMediaId4k) { - this.mediaUrl4k = `${jellyfinHost}/web/index.html#!/${pageName}?id=${this.jellyfinMediaId4k}&context=home&serverId=${serverId}`; + this.mediaUrl4k = `${jellyfinHost}/web/index.html#!/${pageName}?id=${this.jellyfinMediaId}&context=home&serverId=${serverId}`; } } } diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 0bce293d..0280a428 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -245,10 +245,13 @@ authRoutes.post('/jellyfin', async (req, res, next) => { // First we need to attempt to log the user in to jellyfin const jellyfinserver = new JellyfinAPI(hostname ?? '', undefined, deviceId); let jellyfinHost = - externalHostname && externalHostname.length > 0 - ? externalHostname - : hostname; - jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; + externalHostname && externalHostname.length > 0 + ? externalHostname + : hostname; + + jellyfinHost = jellyfinHost!.endsWith('/') + ? jellyfinHost!.slice(0, -1) + : jellyfinHost; const account = await jellyfinserver.login(body.username, body.password); // Next let's see if the user already exists diff --git a/server/routes/settings/index.ts b/server/routes/settings/index.ts index 2fcc1a00..dc9dbcb4 100644 --- a/server/routes/settings/index.ts +++ b/server/routes/settings/index.ts @@ -308,11 +308,13 @@ settingsRoutes.get('/jellyfin/users', async (req, res) => { const settings = getSettings(); const { hostname, externalHostname } = getSettings().jellyfin; let jellyfinHost = - externalHostname && externalHostname.length > 0 - ? externalHostname - : hostname; - jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; + externalHostname && externalHostname.length > 0 + ? externalHostname + : hostname; + jellyfinHost = jellyfinHost!.endsWith('/') + ? jellyfinHost!.slice(0, -1) + : jellyfinHost; const userRepository = getRepository(User); const admin = await userRepository.findOneOrFail({ select: ['id', 'jellyfinAuthToken', 'jellyfinDeviceId', 'jellyfinUserId'], diff --git a/server/routes/user/index.ts b/server/routes/user/index.ts index 349cde07..16d8a50b 100644 --- a/server/routes/user/index.ts +++ b/server/routes/user/index.ts @@ -501,8 +501,10 @@ router.post( externalHostname && externalHostname.length > 0 ? externalHostname : hostname; - jellyfinHost = jellyfinHost.endsWith("/") ? jellyfinHost.slice(0, -1) : jellyfinHost; + jellyfinHost = jellyfinHost!.endsWith('/') + ? jellyfinHost!.slice(0, -1) + : jellyfinHost; jellyfinClient.setUserId(admin.jellyfinUserId ?? ''); const jellyfinUsers = await jellyfinClient.getUsers();