diff --git a/docs/troubleshooting.mdx b/docs/troubleshooting.mdx index 78b7e073..d5adf84f 100644 --- a/docs/troubleshooting.mdx +++ b/docs/troubleshooting.mdx @@ -97,37 +97,7 @@ You can try them all and see which one works for your network. -### Option 2: Force IPV4 resolution first - -Sometimes there are configuration issues with IPV6 that prevent the hostname resolution from working correctly. - -You can try to force the resolution to use IPV4 first by going to `Settings > Networking > Advanced Networking` and enabling `Force IPv4 Resolution First` setting and restarting. You can also add the environment variable, `FORCE_IPV4_FIRST=true`: - - - - -Add the following to your `docker run` command: -```bash --e "FORCE_IPV4_FIRST=true" -``` - - - - - -Add the following to your `compose.yaml`: -```yaml ---- -services: - jellyseerr: - environment: - - FORCE_IPV4_FIRST=true -``` - - - - -### Option 3: Use Jellyseerr through a proxy +### Option 2: Use Jellyseerr through a proxy If you can't change your DNS servers or force IPV4 resolution, you can use Jellyseerr through a proxy. diff --git a/server/api/animelist.ts b/server/api/animelist.ts index 740f6725..7f859eae 100644 --- a/server/api/animelist.ts +++ b/server/api/animelist.ts @@ -164,9 +164,10 @@ class AnimeListMapping { const response = await axios.get(MAPPING_URL, { responseType: 'stream', }); - await new Promise((resolve) => { + await new Promise((resolve, reject) => { const writer = fs.createWriteStream(LOCAL_PATH); writer.on('finish', resolve); + writer.on('error', reject); response.data.pipe(writer); }); } catch (e) { diff --git a/server/api/jellyfin.ts b/server/api/jellyfin.ts index b09c8186..42d6e3b7 100644 --- a/server/api/jellyfin.ts +++ b/server/api/jellyfin.ts @@ -163,7 +163,7 @@ class JellyfinAPI extends ExternalAPI { } catch (e) { logger.debug('Failed to authenticate with headers', { label: 'Jellyfin API', - error: e.response?.status, + error: e.response?.statusText, ip: ClientIP, }); diff --git a/server/api/servarr/sonarr.ts b/server/api/servarr/sonarr.ts index 6f13867c..0e623cef 100644 --- a/server/api/servarr/sonarr.ts +++ b/server/api/servarr/sonarr.ts @@ -206,7 +206,7 @@ class SonarrAPI extends ServarrBase<{ }); logger.debug('Sonarr update details', { label: 'Sonarr', - movie: newSeriesResponse.data, + series: newSeriesResponse.data, }); if (options.searchNow) { @@ -254,7 +254,7 @@ class SonarrAPI extends ServarrBase<{ logger.info('Sonarr accepted request', { label: 'Sonarr' }); logger.debug('Sonarr add details', { label: 'Sonarr', - movie: createdSeriesResponse.data, + series: createdSeriesResponse.data, }); } else { logger.error('Failed to add movie to Sonarr', { diff --git a/server/lib/notifications/agents/telegram.ts b/server/lib/notifications/agents/telegram.ts index 10d4bce4..01d4de49 100644 --- a/server/lib/notifications/agents/telegram.ts +++ b/server/lib/notifications/agents/telegram.ts @@ -180,6 +180,7 @@ class TelegramAgent await axios.post(endpoint, { ...notificationPayload, chat_id: settings.options.chatId, + message_thread_id: settings.options.messageThreadId, disable_notification: !!settings.options.sendSilently, } as TelegramMessagePayload | TelegramPhotoPayload); } catch (e) { @@ -215,6 +216,8 @@ class TelegramAgent await axios.post(endpoint, { ...notificationPayload, chat_id: payload.notifyUser.settings.telegramChatId, + message_thread_id: + payload.notifyUser.settings.telegramMessageThreadId, disable_notification: !!payload.notifyUser.settings.telegramSendSilently, } as TelegramMessagePayload | TelegramPhotoPayload); @@ -262,6 +265,7 @@ class TelegramAgent await axios.post(endpoint, { ...notificationPayload, chat_id: user.settings.telegramChatId, + message_thread_id: user.settings.telegramMessageThreadId, disable_notification: !!user.settings?.telegramSendSilently, } as TelegramMessagePayload | TelegramPhotoPayload); } catch (e) { diff --git a/src/components/IssueDetails/index.tsx b/src/components/IssueDetails/index.tsx index deba3cfc..e9da91d2 100644 --- a/src/components/IssueDetails/index.tsx +++ b/src/components/IssueDetails/index.tsx @@ -11,7 +11,7 @@ import useDeepLinks from '@app/hooks/useDeepLinks'; import useSettings from '@app/hooks/useSettings'; import { Permission, useUser } from '@app/hooks/useUser'; import globalMessages from '@app/i18n/globalMessages'; -import Error from '@app/pages/_error'; +import ErrorPage from '@app/pages/_error'; import defineMessages from '@app/utils/defineMessages'; import { Transition } from '@headlessui/react'; import { @@ -113,7 +113,7 @@ const IssueDetails = () => { } if (!data || !issueData) { - return ; + return ; } const belongsToUser = issueData.createdBy.id === currentUser?.id; diff --git a/src/components/Settings/SettingsNetwork/index.tsx b/src/components/Settings/SettingsNetwork/index.tsx index 27dad900..57e6f525 100644 --- a/src/components/Settings/SettingsNetwork/index.tsx +++ b/src/components/Settings/SettingsNetwork/index.tsx @@ -39,7 +39,6 @@ const messages = defineMessages('components.Settings.SettingsNetwork', { "Use ',' as a separator, and '*.' as a wildcard for subdomains", proxyBypassLocalAddresses: 'Bypass Proxy for Local Addresses', validationProxyPort: 'You must provide a valid port', - advancedNetworkSettings: 'Advanced Network Settings', networkDisclaimer: 'Network parameters from your container/system should be used instead of these settings. See the {docs} for more information.', docs: 'documentation', @@ -370,23 +369,6 @@ const SettingsNetwork = () => { )} -

