New: Deprecate Readarr

This commit is contained in:
bakerboy448 2025-10-30 23:34:07 -05:00
parent e4fb36e08f
commit 20b82146ac
10 changed files with 94 additions and 7 deletions

View file

@ -1,14 +1,18 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import Label from 'Components/Label';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import MenuContent from 'Components/Menu/MenuContent'; import MenuContent from 'Components/Menu/MenuContent';
import { sizes } from 'Helpers/Props'; import { kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
import AddApplicationPresetMenuItem from './AddApplicationPresetMenuItem'; import AddApplicationPresetMenuItem from './AddApplicationPresetMenuItem';
import styles from './AddApplicationItem.css'; import styles from './AddApplicationItem.css';
const DEPRECATED_APPLICATIONS = ['Readarr'];
const OBSOLETE_APPLICATIONS = [];
class AddApplicationItem extends Component { class AddApplicationItem extends Component {
// //
@ -36,6 +40,8 @@ class AddApplicationItem extends Component {
} = this.props; } = this.props;
const hasPresets = !!presets && !!presets.length; const hasPresets = !!presets && !!presets.length;
const isDeprecated = DEPRECATED_APPLICATIONS.includes(implementation);
const isObsolete = OBSOLETE_APPLICATIONS.includes(implementation);
return ( return (
<div <div
@ -49,6 +55,24 @@ class AddApplicationItem extends Component {
<div className={styles.overlay}> <div className={styles.overlay}>
<div className={styles.name}> <div className={styles.name}>
{implementationName} {implementationName}
{
isDeprecated &&
<Label
kind={kinds.WARNING}
title={translate('DeprecatedApplicationMessage', { applicationName: implementationName })}
>
{translate('Deprecated')}
</Label>
}
{
isObsolete &&
<Label
kind={kinds.DANGER}
title={translate('ObsoleteApplicationMessage', { applicationName: implementationName })}
>
{translate('Obsolete')}
</Label>
}
</div> </div>
<div className={styles.actions}> <div className={styles.actions}>

View file

@ -10,6 +10,9 @@ import translate from 'Utilities/String/translate';
import EditApplicationModalConnector from './EditApplicationModalConnector'; import EditApplicationModalConnector from './EditApplicationModalConnector';
import styles from './Application.css'; import styles from './Application.css';
const DEPRECATED_APPLICATIONS = ['Readarr'];
const OBSOLETE_APPLICATIONS = [];
class Application extends Component { class Application extends Component {
// //
@ -61,10 +64,13 @@ class Application extends Component {
syncLevel, syncLevel,
fields, fields,
tags, tags,
tagList tagList,
implementation
} = this.props; } = this.props;
const applicationUrl = fields.find((field) => field.name === 'baseUrl')?.value; const applicationUrl = fields.find((field) => field.name === 'baseUrl')?.value;
const isDeprecated = DEPRECATED_APPLICATIONS.includes(implementation);
const isObsolete = OBSOLETE_APPLICATIONS.includes(implementation);
return ( return (
<Card <Card
@ -88,6 +94,26 @@ class Application extends Component {
} }
</div> </div>
{
isDeprecated &&
<Label
kind={kinds.WARNING}
title={translate('DeprecatedApplicationMessage', { applicationName: implementation })}
>
{translate('Deprecated')}
</Label>
}
{
isObsolete &&
<Label
kind={kinds.DANGER}
title={translate('ObsoleteApplicationMessage', { applicationName: implementation })}
>
{translate('Obsolete')}
</Label>
}
{ {
syncLevel === 'addOnly' && syncLevel === 'addOnly' &&
<Label kind={kinds.WARNING}> <Label kind={kinds.WARNING}>
@ -141,6 +167,7 @@ class Application extends Component {
Application.propTypes = { Application.propTypes = {
id: PropTypes.number.isRequired, id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired, name: PropTypes.string.isRequired,
implementation: PropTypes.string.isRequired,
enable: PropTypes.bool.isRequired, enable: PropTypes.bool.isRequired,
syncLevel: PropTypes.string.isRequired, syncLevel: PropTypes.string.isRequired,
fields: PropTypes.arrayOf(PropTypes.object).isRequired, fields: PropTypes.arrayOf(PropTypes.object).isRequired,

View file

@ -39,6 +39,9 @@ const syncLevelOptions = [
} }
]; ];
const DEPRECATED_APPLICATIONS = ['Readarr'];
const OBSOLETE_APPLICATIONS = [];
function EditApplicationModalContent(props) { function EditApplicationModalContent(props) {
const { const {
advancedSettings, advancedSettings,
@ -60,6 +63,7 @@ function EditApplicationModalContent(props) {
const { const {
id, id,
implementation,
implementationName, implementationName,
name, name,
syncLevel, syncLevel,
@ -68,6 +72,9 @@ function EditApplicationModalContent(props) {
message message
} = item; } = item;
const isDeprecated = DEPRECATED_APPLICATIONS.includes(implementation);
const isObsolete = OBSOLETE_APPLICATIONS.includes(implementation);
return ( return (
<ModalContent onModalClose={onModalClose}> <ModalContent onModalClose={onModalClose}>
<ModalHeader> <ModalHeader>
@ -90,6 +97,28 @@ function EditApplicationModalContent(props) {
{ {
!isFetching && !error && !isFetching && !error &&
<Form {...otherProps}> <Form {...otherProps}>
{
isDeprecated &&
<Alert
className={styles.message}
kind={kinds.WARNING}
>
<div>{translate('DeprecatedApplicationTitle', { applicationName: implementationName })}</div>
<div>{translate('DeprecatedApplicationMessage', { applicationName: implementationName })}</div>
</Alert>
}
{
isObsolete &&
<Alert
className={styles.message}
kind={kinds.DANGER}
>
<div>{translate('ObsoleteApplicationTitle', { applicationName: implementationName })}</div>
<div>{translate('ObsoleteApplicationMessage', { applicationName: implementationName })}</div>
</Alert>
}
{ {
!!message && !!message &&
<Alert <Alert

View file

@ -159,7 +159,7 @@ private LidarrIndexer ExecuteIndexerRequest(HttpRequest request)
case HttpStatusCode.BadRequest: case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase)) if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{ {
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App"); _logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break; break;
} }

View file

@ -172,7 +172,7 @@ private RadarrIndexer ExecuteIndexerRequest(HttpRequest request)
case HttpStatusCode.BadRequest: case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase)) if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{ {
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App"); _logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break; break;
} }

View file

@ -14,6 +14,7 @@
namespace NzbDrone.Core.Applications.Readarr namespace NzbDrone.Core.Applications.Readarr
{ {
[Obsolete("Readarr is deprecated and will be removed in a future version")]
public class Readarr : ApplicationBase<ReadarrSettings> public class Readarr : ApplicationBase<ReadarrSettings>
{ {
public override string Name => "Readarr"; public override string Name => "Readarr";

View file

@ -146,7 +146,7 @@ private ReadarrIndexer ExecuteIndexerRequest(HttpRequest request)
case HttpStatusCode.BadRequest: case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase)) if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{ {
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App"); _logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break; break;
} }

View file

@ -159,7 +159,7 @@ private SonarrIndexer ExecuteIndexerRequest(HttpRequest request)
case HttpStatusCode.BadRequest: case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase)) if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{ {
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App"); _logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break; break;
} }

View file

@ -144,7 +144,7 @@ private WhisparrIndexer ExecuteIndexerRequest(HttpRequest request)
case HttpStatusCode.BadRequest: case HttpStatusCode.BadRequest:
if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase)) if (ex.Response.Content.Contains("Query successful, but no results in the configured categories were returned from your indexer.", StringComparison.InvariantCultureIgnoreCase))
{ {
_logger.Warn(ex, "No Results in configured categories. See FAQ Entry: Prowlarr will not sync X Indexer to App"); _logger.Warn(ex, "No Results in configured categories. See FAQ Entry: https://wiki.servarr.com/prowlarr/faq#prowlarr-will-not-sync-x-indexer-to-app");
break; break;
} }

View file

@ -538,6 +538,12 @@
"NotificationsTelegramSettingsIncludeAppName": "Include {appName} in Title", "NotificationsTelegramSettingsIncludeAppName": "Include {appName} in Title",
"NotificationsTelegramSettingsIncludeAppNameHelpText": "Optionally prefix message title with {appName} to differentiate notifications from different applications", "NotificationsTelegramSettingsIncludeAppNameHelpText": "Optionally prefix message title with {appName} to differentiate notifications from different applications",
"OAuthPopupMessage": "Pop-ups are being blocked by your browser", "OAuthPopupMessage": "Pop-ups are being blocked by your browser",
"Obsolete": "Obsolete",
"ObsoleteApplicationMessage": "{applicationName} is obsolete and has been removed",
"ObsoleteApplicationTitle": "{applicationName} is Obsolete",
"Deprecated": "Deprecated",
"DeprecatedApplicationMessage": "{applicationName} is deprecated and will be removed in a future version",
"DeprecatedApplicationTitle": "{applicationName} is Deprecated",
"Ok": "Ok", "Ok": "Ok",
"OnApplicationUpdate": "On Application Update", "OnApplicationUpdate": "On Application Update",
"OnApplicationUpdateHelpText": "On Application Update", "OnApplicationUpdateHelpText": "On Application Update",