From 29274614c351c541aebaa8ecdfbe20dd09ab6a0c Mon Sep 17 00:00:00 2001 From: Aiden Vigue Date: Mon, 15 Feb 2021 14:26:25 -0500 Subject: [PATCH] feat(rebase): rebase --- config/db/.gitkeep | 0 server/api/jellyfin.ts | 28 +++++++++--- server/constants/server.ts | 3 +- server/interfaces/api/settingsInterfaces.ts | 1 + server/job/jellyfinsync/index.ts | 5 ++- server/lib/settings.ts | 8 +--- server/routes/auth.ts | 1 + src/components/MovieDetails/index.tsx | 47 +++++++++++---------- src/components/Settings/SettingsMain.tsx | 22 ---------- src/components/Setup/index.tsx | 13 ++++-- src/components/StatusBadge/index.tsx | 24 +++++------ src/components/TvDetails/index.tsx | 14 +++--- src/i18n/locale/en.json | 13 ++---- 13 files changed, 85 insertions(+), 94 deletions(-) delete mode 100644 config/db/.gitkeep diff --git a/config/db/.gitkeep b/config/db/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/server/api/jellyfin.ts b/server/api/jellyfin.ts index 0fdd7c18b..50dd1de67 100644 --- a/server/api/jellyfin.ts +++ b/server/api/jellyfin.ts @@ -71,19 +71,18 @@ export interface JellyfinLibraryItemExtended extends JellyfinLibraryItem { class JellyfinAPI { private authToken?: string; + private userId?: string; private jellyfinHost: string; private axios: AxiosInstance; - constructor(jellyfinHost: string, authToken?: string) { + constructor(jellyfinHost: string, authToken?: string, userId?: string) { this.jellyfinHost = jellyfinHost; this.authToken = authToken; + this.userId = userId; let authHeaderVal = ''; if (this.authToken) { - authHeaderVal = - 'MediaBrowser Client="Overseerr", Device="Axios", DeviceId="TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84NS4wfDE2MTI5MjcyMDM5NzM1", Version="10.8.0", Token="' + - authToken + - '"'; + authHeaderVal = `MediaBrowser Client="Overseerr", Device="Axios", DeviceId="TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84NS4wfDE2MTI5MjcyMDM5NzM1", Version="10.8.0", Token="${authToken}"`; } else { authHeaderVal = 'MediaBrowser Client="Overseerr", Device="Axios", DeviceId="TW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODUuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84NS4wfDE2MTI5MjcyMDM5NzM1", Version="10.8.0"'; @@ -117,9 +116,26 @@ class JellyfinAPI { } } + public async getServerName(): Promise { + try { + const account = await this.axios.get( + `/System/Info/Public'}` + ); + return account.data.ServerName; + } catch (e) { + logger.error( + `Something went wrong while getting the server name from the Jellyfin server: ${e.message}`, + { label: 'Jellyfin API' } + ); + throw new Error('girl idk'); + } + } + public async getUser(): Promise { try { - const account = await this.axios.get('/Users/Me'); + const account = await this.axios.get( + `/Users/${this.userId ?? 'Me'}` + ); return account.data; } catch (e) { logger.error( diff --git a/server/constants/server.ts b/server/constants/server.ts index d2a8b4e63..7b2f9f1ff 100644 --- a/server/constants/server.ts +++ b/server/constants/server.ts @@ -1,5 +1,6 @@ export enum MediaServerType { PLEX = 1, - JELLYFIN, //also works for emby (identical APIs, etc) + JELLYFIN, + EMBY, NOT_CONFIGURED, } diff --git a/server/interfaces/api/settingsInterfaces.ts b/server/interfaces/api/settingsInterfaces.ts index 6ef54d9c2..4efd6f6dd 100644 --- a/server/interfaces/api/settingsInterfaces.ts +++ b/server/interfaces/api/settingsInterfaces.ts @@ -7,6 +7,7 @@ export interface SettingsAboutResponse { export interface PublicSettingsResponse { jellyfinHost?: string; + jellyfinServerName?: string; initialized: boolean; applicationTitle: string; hideAvailable: boolean; diff --git a/server/job/jellyfinsync/index.ts b/server/job/jellyfinsync/index.ts index c8fa2e416..b4c7db0c0 100644 --- a/server/job/jellyfinsync/index.ts +++ b/server/job/jellyfinsync/index.ts @@ -552,7 +552,7 @@ class JobJellyfinSync { this.running = true; const userRepository = getRepository(User); const admin = await userRepository.findOne({ - select: ['id', 'jellyfinAuthToken'], + select: ['id', 'jellyfinAuthToken', 'jellyfinId'], order: { id: 'ASC' }, }); @@ -562,7 +562,8 @@ class JobJellyfinSync { this.jfClient = new JellyfinAPI( settings.jellyfin.hostname ?? '', - admin.jellyfinAuthToken ?? '' + admin.jellyfinAuthToken ?? '', + admin.jellyfinId ?? '' ); this.libraries = settings.jellyfin.libraries.filter( diff --git a/server/lib/settings.ts b/server/lib/settings.ts index d139cd983..0656f9e84 100644 --- a/server/lib/settings.ts +++ b/server/lib/settings.ts @@ -99,6 +99,7 @@ interface FullPublicSettings extends PublicSettings { originalLanguage: string; mediaServerType: number; jellyfinHost?: string; + jellyfinServerName?: string; } export interface NotificationAgentConfig { @@ -368,17 +369,10 @@ class Settings { series4kEnabled: this.data.sonarr.some( (sonarr) => sonarr.is4k && sonarr.isDefault ), -<<<<<<< HEAD region: this.data.main.region, originalLanguage: this.data.main.originalLanguage, -======= mediaServerType: this.main.mediaServerType, -<<<<<<< HEAD - jfHost: this.jellyfin.hostname ?? '', ->>>>>>> feat(all): add initial Jellyfin/Emby support -======= jellyfinHost: this.jellyfin.hostname, ->>>>>>> feat(rebase): rebase }; } diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 9c4008fae..fd02b154d 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -181,6 +181,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => { : body.hostname; // First we need to attempt to log the user in to jellyfin const jellyfinserver = new JellyfinAPI(hostname ?? ''); + settings.jellyfin.name = await jellyfinserver.getServerName(); const account = await jellyfinserver.login(body.username, body.password); diff --git a/src/components/MovieDetails/index.tsx b/src/components/MovieDetails/index.tsx index 3fbd903fd..2aac60902 100644 --- a/src/components/MovieDetails/index.tsx +++ b/src/components/MovieDetails/index.tsx @@ -74,10 +74,8 @@ const messages = defineMessages({ openradarr: 'Open Movie in Radarr', openradarr4k: 'Open Movie in 4K Radarr', downloadstatus: 'Download Status', - playonplex: 'Play on Plex', - play4konplex: 'Play 4K on Plex', - playonjellyfin: 'Play on Jellyfin', - play4konjellyfin: 'Play 4K on Jellyfin', + play: 'Play on {mediaServerName}', + play4k: 'Play 4K on {mediaServerName}', markavailable: 'Mark as Available', mark4kavailable: 'Mark 4K as Available', }); @@ -396,8 +394,8 @@ const MovieDetails: React.FC = ({ movie }) => { 0} - plexUrl={data.mediaInfo?.mediaUrl} - plexUrl4k={data.mediaInfo?.mediaUrl4k} + mediaUrl={data.mediaInfo?.mediaUrl} + mediaUrl4k={data.mediaInfo?.mediaUrl4k} /> )} @@ -406,8 +404,8 @@ const MovieDetails: React.FC = ({ movie }) => { status={data.mediaInfo?.status4k} is4k inProgress={(data.mediaInfo?.downloadStatus4k ?? []).length > 0} - plexUrl={data.mediaInfo?.mediaUrl} - plexUrl4k={ + mediaUrl={data.mediaInfo?.mediaUrl} + mediaUrl4k={ data.mediaInfo?.mediaUrl4k && (hasPermission(Permission.REQUEST_4K) || hasPermission(Permission.REQUEST_4K_MOVIE)) @@ -487,21 +485,23 @@ const MovieDetails: React.FC = ({ movie }) => { {data.mediaInfo?.mediaUrl || data.mediaInfo?.mediaUrl4k - ? intl.formatMessage( - settings.currentSettings.mediaServerType == + ? intl.formatMessage(messages.play, { + mediaServerName: + settings.currentSettings.mediaServerType === MediaServerType.PLEX - ? messages.playonplex - : messages.playonjellyfin - ) + ? 'Plex' + : settings.currentSettings.jellyfinServerName, + }) : data.mediaInfo?.mediaUrl4k && (hasPermission(Permission.REQUEST_4K) || hasPermission(Permission.REQUEST_4K_MOVIE)) - ? intl.formatMessage( - settings.currentSettings.mediaServerType == + ? intl.formatMessage(messages.play4k, { + mediaServerName: + settings.currentSettings.mediaServerType === MediaServerType.PLEX - ? messages.playonplex - : messages.playonjellyfin - ) + ? 'Plex' + : settings.currentSettings.jellyfinServerName, + }) : intl.formatMessage(messages.watchtrailer)} @@ -538,12 +538,13 @@ const MovieDetails: React.FC = ({ movie }) => { }} buttonType="ghost" > - {intl.formatMessage( - settings.currentSettings.mediaServerType == + {intl.formatMessage(messages.play4k, { + mediaServerName: + settings.currentSettings.mediaServerType === MediaServerType.PLEX - ? messages.play4konplex - : messages.play4konjellyfin - )} + ? 'Plex' + : settings.currentSettings.jellyfinServerName, + })} )} {trailerUrl && ( diff --git a/src/components/Settings/SettingsMain.tsx b/src/components/Settings/SettingsMain.tsx index 80499183e..830086521 100644 --- a/src/components/Settings/SettingsMain.tsx +++ b/src/components/Settings/SettingsMain.tsx @@ -14,7 +14,6 @@ import globalMessages from '../../i18n/globalMessages'; import PermissionEdit from '../PermissionEdit'; import * as Yup from 'yup'; import RegionSelector from '../RegionSelector'; -import { MediaServerType } from '../../../server/constants/server'; const messages = defineMessages({ generalsettings: 'General Settings', @@ -36,7 +35,6 @@ const messages = defineMessages({ toastSettingsSuccess: 'Settings successfully saved!', toastSettingsFailure: 'Something went wrong while saving settings.', defaultPermissions: 'Default User Permissions', - useJellyfin: 'Use Jellyfin as Media Server', hideAvailable: 'Hide Available Media', csrfProtection: 'Enable CSRF Protection', csrfProtectionTip: @@ -124,8 +122,6 @@ const SettingsMain: React.FC = () => { region: data?.region, originalLanguage: data?.originalLanguage, trustProxy: data?.trustProxy, - useJellyfin: - data?.mediaServerType == MediaServerType.JELLYFIN ? true : false, }} enableReinitialize validationSchema={MainSettingsSchema} @@ -141,9 +137,6 @@ const SettingsMain: React.FC = () => { region: values.region, originalLanguage: values.originalLanguage, trustProxy: values.trustProxy, - mediaServerType: values.useJellyfin - ? MediaServerType.JELLYFIN - : MediaServerType.PLEX, }); addToast(intl.formatMessage(messages.toastSettingsSuccess), { @@ -367,21 +360,6 @@ const SettingsMain: React.FC = () => { /> -
- -
- { - setFieldValue('useJellyfin', !values.useJellyfin); - }} - /> -
-
{ const intl = useIntl(); const [isUpdating, setIsUpdating] = useState(false); const [currentStep, setCurrentStep] = useState(1); - const [msSettingsComplete, setMSSettingsComplete] = useState(false); + const [ + mediaServerSettingsComplete, + setMediaServerSettingsComplete, + ] = useState(false); const [mediaServerType, setMediaServerType] = useState(''); const router = useRouter(); @@ -114,10 +117,12 @@ const Setup: React.FC = () => { {currentStep === 2 && (
{mediaServerType == 'PLEX' ? ( - setMSSettingsComplete(true)} /> + setMediaServerSettingsComplete(true)} + /> ) : ( setMSSettingsComplete(true)} + onComplete={() => setMediaServerSettingsComplete(true)} /> )}
@@ -131,7 +136,7 @@ const Setup: React.FC = () => {