- {intl.formatMessage(messages.advancedNetworkSettings)} -

-

- {intl.formatMessage(messages.networkDisclaimer, { - docs: ( - - {intl.formatMessage(messages.docs)} - - ), - })} -

diff --git a/src/components/Setup/JellyfinSetup.tsx b/src/components/Setup/JellyfinSetup.tsx index c795a2ff..a8fbc22d 100644 --- a/src/components/Setup/JellyfinSetup.tsx +++ b/src/components/Setup/JellyfinSetup.tsx @@ -113,11 +113,6 @@ function JellyfinSetup({ validationSchema={LoginSchema} onSubmit={async (values) => { try { - // Check if serverType is either 'Jellyfin' or 'Emby' - // if (serverType !== 'Jellyfin' && serverType !== 'Emby') { - // throw new Error('Invalid serverType'); // You can customize the error message - // } - await axios.post('/api/v1/auth/jellyfin', { username: values.username, password: values.password, diff --git a/src/components/TitleCard/ErrorCard.tsx b/src/components/TitleCard/ErrorCard.tsx index 54ed1c87..6c386b8c 100644 --- a/src/components/TitleCard/ErrorCard.tsx +++ b/src/components/TitleCard/ErrorCard.tsx @@ -21,7 +21,7 @@ const messages = defineMessages('components.TitleCard', { cleardata: 'Clear Data', }); -const Error = ({ id, tmdbId, tvdbId, type, canExpand }: ErrorCardProps) => { +const ErrorCard = ({ id, tmdbId, tvdbId, type, canExpand }: ErrorCardProps) => { const intl = useIntl(); const deleteMedia = async () => { @@ -129,4 +129,4 @@ const Error = ({ id, tmdbId, tvdbId, type, canExpand }: ErrorCardProps) => {
); }; -export default Error; +export default ErrorCard; diff --git a/src/components/TvDetails/index.tsx b/src/components/TvDetails/index.tsx index cf85aef1..2b49f1ae 100644 --- a/src/components/TvDetails/index.tsx +++ b/src/components/TvDetails/index.tsx @@ -382,9 +382,7 @@ const TvDetails = ({ tv }: TvDetailsProps) => { setIsUpdating(true); try { - await axios.delete('/api/v1/watchlist/' + tv?.id, { - method: 'DELETE', - }); + await axios.delete('/api/v1/watchlist/' + tv?.id); addToast( diff --git a/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx b/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx index 44e422e9..b187a22a 100644 --- a/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx +++ b/src/components/UserProfile/UserSettings/UserGeneralSettings/index.tsx @@ -11,7 +11,7 @@ import useLocale from '@app/hooks/useLocale'; import useSettings from '@app/hooks/useSettings'; import { Permission, UserType, useUser } from '@app/hooks/useUser'; import globalMessages from '@app/i18n/globalMessages'; -import Error from '@app/pages/_error'; +import ErrorPage from '@app/pages/_error'; import defineMessages from '@app/utils/defineMessages'; import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline'; import { ApiErrorCode } from '@server/constants/error'; @@ -129,7 +129,7 @@ const UserGeneralSettings = () => { } if (!data) { - return ; + return ; } return ( diff --git a/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/LinkJellyfinModal.tsx b/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/LinkJellyfinModal.tsx index cf229e16..f4c570ae 100644 --- a/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/LinkJellyfinModal.tsx +++ b/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/LinkJellyfinModal.tsx @@ -84,14 +84,8 @@ const LinkJellyfinModal: React.FC = ({ await axios.post( `/api/v1/user/${user?.id}/settings/linked-accounts/jellyfin`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - username, - password, - }), + username, + password, } ); onSave(); diff --git a/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/index.tsx b/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/index.tsx index f16e1868..ae7e6342 100644 --- a/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/index.tsx +++ b/src/components/UserProfile/UserSettings/UserLinkedAccountsSettings/index.tsx @@ -141,8 +141,7 @@ const UserLinkedAccountsSettings = () => { const deleteRequest = async (account: string) => { try { await axios.delete( - `/api/v1/user/${user?.id}/settings/linked-accounts/${account}`, - { method: 'DELETE' } + `/api/v1/user/${user?.id}/settings/linked-accounts/${account}` ); } catch { setError(intl.formatMessage(messages.deleteFailed)); diff --git a/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx b/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx index b37e3888..869b2188 100644 --- a/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx +++ b/src/components/UserProfile/UserSettings/UserPasswordChange/index.tsx @@ -5,7 +5,7 @@ import PageTitle from '@app/components/Common/PageTitle'; import SensitiveInput from '@app/components/Common/SensitiveInput'; import { Permission, useUser } from '@app/hooks/useUser'; import globalMessages from '@app/i18n/globalMessages'; -import Error from '@app/pages/_error'; +import ErrorPage from '@app/pages/_error'; import defineMessages from '@app/utils/defineMessages'; import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline'; import axios from 'axios'; @@ -80,7 +80,7 @@ const UserPasswordChange = () => { } if (!data) { - return ; + return ; } if ( diff --git a/src/components/UserProfile/UserSettings/UserPermissions/index.tsx b/src/components/UserProfile/UserSettings/UserPermissions/index.tsx index 0503445e..3398ae7e 100644 --- a/src/components/UserProfile/UserSettings/UserPermissions/index.tsx +++ b/src/components/UserProfile/UserSettings/UserPermissions/index.tsx @@ -5,7 +5,7 @@ import PageTitle from '@app/components/Common/PageTitle'; import PermissionEdit from '@app/components/PermissionEdit'; import { useUser } from '@app/hooks/useUser'; import globalMessages from '@app/i18n/globalMessages'; -import Error from '@app/pages/_error'; +import ErrorPage from '@app/pages/_error'; import defineMessages from '@app/utils/defineMessages'; import { ArrowDownOnSquareIcon } from '@heroicons/react/24/outline'; import axios from 'axios'; @@ -46,7 +46,7 @@ const UserPermissions = () => { } if (!data) { - return ; + return ; } if (currentUser?.id !== 1 && currentUser?.id === user?.id) {