refactor: rename some remaining Overseerr occurrences (#1397)

* refactor: rename some remaining Overseerr occurrences

This PR renames some remaining occurrences of Overseerr to Jellyseerr. This includes the OpenAPI
specification, log file names and some variables and console messages.

* fix(i18n): add missing translation
This commit is contained in:
Gauthier
2025-02-26 06:08:00 +01:00
committed by GitHub
parent a790b1abcc
commit 27112be933
32 changed files with 52 additions and 52 deletions

View File

@@ -97,7 +97,7 @@ When adding new UI text, please try to adhere to the following guidelines:
## Translation ## Translation
We use [Weblate](https://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/) for our translations, and your help with localizing Overseerr would be greatly appreciated! If your language is not listed below, please [open a feature request](https://github.com/fallenbagel/jellyseerr/issues/new/choose). We use [Weblate](https://jellyseerr.borgcube.de/projects/jellyseerr/jellyseerr-frontend/) for our translations, and your help with localizing Jellyseerr would be greatly appreciated! If your language is not listed below, please [open a feature request](https://github.com/fallenbagel/jellyseerr/issues/new/choose).
<a href="https://jellyseerr.borgcube.de/engage/jellysseerr/"><img src="https://jellyseerr.borgcube.de/widget/jellyseerr/multi-auto.svg" alt="Translation status" /></a> <a href="https://jellyseerr.borgcube.de/engage/jellysseerr/"><img src="https://jellyseerr.borgcube.de/widget/jellyseerr/multi-auto.svg" alt="Translation status" /></a>

View File

@@ -4,7 +4,7 @@
"vapidPublic": "BK_EpP8NDm9waor2zn6_S28o3ZYv4kCkJOfYpO3pt3W6jnPmxrgTLANUBNbbyaNatPnSQ12De9CeqSYQrqWzHTs", "vapidPublic": "BK_EpP8NDm9waor2zn6_S28o3ZYv4kCkJOfYpO3pt3W6jnPmxrgTLANUBNbbyaNatPnSQ12De9CeqSYQrqWzHTs",
"main": { "main": {
"apiKey": "testkey", "apiKey": "testkey",
"applicationTitle": "Overseerr", "applicationTitle": "Jellyseerr",
"applicationUrl": "", "applicationUrl": "",
"csrfProtection": false, "csrfProtection": false,
"cacheImages": false, "cacheImages": false,
@@ -71,7 +71,7 @@
"ignoreTls": false, "ignoreTls": false,
"requireTls": false, "requireTls": false,
"allowSelfSigned": false, "allowSelfSigned": false,
"senderName": "Overseerr" "senderName": "Jellyseerr"
} }
}, },
"discord": { "discord": {

View File

@@ -1,19 +1,19 @@
openapi: '3.0.2' openapi: '3.0.2'
info: info:
title: 'Overseerr API' title: 'Jellyseerr API'
version: '1.0.0' version: '1.0.0'
description: | description: |
This is the documentation for the Overseerr API backend. This is the documentation for the Jellyseerr API backend.
Two primary authentication methods are supported: Two primary authentication methods are supported:
- **Cookie Authentication**: A valid sign-in to the `/auth/plex` or `/auth/local` will generate a valid authentication cookie. - **Cookie Authentication**: A valid sign-in to the `/auth/plex` or `/auth/local` will generate a valid authentication cookie.
- **API Key Authentication**: Sign-in is also possible by passing an `X-Api-Key` header along with a valid API Key generated by Overseerr. - **API Key Authentication**: Sign-in is also possible by passing an `X-Api-Key` header along with a valid API Key generated by Jellyseerr.
tags: tags:
- name: public - name: public
description: Public API endpoints requiring no authentication. description: Public API endpoints requiring no authentication.
- name: settings - name: settings
description: Endpoints related to Overseerr's settings and configuration. description: Endpoints related to Jellyseerr's settings and configuration.
- name: auth - name: auth
description: Endpoints related to logging in or out, and the currently authenticated user. description: Endpoints related to logging in or out, and the currently authenticated user.
- name: users - name: users
@@ -160,7 +160,7 @@ components:
example: en example: en
applicationTitle: applicationTitle:
type: string type: string
example: Overseerr example: Jellyseerr
applicationUrl: applicationUrl:
type: string type: string
example: https://os.example.com example: https://os.example.com
@@ -1438,7 +1438,7 @@ components:
example: no-reply@example.com example: no-reply@example.com
senderName: senderName:
type: string type: string
example: Overseerr example: Jellyseerr
smtpHost: smtpHost:
type: string type: string
example: 127.0.0.1 example: 127.0.0.1
@@ -1969,8 +1969,8 @@ components:
paths: paths:
/status: /status:
get: get:
summary: Get Overseerr status summary: Get Jellyseerr status
description: Returns the current Overseerr status in a JSON object. description: Returns the current Jellyseerr status in a JSON object.
security: [] security: []
tags: tags:
- public - public

View File

@@ -5,7 +5,7 @@
"scripts": { "scripts": {
"preinstall": "npx only-allow pnpm", "preinstall": "npx only-allow pnpm",
"postinstall": "node postinstall-win.js", "postinstall": "node postinstall-win.js",
"dev": "nodemon -e ts --watch server --watch overseerr-api.yml -e .json,.ts,.yml -x ts-node -r tsconfig-paths/register --files --project server/tsconfig.json server/index.ts", "dev": "nodemon -e ts --watch server --watch jellyseerr-api.yml -e .json,.ts,.yml -x ts-node -r tsconfig-paths/register --files --project server/tsconfig.json server/index.ts",
"build:server": "tsc --project server/tsconfig.json && copyfiles -u 2 server/templates/**/*.{html,pug} dist/templates && tsc-alias -p server/tsconfig.json", "build:server": "tsc --project server/tsconfig.json && copyfiles -u 2 server/templates/**/*.{html,pug} dist/templates && tsc-alias -p server/tsconfig.json",
"build:next": "next build", "build:next": "next build",
"build": "pnpm build:next && pnpm build:server", "build": "pnpm build:next && pnpm build:server",

View File

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -72,7 +72,7 @@ class GithubAPI extends ExternalAPI {
); );
} }
public async getOverseerrReleases({ public async getJellyseerrReleases({
take = 20, take = 20,
}: { }: {
take?: number; take?: number;
@@ -88,14 +88,14 @@ class GithubAPI extends ExternalAPI {
return data; return data;
} catch (e) { } catch (e) {
logger.warn( logger.warn(
"Failed to retrieve GitHub releases. This may be an issue on GitHub's end. Overseerr can't check if it's on the latest version.", "Failed to retrieve GitHub releases. This may be an issue on GitHub's end. Jellyseerr can't check if it's on the latest version.",
{ label: 'GitHub API', errorMessage: e.message } { label: 'GitHub API', errorMessage: e.message }
); );
return []; return [];
} }
} }
public async getOverseerrCommits({ public async getJellyseerrCommits({
take = 20, take = 20,
branch = 'develop', branch = 'develop',
}: { }: {
@@ -114,7 +114,7 @@ class GithubAPI extends ExternalAPI {
return data; return data;
} catch (e) { } catch (e) {
logger.warn( logger.warn(
"Failed to retrieve GitHub commits. This may be an issue on GitHub's end. Overseerr can't check if it's on the latest version.", "Failed to retrieve GitHub commits. This may be an issue on GitHub's end. Jellyseerr can't check if it's on the latest version.",
{ label: 'GitHub API', errorMessage: e.message } { label: 'GitHub API', errorMessage: e.message }
); );
return []; return [];

View File

@@ -124,9 +124,9 @@ class PlexAPI {
// }, // },
options: { options: {
identifier: settings.clientId, identifier: settings.clientId,
product: 'Overseerr', product: 'Jellyseerr',
deviceName: 'Overseerr', deviceName: 'Jellyseerr',
platform: 'Overseerr', platform: 'Jellyseerr',
}, },
}); });
} }

View File

@@ -41,9 +41,9 @@ import path from 'path';
import swaggerUi from 'swagger-ui-express'; import swaggerUi from 'swagger-ui-express';
import YAML from 'yamljs'; import YAML from 'yamljs';
const API_SPEC_PATH = path.join(__dirname, '../overseerr-api.yml'); const API_SPEC_PATH = path.join(__dirname, '../jellyseerr-api.yml');
logger.info(`Starting Overseerr version ${getAppVersion()}`); logger.info(`Starting Jellyseerr version ${getAppVersion()}`);
const dev = process.env.NODE_ENV !== 'production'; const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev }); const app = next({ dev });
const handle = app.getRequestHandler(); const handle = app.getRequestHandler();

