diff --git a/README.md b/README.md index 0dc45fe7..d05c93cd 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ https://hub.docker.com/r/fallenbagel/jellyseerr Pre-requisites: - Nodejs [v18](https://nodejs.org/download/release/v18.18.2) -- [Yarn](https://classic.yarnpkg.com/lang/en/docs/install) +- [Yarn](https://classic.yarnpkg.com/lang/en/docs/install) - Download/git clone the source code from the github (Either develop branch or main for stable) ```cmd @@ -59,6 +59,7 @@ yarn install --frozen-lockfile --network-timeout 1000000 yarn run build yarn start ``` + (you can use task scheduler to run a bat script with `@echo off` and `yarn start` to run jellyseerr in the background) _to set env variables such as `JELLYFIN_TYPE=emby` create a file called `.env` in the root directory of jellyseerr_ @@ -136,6 +137,7 @@ ExecStart=/usr/bin/node dist/index.js [Install] WantedBy=multi-user.target ``` + ### Packages: Archlinux: [AUR](https://aur.archlinux.org/packages/jellyseerr) diff --git a/overseerr-api.yml b/overseerr-api.yml index e070361b..7a7ea490 100644 --- a/overseerr-api.yml +++ b/overseerr-api.yml @@ -368,6 +368,9 @@ components: externalHostname: type: string example: 'http://my.jellyfin.host' + jellyfinForgotPasswordUrl: + type: string + example: 'http://my.jellyfin.host/web/index.html#!/forgotpassword.html' adminUser: type: string example: 'admin' diff --git a/server/interfaces/api/settingsInterfaces.ts b/server/interfaces/api/settingsInterfaces.ts index b709a0c4..1bf40cdb 100644 --- a/server/interfaces/api/settingsInterfaces.ts +++ b/server/interfaces/api/settingsInterfaces.ts @@ -24,6 +24,7 @@ export interface PublicSettingsResponse { jellyfinHost?: string; jellyfinExternalHost?: string; jellyfinServerName?: string; + jellyfinForgotPasswordUrl?: string; initialized: boolean; applicationTitle: string; applicationUrl: string; diff --git a/server/lib/settings.ts b/server/lib/settings.ts index 133d0e32..63f95236 100644 --- a/server/lib/settings.ts +++ b/server/lib/settings.ts @@ -40,6 +40,7 @@ export interface JellyfinSettings { name: string; hostname: string; externalHostname?: string; + jellyfinForgotPasswordUrl?: string; libraries: Library[]; serverId: string; } @@ -131,6 +132,7 @@ interface FullPublicSettings extends PublicSettings { mediaServerType: number; jellyfinHost?: string; jellyfinExternalHost?: string; + jellyfinForgotPasswordUrl?: string; jellyfinServerName?: string; partialRequestsEnabled: boolean; cacheImages: boolean; @@ -331,6 +333,7 @@ class Settings { name: '', hostname: '', externalHostname: '', + jellyfinForgotPasswordUrl: '', libraries: [], serverId: '', }, @@ -534,6 +537,7 @@ class Settings { applicationUrl: this.data.main.applicationUrl, hideAvailable: this.data.main.hideAvailable, localLogin: this.data.main.localLogin, + jellyfinForgotPasswordUrl: this.data.jellyfin.jellyfinForgotPasswordUrl, movie4kEnabled: this.data.radarr.some( (radarr) => radarr.is4k && radarr.isDefault ), diff --git a/src/components/Login/JellyfinLogin.tsx b/src/components/Login/JellyfinLogin.tsx index 126fa4f7..594a6ff6 100644 --- a/src/components/Login/JellyfinLogin.tsx +++ b/src/components/Login/JellyfinLogin.tsx @@ -222,6 +222,8 @@ const JellyfinLogin: React.FC = ({ const baseUrl = settings.currentSettings.jellyfinExternalHost ? settings.currentSettings.jellyfinExternalHost : settings.currentSettings.jellyfinHost; + const jellyfinForgotPasswordUrl = + settings.currentSettings.jellyfinForgotPasswordUrl; return (
= ({ diff --git a/src/components/Settings/SettingsJellyfin.tsx b/src/components/Settings/SettingsJellyfin.tsx index 5d56431f..584a98fd 100644 --- a/src/components/Settings/SettingsJellyfin.tsx +++ b/src/components/Settings/SettingsJellyfin.tsx @@ -30,9 +30,10 @@ const messages = defineMessages({ jellyfinSettingsSuccess: '{mediaServerName} settings saved successfully!', jellyfinSettings: '{mediaServerName} Settings', jellyfinSettingsDescription: - 'Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL.', + 'Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page.', externalUrl: 'External URL', internalUrl: 'Internal URL', + jellyfinForgotPasswordUrl: 'Forgot Password URL', validationUrl: 'You must provide a valid URL', syncing: 'Syncing', syncJellyfin: 'Sync Libraries', @@ -94,6 +95,10 @@ const SettingsJellyfin: React.FC = ({ /^(https?:\/\/)?(?:[\w-]+\.)*[\w-]+(?::\d{2,5})?(?:\/[\w-]+)*(?:\/)?$/gm, intl.formatMessage(messages.validationUrl) ), + jellyfinForgotPasswordUrl: Yup.string().matches( + /^(https?:\/\/)?(?:[\w-]+\.)*[\w-]+(?::\d{2,5})?(?:\/[\w-]+)*(?:\/)?$/gm, + intl.formatMessage(messages.validationUrl) + ), }); const activeLibraries = @@ -353,6 +358,7 @@ const SettingsJellyfin: React.FC = ({ initialValues={{ jellyfinInternalUrl: data?.hostname || '', jellyfinExternalUrl: data?.externalHostname || '', + jellyfinForgotPasswordUrl: data?.jellyfinForgotPasswordUrl || '', }} validationSchema={JellyfinSettingsSchema} onSubmit={async (values) => { @@ -360,6 +366,7 @@ const SettingsJellyfin: React.FC = ({ await axios.post('/api/v1/settings/jellyfin', { hostname: values.jellyfinInternalUrl, externalHostname: values.jellyfinExternalUrl, + jellyfinForgotPasswordUrl: values.jellyfinForgotPasswordUrl, } as JellyfinSettings); addToast( @@ -437,6 +444,30 @@ const SettingsJellyfin: React.FC = ({ )}
+
+ +
+
+ +
+ {errors.jellyfinForgotPasswordUrl && + touched.jellyfinForgotPasswordUrl && ( +
+ {errors.jellyfinForgotPasswordUrl} +
+ )} +
+
diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 906892b0..71126cc2 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -938,7 +938,7 @@ "components.Settings.internalUrl": "Internal URL", "components.Settings.is4k": "4K", "components.Settings.jellyfinSettings": "{mediaServerName} Settings", - "components.Settings.jellyfinSettingsDescription": "Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL.", + "components.Settings.jellyfinSettingsDescription": "Optionally configure the internal and external endpoints for your {mediaServerName} server. In most cases, the external URL is different to the internal URL. A custom password reset URL can also be set for {mediaServerName} login, in case you would like to redirect to a different password reset page.", "components.Settings.jellyfinSettingsFailure": "Something went wrong while saving {mediaServerName} settings.", "components.Settings.jellyfinSettingsSuccess": "{mediaServerName} settings saved successfully!", "components.Settings.jellyfinlibraries": "{mediaServerName} Libraries",