From ade40b72bc02d47845a719f2ae85edb2d41b6eaf Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 21 Oct 2023 21:57:59 -0500 Subject: [PATCH] New: Option to control whether new seasons get monitored automatically (cherry picked from commit b95a84f6612333d96fcdca083f9c39d96956f3f4) Closes #5083 --- ...iesMonitorNewItemsOptionsPopoverContent.js | 22 ++++++++ .../src/Components/Form/FormInputGroup.js | 4 ++ .../Form/MonitorNewItemsSelectInput.js | 50 +++++++++++++++++++ frontend/src/Helpers/Props/inputTypes.js | 2 + .../Series/Edit/EditSeriesModalContent.css | 4 ++ .../Edit/EditSeriesModalContent.css.d.ts | 1 + .../src/Series/Edit/EditSeriesModalContent.js | 31 +++++++++++- .../Edit/EditSeriesModalContentConnector.js | 1 + .../Select/Edit/EditSeriesModalContent.tsx | 24 +++++++++ .../ImportLists/EditImportListModalContent.js | 27 ++++++++++ frontend/src/Utilities/Series/getNewSeries.js | 2 + .../Series/monitorNewItemsOptions.js | 18 +++++++ .../TvTests/RefreshSeriesServiceFixture.cs | 10 ++-- .../Migration/200_monitor_new_items.cs | 15 ++++++ .../ImportLists/ImportListDefinition.cs | 1 + .../ImportLists/ImportListSyncService.cs | 1 + src/NzbDrone.Core/Localization/Core/en.json | 5 ++ src/NzbDrone.Core/Tv/MonitoringOptions.cs | 6 +++ src/NzbDrone.Core/Tv/RefreshEpisodeService.cs | 6 +-- src/NzbDrone.Core/Tv/Series.cs | 2 + .../ImportLists/ImportListResource.cs | 3 ++ .../Series/SeriesEditorController.cs | 5 ++ .../Series/SeriesEditorResource.cs | 1 + src/Sonarr.Api.V3/Series/SeriesResource.cs | 3 ++ 24 files changed, 236 insertions(+), 8 deletions(-) create mode 100644 frontend/src/AddSeries/SeriesMonitorNewItemsOptionsPopoverContent.js create mode 100644 frontend/src/Components/Form/MonitorNewItemsSelectInput.js create mode 100644 frontend/src/Utilities/Series/monitorNewItemsOptions.js create mode 100644 src/NzbDrone.Core/Datastore/Migration/200_monitor_new_items.cs diff --git a/frontend/src/AddSeries/SeriesMonitorNewItemsOptionsPopoverContent.js b/frontend/src/AddSeries/SeriesMonitorNewItemsOptionsPopoverContent.js new file mode 100644 index 000000000..164b75e5c --- /dev/null +++ b/frontend/src/AddSeries/SeriesMonitorNewItemsOptionsPopoverContent.js @@ -0,0 +1,22 @@ +import React from 'react'; +import DescriptionList from 'Components/DescriptionList/DescriptionList'; +import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem'; +import translate from 'Utilities/String/translate'; + +function SeriesMonitorNewItemsOptionsPopoverContent() { + return ( + + + + + + ); +} + +export default SeriesMonitorNewItemsOptionsPopoverContent; diff --git a/frontend/src/Components/Form/FormInputGroup.js b/frontend/src/Components/Form/FormInputGroup.js index 6f3155f5b..49f08c90b 100644 --- a/frontend/src/Components/Form/FormInputGroup.js +++ b/frontend/src/Components/Form/FormInputGroup.js @@ -14,6 +14,7 @@ import FormInputHelpText from './FormInputHelpText'; import IndexerSelectInputConnector from './IndexerSelectInputConnector'; import KeyValueListInput from './KeyValueListInput'; import MonitorEpisodesSelectInput from './MonitorEpisodesSelectInput'; +import MonitorNewItemsSelectInput from './MonitorNewItemsSelectInput'; import NumberInput from './NumberInput'; import OAuthInputConnector from './OAuthInputConnector'; import PasswordInput from './PasswordInput'; @@ -49,6 +50,9 @@ function getComponent(type) { case inputTypes.MONITOR_EPISODES_SELECT: return MonitorEpisodesSelectInput; + case inputTypes.MONITOR_NEW_ITEMS_SELECT: + return MonitorNewItemsSelectInput; + case inputTypes.NUMBER: return NumberInput; diff --git a/frontend/src/Components/Form/MonitorNewItemsSelectInput.js b/frontend/src/Components/Form/MonitorNewItemsSelectInput.js new file mode 100644 index 000000000..c704e5c1f --- /dev/null +++ b/frontend/src/Components/Form/MonitorNewItemsSelectInput.js @@ -0,0 +1,50 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import monitorNewItemsOptions from 'Utilities/Series/monitorNewItemsOptions'; +import SelectInput from './SelectInput'; + +function MonitorNewItemsSelectInput(props) { + const { + includeNoChange, + includeMixed, + ...otherProps + } = props; + + const values = [...monitorNewItemsOptions]; + + if (includeNoChange) { + values.unshift({ + key: 'noChange', + value: 'No Change', + disabled: true + }); + } + + if (includeMixed) { + values.unshift({ + key: 'mixed', + value: '(Mixed)', + disabled: true + }); + } + + return ( + + ); +} + +MonitorNewItemsSelectInput.propTypes = { + includeNoChange: PropTypes.bool.isRequired, + includeMixed: PropTypes.bool.isRequired, + onChange: PropTypes.func.isRequired +}; + +MonitorNewItemsSelectInput.defaultProps = { + includeNoChange: false, + includeMixed: false +}; + +export default MonitorNewItemsSelectInput; diff --git a/frontend/src/Helpers/Props/inputTypes.js b/frontend/src/Helpers/Props/inputTypes.js index 575dc698a..126b45954 100644 --- a/frontend/src/Helpers/Props/inputTypes.js +++ b/frontend/src/Helpers/Props/inputTypes.js @@ -4,6 +4,7 @@ export const CHECK = 'check'; export const DEVICE = 'device'; export const KEY_VALUE_LIST = 'keyValueList'; export const MONITOR_EPISODES_SELECT = 'monitorEpisodesSelect'; +export const MONITOR_NEW_ITEMS_SELECT = 'monitorNewItemsSelect'; export const FLOAT = 'float'; export const NUMBER = 'number'; export const OAUTH = 'oauth'; @@ -31,6 +32,7 @@ export const all = [ DEVICE, KEY_VALUE_LIST, MONITOR_EPISODES_SELECT, + MONITOR_NEW_ITEMS_SELECT, FLOAT, NUMBER, OAUTH, diff --git a/frontend/src/Series/Edit/EditSeriesModalContent.css b/frontend/src/Series/Edit/EditSeriesModalContent.css index a2b6014df..fd7ddf093 100644 --- a/frontend/src/Series/Edit/EditSeriesModalContent.css +++ b/frontend/src/Series/Edit/EditSeriesModalContent.css @@ -3,3 +3,7 @@ margin-right: auto; } + +.labelIcon { + margin-left: 8px; +} diff --git a/frontend/src/Series/Edit/EditSeriesModalContent.css.d.ts b/frontend/src/Series/Edit/EditSeriesModalContent.css.d.ts index c5f0ef8a7..238343ae5 100644 --- a/frontend/src/Series/Edit/EditSeriesModalContent.css.d.ts +++ b/frontend/src/Series/Edit/EditSeriesModalContent.css.d.ts @@ -2,6 +2,7 @@ // Please do not change this file! interface CssExports { 'deleteButton': string; + 'labelIcon': string; } export const cssExports: CssExports; export default cssExports; diff --git a/frontend/src/Series/Edit/EditSeriesModalContent.js b/frontend/src/Series/Edit/EditSeriesModalContent.js index 2bc6ba202..6824b0f21 100644 --- a/frontend/src/Series/Edit/EditSeriesModalContent.js +++ b/frontend/src/Series/Edit/EditSeriesModalContent.js @@ -1,16 +1,19 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; +import SeriesMonitorNewItemsOptionsPopoverContent from 'AddSeries/SeriesMonitorNewItemsOptionsPopoverContent'; import Form from 'Components/Form/Form'; import FormGroup from 'Components/Form/FormGroup'; import FormInputGroup from 'Components/Form/FormInputGroup'; import FormLabel from 'Components/Form/FormLabel'; +import Icon from 'Components/Icon'; import Button from 'Components/Link/Button'; import SpinnerButton from 'Components/Link/SpinnerButton'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; -import { inputTypes, kinds } from 'Helpers/Props'; +import Popover from 'Components/Tooltip/Popover'; +import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props'; import MoveSeriesModal from 'Series/MoveSeries/MoveSeriesModal'; import translate from 'Utilities/String/translate'; import styles from './EditSeriesModalContent.css'; @@ -73,6 +76,7 @@ class EditSeriesModalContent extends Component { const { monitored, + monitorNewItems, seasonFolder, qualityProfileId, seriesType, @@ -100,6 +104,31 @@ class EditSeriesModalContent extends Component { /> + + + {translate('MonitorNewSeasons')} + + } + title={translate('MonitorNewSeasons')} + body={} + position={tooltipPositions.RIGHT} + /> + + + + + {translate('UseSeasonFolder')} diff --git a/frontend/src/Series/Edit/EditSeriesModalContentConnector.js b/frontend/src/Series/Edit/EditSeriesModalContentConnector.js index 0521f92df..b4a53685a 100644 --- a/frontend/src/Series/Edit/EditSeriesModalContentConnector.js +++ b/frontend/src/Series/Edit/EditSeriesModalContentConnector.js @@ -38,6 +38,7 @@ function createMapStateToProps() { const seriesSettings = _.pick(series, [ 'monitored', + 'monitorNewItems', 'seasonFolder', 'qualityProfileId', 'seriesType', diff --git a/frontend/src/Series/Index/Select/Edit/EditSeriesModalContent.tsx b/frontend/src/Series/Index/Select/Edit/EditSeriesModalContent.tsx index 522d3906d..27b54f95b 100644 --- a/frontend/src/Series/Index/Select/Edit/EditSeriesModalContent.tsx +++ b/frontend/src/Series/Index/Select/Edit/EditSeriesModalContent.tsx @@ -14,6 +14,7 @@ import styles from './EditSeriesModalContent.css'; interface SavePayload { monitored?: boolean; + monitorNewItems?: string; qualityProfileId?: number; seriesType?: string; seasonFolder?: boolean; @@ -77,6 +78,7 @@ function EditSeriesModalContent(props: EditSeriesModalContentProps) { const { seriesIds, onSavePress, onModalClose } = props; const [monitored, setMonitored] = useState(NO_CHANGE); + const [monitorNewItems, setMonitorNewItems] = useState(NO_CHANGE); const [qualityProfileId, setQualityProfileId] = useState( NO_CHANGE ); @@ -95,6 +97,11 @@ function EditSeriesModalContent(props: EditSeriesModalContentProps) { payload.monitored = monitored === 'monitored'; } + if (monitorNewItems !== NO_CHANGE) { + hasChanges = true; + payload.monitorNewItems = monitorNewItems; + } + if (qualityProfileId !== NO_CHANGE) { hasChanges = true; payload.qualityProfileId = qualityProfileId as number; @@ -124,6 +131,7 @@ function EditSeriesModalContent(props: EditSeriesModalContentProps) { }, [ monitored, + monitorNewItems, qualityProfileId, seriesType, seasonFolder, @@ -139,6 +147,9 @@ function EditSeriesModalContent(props: EditSeriesModalContentProps) { case 'monitored': setMonitored(value); break; + case 'monitorNewItems': + setMonitorNewItems(value); + break; case 'qualityProfileId': setQualityProfileId(value); break; @@ -199,6 +210,19 @@ function EditSeriesModalContent(props: EditSeriesModalContentProps) { /> + + {translate('MonitorNewItems')} + + + + {translate('QualityProfile')} diff --git a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js index b1bccdd84..1dc9c8def 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js +++ b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js @@ -1,6 +1,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import SeriesMonitoringOptionsPopoverContent from 'AddSeries/SeriesMonitoringOptionsPopoverContent'; +import SeriesMonitorNewItemsOptionsPopoverContent from 'AddSeries/SeriesMonitorNewItemsOptionsPopoverContent'; import SeriesTypePopoverContent from 'AddSeries/SeriesTypePopoverContent'; import Alert from 'Components/Alert'; import Form from 'Components/Form/Form'; @@ -50,6 +51,7 @@ function EditImportListModalContent(props) { minRefreshInterval, shouldMonitor, rootFolderPath, + monitorNewItems, qualityProfileId, seriesType, seasonFolder, @@ -151,6 +153,31 @@ function EditImportListModalContent(props) { /> + + + {translate('MonitorNewSeasons')} + + } + title={translate('MonitorNewSeasons')} + body={} + position={tooltipPositions.RIGHT} + /> + + + + + {translate('RootFolder')} diff --git a/frontend/src/Utilities/Series/getNewSeries.js b/frontend/src/Utilities/Series/getNewSeries.js index 6e4de0c74..0acbe93d7 100644 --- a/frontend/src/Utilities/Series/getNewSeries.js +++ b/frontend/src/Utilities/Series/getNewSeries.js @@ -3,6 +3,7 @@ function getNewSeries(series, payload) { const { rootFolderPath, monitor, + monitorNewItems, qualityProfileId, seriesType, seasonFolder, @@ -19,6 +20,7 @@ function getNewSeries(series, payload) { series.addOptions = addOptions; series.monitored = true; + series.monitorNewItems = monitorNewItems; series.qualityProfileId = qualityProfileId; series.rootFolderPath = rootFolderPath; series.seriesType = seriesType; diff --git a/frontend/src/Utilities/Series/monitorNewItemsOptions.js b/frontend/src/Utilities/Series/monitorNewItemsOptions.js new file mode 100644 index 000000000..184d60397 --- /dev/null +++ b/frontend/src/Utilities/Series/monitorNewItemsOptions.js @@ -0,0 +1,18 @@ +import translate from 'Utilities/String/translate'; + +const monitorNewItemsOptions = [ + { + key: 'all', + get value() { + return translate('MonitorAllSeasons'); + } + }, + { + key: 'none', + get value() { + return translate('MonitorNone'); + } + } +]; + +export default monitorNewItemsOptions; diff --git a/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs b/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs index 7a154d5fa..429eef2d2 100644 --- a/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs +++ b/src/NzbDrone.Core.Test/TvTests/RefreshSeriesServiceFixture.cs @@ -58,9 +58,10 @@ namespace NzbDrone.Core.Test.TvTests } [Test] - public void should_monitor_new_seasons_automatically_if_series_is_monitored() + public void should_monitor_new_seasons_automatically_if_monitor_new_items_is_all() { - _series.Monitored = true; + _series.MonitorNewItems = NewItemMonitorTypes.All; + var newSeriesInfo = _series.JsonClone(); newSeriesInfo.Seasons.Add(Builder.CreateNew() .With(s => s.SeasonNumber = 2) @@ -75,9 +76,10 @@ namespace NzbDrone.Core.Test.TvTests } [Test] - public void should_not_monitor_new_seasons_automatically_if_series_is_not_monitored() + public void should_not_monitor_new_seasons_automatically_if_monitor_new_items_is_none() { - _series.Monitored = false; + _series.MonitorNewItems = NewItemMonitorTypes.None; + var newSeriesInfo = _series.JsonClone(); newSeriesInfo.Seasons.Add(Builder.CreateNew() .With(s => s.SeasonNumber = 2) diff --git a/src/NzbDrone.Core/Datastore/Migration/200_monitor_new_items.cs b/src/NzbDrone.Core/Datastore/Migration/200_monitor_new_items.cs new file mode 100644 index 000000000..d2961c06c --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/200_monitor_new_items.cs @@ -0,0 +1,15 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration +{ + [Migration(200)] + public class AddNewItemMonitorType : NzbDroneMigrationBase + { + protected override void MainDbUpgrade() + { + Alter.Table("Series").AddColumn("MonitorNewItems").AsInt32().WithDefaultValue(0); + Alter.Table("ImportLists").AddColumn("MonitorNewItems").AsInt32().WithDefaultValue(0); + } + } +} diff --git a/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs b/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs index 68600dec0..31b99c23c 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListDefinition.cs @@ -9,6 +9,7 @@ namespace NzbDrone.Core.ImportLists public bool EnableAutomaticAdd { get; set; } public bool SearchForMissingEpisodes { get; set; } public MonitorTypes ShouldMonitor { get; set; } + public NewItemMonitorTypes MonitorNewItems { get; set; } public int QualityProfileId { get; set; } public SeriesTypes SeriesType { get; set; } public bool SeasonFolder { get; set; } diff --git a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs index ef735e75f..12109a94a 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs @@ -173,6 +173,7 @@ namespace NzbDrone.Core.ImportLists Title = item.Title, Year = item.Year, Monitored = monitored, + MonitorNewItems = importList.MonitorNewItems, RootFolderPath = importList.RootFolderPath, QualityProfileId = importList.QualityProfileId, SeriesType = importList.SeriesType, diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index de3b64ce2..5623983fd 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -976,6 +976,8 @@ "Monitor": "Monitor", "MonitorAllEpisodes": "All Episodes", "MonitorAllEpisodesDescription": "Monitor all episodes except specials", + "MonitorAllSeasons": "All Seasons", + "MonitorAllSeasonsDescription": "Monitor all new seasons automatically", "MonitorExistingEpisodes": "Existing Episodes", "MonitorExistingEpisodesDescription": "Monitor episodes that have files or have not aired yet", "MonitorFirstSeason": "First Season", @@ -986,6 +988,9 @@ "MonitorLatestSeasonDescription": "Monitor all episodes of the latest season that aired within the last 90 days and all future seasons", "MonitorMissingEpisodes": "Missing Episodes", "MonitorMissingEpisodesDescription": "Monitor episodes that do not have files or have not aired yet", + "MonitorNewSeasons": "Monitor New Seasons", + "MonitorNewSeasonsHelpText": "Which new seasons should be monitored automatically", + "MonitorNoNewSeasonsDescription": "Do not monitor any new seasons automatically", "MonitorNone": "None", "MonitorNoneDescription": "No episodes will be monitored", "MonitorPilotEpisode": "Pilot Episode", diff --git a/src/NzbDrone.Core/Tv/MonitoringOptions.cs b/src/NzbDrone.Core/Tv/MonitoringOptions.cs index 878a9f8e1..0fb4baeed 100644 --- a/src/NzbDrone.Core/Tv/MonitoringOptions.cs +++ b/src/NzbDrone.Core/Tv/MonitoringOptions.cs @@ -23,4 +23,10 @@ namespace NzbDrone.Core.Tv UnmonitorSpecials, None } + + public enum NewItemMonitorTypes + { + All, + None + } } diff --git a/src/NzbDrone.Core/Tv/RefreshEpisodeService.cs b/src/NzbDrone.Core/Tv/RefreshEpisodeService.cs index e2a3d41f1..893e326e1 100644 --- a/src/NzbDrone.Core/Tv/RefreshEpisodeService.cs +++ b/src/NzbDrone.Core/Tv/RefreshEpisodeService.cs @@ -63,7 +63,7 @@ namespace NzbDrone.Core.Tv else { episodeToUpdate = new Episode(); - episodeToUpdate.Monitored = GetMonitoredStatus(episode, seasons); + episodeToUpdate.Monitored = GetMonitoredStatus(episode, seasons, series); newList.Add(episodeToUpdate); } @@ -135,9 +135,9 @@ namespace NzbDrone.Core.Tv } } - private bool GetMonitoredStatus(Episode episode, IEnumerable seasons) + private bool GetMonitoredStatus(Episode episode, IEnumerable seasons, Series series) { - if (episode.EpisodeNumber == 0 && episode.SeasonNumber != 1) + if ((episode.EpisodeNumber == 0 && episode.SeasonNumber != 1) || series.MonitorNewItems == NewItemMonitorTypes.None) { return false; } diff --git a/src/NzbDrone.Core/Tv/Series.cs b/src/NzbDrone.Core/Tv/Series.cs index 9f557af42..6296d8500 100644 --- a/src/NzbDrone.Core/Tv/Series.cs +++ b/src/NzbDrone.Core/Tv/Series.cs @@ -30,6 +30,7 @@ namespace NzbDrone.Core.Tv public string Overview { get; set; } public string AirTime { get; set; } public bool Monitored { get; set; } + public NewItemMonitorTypes MonitorNewItems { get; set; } public int QualityProfileId { get; set; } public bool SeasonFolder { get; set; } public DateTime? LastInfoSync { get; set; } @@ -71,6 +72,7 @@ namespace NzbDrone.Core.Tv SeasonFolder = otherSeries.SeasonFolder; Monitored = otherSeries.Monitored; + MonitorNewItems = otherSeries.MonitorNewItems; SeriesType = otherSeries.SeriesType; RootFolderPath = otherSeries.RootFolderPath; diff --git a/src/Sonarr.Api.V3/ImportLists/ImportListResource.cs b/src/Sonarr.Api.V3/ImportLists/ImportListResource.cs index c3fa06be7..4e4fcac11 100644 --- a/src/Sonarr.Api.V3/ImportLists/ImportListResource.cs +++ b/src/Sonarr.Api.V3/ImportLists/ImportListResource.cs @@ -9,6 +9,7 @@ namespace Sonarr.Api.V3.ImportLists public bool EnableAutomaticAdd { get; set; } public bool SearchForMissingEpisodes { get; set; } public MonitorTypes ShouldMonitor { get; set; } + public NewItemMonitorTypes MonitorNewItems { get; set; } public string RootFolderPath { get; set; } public int QualityProfileId { get; set; } public SeriesTypes SeriesType { get; set; } @@ -32,6 +33,7 @@ namespace Sonarr.Api.V3.ImportLists resource.EnableAutomaticAdd = definition.EnableAutomaticAdd; resource.SearchForMissingEpisodes = definition.SearchForMissingEpisodes; resource.ShouldMonitor = definition.ShouldMonitor; + resource.MonitorNewItems = definition.MonitorNewItems; resource.RootFolderPath = definition.RootFolderPath; resource.QualityProfileId = definition.QualityProfileId; resource.SeriesType = definition.SeriesType; @@ -55,6 +57,7 @@ namespace Sonarr.Api.V3.ImportLists definition.EnableAutomaticAdd = resource.EnableAutomaticAdd; definition.SearchForMissingEpisodes = resource.SearchForMissingEpisodes; definition.ShouldMonitor = resource.ShouldMonitor; + definition.MonitorNewItems = resource.MonitorNewItems; definition.RootFolderPath = resource.RootFolderPath; definition.QualityProfileId = resource.QualityProfileId; definition.SeriesType = resource.SeriesType; diff --git a/src/Sonarr.Api.V3/Series/SeriesEditorController.cs b/src/Sonarr.Api.V3/Series/SeriesEditorController.cs index 99927887b..cea1220e1 100644 --- a/src/Sonarr.Api.V3/Series/SeriesEditorController.cs +++ b/src/Sonarr.Api.V3/Series/SeriesEditorController.cs @@ -34,6 +34,11 @@ namespace Sonarr.Api.V3.Series series.Monitored = resource.Monitored.Value; } + if (resource.MonitorNewItems.HasValue) + { + series.MonitorNewItems = resource.MonitorNewItems.Value; + } + if (resource.QualityProfileId.HasValue) { series.QualityProfileId = resource.QualityProfileId.Value; diff --git a/src/Sonarr.Api.V3/Series/SeriesEditorResource.cs b/src/Sonarr.Api.V3/Series/SeriesEditorResource.cs index 368251a93..c1d8a53fb 100644 --- a/src/Sonarr.Api.V3/Series/SeriesEditorResource.cs +++ b/src/Sonarr.Api.V3/Series/SeriesEditorResource.cs @@ -7,6 +7,7 @@ namespace Sonarr.Api.V3.Series { public List SeriesIds { get; set; } public bool? Monitored { get; set; } + public NewItemMonitorTypes? MonitorNewItems { get; set; } public int? QualityProfileId { get; set; } public SeriesTypes? SeriesType { get; set; } public bool? SeasonFolder { get; set; } diff --git a/src/Sonarr.Api.V3/Series/SeriesResource.cs b/src/Sonarr.Api.V3/Series/SeriesResource.cs index 021518149..e1c87a434 100644 --- a/src/Sonarr.Api.V3/Series/SeriesResource.cs +++ b/src/Sonarr.Api.V3/Series/SeriesResource.cs @@ -44,6 +44,7 @@ namespace Sonarr.Api.V3.Series // Editing Only public bool SeasonFolder { get; set; } public bool Monitored { get; set; } + public NewItemMonitorTypes MonitorNewItems { get; set; } public bool UseSceneNumbering { get; set; } public int Runtime { get; set; } @@ -115,6 +116,7 @@ namespace Sonarr.Api.V3.Series SeasonFolder = model.SeasonFolder, Monitored = model.Monitored, + MonitorNewItems = model.MonitorNewItems, UseSceneNumbering = model.UseSceneNumbering, Runtime = model.Runtime, @@ -178,6 +180,7 @@ namespace Sonarr.Api.V3.Series SeasonFolder = resource.SeasonFolder, Monitored = resource.Monitored, + MonitorNewItems = resource.MonitorNewItems, UseSceneNumbering = resource.UseSceneNumbering, Runtime = resource.Runtime,