View File

@@ -188,7 +188,7 @@ class SlackAgent
type: 'actions', type: 'actions',
elements: [ elements: [
{ {
action_id: 'open-in-overseerr', action_id: 'open-in-jellyseerr',
type: 'button', type: 'button',
url, url,
text: { text: {

View File

@@ -130,7 +130,7 @@ class WatchlistSync {
switch (e.constructor) { switch (e.constructor) {
// During watchlist sync, these errors aren't necessarily // During watchlist sync, these errors aren't necessarily
// a problem with Overseerr. Since we are auto syncing these constantly, it's // a problem with Jellyseerr. Since we are auto syncing these constantly, it's
// possible they are unexpectedly at their quota limit, for example. So we'll // possible they are unexpectedly at their quota limit, for example. So we'll
// instead log these as debug messages. // instead log these as debug messages.
case RequestPermissionError: case RequestPermissionError:

View File

@@ -43,14 +43,14 @@ const logger = winston.createLogger({
}), }),
new winston.transports.DailyRotateFile({ new winston.transports.DailyRotateFile({
filename: process.env.CONFIG_DIRECTORY filename: process.env.CONFIG_DIRECTORY
? `${process.env.CONFIG_DIRECTORY}/logs/overseerr-%DATE%.log` ? `${process.env.CONFIG_DIRECTORY}/logs/jellyseerr-%DATE%.log`
: path.join(__dirname, '../config/logs/overseerr-%DATE%.log'), : path.join(__dirname, '../config/logs/jellyseerr-%DATE%.log'),
datePattern: 'YYYY-MM-DD', datePattern: 'YYYY-MM-DD',
zippedArchive: true, zippedArchive: true,
maxSize: '20m', maxSize: '20m',
maxFiles: '7d', maxFiles: '7d',
createSymlink: true, createSymlink: true,
symlinkName: 'overseerr.log', symlinkName: 'jellyseerr.log',
}), }),
new winston.transports.DailyRotateFile({ new winston.transports.DailyRotateFile({
filename: process.env.CONFIG_DIRECTORY filename: process.env.CONFIG_DIRECTORY

View File

@@ -158,7 +158,7 @@ authRoutes.post('/plex', async (req, res, next) => {
}); });
} else { } else {
logger.info( logger.info(
'Sign-in attempt from Plex user with access to the media server; creating new Overseerr user', 'Sign-in attempt from Plex user with access to the media server; creating new Jellyseerr user',
{ {
label: 'API', label: 'API',
ip: req.ip, ip: req.ip,
@@ -274,7 +274,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
if (user) { if (user) {
deviceId = user.jellyfinDeviceId ?? ''; deviceId = user.jellyfinDeviceId ?? '';
} else { } else {
deviceId = Buffer.from(`BOT_overseerr_${body.username ?? ''}`).toString( deviceId = Buffer.from(`BOT_jellyseerr_${body.username ?? ''}`).toString(
'base64' 'base64'
); );
} }
@@ -446,7 +446,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => {
}); });
} else if (!user) { } else if (!user) {
logger.info( logger.info(
'Sign-in attempt from Jellyfin user with access to the media server; creating new Overseerr user', 'Sign-in attempt from Jellyfin user with access to the media server; creating new Jellyseerr user',
{ {
label: 'API', label: 'API',
ip: req.ip, ip: req.ip,
@@ -584,7 +584,7 @@ authRoutes.post('/local', async (req, res, next) => {
.getOne(); .getOne();
if (!user || !(await user.passwordMatch(body.password))) { if (!user || !(await user.passwordMatch(body.password))) {
logger.warn('Failed sign-in attempt using invalid Overseerr password', { logger.warn('Failed sign-in attempt using invalid Jellyseerr password', {
label: 'API', label: 'API',
ip: req.ip, ip: req.ip,
email: body.email, email: body.email,
@@ -674,7 +674,7 @@ authRoutes.post('/local', async (req, res, next) => {
return res.status(200).json(user?.filter() ?? {}); return res.status(200).json(user?.filter() ?? {});
} catch (e) { } catch (e) {
logger.error( logger.error(
'Something went wrong authenticating with Overseerr password', 'Something went wrong authenticating with Jellyseerr password',
{ {
label: 'API', label: 'API',
errorMessage: e.message, errorMessage: e.message,

View File

@@ -55,7 +55,7 @@ router.get<unknown, StatusResponse>('/status', async (req, res) => {
let commitsBehind = 0; let commitsBehind = 0;
if (currentVersion.startsWith('develop-') && commitTag !== 'local') { if (currentVersion.startsWith('develop-') && commitTag !== 'local') {
const commits = await githubApi.getOverseerrCommits(); const commits = await githubApi.getJellyseerrCommits();
if (commits.length) { if (commits.length) {
const filteredCommits = commits.filter( const filteredCommits = commits.filter(
@@ -74,7 +74,7 @@ router.get<unknown, StatusResponse>('/status', async (req, res) => {
} }
} }
} else if (commitTag !== 'local') { } else if (commitTag !== 'local') {
const releases = await githubApi.getOverseerrReleases(); const releases = await githubApi.getJellyseerrReleases();
if (releases.length) { if (releases.length) {
const latestVersion = releases[0]; const latestVersion = releases[0];
@@ -403,7 +403,7 @@ router.get('/watchproviders/tv', async (req, res, next) => {
router.get('/', (_req, res) => { router.get('/', (_req, res) => {
return res.status(200).json({ return res.status(200).json({
api: 'Overseerr API', api: 'Jellyseerr API',
version: '1.0', version: '1.0',
}); });
}); });

View File

@@ -419,7 +419,7 @@ userSettingsRoutes.post<{ username: string; password: string }>(
const hostname = getHostname(); const hostname = getHostname();
const deviceId = Buffer.from( const deviceId = Buffer.from(
`BOT_overseerr_${req.user.username ?? ''}` `BOT_jellyseerr_${req.user.username ?? ''}`
).toString('base64'); ).toString('base64');
const jellyfinserver = new JellyfinAPI(hostname, undefined, deviceId); const jellyfinserver = new JellyfinAPI(hostname, undefined, deviceId);

View File

@@ -298,7 +298,7 @@ const BlacklistedItem = ({ item, revalidateList }: BlacklistedItemProps) => {
src={ src={
title?.posterPath title?.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -233,7 +233,7 @@ const CollectionDetails = ({ collection }: CollectionDetailsProps) => {
src={ src={
data.posterPath data.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -240,7 +240,7 @@ const IssueDetails = () => {
src={ src={
data.posterPath data.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -142,7 +142,7 @@ const IssueItem = ({ issue }: IssueItemProps) => {
src={ src={
title.posterPath title.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -505,7 +505,7 @@ const MovieDetails = ({ movie }: MovieDetailsProps) => {
src={ src={
data.posterPath data.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -2,7 +2,7 @@ interface PWAHeaderProps {
applicationTitle?: string; applicationTitle?: string;
} }
const PWAHeader = ({ applicationTitle = 'Overseerr' }: PWAHeaderProps) => { const PWAHeader = ({ applicationTitle = 'Jellyseerr' }: PWAHeaderProps) => {
return ( return (
<> <>
<link <link

View File

@@ -618,7 +618,7 @@ const RequestCard = ({ request, onTitleData }: RequestCardProps) => {
src={ src={
title.posterPath title.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -453,7 +453,7 @@ const RequestItem = ({ request, revalidateList }: RequestItemProps) => {
src={ src={
title.posterPath title.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${title.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -441,7 +441,7 @@ const CollectionRequestModal = ({
src={ src={
part.posterPath part.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${part.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${part.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -92,7 +92,7 @@ const SearchByNameModal = ({
<Image <Image
src={ src={
item.remotePoster ?? item.remotePoster ??
'/images/overseerr_poster_not_found.png' '/images/jellyseerr_poster_not_found.png'
} }
alt={item.title} alt={item.title}
className="w-100 h-auto rounded-md" className="w-100 h-auto rounded-md"

View File

@@ -35,7 +35,7 @@ import useSWR from 'swr';
const messages = defineMessages('components.Settings.SettingsLogs', { const messages = defineMessages('components.Settings.SettingsLogs', {
logs: 'Logs', logs: 'Logs',
logsDescription: logsDescription:
'You can also view these logs directly via <code>stdout</code>, or in <code>{appDataPath}/logs/overseerr.log</code>.', 'You can also view these logs directly via <code>stdout</code>, or in <code>{appDataPath}/logs/jellyseerr.log</code>.',
time: 'Timestamp', time: 'Timestamp',
level: 'Severity', level: 'Severity',
label: 'Label', label: 'Label',

View File

@@ -352,7 +352,7 @@ const TitleCard = ({
src={ src={
image image
? `https://image.tmdb.org/t/p/w300_and_h450_face${image}` ? `https://image.tmdb.org/t/p/w300_and_h450_face${image}`
: `/images/overseerr_poster_not_found_logo_top.png` : `/images/jellyseerr_poster_not_found_logo_top.png`
} }
style={{ width: '100%', height: '100%', objectFit: 'cover' }} style={{ width: '100%', height: '100%', objectFit: 'cover' }}
fill fill

View File

@@ -547,7 +547,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => {
src={ src={
data.posterPath data.posterPath
? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}` ? `https://image.tmdb.org/t/p/w600_and_h900_bestv2${data.posterPath}`
: '/images/overseerr_poster_not_found.png' : '/images/jellyseerr_poster_not_found.png'
} }
alt="" alt=""
sizes="100vw" sizes="100vw"

View File

@@ -10,7 +10,7 @@ export interface SettingsContextProps {
const defaultSettings = { const defaultSettings = {
initialized: false, initialized: false,
applicationTitle: 'Overseerr', applicationTitle: 'Jellyseerr',
applicationUrl: '', applicationUrl: '',
hideAvailable: false, hideAvailable: false,
localLogin: true, localLogin: true,

View File

@@ -904,7 +904,7 @@
"components.Settings.SettingsLogs.level": "Severity", "components.Settings.SettingsLogs.level": "Severity",
"components.Settings.SettingsLogs.logDetails": "Log Details", "components.Settings.SettingsLogs.logDetails": "Log Details",
"components.Settings.SettingsLogs.logs": "Logs", "components.Settings.SettingsLogs.logs": "Logs",
"components.Settings.SettingsLogs.logsDescription": "You can also view these logs directly via <code>stdout</code>, or in <code>{appDataPath}/logs/overseerr.log</code>.", "components.Settings.SettingsLogs.logsDescription": "You can also view these logs directly via <code>stdout</code>, or in <code>{appDataPath}/logs/jellyseerr.log</code>.",
"components.Settings.SettingsLogs.message": "Message", "components.Settings.SettingsLogs.message": "Message",
"components.Settings.SettingsLogs.pauseLogs": "Pause", "components.Settings.SettingsLogs.pauseLogs": "Pause",
"components.Settings.SettingsLogs.resumeLogs": "Resume", "components.Settings.SettingsLogs.resumeLogs": "Resume",

View File

@@ -57,14 +57,14 @@ class PlexOAuth {
const browser = Bowser.getParser(window.navigator.userAgent); const browser = Bowser.getParser(window.navigator.userAgent);
this.plexHeaders = { this.plexHeaders = {
Accept: 'application/json', Accept: 'application/json',
'X-Plex-Product': 'Overseerr', 'X-Plex-Product': 'Jellyseerr',
'X-Plex-Version': 'Plex OAuth', 'X-Plex-Version': 'Plex OAuth',
'X-Plex-Client-Identifier': clientId, 'X-Plex-Client-Identifier': clientId,
'X-Plex-Model': 'Plex OAuth', 'X-Plex-Model': 'Plex OAuth',
'X-Plex-Platform': browser.getBrowserName(), 'X-Plex-Platform': browser.getBrowserName(),
'X-Plex-Platform-Version': browser.getBrowserVersion(), 'X-Plex-Platform-Version': browser.getBrowserVersion(),
'X-Plex-Device': browser.getOSName(), 'X-Plex-Device': browser.getOSName(),
'X-Plex-Device-Name': `${browser.getBrowserName()} (Overseerr)`, 'X-Plex-Device-Name': `${browser.getBrowserName()} (Jellyseerr)`,
'X-Plex-Device-Screen-Resolution': 'X-Plex-Device-Screen-Resolution':
window.screen.width + 'x' + window.screen.height, window.screen.width + 'x' + window.screen.height,
'X-Plex-Language': 'en', 'X-Plex-Language': 'en',