diff --git a/.all-contributorsrc b/.all-contributorsrc index 0367e4ac8..441c227ca 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -543,8 +543,8 @@ ], "badgeTemplate": "\"All-orange.svg\"/>", "contributorsPerLine": 7, - "projectName": "overseerr", - "projectOwner": "sct", + "projectName": "Jellyseerr", + "projectOwner": "Fallenbagel", "repoType": "github", "repoHost": "https://github.com", "skipCi": true diff --git a/.eslintrc.js b/.eslintrc.js index b1c6f4b9f..3b6ea1866 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -7,7 +7,6 @@ module.exports = { 'plugin:jsx-a11y/recommended', 'plugin:react/recommended', 'plugin:react-hooks/recommended', - 'prettier', ], parserOptions: { ecmaVersion: 6, @@ -26,7 +25,6 @@ module.exports = { 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', '@typescript-eslint/explicit-function-return-type': 'off', - 'prettier/prettier': ['error', { endOfLine: 'auto' }], 'formatjs/no-offset': 'error', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': ['error'], @@ -40,7 +38,7 @@ module.exports = { }, }, ], - plugins: ['jsx-a11y', 'prettier', 'react-hooks', 'formatjs'], + plugins: ['jsx-a11y', 'react-hooks', 'formatjs'], settings: { react: { pragma: 'React', diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 000000000..958988670 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +[[ -n $HUSKY_BYPASS ]] || commitlint -E HUSKY_GIT_PARAMS diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..449fcdee1 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm test diff --git a/.husky/prepare-commit-msg b/.husky/prepare-commit-msg new file mode 100755 index 000000000..73a4cdc33 --- /dev/null +++ b/.husky/prepare-commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +exec < /dev/tty && git cz --hook || true diff --git a/README.md b/README.md index 02c4a81a8..152736970 100644 --- a/README.md +++ b/README.md @@ -1,158 +1,50 @@

-Overseerr +Overseerr

-Overseerr Release -Overseerr CI -

-

-Discord -Docker pulls -Translation status -Language grade: JavaScript -GitHub - -All Contributors - +Discord

-**Overseerr** is a free and open source software application for managing requests for your media library. It integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**, and **[Plex](https://www.plex.tv/)**! +**Jellyseerr** is a free and open source fork of Overseerr for managing requests for your media library. It integrates with your existing services, such as **[Sonarr](https://sonarr.tv/)**, **[Radarr](https://radarr.video/)**, and **[Jellyfin](https://jellyfin.org/)**! ## Current Features -- Full Plex integration. Authenticate and manage user access with Plex! -- Easy integration with your existing services. Currently, Overseerr supports Sonarr and Radarr. More to come! -- Plex library scan, to keep track of the titles which are already available. +- Jellyfin support +- Easy integration with your existing services. Currently, Jellyseerr supports Sonarr and Radarr. +- Jellyfin library scan, to keep track of the titles which are already available. - Customizable request system, which allows users to request individual seasons or movies in a friendly, easy-to-use interface. - Incredibly simple request management UI. Don't dig through the app to simply approve recent requests! - Granular permission system. - Support for various notification agents. - Mobile-friendly design, for when you need to approve requests on the go! -With more features on the way! Check out our [issue tracker](https://github.com/sct/overseerr/issues) to see the features which have already been requested. +Check out our [issue tracker](https://github.com/Fallenbagel/jellyseerr/issues). + +## Supported Architectures + +Jellyseerr image support multiple architectures such as x86-64, arm64 and armv7. + +| **Architecture** | **Tag** | +| ---------------- | ------- | +| x86-64 | latest | +| ARM64 | arm | +| ARMv7 | armv7 | ## Getting Started -Check out our documentation for instructions on how to install and run Overseerr: - -https://docs.overseerr.dev/getting-started/installation - -## Preview - - +Check out our dockerhub for instructions on how to install and run Jellyseerr: +https://hub.docker.com/r/fallenbagel/jellyseerr ## Support -- Check out the [Overseerr Documentation](https://docs.overseerr.dev/) before asking for help. Your question might already be in the [FAQ](https://docs.overseerr.dev/support/faq). -- You can get support on [Discord](https://discord.gg/overseerr). -- You can ask questions in the Help category of our [GitHub Discussions](https://github.com/sct/overseerr/discussions). +- You can get support on [Discord](https://discord.gg/ckbvBtDJgC). - Bug reports and feature requests can be submitted via [GitHub Issues](https://github.com/sct/overseerr/issues). -## API Documentation - -Our documentation is built on every commit and hosted at https://api-docs.overseerr.dev - -You can also access the API documentation from your local Overseerr install at http://localhost:5055/api-docs - -## Community - -You can ask questions, share ideas, and more in [GitHub Discussions](https://github.com/sct/overseerr/discussions). - -If you would like to chat with other members of our growing community, [join the Overseerr Discord server](https://discord.gg/overseerr)! - -Our [Code of Conduct](https://github.com/sct/overseerr/blob/develop/CODE_OF_CONDUCT.md) applies to all Overseerr community channels. - -## Contributing - -You can help improve Overseerr too! Check out our [Contribution Guide](https://github.com/sct/overseerr/blob/develop/CONTRIBUTING.md) to get started. - -## Contributors ✨ - -Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

sct

💻 🎨 🤔

Alex Zoitos

💻

Brandon Cohen

💻 📖

Ahreluth

🌍

KovalevArtem

🌍

GiyomuWeb

🌍

Angry Cuban

📖

jvennik

🌍

darknessgp

💻

salty

🚇

Shutruk

🌍

Krystian Charubin

🎨

Kieron Boswell

💻

samwiseg0

💬 🚇

ecelebi29

💻 📖

Mārtiņš Možeiko

💻

mazzetta86

🌍

Paul Hagedorn

🌍

Shagon94

🌍

sebstrgg

🌍

Danshil Mungur

💻 📖

doob187

🚇

johnpyp

💻

Jakob Ankarhem

📖 💻 🌍

Jayesh

💻

flying-sausages

📖

hirenshah

📖

TheCatLady

💻 🌍 📖

Chris Pritchard

💻 📖

Tamberlox

🌍

David

💻

Douglas Parker

📖

Daniel Carter

💻

nuro

📖

ᗪєνιη ᗷυнʟ

🚇

JonnyWong16

📖

Roxedus

📖

WoisWoi

🌍

HubDuck

🌍 📖

costaht

📖 🌍

Shjosan

🌍

kobaubarr

🌍

Ricardo González

🌍

Torkil

🌍

Jagandeep Brar

📖

dtalens

🌍

Alex Cortelyou

💻

Jono Cairns

💻

DJScias

🌍

Dabu-dot

🌍

Jabster28

💻

littlerooster

🌍

Dustin Hildebrandt

💻

Bruno Guerreiro

🌍

Alexander Neuhäuser

🌍

Livio

🎨

tangentThought

💻

Nicolás Espinoza

💻
- - +## Buy me a Coffee! + +If you like jellyseerr and want to help maintain it, please buy me a coffee as it would help me out a lot! + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/fallen.bagel) diff --git a/server/api/github.ts b/server/api/github.ts index 48b8854b1..a60a3341b 100644 --- a/server/api/github.ts +++ b/server/api/github.ts @@ -83,7 +83,7 @@ class GithubAPI extends ExternalAPI { } = {}): Promise { try { const data = await this.get( - '/repos/sct/overseerr/releases', + '/repos/Fallenbagel/jellyseerr/releases', { params: { per_page: take, @@ -110,7 +110,7 @@ class GithubAPI extends ExternalAPI { } = {}): Promise { try { const data = await this.get( - '/repos/sct/overseerr/commits', + '/repos/Fallenbagel/jellyseerr/commits', { params: { per_page: take, @@ -122,7 +122,7 @@ class GithubAPI extends ExternalAPI { return data; } catch (e) { 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 } ); return []; diff --git a/server/api/jellyfin.ts b/server/api/jellyfin.ts index 796788328..3bca32435 100644 --- a/server/api/jellyfin.ts +++ b/server/api/jellyfin.ts @@ -81,9 +81,9 @@ class JellyfinAPI { let authHeaderVal = ''; if (this.authToken) { - authHeaderVal = `MediaBrowser Client="Overseerr", Device="Axios", DeviceId="${deviceId}", Version="10.8.0", Token="${authToken}"`; + authHeaderVal = `MediaBrowser Client="Jellyseerr", Device="Axios", DeviceId="${deviceId}", Version="10.8.0", Token="${authToken}"`; } else { - authHeaderVal = `MediaBrowser Client="Overseerr", Device="Axios", DeviceId="${deviceId}", Version="10.8.0"`; + authHeaderVal = `MediaBrowser Client="Jellyseerr", Device="Axios", DeviceId="${deviceId}", Version="10.8.0"`; } this.axios = axios.create({ diff --git a/server/api/plexapi.ts b/server/api/plexapi.ts index cee4a9cd1..3e8dedfc1 100644 --- a/server/api/plexapi.ts +++ b/server/api/plexapi.ts @@ -122,9 +122,9 @@ class PlexAPI { // }, options: { identifier: settings.clientId, - product: 'Overseerr', - deviceName: 'Overseerr', - platform: 'Overseerr', + product: 'Jellyseerr', + deviceName: 'Jellyseerr', + platform: 'Jellyseerr', }, }); } diff --git a/server/index.ts b/server/index.ts index f85b02752..c5c0dd6ca 100644 --- a/server/index.ts +++ b/server/index.ts @@ -31,7 +31,7 @@ import { getAppVersion } from './utils/appVersion'; const API_SPEC_PATH = path.join(__dirname, '../overseerr-api.yml'); -logger.info(`Starting Overseerr version ${getAppVersion()}`); +logger.info(`Starting Jellyseerr version ${getAppVersion()}`); const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev }); const handle = app.getRequestHandler(); diff --git a/server/lib/notifications/agents/slack.ts b/server/lib/notifications/agents/slack.ts index d6f2289f9..825460d5e 100644 --- a/server/lib/notifications/agents/slack.ts +++ b/server/lib/notifications/agents/slack.ts @@ -43,7 +43,8 @@ interface SlackBlockEmbed { class SlackAgent extends BaseAgent - implements NotificationAgent { + implements NotificationAgent +{ protected getSettings(): NotificationAgentSlack { if (this.settings) { return this.settings; @@ -202,7 +203,7 @@ class SlackAgent action_id: 'button-action', type: 'button', url: actionUrl, - value: 'open_overseerr', + value: 'open_jellyseerr', text: { type: 'plain_text', text: `Open in ${settings.main.applicationTitle}`, diff --git a/server/lib/settings.ts b/server/lib/settings.ts index cfef7729a..114625127 100644 --- a/server/lib/settings.ts +++ b/server/lib/settings.ts @@ -254,7 +254,7 @@ class Settings { vapidPublic: '', main: { apiKey: '', - applicationTitle: 'Overseerr', + applicationTitle: 'Jellyseerr', applicationUrl: '', csrfProtection: false, cacheImages: false, @@ -303,7 +303,7 @@ class Settings { ignoreTls: false, requireTls: false, allowSelfSigned: false, - senderName: 'Overseerr', + senderName: 'Jellyseerr', }, }, discord: { diff --git a/server/logger.ts b/server/logger.ts index 824de630b..de053bef3 100644 --- a/server/logger.ts +++ b/server/logger.ts @@ -1,10 +1,10 @@ +import fs from 'fs'; +import path from 'path'; import * as winston from 'winston'; import 'winston-daily-rotate-file'; -import path from 'path'; -import fs from 'fs'; // Migrate away from old log -const OLD_LOG_FILE = path.join(__dirname, '../config/logs/overseerr.log'); +const OLD_LOG_FILE = path.join(__dirname, '../config/logs/Jellyseerr.log'); if (fs.existsSync(OLD_LOG_FILE)) { const file = fs.lstatSync(OLD_LOG_FILE); @@ -43,14 +43,14 @@ const logger = winston.createLogger({ }), new winston.transports.DailyRotateFile({ filename: process.env.CONFIG_DIRECTORY - ? `${process.env.CONFIG_DIRECTORY}/logs/overseerr-%DATE%.log` - : path.join(__dirname, '../config/logs/overseerr-%DATE%.log'), + ? `${process.env.CONFIG_DIRECTORY}/logs/Jellyseerr-%DATE%.log` + : path.join(__dirname, '../config/logs/Jellyseerr-%DATE%.log'), datePattern: 'YYYY-MM-DD', zippedArchive: true, maxSize: '20m', maxFiles: '7d', createSymlink: true, - symlinkName: 'overseerr.log', + symlinkName: 'Jellyseerr.log', }), ], }); diff --git a/server/routes/auth.ts b/server/routes/auth.ts index 75e25d4ed..b2a788d77 100644 --- a/server/routes/auth.ts +++ b/server/routes/auth.ts @@ -102,7 +102,7 @@ authRoutes.post('/plex', async (req, res, next) => { if (!user) { if (!settings.main.newPlexLogin) { logger.info( - 'Failed sign-in attempt from user who has not been imported to Overseerr.', + 'Failed sign-in attempt from user who has not been imported to Jellyseerr.', { label: 'Auth', account: { @@ -214,7 +214,7 @@ authRoutes.post('/jellyfin', async (req, res, next) => { if (user) { deviceId = user.jellyfinDeviceId ?? ''; } else { - deviceId = Buffer.from(`BOT_overseerr_${body.username ?? ''}`).toString( + deviceId = Buffer.from(`BOT_jellyseerr_${body.username ?? ''}`).toString( 'base64' ); } diff --git a/server/routes/index.ts b/server/routes/index.ts index e99ab3da0..a12d08c72 100644 --- a/server/routes/index.ts +++ b/server/routes/index.ts @@ -162,7 +162,7 @@ router.get('/genres/tv', isAuthenticated(), async (req, res) => { router.get('/', (_req, res) => { return res.status(200).json({ - api: 'Overseerr API', + api: 'Jellyseerr API', version: '1.0', }); }); diff --git a/server/routes/settings/index.ts b/server/routes/settings/index.ts index 9a8d753f2..1007ee7ab 100644 --- a/server/routes/settings/index.ts +++ b/server/routes/settings/index.ts @@ -325,8 +325,8 @@ settingsRoutes.get( } const logFile = process.env.CONFIG_DIRECTORY - ? `${process.env.CONFIG_DIRECTORY}/logs/overseerr.log` - : path.join(__dirname, '../../../config/logs/overseerr.log'); + ? `${process.env.CONFIG_DIRECTORY}/logs/jellyseerr.log` + : path.join(__dirname, '../../../config/logs/jellyseerr.log'); const logs: LogMessage[] = []; try { diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index ecb8712ad..2a1caee49 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,15 +1,15 @@ -name: overseerr -adopt-info: overseerr +name: jellyseerr +adopt-info: jellyseerr license: MIT summary: Request management and media discovery tool for the Plex ecosystem. description: > - Overseerr is a free and open source software application for managing requests for your media library. + Jellyseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services such as Sonarr, Radarr and Plex! base: core18 confinement: strict parts: - overseerr: + jellyseerr: plugin: nodejs nodejs-version: '14.17.0' nodejs-package-manager: 'yarn' @@ -88,7 +88,7 @@ apps: - network-bind environment: PATH: '$SNAP/usr/sbin:$SNAP/usr/bin:$SNAP/sbin:$SNAP/bin:$PATH' - OVERSEERR_SNAP: 'True' + JELLYSEERR_SNAP: 'True' CONFIG_DIRECTORY: $SNAP_USER_COMMON LOG_LEVEL: 'debug' NODE_ENV: 'production' diff --git a/src/components/CollectionDetails/index.tsx b/src/components/CollectionDetails/index.tsx index 180bd2ed5..56b368d90 100644 --- a/src/components/CollectionDetails/index.tsx +++ b/src/components/CollectionDetails/index.tsx @@ -60,9 +60,8 @@ const CollectionDetails: React.FC = ({ } ); - const { data: genres } = useSWR<{ id: number; name: string }[]>( - `/api/v1/genres/movie` - ); + const { data: genres } = + useSWR<{ id: number; name: string }[]>(`/api/v1/genres/movie`); if (!data && !error) { return ; diff --git a/src/components/Discover/index.tsx b/src/components/Discover/index.tsx index 0d7b1da73..3ebd6226c 100644 --- a/src/components/Discover/index.tsx +++ b/src/components/Discover/index.tsx @@ -35,13 +35,11 @@ const Discover: React.FC = () => { { revalidateOnMount: true } ); - const { - data: requests, - error: requestError, - } = useSWR( - '/api/v1/request?filter=all&take=10&sort=modified&skip=0', - { revalidateOnMount: true } - ); + const { data: requests, error: requestError } = + useSWR( + '/api/v1/request?filter=all&take=10&sort=modified&skip=0', + { revalidateOnMount: true } + ); return ( <> diff --git a/src/components/Layout/LanguagePicker/index.tsx b/src/components/Layout/LanguagePicker/index.tsx index 70b17c5b2..16b3599ea 100644 --- a/src/components/Layout/LanguagePicker/index.tsx +++ b/src/components/Layout/LanguagePicker/index.tsx @@ -65,9 +65,11 @@ const LanguagePicker: React.FC = () => { } defaultValue={locale} > - {(Object.keys( - availableLanguages - ) as (keyof typeof availableLanguages)[]).map((key) => ( + {( + Object.keys( + availableLanguages + ) as (keyof typeof availableLanguages)[] + ).map((key) => ( diff --git a/src/components/Layout/VersionStatus/index.tsx b/src/components/Layout/VersionStatus/index.tsx index 39ca6807f..ca8150a7b 100644 --- a/src/components/Layout/VersionStatus/index.tsx +++ b/src/components/Layout/VersionStatus/index.tsx @@ -11,8 +11,8 @@ import useSWR from 'swr'; import { StatusResponse } from '../../../../server/interfaces/api/settingsInterfaces'; const messages = defineMessages({ - streamdevelop: 'Overseerr Develop', - streamstable: 'Overseerr Stable', + streamdevelop: 'Jellyseerr Develop', + streamstable: 'Jellyseerr Stable', outofdate: 'Out of Date', commitsbehind: '{commitsBehind} {commitsBehind, plural, one {commit} other {commits}} behind', diff --git a/src/components/MovieDetails/index.tsx b/src/components/MovieDetails/index.tsx index 1b37cff04..4c857eb5e 100644 --- a/src/components/MovieDetails/index.tsx +++ b/src/components/MovieDetails/index.tsx @@ -106,9 +106,10 @@ const MovieDetails: React.FC = ({ movie }) => { `/api/v1/movie/${router.query.movieId}/ratings` ); - const sortedCrew = useMemo(() => sortCrewPriority(data?.credits.crew ?? []), [ - data, - ]); + const sortedCrew = useMemo( + () => sortCrewPriority(data?.credits.crew ?? []), + [data] + ); if (!data && !error) { return ; diff --git a/src/components/PWAHeader/index.tsx b/src/components/PWAHeader/index.tsx index d8a9eba13..f508b1b1c 100644 --- a/src/components/PWAHeader/index.tsx +++ b/src/components/PWAHeader/index.tsx @@ -164,10 +164,13 @@ const PWAHeader: React.FC = ({ applicationTitle }) => { href="/site.webmanifest" crossOrigin="use-credentials" /> - + { ); const [showBio, setShowBio] = useState(false); - const { - data: combinedCredits, - error: errorCombinedCredits, - } = useSWR( - `/api/v1/person/${router.query.personId}/combined_credits` - ); + const { data: combinedCredits, error: errorCombinedCredits } = + useSWR( + `/api/v1/person/${router.query.personId}/combined_credits` + ); const sortedCast = useMemo(() => { const grouped = groupBy(combinedCredits?.cast ?? [], 'id'); diff --git a/src/components/RequestList/RequestItem/index.tsx b/src/components/RequestList/RequestItem/index.tsx index 59cdea66d..372725588 100644 --- a/src/components/RequestList/RequestItem/index.tsx +++ b/src/components/RequestList/RequestItem/index.tsx @@ -1,30 +1,30 @@ +import axios from 'axios'; +import Link from 'next/link'; import React, { useContext, useState } from 'react'; import { useInView } from 'react-intersection-observer'; -import type { MediaRequest } from '../../../../server/entity/MediaRequest'; import { - useIntl, + defineMessages, FormattedDate, FormattedRelativeTime, - defineMessages, + useIntl, } from 'react-intl'; -import { useUser, Permission } from '../../../hooks/useUser'; -import { LanguageContext } from '../../../context/LanguageContext'; -import type { MovieDetails } from '../../../../server/models/Movie'; -import type { TvDetails } from '../../../../server/models/Tv'; +import { useToasts } from 'react-toast-notifications'; import useSWR from 'swr'; -import Badge from '../../Common/Badge'; -import StatusBadge from '../../StatusBadge'; -import Table from '../../Common/Table'; import { MediaRequestStatus, MediaStatus, } from '../../../../server/constants/media'; -import Button from '../../Common/Button'; -import axios from 'axios'; +import type { MediaRequest } from '../../../../server/entity/MediaRequest'; +import type { MovieDetails } from '../../../../server/models/Movie'; +import type { TvDetails } from '../../../../server/models/Tv'; +import { LanguageContext } from '../../../context/LanguageContext'; +import { Permission, useUser } from '../../../hooks/useUser'; import globalMessages from '../../../i18n/globalMessages'; -import Link from 'next/link'; -import { useToasts } from 'react-toast-notifications'; +import Badge from '../../Common/Badge'; +import Button from '../../Common/Button'; +import Table from '../../Common/Table'; import RequestModal from '../../RequestModal'; +import StatusBadge from '../../StatusBadge'; const messages = defineMessages({ seasons: 'Seasons', @@ -60,12 +60,13 @@ const RequestItem: React.FC = ({ const { data: title, error } = useSWR( inView ? `${url}?language=${locale}` : null ); - const { data: requestData, revalidate, mutate } = useSWR( - `/api/v1/request/${request.id}`, - { - initialData: request, - } - ); + const { + data: requestData, + revalidate, + mutate, + } = useSWR(`/api/v1/request/${request.id}`, { + initialData: request, + }); const [isRetrying, setRetrying] = useState(false); diff --git a/src/components/RequestModal/AdvancedRequester/index.tsx b/src/components/RequestModal/AdvancedRequester/index.tsx index 8d140538e..f532917d4 100644 --- a/src/components/RequestModal/AdvancedRequester/index.tsx +++ b/src/components/RequestModal/AdvancedRequester/index.tsx @@ -97,21 +97,19 @@ const AdvancedRequester: React.FC = ({ defaultOverrides?.tags ?? [] ); - const { - data: serverData, - isValidating, - } = useSWR( - selectedServer !== null - ? `/api/v1/service/${ - type === 'movie' ? 'radarr' : 'sonarr' - }/${selectedServer}` - : null, - { - refreshInterval: 0, - refreshWhenHidden: false, - revalidateOnFocus: false, - } - ); + const { data: serverData, isValidating } = + useSWR( + selectedServer !== null + ? `/api/v1/service/${ + type === 'movie' ? 'radarr' : 'sonarr' + }/${selectedServer}` + : null, + { + refreshInterval: 0, + refreshWhenHidden: false, + revalidateOnFocus: false, + } + ); const [selectedUser, setSelectedUser] = useState( requestUser ?? null diff --git a/src/components/RequestModal/MovieRequestModal.tsx b/src/components/RequestModal/MovieRequestModal.tsx index 61fb7c676..ccfa4f1f9 100644 --- a/src/components/RequestModal/MovieRequestModal.tsx +++ b/src/components/RequestModal/MovieRequestModal.tsx @@ -51,10 +51,8 @@ const MovieRequestModal: React.FC = ({ is4k = false, }) => { const [isUpdating, setIsUpdating] = useState(false); - const [ - requestOverrides, - setRequestOverrides, - ] = useState(null); + const [requestOverrides, setRequestOverrides] = + useState(null); const { addToast } = useToasts(); const { data, error } = useSWR(`/api/v1/movie/${tmdbId}`, { revalidateOnMount: true, diff --git a/src/components/RequestModal/TvRequestModal.tsx b/src/components/RequestModal/TvRequestModal.tsx index 7acb6f4db..1d6a9e640 100644 --- a/src/components/RequestModal/TvRequestModal.tsx +++ b/src/components/RequestModal/TvRequestModal.tsx @@ -74,10 +74,8 @@ const TvRequestModal: React.FC = ({ (season) => season.seasonNumber ); const { data, error } = useSWR(`/api/v1/tv/${tmdbId}`); - const [ - requestOverrides, - setRequestOverrides, - ] = useState(null); + const [requestOverrides, setRequestOverrides] = + useState(null); const [selectedSeasons, setSelectedSeasons] = useState( editRequest ? editingSeasons : [] ); diff --git a/src/components/Settings/Notifications/NotificationsPushover/index.tsx b/src/components/Settings/Notifications/NotificationsPushover/index.tsx index eaedfb96d..63d60f5d9 100644 --- a/src/components/Settings/Notifications/NotificationsPushover/index.tsx +++ b/src/components/Settings/Notifications/NotificationsPushover/index.tsx @@ -15,7 +15,7 @@ const messages = defineMessages({ agentenabled: 'Enable Agent', accessToken: 'Application API Token', accessTokenTip: - 'Register an application for use with Overseerr', + 'Register an application for use with Jellyseerr', userToken: 'User or Group Key', userTokenTip: 'Your 30-character user or group identifier', @@ -177,20 +177,19 @@ const NotificationsPushover: React.FC = () => { * {intl.formatMessage(messages.accessTokenTip, { - ApplicationRegistrationLink: function ApplicationRegistrationLink( - msg - ) { - return ( - - {msg} - - ); - }, + ApplicationRegistrationLink: + function ApplicationRegistrationLink(msg) { + return ( + + {msg} + + ); + }, })} diff --git a/src/components/Settings/Notifications/NotificationsTelegram.tsx b/src/components/Settings/Notifications/NotificationsTelegram.tsx index bcb03df89..4534f98f6 100644 --- a/src/components/Settings/Notifications/NotificationsTelegram.tsx +++ b/src/components/Settings/Notifications/NotificationsTelegram.tsx @@ -19,7 +19,7 @@ const messages = defineMessages({ 'Allow users to also start a chat with your bot and configure their own notifications', botAPI: 'Bot Authorization Token', botApiTip: - 'Create a bot for use with Overseerr', + 'Create a bot for use with Jellyseerr', chatId: 'Chat ID', chatIdTip: 'Start a chat with your bot, add @get_id_bot, and issue the /my_id command', diff --git a/src/components/Settings/Notifications/NotificationsWebPush/index.tsx b/src/components/Settings/Notifications/NotificationsWebPush/index.tsx index 56aef39f7..999de8e25 100644 --- a/src/components/Settings/Notifications/NotificationsWebPush/index.tsx +++ b/src/components/Settings/Notifications/NotificationsWebPush/index.tsx @@ -18,7 +18,7 @@ const messages = defineMessages({ toastWebPushTestSuccess: 'Web push test notification sent!', toastWebPushTestFailed: 'Web push test notification failed to send.', httpsRequirement: - 'In order to receive web push notifications, Overseerr must be served over HTTPS.', + 'In order to receive web push notifications, Jellyseerr must be served over HTTPS.', }); const NotificationsWebPush: React.FC = () => { diff --git a/src/components/Settings/SettingsAbout/Releases/index.tsx b/src/components/Settings/SettingsAbout/Releases/index.tsx index f3ef21fe6..9594e57f2 100644 --- a/src/components/Settings/SettingsAbout/Releases/index.tsx +++ b/src/components/Settings/SettingsAbout/Releases/index.tsx @@ -20,11 +20,11 @@ const messages = defineMessages({ currentversion: 'Current Version', viewchangelog: 'View Changelog', runningDevelopMessage: - 'The latest changes to the develop branch of Overseerr are not shown below. Please see the commit history for this branch on GitHub for details.', + 'The latest changes to the develop branch of Jellyseerr are not shown below. Please see the commit history for this branch on GitHub for details.', }); const REPO_RELEASE_API = - 'https://api.github.com/repos/sct/overseerr/releases?per_page=20'; + 'https://api.github.com/repos/Fallenbagel/jellyseerr/releases?per_page=20'; interface GitHubRelease { url: string; @@ -153,7 +153,7 @@ const Releases: React.FC = ({ currentVersion }) => { GithubLink: function GithubLink(msg) { return ( {

{ - https://docs.overseerr.dev + https://github.com/Fallenbagel/jellyseerr#readme - https://github.com/sct/overseerr/discussions + https://github.com/Fallenbagel/jellyseerr/discussions - https://discord.gg/overseerr + https://discord.gg/XDyAd3AuUV @@ -151,27 +151,17 @@ const SettingsAbout: React.FC = () => { title={`${intl.formatMessage(messages.helppaycoffee)} ☕️`} > - https://github.com/sponsors/sct + https://www.buymeacoffee.com/fallen.bagel {intl.formatMessage(messages.preferredmethod)} - - - https://patreon.com/overseerr - -

diff --git a/src/components/Settings/SettingsJellyfin.tsx b/src/components/Settings/SettingsJellyfin.tsx index dfa61cad6..c917ecec3 100644 --- a/src/components/Settings/SettingsJellyfin.tsx +++ b/src/components/Settings/SettingsJellyfin.tsx @@ -1,28 +1,28 @@ -import React, { useState } from 'react'; -import LoadingSpinner from '../Common/LoadingSpinner'; -import type { JellyfinSettings } from '../../../server/lib/settings'; -import useSWR from 'swr'; -import Button from '../Common/Button'; import axios from 'axios'; -import LibraryItem from './LibraryItem'; -import Badge from '../Common/Badge'; +import React, { useState } from 'react'; import { defineMessages, FormattedMessage, useIntl } from 'react-intl'; +import useSWR from 'swr'; +import type { JellyfinSettings } from '../../../server/lib/settings'; +import Badge from '../Common/Badge'; +import Button from '../Common/Button'; +import LoadingSpinner from '../Common/LoadingSpinner'; +import LibraryItem from './LibraryItem'; const messages = defineMessages({ jellyfinsettings: 'Jellyfin Settings', jellyfinsettingsDescription: - 'Configure the settings for your Jellyfin server. Overseerr scans your Jellyfin libraries to see what content is available.', + 'Configure the settings for your Jellyfin server. Jellyseerr scans your Jellyfin libraries to see what content is available.', timeout: 'Timeout', save: 'Save Changes', saving: 'Saving…', jellyfinlibraries: 'Jellyfin Libraries', jellyfinlibrariesDescription: - 'The libraries Overseerr scans for titles. Click the button below if no libraries are listed.', + 'The libraries Jellyseerr scans for titles. Click the button below if no libraries are listed.', syncing: 'Syncing', syncJellyfin: 'Sync Libraries', manualscanJellyfin: 'Manual Library Scan', manualscanDescriptionJellyfin: - "Normally, this will only be run once every 24 hours. Overseerr will check your Jellyfin server's recently added more aggressively. If this is your first time configuring Jellyfin, a one-time full manual library scan is recommended!", + "Normally, this will only be run once every 24 hours. Jellyseerr will check your Jellyfin server's recently added more aggressively. If this is your first time configuring Jellyfin, a one-time full manual library scan is recommended!", notrunning: 'Not Running', currentlibrary: 'Current Library: {name}', librariesRemaining: 'Libraries Remaining: {count}', diff --git a/src/components/Settings/SettingsJobsCache/index.tsx b/src/components/Settings/SettingsJobsCache/index.tsx index a621228b2..835011253 100644 --- a/src/components/Settings/SettingsJobsCache/index.tsx +++ b/src/components/Settings/SettingsJobsCache/index.tsx @@ -23,7 +23,7 @@ const messages: { [messageName: string]: MessageDescriptor } = defineMessages({ jobsandcache: 'Jobs & Cache', jobs: 'Jobs', 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.', + '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.', jobname: 'Job Name', jobtype: 'Type', nextexecution: 'Next Execution', @@ -35,7 +35,7 @@ const messages: { [messageName: string]: MessageDescriptor } = defineMessages({ command: 'Command', cache: 'Cache', cacheDescription: - 'Overseerr caches requests to external API endpoints to optimize performance and avoid making unnecessary API calls.', + 'Jellyseerr caches requests to external API endpoints to optimize performance and avoid making unnecessary API calls.', cacheflushed: '{cachename} cache flushed.', cachename: 'Cache Name', cachehits: 'Hits', diff --git a/src/components/Settings/SettingsLogs/index.tsx b/src/components/Settings/SettingsLogs/index.tsx index 572246fde..5bc7dce81 100644 --- a/src/components/Settings/SettingsLogs/index.tsx +++ b/src/components/Settings/SettingsLogs/index.tsx @@ -31,7 +31,7 @@ import Transition from '../../Transition'; const messages = defineMessages({ logs: 'Logs', logsDescription: - 'You can also view these logs directly via stdout, or in {configDir}/logs/overseerr.log.', + 'You can also view these logs directly via stdout, or in {configDir}/logs/jellyseerr.log.', time: 'Timestamp', level: 'Severity', label: 'Label', diff --git a/src/components/Settings/SettingsMain.tsx b/src/components/Settings/SettingsMain.tsx index bf2bb35ca..6d4eb0665 100644 --- a/src/components/Settings/SettingsMain.tsx +++ b/src/components/Settings/SettingsMain.tsx @@ -29,7 +29,7 @@ const messages = defineMessages({ general: 'General', generalsettings: 'General Settings', generalsettingsDescription: - 'Configure global and default settings for Overseerr.', + 'Configure global and default settings for Jellyseerr.', apikey: 'API Key', applicationTitle: 'Application Title', applicationurl: 'Application URL', @@ -44,7 +44,7 @@ const messages = defineMessages({ hideAvailable: 'Hide Available Media', csrfProtection: 'Enable CSRF Protection', csrfProtectionTip: - 'Set external API access to read-only (requires HTTPS, and Overseerr must be reloaded for changes to take effect)', + 'Set external API access to read-only (requires HTTPS, and Jellyseerr must be reloaded for changes to take effect)', csrfProtectionHoverTip: 'Do NOT enable this setting unless you understand what you are doing!', cacheImages: 'Enable Image Caching', @@ -52,7 +52,7 @@ const messages = defineMessages({ 'Optimize and store all images locally (consumes a significant amount of disk space)', trustProxy: 'Enable Proxy Support', trustProxyTip: - 'Allow Overseerr to correctly register client IP addresses behind a proxy (Overseerr must be reloaded for changes to take effect)', + 'Allow Jellyseerr to correctly register client IP addresses behind a proxy (Jellyseerr must be reloaded for changes to take effect)', validationApplicationTitle: 'You must provide an application title', validationApplicationUrl: 'You must provide a valid URL', validationApplicationUrlTrailingSlash: 'URL must not end in a trailing slash', @@ -306,9 +306,11 @@ const SettingsMain: React.FC = () => {
- {(Object.keys( - availableLanguages - ) as (keyof typeof availableLanguages)[]).map((key) => ( + {( + Object.keys( + availableLanguages + ) as (keyof typeof availableLanguages)[] + ).map((key) => ( - {(Object.keys( - availableLanguages - ) as (keyof typeof availableLanguages)[]).map((key) => ( + {( + Object.keys( + availableLanguages + ) as (keyof typeof availableLanguages)[] + ).map((key) => (