From c2e87714b4c4aa11bf68dcd82b76979f82990f3c Mon Sep 17 00:00:00 2001 From: Fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Thu, 14 Mar 2024 01:08:09 +0500 Subject: [PATCH 1/5] fix(embyauth): remove the accidentally added mediaServerType change code from another PR (#684) Accidentally added the mediaServerType change code from another feature branch/PR during the auth logic refactor that broke emby logins. --- server/routes/auth.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/routes/auth.ts b/server/routes/auth.ts index c3d9d0f6..9ec9ff99 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -345,11 +345,11 @@ authRoutes.post('/jellyfin', async (req, res, next) => { user.username = ''; } - // If JELLYFIN_TYPE is set to 'emby' then set mediaServerType to EMBY - if (process.env.JELLYFIN_TYPE === 'emby') { - settings.main.mediaServerType = MediaServerType.EMBY; - settings.save(); - } + // TODO: If JELLYFIN_TYPE is set to 'emby' then set mediaServerType to EMBY + // if (process.env.JELLYFIN_TYPE === 'emby') { + // settings.main.mediaServerType = MediaServerType.EMBY; + // settings.save(); + // } await userRepository.save(user); } else if (!settings.main.newPlexLogin) { From 530be4272cce1b0d74d7f4156b8d794cda6ea03f Mon Sep 17 00:00:00 2001 From: Fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Thu, 14 Mar 2024 03:11:53 +0500 Subject: [PATCH 2/5] fix(jellyfinscanner): conditionally assign the jellyfinMediaId and jellyfinMediaId4k (#686) Previously `jellyfinMediaId4k` was being assigned even if 4k server was not setup or even if 4k content were not present. This fixes it by conditionally assigning the jellyfinMediaId and JellyfinMediaId4k fix #681 --- server/lib/scanners/jellyfin/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/lib/scanners/jellyfin/index.ts b/server/lib/scanners/jellyfin/index.ts index 193882ed..ee546fe7 100644 --- a/server/lib/scanners/jellyfin/index.ts +++ b/server/lib/scanners/jellyfin/index.ts @@ -461,8 +461,9 @@ class JellyfinScanner { tmdbId: tvShow.id, tvdbId: tvShow.external_ids.tvdb_id, mediaAddedAt: new Date(metadata.DateCreated ?? ''), - jellyfinMediaId: Id, - jellyfinMediaId4k: Id, + jellyfinMediaId: isAllStandardSeasons ? Id : undefined, + jellyfinMediaId4k: + isAll4kSeasons && this.enable4kShow ? Id : undefined, status: isAllStandardSeasons ? MediaStatus.AVAILABLE : newSeasons.some( From 010df62776191fe4c195e590df338f8d8523f55b Mon Sep 17 00:00:00 2001 From: Danish Humair Date: Sat, 30 Mar 2024 05:53:14 +0500 Subject: [PATCH 3/5] feat: check if first jellyfin user is admin (#635) * feat: merge check if first jellyfin user is admin re #610 * refactor(i18n): extract admin error message into en locale --------- Co-authored-by: fallenbagel <98979876+Fallenbagel@users.noreply.github.com> --- server/api/jellyfin.ts | 3 +++ server/routes/auth.ts | 10 ++++++++++ src/components/Login/JellyfinLogin.tsx | 3 +++ src/i18n/locale/en.json | 1 + 4 files changed, 17 insertions(+) diff --git a/server/api/jellyfin.ts b/server/api/jellyfin.ts index 9f730965..768398a0 100644 --- a/server/api/jellyfin.ts +++ b/server/api/jellyfin.ts @@ -9,6 +9,9 @@ export interface JellyfinUserResponse { ServerId: string; ServerName: string; Id: string; + Policy: { + IsAdministrator: boolean; + }; PrimaryImageTag?: string; } diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 9ec9ff99..c20b4a5f 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -276,6 +276,11 @@ authRoutes.post('/jellyfin', async (req, res, next) => { }); if (!user && !(await userRepository.count())) { + // Check if user is admin on jellyfin + if (account.User.Policy.IsAdministrator === false) { + throw new Error('not_admin'); + } + logger.info( 'Sign-in attempt from Jellyfin user with access to the media server; creating initial admin user for Overseerr', { @@ -423,6 +428,11 @@ authRoutes.post('/jellyfin', async (req, res, next) => { status: 401, message: 'Unauthorized', }); + } else if (e.message === 'not_admin') { + return next({ + status: 403, + message: 'CREDENTIAL_ERROR_NOT_ADMIN', + }); } else if (e.message === 'add_email') { return next({ status: 406, diff --git a/src/components/Login/JellyfinLogin.tsx b/src/components/Login/JellyfinLogin.tsx index 594a6ff6..e5c01d6e 100644 --- a/src/components/Login/JellyfinLogin.tsx +++ b/src/components/Login/JellyfinLogin.tsx @@ -24,6 +24,7 @@ const messages = defineMessages({ validationusernamerequired: 'Username required', validationpasswordrequired: 'Password required', loginerror: 'Something went wrong while trying to sign in.', + adminerror: 'You must use an admin account to sign in.', credentialerror: 'The username or password is incorrect.', signingin: 'Signing in…', signin: 'Sign In', @@ -94,6 +95,8 @@ const JellyfinLogin: React.FC = ({ intl.formatMessage( e.message == 'Request failed with status code 401' ? messages.credentialerror + : e.message == 'Request failed with status code 403' + ? messages.adminerror : messages.loginerror ), { diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 71126cc2..257ac222 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -220,6 +220,7 @@ "components.Layout.VersionStatus.streamdevelop": "Overseerr Develop", "components.Layout.VersionStatus.streamstable": "Overseerr Stable", "components.Login.credentialerror": "The username or password is incorrect.", + "components.Login.adminerror": "You must use an admin account to sign in.", "components.Login.description": "Since this is your first time logging into {applicationName}, you are required to add a valid email address.", "components.Login.email": "Email Address", "components.Login.emailtooltip": "Address does not need to be associated with your {mediaServerName} instance.", From 0c86684bc28e2d77ee60d3e7c78356b1c1f81ea5 Mon Sep 17 00:00:00 2001 From: Fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Sun, 31 Mar 2024 16:25:45 +0500 Subject: [PATCH 4/5] refactor(i18n): change the user-facing identity of the application in i18n (#703) --- src/i18n/locale/cs.json | 2 +- src/i18n/locale/da.json | 2 +- src/i18n/locale/de.json | 2 +- src/i18n/locale/el.json | 2 +- src/i18n/locale/en.json | 34 +++++++++++++++++----------------- src/i18n/locale/it.json | 2 +- src/i18n/locale/ko.json | 33 +++++++++++++++++---------------- src/i18n/locale/nl.json | 2 +- src/i18n/locale/pt_PT.json | 2 +- src/i18n/locale/sv.json | 8 ++++---- 10 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/i18n/locale/cs.json b/src/i18n/locale/cs.json index 66121b8c..f9ff287c 100644 --- a/src/i18n/locale/cs.json +++ b/src/i18n/locale/cs.json @@ -155,7 +155,7 @@ "components.TvDetails.overview": "Přehled", "components.TvDetails.cast": "Obsazení", "components.TvDetails.anime": "Anime", - "components.StatusChacker.reloadJellyseerr": "Znovu načíst", + "components.StatusChacker.reloadOverseerr": "Znovu načíst", "components.Setup.tip": "Tip", "components.Setup.setup": "Konfigurace", "components.Setup.finishing": "Dokončování…", diff --git a/src/i18n/locale/da.json b/src/i18n/locale/da.json index 6ef1752e..bf102a6c 100644 --- a/src/i18n/locale/da.json +++ b/src/i18n/locale/da.json @@ -724,7 +724,7 @@ "components.StatusBadge.status4k": "4K {status}", "components.Setup.tip": "Tip", "components.Setup.welcome": "Velkommen til Jellyseerr", - "components.StatusChacker.reloadJellyseerr": "Genindlæs", + "components.StatusChacker.reloadOverseerr": "Genindlæs", "components.TvDetails.anime": "Anime", "components.TvDetails.cast": "Roller", "components.TvDetails.episodeRuntimeMinutes": "{runtime} minutter", diff --git a/src/i18n/locale/de.json b/src/i18n/locale/de.json index 94938f0c..7c4392c3 100644 --- a/src/i18n/locale/de.json +++ b/src/i18n/locale/de.json @@ -889,7 +889,7 @@ "components.StatusBadge.status4k": "4K {status}", "components.StatusChacker.newversionDescription": "Jellyseerr wurde aktualisiert! Bitte klicke auf die Schaltfläche unten, um die Seite neu zu laden.", "components.StatusChacker.newversionavailable": "Anwendungsaktualisierung", - "components.StatusChacker.reloadJellyseerr": "Jellyseerr neu laden", + "components.StatusChacker.reloadOverseerr": "Jellyseerr neu laden", "components.StatusChecker.appUpdated": "{applicationTitle} aktualisiert", "components.StatusChecker.appUpdatedDescription": "Klicke bitte auf die Schaltfläche unten, um die Anwendung neu zu laden.", "components.StatusChecker.reloadApp": "{applicationTitle} neu laden", diff --git a/src/i18n/locale/el.json b/src/i18n/locale/el.json index 0adf0902..01cf0776 100644 --- a/src/i18n/locale/el.json +++ b/src/i18n/locale/el.json @@ -634,7 +634,7 @@ "components.TvDetails.anime": "Anime", "components.TvDetails.TvCrew.fullseriescrew": "Όλο το Πλήρωμα της Σειράς", "components.TvDetails.TvCast.fullseriescast": "Όλοι οι Ηθοποιοί της Σειράς", - "components.StatusChacker.reloadJellyseerr": "Επαναφόρτωση", + "components.StatusChacker.reloadOverseerr": "Επαναφόρτωση", "components.StatusChacker.newversionavailable": "Ενημέρωση εφαρμογής", "components.StatusChacker.newversionDescription": "Το Jellyseerr έχει ενημερωθεί! Κάνε κλικ στο παρακάτω κουμπί για να φορτώσει ξανά η σελίδα.", "components.StatusBadge.status4k": "4K {status}", diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 257ac222..9ebbed25 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -217,8 +217,8 @@ "components.Layout.UserWarnings.passwordRequired": "A password is required.", "components.Layout.VersionStatus.commitsbehind": "{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} behind", "components.Layout.VersionStatus.outofdate": "Out of Date", - "components.Layout.VersionStatus.streamdevelop": "Overseerr Develop", - "components.Layout.VersionStatus.streamstable": "Overseerr Stable", + "components.Layout.VersionStatus.streamdevelop": "Jellyseerr Develop", + "components.Layout.VersionStatus.streamstable": "Jellyseerr Stable", "components.Login.credentialerror": "The username or password is incorrect.", "components.Login.adminerror": "You must use an admin account to sign in.", "components.Login.description": "Since this is your first time logging into {applicationName}, you are required to add a valid email address.", @@ -583,7 +583,7 @@ "components.Settings.Notifications.NotificationsPushbullet.validationAccessTokenRequired": "You must provide an access token", "components.Settings.Notifications.NotificationsPushbullet.validationTypes": "You must select at least one notification type", "components.Settings.Notifications.NotificationsPushover.accessToken": "Application API Token", - "components.Settings.Notifications.NotificationsPushover.accessTokenTip": "Register an application for use with Overseerr", + "components.Settings.Notifications.NotificationsPushover.accessTokenTip": "Register an application for use with Jellyseerr", "components.Settings.Notifications.NotificationsPushover.agentenabled": "Enable Agent", "components.Settings.Notifications.NotificationsPushover.deviceDefault": "Device Default", "components.Settings.Notifications.NotificationsPushover.pushoversettingsfailed": "Pushover notification settings failed to save.", @@ -608,7 +608,7 @@ "components.Settings.Notifications.NotificationsSlack.webhookUrl": "Webhook URL", "components.Settings.Notifications.NotificationsSlack.webhookUrlTip": "Create an Incoming Webhook integration", "components.Settings.Notifications.NotificationsWebPush.agentenabled": "Enable Agent", - "components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "In order to receive web push notifications, Overseerr must be served over HTTPS.", + "components.Settings.Notifications.NotificationsWebPush.httpsRequirement": "In order to receive web push notifications, Jellyseerr must be served over HTTPS.", "components.Settings.Notifications.NotificationsWebPush.toastWebPushTestFailed": "Web push test notification failed to send.", "components.Settings.Notifications.NotificationsWebPush.toastWebPushTestSending": "Sending web push test notification…", "components.Settings.Notifications.NotificationsWebPush.toastWebPushTestSuccess": "Web push test notification sent!", @@ -634,7 +634,7 @@ "components.Settings.Notifications.authPass": "SMTP Password", "components.Settings.Notifications.authUser": "SMTP Username", "components.Settings.Notifications.botAPI": "Bot Authorization Token", - "components.Settings.Notifications.botApiTip": "Create a bot for use with Overseerr", + "components.Settings.Notifications.botApiTip": "Create a bot for use with Jellyseerr", "components.Settings.Notifications.botAvatarUrl": "Bot Avatar URL", "components.Settings.Notifications.botUsername": "Bot Username", "components.Settings.Notifications.botUsernameTip": "Allow users to also start a chat with your bot and configure their own notifications", @@ -749,9 +749,9 @@ "components.Settings.SettingsAbout.githubdiscussions": "GitHub Discussions", "components.Settings.SettingsAbout.helppaycoffee": "Help Pay for Coffee", "components.Settings.SettingsAbout.outofdate": "Out of Date", - "components.Settings.SettingsAbout.overseerrinformation": "About Overseerr", + "components.Settings.SettingsAbout.overseerrinformation": "About Jellyseerr", "components.Settings.SettingsAbout.preferredmethod": "Preferred", - "components.Settings.SettingsAbout.runningDevelop": "You are running the develop branch of Overseerr, which is only recommended for those contributing to development or assisting with bleeding-edge testing.", + "components.Settings.SettingsAbout.runningDevelop": "You are running the develop branch of Jellyseerr, which is only recommended for those contributing to development or assisting with bleeding-edge testing.", "components.Settings.SettingsAbout.supportoverseerr": "Support Overseerr", "components.Settings.SettingsAbout.supportjellyseerr": "Support Jellyseerr", "components.Settings.SettingsAbout.timezone": "Time Zone", @@ -761,7 +761,7 @@ "components.Settings.SettingsAbout.version": "Version", "components.Settings.SettingsJobsCache.availability-sync": "Media Availability Sync", "components.Settings.SettingsJobsCache.cache": "Cache", - "components.Settings.SettingsJobsCache.cacheDescription": "Overseerr caches requests to external API endpoints to optimize performance and avoid making unnecessary API calls.", + "components.Settings.SettingsJobsCache.cacheDescription": "Jellyseerr caches requests to external API endpoints to optimize performance and avoid making unnecessary API calls.", "components.Settings.SettingsJobsCache.cacheflushed": "{cachename} cache flushed.", "components.Settings.SettingsJobsCache.cachehits": "Hits", "components.Settings.SettingsJobsCache.cachekeys": "Total Keys", @@ -782,7 +782,7 @@ "components.Settings.SettingsJobsCache.flushcache": "Flush Cache", "components.Settings.SettingsJobsCache.image-cache-cleanup": "Image Cache Cleanup", "components.Settings.SettingsJobsCache.imagecache": "Image Cache", - "components.Settings.SettingsJobsCache.imagecacheDescription": "When enabled in settings, Overseerr will proxy and cache images from pre-configured external sources. Cached images are saved into your config folder. You can find the files in {appDataPath}/cache/images.", + "components.Settings.SettingsJobsCache.imagecacheDescription": "When enabled in settings, Jellyseerr will proxy and cache images from pre-configured external sources. Cached images are saved into your config folder. You can find the files in {appDataPath}/cache/images.", "components.Settings.SettingsJobsCache.imagecachecount": "Images Cached", "components.Settings.SettingsJobsCache.imagecachesize": "Total Cache Size", "components.Settings.SettingsJobsCache.jellyfin-full-scan": "Jellyfin Full Library Scan", @@ -792,7 +792,7 @@ "components.Settings.SettingsJobsCache.jobcancelled": "{jobname} canceled.", "components.Settings.SettingsJobsCache.jobname": "Job Name", "components.Settings.SettingsJobsCache.jobs": "Jobs", - "components.Settings.SettingsJobsCache.jobsDescription": "Overseerr performs certain maintenance tasks as regularly-scheduled jobs, but they can also be manually triggered below. Manually running a job will not alter its schedule.", + "components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr performs certain maintenance tasks as regularly-scheduled jobs, but they can also be manually triggered below. Manually running a job will not alter its schedule.", "components.Settings.SettingsJobsCache.jobsandcache": "Jobs & Cache", "components.Settings.SettingsJobsCache.jobstarted": "{jobname} started.", "components.Settings.SettingsJobsCache.jobtype": "Type", @@ -833,7 +833,7 @@ "components.Settings.SettingsMain.csrfProtectionTip": "Set external API access to read-only (requires HTTPS)", "components.Settings.SettingsMain.general": "General", "components.Settings.SettingsMain.generalsettings": "General Settings", - "components.Settings.SettingsMain.generalsettingsDescription": "Configure global and default settings for Overseerr.", + "components.Settings.SettingsMain.generalsettingsDescription": "Configure global and default settings for Jellyseerr.", "components.Settings.SettingsMain.hideAvailable": "Hide Available Media", "components.Settings.SettingsMain.locale": "Display Language", "components.Settings.SettingsMain.originallanguage": "Discover Language", @@ -846,7 +846,7 @@ "components.Settings.SettingsMain.toastSettingsFailure": "Something went wrong while saving settings.", "components.Settings.SettingsMain.toastSettingsSuccess": "Settings saved successfully!", "components.Settings.SettingsMain.trustProxy": "Enable Proxy Support", - "components.Settings.SettingsMain.trustProxyTip": "Allow Overseerr to correctly register client IP addresses behind a proxy", + "components.Settings.SettingsMain.trustProxyTip": "Allow Jellyseerr to correctly register client IP addresses behind a proxy", "components.Settings.SettingsMain.validationApplicationTitle": "You must provide an application title", "components.Settings.SettingsMain.validationApplicationUrl": "You must provide a valid URL", "components.Settings.SettingsMain.validationApplicationUrlTrailingSlash": "URL must not end in a trailing slash", @@ -948,7 +948,7 @@ "components.Settings.jellyfinsettingsDescription": "Configure the settings for your {mediaServerName} server. {mediaServerName} scans your {mediaServerName} libraries to see what content is available.", "components.Settings.librariesRemaining": "Libraries Remaining: {count}", "components.Settings.manualscan": "Manual Library Scan", - "components.Settings.manualscanDescription": "Normally, this will only be run once every 24 hours. Overseerr will check your Plex server's recently added more aggressively. If this is your first time configuring Plex, a one-time full manual library scan is recommended!", + "components.Settings.manualscanDescription": "Normally, this will only be run once every 24 hours. Jellyseerr will check your Plex server's recently added more aggressively. If this is your first time configuring Plex, a one-time full manual library scan is recommended!", "components.Settings.manualscanDescriptionJellyfin": "Normally, this will only be run once every 24 hours. Jellyseerr will check your {mediaServerName} server's recently added more aggressively. If this is your first time configuring Jellyseerr, a one-time full manual library scan is recommended!", "components.Settings.manualscanJellyfin": "Manual Library Scan", "components.Settings.mediaTypeMovie": "movie", @@ -971,12 +971,12 @@ "components.Settings.notrunning": "Not Running", "components.Settings.plex": "Plex", "components.Settings.plexlibraries": "Plex Libraries", - "components.Settings.plexlibrariesDescription": "The libraries Overseerr scans for titles. Set up and save your Plex connection settings, then click the button below if no libraries are listed.", + "components.Settings.plexlibrariesDescription": "The libraries Jellyseerr scans for titles. Set up and save your Plex connection settings, then click the button below if no libraries are listed.", "components.Settings.plexsettings": "Plex Settings", - "components.Settings.plexsettingsDescription": "Configure the settings for your Plex server. Overseerr scans your Plex libraries to determine content availability.", + "components.Settings.plexsettingsDescription": "Configure the settings for your Plex server. Jellyseerr scans your Plex libraries to determine content availability.", "components.Settings.port": "Port", "components.Settings.radarrsettings": "Radarr Settings", - "components.Settings.restartrequiredTooltip": "Overseerr must be restarted for changes to this setting to take effect", + "components.Settings.restartrequiredTooltip": "Jellyseerr must be restarted for changes to this setting to take effect", "components.Settings.save": "Save Changes", "components.Settings.saving": "Saving…", "components.Settings.scan": "Sync Libraries", @@ -998,7 +998,7 @@ "components.Settings.syncing": "Syncing", "components.Settings.tautulliApiKey": "API Key", "components.Settings.tautulliSettings": "Tautulli Settings", - "components.Settings.tautulliSettingsDescription": "Optionally configure the settings for your Tautulli server. Overseerr fetches watch history data for your Plex media from Tautulli.", + "components.Settings.tautulliSettingsDescription": "Optionally configure the settings for your Tautulli server. Jellyseerr fetches watch history data for your Plex media from Tautulli.", "components.Settings.timeout": "Timeout", "components.Settings.toastPlexConnecting": "Attempting to connect to Plex…", "components.Settings.toastPlexConnectingFailure": "Failed to connect to Plex.", diff --git a/src/i18n/locale/it.json b/src/i18n/locale/it.json index 243e50c3..8f7f3d27 100644 --- a/src/i18n/locale/it.json +++ b/src/i18n/locale/it.json @@ -1152,7 +1152,7 @@ "components.Settings.SettingsMain.applicationurl": "URL applicazione", "components.Settings.SettingsMain.validationApplicationTitle": "Devi fornire un titolo dell'applicazione", "components.Settings.SettingsMain.validationApplicationUrl": "Devi fornire un URL valido", - "components.Settings.restartrequiredTooltip": "Overseerr deve essere riavviato per rendere effettive le modifiche", + "components.Settings.restartrequiredTooltip": "Jellyseerr deve essere riavviato per rendere effettive le modifiche", "components.TitleCard.tvdbid": "TheTVDB ID", "components.UserProfile.emptywatchlist": "I media aggiunti alla tua Plex Watchlist appariranno qui.", "components.TvDetails.status4k": "4K {status}", diff --git a/src/i18n/locale/ko.json b/src/i18n/locale/ko.json index 8b6634e4..70d87812 100644 --- a/src/i18n/locale/ko.json +++ b/src/i18n/locale/ko.json @@ -324,13 +324,13 @@ "components.Settings.SettingsAbout.appDataPath": "데이터 디렉토리", "components.Settings.SettingsAbout.documentation": "문서", "components.Settings.SettingsAbout.gettingsupport": "지원 받기", - "components.Settings.SettingsAbout.overseerrinformation": "Overseerr 정보", + "components.Settings.SettingsAbout.overseerrinformation": "Jellyseerr 정보", "components.Settings.SettingsAbout.preferredmethod": "선호", "components.Settings.SettingsAbout.runningDevelop": "당신은 개발에 기여하거나 최신 테스트를 지원하는 사람들에게만 권장되는 Overserr 분기를 실행하고 있습니다.", "components.Settings.SettingsAbout.timezone": "시간대", "components.Settings.SettingsJobsCache.availability-sync": "사용가능한 미디어 동기화", "components.Settings.SettingsJobsCache.cache": "캐시", - "components.Settings.SettingsJobsCache.cacheDescription": "Overseerr는 외부 API 엔드포인트에 대한 요청을 캐시하여 성능을 최적화하고 불필요한 API 호출을 방지합니다.", + "components.Settings.SettingsJobsCache.cacheDescription": "Jellyseerr는 외부 API 엔드포인트에 대한 요청을 캐시하여 성능을 최적화하고 불필요한 API 호출을 방지합니다.", "components.Settings.SettingsJobsCache.cacheflushed": "{cachename} 캐시가 플러시되었습니다.", "components.Settings.SettingsJobsCache.cachekeys": "전체 키", "components.Settings.SettingsJobsCache.cacheksize": "키 크기", @@ -342,11 +342,11 @@ "components.Settings.SettingsJobsCache.editJobSchedulePrompt": "새 주파수", "components.Settings.SettingsJobsCache.editJobScheduleSelectorSeconds": "매 {jobScheduleSeconds, plural, one {초} other {{jobScheduleSeconds} 초}}", "components.Settings.SettingsJobsCache.imagecache": "이미지 캐시", - "components.Settings.SettingsJobsCache.imagecacheDescription": "설정에서 활성화하면 Overseerr는 미리 구성된 외부 소스에서 이미지를 프록시하고 캐시합니다. 캐시된 이미지는 구성 폴더에 저장됩니다. {appDataPath}/cache/images 에서 파일을 찾을 수 있습니다.", + "components.Settings.SettingsJobsCache.imagecacheDescription": "설정에서 활성화하면 Jellyseerr는 미리 구성된 외부 소스에서 이미지를 프록시하고 캐시합니다. 캐시된 이미지는 구성 폴더에 저장됩니다. {appDataPath}/cache/images 에서 파일을 찾을 수 있습니다.", "components.Settings.SettingsJobsCache.jobScheduleEditFailed": "작업을 저장하는 동안 문제가 발생했습니다.", "components.Settings.SettingsJobsCache.jobScheduleEditSaved": "작업이 성공적으로 수정되었습니다!", "components.Settings.SettingsJobsCache.jobs": "작업", - "components.Settings.SettingsJobsCache.jobsDescription": "Overseerr는 특정 유지 관리 작업을 정기적으로 예약된 작업으로 수행하지만 아래에서 수동으로 트리거할 수도 있습니다. 작업을 수동으로 실행해도 일정이 변경되지는 않습니다.", + "components.Settings.SettingsJobsCache.jobsDescription": "Jellyseerr는 특정 유지 관리 작업을 정기적으로 예약된 작업으로 수행하지만 아래에서 수동으로 트리거할 수도 있습니다. 작업을 수동으로 실행해도 일정이 변경되지는 않습니다.", "components.Settings.SettingsJobsCache.jobtype": "유형", "components.Settings.SettingsJobsCache.plex-full-scan": "Plex 전체 라이브러리 스캔", "components.Settings.SettingsJobsCache.plex-recently-added-scan": "Plex 최근 추가 스캔", @@ -420,7 +420,7 @@ "components.Settings.is4k": "4K", "components.Settings.manualscan": "수동으로 라이브러리 스캔", "components.Settings.mediaTypeMovie": "영화", - "components.Settings.manualscanDescription": "일반적으로 이는 24시간에 한 번 실행됩니다. Overseerr는 Plex 서버의 최근 추가 항목을 더 적극적으로 확인합니다. 만약 Plex를 처음 구성하는 경우, 한번은 전체 수동 라이브러리 스캔을 권장합니다!", + "components.Settings.manualscanDescription": "일반적으로 이는 24시간에 한 번 실행됩니다. Jellyseerr는 Plex 서버의 최근 추가 항목을 더 적극적으로 확인합니다. 만약 Plex를 처음 구성하는 경우, 한번은 전체 수동 라이브러리 스캔을 권장합니다!", "components.Settings.mediaTypeSeries": "시리즈", "components.Settings.menuAbout": "정보", "components.Settings.menuGeneralSettings": "일반", @@ -431,10 +431,10 @@ "components.Settings.noDefaultNon4kServer": "비-4K 및 4K 콘텐츠를 전부 처리하는 유일한 {serverType} 서버가 있는 경우(또는 4K 콘텐츠만 다운로드하는 경우), {serverType} 서버는 4K 서버로 지정되어서는 안됩니다.", "components.Settings.noDefaultServer": "{mediaType} 요청을 처리하기 위해서는 적어도 하나 이상의 {serverType} 서버를 기본 설정해야 합니다.", "components.Settings.notifications": "알림", - "components.Settings.plexlibrariesDescription": "Overseerr에서 타이틀을 스캔하는 라이브러리입니다. Plex 연결 설정을 설정하고 저장한 후, 라이브러리가 표시되지 않는 경우 아래 버튼을 클릭하세요.", + "components.Settings.plexlibrariesDescription": "Jellyseerr에서 타이틀을 스캔하는 라이브러리입니다. Plex 연결 설정을 설정하고 저장한 후, 라이브러리가 표시되지 않는 경우 아래 버튼을 클릭하세요.", "components.Settings.port": "포트", "components.Settings.radarrsettings": "Radarr 설정", - "components.Settings.restartrequiredTooltip": "이 변경된 설정이 적용되려면 Overseerr를 재시작해야 합니다", + "components.Settings.restartrequiredTooltip": "이 변경된 설정이 적용되려면 Jellyseerr를 재시작해야 합니다", "components.Settings.serverRemote": "원격", "components.Settings.serverSecure": "보안", "components.Settings.serverpreset": "서버", @@ -598,7 +598,7 @@ "components.IssueList.showallissues": "모든 이슈 표시", "components.IssueModal.CreateIssueModal.toastFailedCreate": "이슈를 제출하는 동안에 문제가 발생했습니다.", "components.Layout.LanguagePicker.displaylanguage": "표시 언어", - "components.Layout.VersionStatus.streamdevelop": "Overseerr 개발", + "components.Layout.VersionStatus.streamdevelop": "Jellyseerr 개발", "components.ManageSlideOver.tvshow": "시리즈", "components.ManageSlideOver.plays": "{playCount, number} {playCount, plural, one {재생} other {재생}}", "components.MovieDetails.rtaudiencescore": "Rotten Tomatoes 시청자 점수", @@ -690,7 +690,7 @@ "components.Layout.Sidebar.issues": "이슈", "components.Layout.UserDropdown.myprofile": "프로필", "components.Login.loginerror": "로그인을 시도하는 중에 문제가 발생했습니다.", - "components.Layout.VersionStatus.streamstable": "Overseerr 안정", + "components.Layout.VersionStatus.streamstable": "Jellyseerr 안정", "components.Login.signingin": "로그인 중…", "components.ManageSlideOver.manageModalIssues": "진행 중인 이슈", "components.ManageSlideOver.manageModalMedia": "미디어", @@ -780,7 +780,7 @@ "components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestSuccess": "Pushbullet 테스트 알림이 전송되었습니다!", "components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestFailed": "Pushbullet 테스트 알림을 보내지 못했습니다.", "components.Settings.Notifications.NotificationsPushbullet.toastPushbulletTestSending": "Pushbullet 테스트 알림 보내기…", - "components.Settings.Notifications.NotificationsPushover.accessTokenTip": "Overseerr와 함께 사용할 애플리케이션 등록", + "components.Settings.Notifications.NotificationsPushover.accessTokenTip": "Jellyseerr와 함께 사용할 애플리케이션 등록", "components.Settings.Notifications.NotificationsPushover.agentenabled": "에이전트 활성화", "components.Settings.Notifications.NotificationsPushbullet.validationTypes": "적어도 하나 이상의 알림 유형을 선택해야 합니다", "components.Settings.Notifications.NotificationsPushover.accessToken": "애플리케이션 API 토큰", @@ -796,7 +796,7 @@ "components.Settings.Notifications.NotificationsWebhook.validationJsonPayloadRequired": "유효한 JSON 페이로드를 입력해야 합니다", "components.Settings.Notifications.allowselfsigned": "자체 서명된 인증서 허용", "components.Settings.Notifications.authUser": "SMTP 사용자 이름", - "components.Settings.Notifications.botApiTip": "Overseerr와 함께 사용할 봇 생성이 필요합니다", + "components.Settings.Notifications.botApiTip": "Jellyseerr와 함께 사용할 봇 생성이 필요합니다", "components.Settings.Notifications.botUsername": "봇 사용자 이름", "components.Settings.Notifications.chatIdTip": "봇과 채팅을 시작하고 @get_id_bot, /my_id 명령을 실행하세요", "components.Settings.Notifications.discordsettingsfailed": "Discord 알림 설정을 저장하지 못했습니다.", @@ -840,7 +840,7 @@ "components.Settings.SettingsMain.originallanguageTip": "원작 언어로 콘텐츠 필터링", "components.Settings.SettingsMain.partialRequestsEnabled": "부분 시리즈 요청 허용", "components.Settings.SettingsMain.trustProxy": "프록시 지원 활성화", - "components.Settings.SettingsMain.trustProxyTip": "프록시 뒤에서 클라이언트 IP 주소를 정확하게 등록하도록 Overseerr에 허용", + "components.Settings.SettingsMain.trustProxyTip": "프록시 뒤에서 클라이언트 IP 주소를 정확하게 등록하도록 Jellyseerr에 허용", "components.Settings.SettingsUsers.localLoginTip": "사용자가 Plex OAuth 대신 이메일 주소와 암호를 사용하여 로그인하도록 허용", "components.Settings.SettingsUsers.movieRequestLimitLabel": "전역 영화 요청 제한", "components.Settings.SettingsUsers.toastSettingsSuccess": "사용자 설정이 성공적으로 저장되었습니다!", @@ -1081,6 +1081,7 @@ "components.Settings.Notifications.encryptionTip": "대부분의 경우 암시적 TLS는 465 포트를 사용하고 STARTTLS는 587 포트를 사용합니다", "components.Settings.SettingsAbout.Releases.versionChangelog": "{version} 변경 로그", "components.Settings.SettingsAbout.supportoverseerr": "Overseerr 지원", + "components.Settings.SettingsAbout.supportjellyseerr": "Jellyseerr 지원", "components.Settings.SettingsAbout.uptodate": "최신", "components.Settings.SettingsAbout.githubdiscussions": "GitHub 토론", "components.Settings.SettingsAbout.version": "버전", @@ -1098,7 +1099,7 @@ "components.Settings.SettingsLogs.extraData": "추가 데이터", "components.Settings.SettingsLogs.time": "타임스탬프", "components.Settings.SettingsMain.cacheImages": "이미지 캐싱 활성화", - "components.Settings.SettingsMain.generalsettingsDescription": "Overseerr에 대한 전역 및 기본 설정을 구성합니다.", + "components.Settings.SettingsMain.generalsettingsDescription": "Jellyseerr에 대한 전역 및 기본 설정을 구성합니다.", "components.Settings.SettingsLogs.viewdetails": "세부 정보 보기", "components.Settings.SettingsMain.applicationurl": "애플리케이션 URL", "components.Settings.SettingsMain.apikey": "API 키", @@ -1138,7 +1139,7 @@ "components.Settings.librariesRemaining": "남은 라이브러리: {count}", "components.Settings.noDefault4kServer": "4K {serverType} 서버는 사용자가 4K {mediaType} 요청을 제출할 수 있도록 기본 설정되어야 합니다.", "components.Settings.scan": "라이브러리 동기화", - "components.Settings.plexsettingsDescription": "Plex 서버의 설정을 구성하세요. Overseerr는 Plex 라이브러리를 스캔하여 콘텐츠의 사용 가능성을 판단합니다.", + "components.Settings.plexsettingsDescription": "Plex 서버의 설정을 구성하세요. Jellyseerr는 Plex 라이브러리를 스캔하여 콘텐츠의 사용 가능성을 판단합니다.", "components.Settings.notificationsettings": "알림 설정", "components.Settings.plexsettings": "Plex 설정", "components.Settings.notificationAgentSettingsDescription": "알림 에이전트를 구성하고 활성화합니다.", @@ -1155,7 +1156,7 @@ "components.Settings.webAppUrlTip": "사용자에게 \"호스팅된\" 웹 앱 대신 서버의 웹 앱으로 이동하도록 선택적으로 설정할 수 있습니다", "components.Setup.setup": "설정", "components.Setup.tip": "팁", - "components.Setup.welcome": "Overseerr에 오신 것을 환영합니다", + "components.Setup.welcome": "Jellyseerr에 오신 것을 환영합니다", "components.StatusBadge.status4k": "4K {status}", "components.StatusBadge.status": "{status}", "components.TvDetails.play4konplex": "Plex에서 4K로 재생", @@ -1226,7 +1227,7 @@ "pages.errormessagewithcode": "{statusCode} - {error}", "pages.serviceunavailable": "서비스를 사용할 수 없음", "components.Settings.settingUpPlexDescription": "Plex를 설정하려면, 세부 정보를 수동으로 입력하거나 plex.tv에서 검색된 서버를 선택할 수 있습니다. 사용 가능한 서버 목록을 불러오려면 드롭다운 오른쪽에 있는 버튼을 누르세요.", - "components.Settings.tautulliSettingsDescription": "선택적으로 Tautulli 서버의 설정을 구성하세요. Overseerr는 Tautulli로부터 Plex 미디어의 시청 기록 데이터를 불러옵니다.", + "components.Settings.tautulliSettingsDescription": "선택적으로 Tautulli 서버의 설정을 구성하세요. Jellyseerr는 Tautulli로부터 Plex 미디어의 시청 기록 데이터를 불러옵니다.", "components.RequestBlock.requestdate": "요청 일자", "components.Discover.DiscoverMovies.activefilters": "{count, plural, one {# 선택한 필터} other {# 선택한 필터}}", "components.QuotaSelector.seasons": "{count, plural, one {시즌} other {시즌}}", diff --git a/src/i18n/locale/nl.json b/src/i18n/locale/nl.json index d89f9178..1b6cdea2 100644 --- a/src/i18n/locale/nl.json +++ b/src/i18n/locale/nl.json @@ -223,7 +223,7 @@ "components.TvDetails.network": "{networkCount, plural, one {Netwerk} other {Netwerken}}", "components.TvDetails.firstAirDate": "Datum eerste uitzending", "components.TvDetails.anime": "Anime", - "components.StatusChacker.reloadJellyseerr": "Herladen", + "components.StatusChacker.reloadOverseerr": "Herladen", "components.StatusChacker.newversionavailable": "Toepassingsupdate", "components.StatusChacker.newversionDescription": "Jellyseerr is geüpdatet! Klik op de onderstaande knop om de pagina opnieuw te laden.", "components.Settings.toastSettingsSuccess": "Instellingen succesvol opgeslagen!", diff --git a/src/i18n/locale/pt_PT.json b/src/i18n/locale/pt_PT.json index 274b64a1..2a967d78 100644 --- a/src/i18n/locale/pt_PT.json +++ b/src/i18n/locale/pt_PT.json @@ -332,7 +332,7 @@ "components.TvDetails.anime": "Anime", "components.TvDetails.TvCrew.fullseriescrew": "Equipa Técnica Completa da Série", "components.TvDetails.TvCast.fullseriescast": "Elenco Completo da Série", - "components.StatusChacker.reloadJellyseerr": "Recarregar", + "components.StatusChacker.reloadOverseerr": "Recarregar", "components.StatusChacker.newversionavailable": "Atualização de Aplicação", "components.StatusChacker.newversionDescription": "Jellyseerr foi atualizado! Clique no botão abaixo para recarregar a página.", "components.StatusBadge.status4k": "4K {status}", diff --git a/src/i18n/locale/sv.json b/src/i18n/locale/sv.json index 926b5e42..2c10fd72 100644 --- a/src/i18n/locale/sv.json +++ b/src/i18n/locale/sv.json @@ -1092,7 +1092,7 @@ "components.RequestList.RequestItem.tvdbid": "TheTVDB ID", "components.Settings.SettingsJobsCache.plex-watchlist-sync": "Synkronisering av Plex Watchlist", "components.Settings.advancedTooltip": "Om du konfigurerar den här inställningen felaktigt kan det leda till att funktionerna inte fungerar", - "components.Settings.restartrequiredTooltip": "Overseerr måste startas om för att ändringarna i den här inställningen ska träda i kraft", + "components.Settings.restartrequiredTooltip": "Jellyseerr måste startas om för att ändringarna i den här inställningen ska träda i kraft", "components.TvDetails.reportissue": "Rapportera ett problem", "components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseries": "Begär automatiskt serier", "components.UserProfile.UserSettings.UserGeneralSettings.plexwatchlistsyncseriestip": "Begär automatiskt serier på din Plex Watchlist", @@ -1103,7 +1103,7 @@ "components.StatusBadge.playonplex": "Spela upp på Plex", "components.TitleCard.tvdbid": "TheTVDB ID", "components.Settings.SettingsLogs.viewdetails": "Visa detaljer", - "components.Settings.SettingsJobsCache.imagecacheDescription": "När det är aktiverat i inställningarna kommer Overseerr att göra proxy- och cache-bilder från förkonfigurerade externa källor. Cachade bilder sparas i din konfigurationsmapp. Du hittar filerna i {appDataPath}/cache/images.", + "components.Settings.SettingsJobsCache.imagecacheDescription": "När det är aktiverat i inställningarna kommer Jellyseerrr att göra proxy- och cache-bilder från förkonfigurerade externa källor. Cachade bilder sparas i din konfigurationsmapp. Du hittar filerna i {appDataPath}/cache/images.", "components.TitleCard.cleardata": "Rensa data", "components.TitleCard.mediaerror": "{mediaType} Hittades inte", "components.TvDetails.rtcriticsscore": "Rotten Tomatoes Tomatometer", @@ -1183,7 +1183,7 @@ "components.Settings.SettingsMain.csrfProtectionTip": "Ställ in extern API-åtkomst till skrivskyddad (kräver HTTPS)", "components.Settings.SettingsMain.general": "Allmänt", "components.Settings.SettingsMain.generalsettings": "Generella inställningar", - "components.Settings.SettingsMain.generalsettingsDescription": "Konfigurera globala och standard-inställningar för Overseerr.", + "components.Settings.SettingsMain.generalsettingsDescription": "Konfigurera globala och standard-inställningar för Jellyseerr.", "components.Settings.SettingsMain.locale": "Visningsspråk", "components.Settings.SettingsMain.originallanguage": "Upptäck språk", "components.Settings.SettingsMain.originallanguageTip": "Filtrera innehållet efter originalspråk", @@ -1192,7 +1192,7 @@ "components.Settings.SettingsMain.regionTip": "Filtrera innehållet efter regional tillgänglighet", "components.Settings.SettingsMain.toastApiKeyFailure": "Något gick fel när du genererade en ny API-nyckel.", "components.Settings.SettingsMain.toastApiKeySuccess": "Ny API-nyckel genererades framgångsrikt!", - "components.Settings.SettingsMain.trustProxyTip": "Tillåt Overseerr att korrekt registrera klienternas IP-adresser bakom en proxy", + "components.Settings.SettingsMain.trustProxyTip": "Tillåt Jellyseerr att korrekt registrera klienternas IP-adresser bakom en proxy", "components.Discover.resetwarning": "Återställer alla skjutreglage till standardvärdet. Detta raderar också alla anpassade skjutreglage!", "components.Discover.stopediting": "Sluta redigera", "components.Discover.tmdbmoviegenre": "TMDB filmgenre", From 0900a95532501b6f4d9698de7530a771512924fc Mon Sep 17 00:00:00 2001 From: Fallenbagel <98979876+Fallenbagel@users.noreply.github.com> Date: Sun, 31 Mar 2024 16:26:09 +0500 Subject: [PATCH 5/5] fix: nullable type for jellyfinMediaId(4k) (#702) The jellyfinMediaId(4k) properties were inferred as string | undefined, causing them to be set to undefined when assigning null. This prevented the media from being saved correctly to the SQLite database, as it doesn't accept undefined values. This resolves the availabilitySync job issue where the "play on" button wasn't being removed for all media server types. fix #668 --- server/entity/Media.ts | 8 ++++---- server/lib/availabilitySync.ts | 4 ++-- server/lib/scanners/jellyfin/index.ts | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/server/entity/Media.ts b/server/entity/Media.ts index 68a5622c..1932670e 100644 --- a/server/entity/Media.ts +++ b/server/entity/Media.ts @@ -151,11 +151,11 @@ class Media { @Column({ nullable: true, type: 'varchar' }) public ratingKey4k?: string | null; - @Column({ nullable: true }) - public jellyfinMediaId?: string; + @Column({ nullable: true, type: 'varchar' }) + public jellyfinMediaId?: string | null; - @Column({ nullable: true }) - public jellyfinMediaId4k?: string; + @Column({ nullable: true, type: 'varchar' }) + public jellyfinMediaId4k?: string | null; public serviceUrl?: string; public serviceUrl4k?: string; diff --git a/server/lib/availabilitySync.ts b/server/lib/availabilitySync.ts index 5bdbf593..8b37bc85 100644 --- a/server/lib/availabilitySync.ts +++ b/server/lib/availabilitySync.ts @@ -548,7 +548,7 @@ class AvailabilitySync { media[is4k ? 'ratingKey4k' : 'ratingKey'] = mediaStatus === MediaStatus.PROCESSING ? media[is4k ? 'ratingKey4k' : 'ratingKey'] - : undefined; + : null; } else if ( mediaServerType === MediaServerType.JELLYFIN || mediaServerType === MediaServerType.EMBY @@ -556,7 +556,7 @@ class AvailabilitySync { media[is4k ? 'jellyfinMediaId4k' : 'jellyfinMediaId'] = mediaStatus === MediaStatus.PROCESSING ? media[is4k ? 'jellyfinMediaId4k' : 'jellyfinMediaId'] - : undefined; + : null; } logger.info( `The ${is4k ? '4K' : 'non-4K'} ${ diff --git a/server/lib/scanners/jellyfin/index.ts b/server/lib/scanners/jellyfin/index.ts index ee546fe7..f5b0f66a 100644 --- a/server/lib/scanners/jellyfin/index.ts +++ b/server/lib/scanners/jellyfin/index.ts @@ -168,9 +168,9 @@ class JellyfinScanner { newMedia.jellyfinMediaId = hasOtherResolution || (!this.enable4kMovie && has4k) ? metadata.Id - : undefined; + : null; newMedia.jellyfinMediaId4k = - has4k && this.enable4kMovie ? metadata.Id : undefined; + has4k && this.enable4kMovie ? metadata.Id : null; await mediaRepository.save(newMedia); this.log(`Saved ${metadata.Name}`); } @@ -461,9 +461,9 @@ class JellyfinScanner { tmdbId: tvShow.id, tvdbId: tvShow.external_ids.tvdb_id, mediaAddedAt: new Date(metadata.DateCreated ?? ''), - jellyfinMediaId: isAllStandardSeasons ? Id : undefined, + jellyfinMediaId: isAllStandardSeasons ? Id : null, jellyfinMediaId4k: - isAll4kSeasons && this.enable4kShow ? Id : undefined, + isAll4kSeasons && this.enable4kShow ? Id : null, status: isAllStandardSeasons ? MediaStatus.AVAILABLE : newSeasons.some(