diff --git a/server/entity/MediaRequest.ts b/server/entity/MediaRequest.ts index 167d1db06..be28e35d0 100644 --- a/server/entity/MediaRequest.ts +++ b/server/entity/MediaRequest.ts @@ -142,7 +142,9 @@ export class MediaRequest { if (this.type === MediaType.MOVIE) { const movie = await tmdb.getMovie({ movieId: media.tmdbId }); notificationManager.sendNotification(Notification.MEDIA_PENDING, { - subject: movie.title, + subject: `${movie.title}${ + movie.release_date ? ` (${movie.release_date.slice(0, 4)})` : '' + }`, message: movie.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`, media, @@ -153,7 +155,9 @@ export class MediaRequest { if (this.type === MediaType.TV) { const tv = await tmdb.getTvShow({ tvId: media.tmdbId }); notificationManager.sendNotification(Notification.MEDIA_PENDING, { - subject: tv.name, + subject: `${tv.name}${ + tv.first_air_date ? ` (${tv.first_air_date.slice(0, 4)})` : '' + }`, message: tv.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${tv.poster_path}`, media, @@ -210,7 +214,9 @@ export class MediaRequest { : Notification.MEDIA_APPROVED : Notification.MEDIA_DECLINED, { - subject: movie.title, + subject: `${movie.title}${ + movie.release_date ? ` (${movie.release_date.slice(0, 4)})` : '' + }`, message: movie.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`, notifyUser: autoApproved ? undefined : this.requestedBy, @@ -227,7 +233,9 @@ export class MediaRequest { : Notification.MEDIA_APPROVED : Notification.MEDIA_DECLINED, { - subject: tv.name, + subject: `${tv.name}${ + tv.first_air_date ? ` (${tv.first_air_date.slice(0, 4)})` : '' + }`, message: tv.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${tv.poster_path}`, notifyUser: autoApproved ? undefined : this.requestedBy, @@ -492,7 +500,9 @@ export class MediaRequest { ); notificationManager.sendNotification(Notification.MEDIA_FAILED, { - subject: movie.title, + subject: `${movie.title}${ + movie.release_date ? ` (${movie.release_date.slice(0, 4)})` : '' + }`, message: movie.overview, media, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${movie.poster_path}`, @@ -700,7 +710,11 @@ export class MediaRequest { ); notificationManager.sendNotification(Notification.MEDIA_FAILED, { - subject: series.name, + subject: `${series.name}${ + series.first_air_date + ? ` (${series.first_air_date.slice(0, 4)})` + : '' + }`, message: series.overview, image: `https://image.tmdb.org/t/p/w600_and_h900_bestv2${series.poster_path}`, media, diff --git a/server/lib/notifications/index.ts b/server/lib/notifications/index.ts index f1f237f5e..70af56ba2 100644 --- a/server/lib/notifications/index.ts +++ b/server/lib/notifications/index.ts @@ -1,5 +1,4 @@ import logger from '../../logger'; -import { getSettings } from '../settings'; import type { NotificationAgent, NotificationPayload } from './agents/agent'; export enum Notification { @@ -45,13 +44,13 @@ class NotificationManager { type: Notification, payload: NotificationPayload ): void { - const settings = getSettings().notifications; logger.info(`Sending notification(s) for ${Notification[type]}`, { label: 'Notifications', subject: payload.subject, }); + this.activeAgents.forEach((agent) => { - if (settings.enabled && agent.shouldSend(type)) { + if (agent.shouldSend(type)) { agent.send(type, payload); } }); diff --git a/server/lib/settings.ts b/server/lib/settings.ts index bb82c7ef9..290d40406 100644 --- a/server/lib/settings.ts +++ b/server/lib/settings.ts @@ -179,7 +179,6 @@ interface NotificationAgents { } interface NotificationSettings { - enabled: boolean; agents: NotificationAgents; } @@ -234,7 +233,6 @@ class Settings { initialized: false, }, notifications: { - enabled: true, agents: { email: { enabled: false, diff --git a/server/routes/user/index.ts b/server/routes/user/index.ts index 0c9046918..6546d666f 100644 --- a/server/routes/user/index.ts +++ b/server/routes/user/index.ts @@ -84,7 +84,10 @@ router.post( const passedExplicitPassword = body.password && body.password.length > 0; const avatar = gravatarUrl(body.email, { default: 'mm', size: 200 }); - if (!passedExplicitPassword && !settings.notifications.agents.email) { + if ( + !passedExplicitPassword && + !settings.notifications.agents.email.enabled + ) { throw new Error('Email notifications must be enabled'); } diff --git a/src/components/Settings/Notifications/NotificationsDiscord.tsx b/src/components/Settings/Notifications/NotificationsDiscord.tsx index ecaff4b05..b70baf286 100644 --- a/src/components/Settings/Notifications/NotificationsDiscord.tsx +++ b/src/components/Settings/Notifications/NotificationsDiscord.tsx @@ -18,7 +18,7 @@ const messages = defineMessages({ webhookUrlPlaceholder: 'Server Settings → Integrations → Webhooks', discordsettingssaved: 'Discord notification settings saved successfully!', discordsettingsfailed: 'Discord notification settings failed to save.', - testsent: 'Discord test notification sent!', + discordtestsent: 'Discord test notification sent!', validationUrl: 'You must provide a valid URL', }); @@ -96,7 +96,7 @@ const NotificationsDiscord: React.FC = () => { }, }); - addToast(intl.formatMessage(messages.testsent), { + addToast(intl.formatMessage(messages.discordtestsent), { appearance: 'info', autoDismiss: true, }); diff --git a/src/components/Settings/Notifications/NotificationsEmail.tsx b/src/components/Settings/Notifications/NotificationsEmail.tsx index 1daca614f..ac45e3e6b 100644 --- a/src/components/Settings/Notifications/NotificationsEmail.tsx +++ b/src/components/Settings/Notifications/NotificationsEmail.tsx @@ -24,7 +24,7 @@ const messages = defineMessages({ authPass: 'SMTP Password', emailsettingssaved: 'Email notification settings saved successfully!', emailsettingsfailed: 'Email notification settings failed to save.', - testsent: 'Email test notification sent!', + emailtestsent: 'Email test notification sent!', allowselfsigned: 'Allow Self-Signed Certificates', ssldisabletip: 'SSL should be disabled on standard TLS connections (port 587)', @@ -188,7 +188,7 @@ const NotificationsEmail: React.FC = () => { }, }); - addToast(intl.formatMessage(messages.testsent), { + addToast(intl.formatMessage(messages.emailtestsent), { appearance: 'info', autoDismiss: true, }); diff --git a/src/components/Settings/Notifications/NotificationsTelegram.tsx b/src/components/Settings/Notifications/NotificationsTelegram.tsx index 72b8d4dda..6f8c230be 100644 --- a/src/components/Settings/Notifications/NotificationsTelegram.tsx +++ b/src/components/Settings/Notifications/NotificationsTelegram.tsx @@ -22,7 +22,7 @@ const messages = defineMessages({ validationChatIdRequired: 'You must provide a valid chat ID', telegramsettingssaved: 'Telegram notification settings saved successfully!', telegramsettingsfailed: 'Telegram notification settings failed to save.', - testsent: 'Telegram test notification sent!', + telegramtestsent: 'Telegram test notification sent!', settinguptelegramDescription: 'To configure Telegram notifications, you will need to create a bot and get the bot API key. Additionally, you will need the chat ID for the chat to which you would like to send notifications. You can find this by adding @get_id_bot to the chat and issuing the /my_id command.', sendSilently: 'Send Silently', @@ -113,7 +113,7 @@ const NotificationsTelegram: React.FC = () => { }, }); - addToast(intl.formatMessage(messages.testsent), { + addToast(intl.formatMessage(messages.telegramtestsent), { appearance: 'info', autoDismiss: true, }); diff --git a/src/i18n/locale/en.json b/src/i18n/locale/en.json index 7807ff629..bab294b3f 100644 --- a/src/i18n/locale/en.json +++ b/src/i18n/locale/en.json @@ -290,11 +290,13 @@ "components.Settings.Notifications.chatId": "Chat ID", "components.Settings.Notifications.discordsettingsfailed": "Discord notification settings failed to save.", "components.Settings.Notifications.discordsettingssaved": "Discord notification settings saved successfully!", + "components.Settings.Notifications.discordtestsent": "Discord test notification sent!", "components.Settings.Notifications.emailNotificationTypesAlertDescription": "Media Requested, Media Automatically Approved, and Media Failed email notifications are sent to all users with the Manage Requests permission.", "components.Settings.Notifications.emailNotificationTypesAlertDescriptionPt2": "Media Approved, Media Declined, and Media Available email notifications are sent to the user who submitted the request.", "components.Settings.Notifications.emailsender": "Sender Address", "components.Settings.Notifications.emailsettingsfailed": "Email notification settings failed to save.", "components.Settings.Notifications.emailsettingssaved": "Email notification settings saved successfully!", + "components.Settings.Notifications.emailtestsent": "Email test notification sent!", "components.Settings.Notifications.enableSsl": "Enable SSL", "components.Settings.Notifications.pgpPassword": "PGP Password", "components.Settings.Notifications.pgpPasswordTip": "Sign encrypted email messages using OpenPGP", @@ -309,7 +311,7 @@ "components.Settings.Notifications.ssldisabletip": "SSL should be disabled on standard TLS connections (port 587)", "components.Settings.Notifications.telegramsettingsfailed": "Telegram notification settings failed to save.", "components.Settings.Notifications.telegramsettingssaved": "Telegram notification settings saved successfully!", - "components.Settings.Notifications.testsent": "Telegram test notification sent!", + "components.Settings.Notifications.telegramtestsent": "Telegram test notification sent!", "components.Settings.Notifications.validationBotAPIRequired": "You must provide a bot authentication token", "components.Settings.Notifications.validationChatIdRequired": "You must provide a valid chat ID", "components.Settings.Notifications.validationEmail": "You must provide a valid email address",