diff --git a/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx b/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx index 63d9edccb..886b36b63 100644 --- a/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx +++ b/frontend/src/Settings/Indexers/Indexers/Manage/Edit/ManageIndexersEditModalContent.tsx @@ -17,6 +17,7 @@ interface SavePayload { enableAutomaticSearch?: boolean; enableInteractiveSearch?: boolean; priority?: number; + seasonSearchMaximumSingleEpisodeAge?: number; } interface ManageIndexersEditModalContentProps { @@ -59,6 +60,10 @@ function ManageIndexersEditModalContent( const [enableInteractiveSearch, setEnableInteractiveSearch] = useState(NO_CHANGE); const [priority, setPriority] = useState(null); + const [ + seasonSearchMaximumSingleEpisodeAge, + setSeasonSearchMaximumSingleEpisodeAge, + ] = useState(null); const save = useCallback(() => { let hasChanges = false; @@ -84,6 +89,12 @@ function ManageIndexersEditModalContent( payload.priority = priority as number; } + if (seasonSearchMaximumSingleEpisodeAge !== null) { + hasChanges = true; + payload.seasonSearchMaximumSingleEpisodeAge = + seasonSearchMaximumSingleEpisodeAge as number; + } + if (hasChanges) { onSavePress(payload); } @@ -94,6 +105,7 @@ function ManageIndexersEditModalContent( enableAutomaticSearch, enableInteractiveSearch, priority, + seasonSearchMaximumSingleEpisodeAge, onSavePress, onModalClose, ]); @@ -112,6 +124,9 @@ function ManageIndexersEditModalContent( case 'priority': setPriority(value as number); break; + case 'seasonSearchMaximumSingleEpisodeAge': + setSeasonSearchMaximumSingleEpisodeAge(value as number); + break; default: console.warn(`EditIndexersModalContent Unknown Input: '${name}'`); } @@ -172,6 +187,20 @@ function ManageIndexersEditModalContent( onChange={onInputChange} /> + + + {translate('MaximumSingleEpisodeAge')} + + + diff --git a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx index 18e20a6e5..2b5fe317a 100644 --- a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx +++ b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalContent.tsx @@ -72,6 +72,12 @@ const COLUMNS = [ isSortable: true, isVisible: true, }, + { + name: 'seasonSearchMaximumSingleEpisodeAge', + label: () => translate('MaximumSingleEpisodeAge'), + isSortable: true, + isVisible: true, + }, { name: 'tags', label: () => translate('Tags'), diff --git a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css index 982495344..cf3792c16 100644 --- a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css +++ b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css @@ -4,8 +4,9 @@ .enableAutomaticSearch, .enableInteractiveSearch, .priority, +.seasonSearchMaximumSingleEpisodeAge, .implementation { composes: cell from '~Components/Table/Cells/TableRowCell.css'; word-break: break-all; -} \ No newline at end of file +} diff --git a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css.d.ts b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css.d.ts index 7991c19fd..c1083bacf 100644 --- a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css.d.ts +++ b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.css.d.ts @@ -7,6 +7,7 @@ interface CssExports { 'implementation': string; 'name': string; 'priority': string; + 'seasonSearchMaximumSingleEpisodeAge': string; 'tags': string; } export const cssExports: CssExports; diff --git a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.tsx b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.tsx index 8d909885d..6c551916d 100644 --- a/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.tsx +++ b/frontend/src/Settings/Indexers/Indexers/Manage/ManageIndexersModalRow.tsx @@ -17,6 +17,7 @@ interface ManageIndexersModalRowProps { enableAutomaticSearch: boolean; enableInteractiveSearch: boolean; priority: number; + seasonSearchMaximumSingleEpisodeAge: number; implementation: string; tags: number[]; columns: Column[]; @@ -33,6 +34,7 @@ function ManageIndexersModalRow(props: ManageIndexersModalRowProps) { enableAutomaticSearch, enableInteractiveSearch, priority, + seasonSearchMaximumSingleEpisodeAge, implementation, tags, onSelectedChange, @@ -90,6 +92,10 @@ function ManageIndexersModalRow(props: ManageIndexersModalRowProps) { {priority} + + {seasonSearchMaximumSingleEpisodeAge} + + diff --git a/src/Sonarr.Api.V3/Indexers/IndexerBulkResource.cs b/src/Sonarr.Api.V3/Indexers/IndexerBulkResource.cs index 7308e2ab7..89d74d6a3 100644 --- a/src/Sonarr.Api.V3/Indexers/IndexerBulkResource.cs +++ b/src/Sonarr.Api.V3/Indexers/IndexerBulkResource.cs @@ -9,6 +9,7 @@ namespace Sonarr.Api.V3.Indexers public bool? EnableAutomaticSearch { get; set; } public bool? EnableInteractiveSearch { get; set; } public int? Priority { get; set; } + public int? SeasonSearchMaximumSingleEpisodeAge { get; set; } } public class IndexerBulkResourceMapper : ProviderBulkResourceMapper @@ -26,6 +27,7 @@ namespace Sonarr.Api.V3.Indexers existing.EnableAutomaticSearch = resource.EnableAutomaticSearch ?? existing.EnableAutomaticSearch; existing.EnableInteractiveSearch = resource.EnableInteractiveSearch ?? existing.EnableInteractiveSearch; existing.Priority = resource.Priority ?? existing.Priority; + existing.SeasonSearchMaximumSingleEpisodeAge = resource.SeasonSearchMaximumSingleEpisodeAge ?? existing.SeasonSearchMaximumSingleEpisodeAge; }); return existingDefinitions; diff --git a/src/Sonarr.Api.V3/Indexers/IndexerController.cs b/src/Sonarr.Api.V3/Indexers/IndexerController.cs index 0ae09bed0..033a01460 100644 --- a/src/Sonarr.Api.V3/Indexers/IndexerController.cs +++ b/src/Sonarr.Api.V3/Indexers/IndexerController.cs @@ -18,6 +18,7 @@ namespace Sonarr.Api.V3.Indexers : base(signalRBroadcaster, indexerFactory, "indexer", ResourceMapper, BulkResourceMapper) { SharedValidator.RuleFor(c => c.Priority).InclusiveBetween(1, 50); + SharedValidator.RuleFor(c => c.SeasonSearchMaximumSingleEpisodeAge).GreaterThanOrEqualTo(0); SharedValidator.RuleFor(c => c.DownloadClientId).SetValidator(downloadClientExistsValidator); } }