diff --git a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js index d80427d48e..03756adec9 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js +++ b/frontend/src/Settings/ImportLists/ImportLists/EditImportListModalContent.js @@ -55,6 +55,7 @@ function EditImportListModalContent(props) { rootFolderPath, searchOnAdd, tags, + retroApplyTags, fields, message } = item; @@ -225,6 +226,18 @@ function EditImportListModalContent(props) { /> + + {translate('RadarrRetroactiveApply')} + + + + { fields.map((field) => { return ( diff --git a/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalContent.tsx b/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalContent.tsx index 37e962a260..a854c31c40 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalContent.tsx +++ b/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalContent.tsx @@ -82,6 +82,12 @@ const COLUMNS = [ isSortable: true, isVisible: true, }, + { + name: 'retroApplyTags', + label: () => translate('RetroApplyTags'), + isSortable: true, + isVisible: true, + }, ]; interface ManageImportListsModalContentProps { diff --git a/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalRow.tsx b/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalRow.tsx index 829ed94c49..92e6b2b013 100644 --- a/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalRow.tsx +++ b/frontend/src/Settings/ImportLists/ImportLists/Manage/ManageImportListsModalRow.tsx @@ -19,6 +19,7 @@ interface ManageImportListsModalRowProps { minimumAvailability: string; implementation: string; tags: number[]; + retroApplyTags: boolean; enabled: boolean; enableAuto: boolean; columns: Column[]; @@ -38,6 +39,7 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) { enabled, enableAuto, tags, + retroApplyTags, onSelectedChange, } = props; @@ -91,6 +93,10 @@ function ManageImportListsModalRow(props: ManageImportListsModalRowProps) { + + + {retroApplyTags ? translate('Yes') : translate('No')} + ); } diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 174d1cb8a2..1e722177f0 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -221,7 +221,7 @@ <_UsingDefaultRuntimeIdentifier>true - osx-x64 + osx-$(Architecture) diff --git a/src/NzbDrone.Core/Datastore/Migration/241_add_retroapply_to_importlists.cs b/src/NzbDrone.Core/Datastore/Migration/241_add_retroapply_to_importlists.cs new file mode 100644 index 0000000000..2b80ffd0ca --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Migration/241_add_retroapply_to_importlists.cs @@ -0,0 +1,13 @@ +using FluentMigrator; +using NzbDrone.Core.Datastore.Migration.Framework; + +namespace NzbDrone.Core.Datastore.Migration; + +[Migration(241)] +public class add_retroapply_to_importlists : NzbDroneMigrationBase +{ + protected override void MainDbUpgrade() + { + Alter.Table("ImportLists").AddColumn("RetroApplyTags").AsInt32().WithDefaultValue(0); + } +} diff --git a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs index 60c118a6a0..84c5da6b4c 100644 --- a/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs +++ b/src/NzbDrone.Core/ImportLists/ImportListSyncService.cs @@ -81,9 +81,10 @@ private void ProcessMovieReport(ImportListDefinition importList, ImportListMovie return; } - // Check to see if movie in DB + // Check to see if movie in DB and maybe apply retro-tags if (dbMovies.Contains(report.TmdbId)) { + RetroApplyTags(importList, report); _logger.Debug("{0} [{1}] Rejected, Movie Exists in DB", report.TmdbId, report.Title); return; } @@ -123,6 +124,26 @@ private void ProcessMovieReport(ImportListDefinition importList, ImportListMovie } } + private void RetroApplyTags(ImportListDefinition importList, ImportListMovie report) + { + if (importList.RetroApplyTags) + { + var movie = _movieService.FindByTmdbId(report.TmdbId); + + var preCount = movie.Tags.Count; + foreach (var tag in importList.Tags) + { + movie.Tags.Add(tag); + } + + if (preCount != movie.Tags.Count) + { + _movieService.UpdateMovie(movie); + _logger.Debug("{0} [{1}] Retro-Actively added tags to movie", report.TmdbId, report.Title); + } + } + } + private void ProcessListItems(ImportListFetchResult listFetchResult) { listFetchResult.Movies = listFetchResult.Movies.DistinctBy(x => diff --git a/src/NzbDrone.Core/Localization/Core/en.json b/src/NzbDrone.Core/Localization/Core/en.json index 884c7394ce..f21cd84a69 100644 --- a/src/NzbDrone.Core/Localization/Core/en.json +++ b/src/NzbDrone.Core/Localization/Core/en.json @@ -841,6 +841,7 @@ "ListSyncLevelHelpText": "Movies in library will be handled based on your selection if they fall off or do not appear on your list(s)", "ListSyncLevelHelpTextWarning": "Movie files will be permanently deleted, this can result in wiping your library if your lists are empty", "ListTagsHelpText": "Tags list items will be added with", + "RetroApplyListTagsHelpText": "Retro-Actively apply tags to movies already in Radarr", "ListWillRefreshEveryInterval": "List will refresh every {refreshInterval}", "Lists": "Lists", "Loading": "Loading", @@ -1366,6 +1367,7 @@ "Queued": "Queued", "QuickImport": "Move Automatically", "RadarrTags": "{appName} Tags", + "RadarrRetroactiveApply": "Retro-Apply Tags", "Rating": "Rating", "Ratings": "Ratings", "ReadTheWikiForMoreInformation": "Read the Wiki for more information", diff --git a/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs b/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs index a4c5db45b0..449af4c7ae 100644 --- a/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs +++ b/src/NzbDrone.Core/ThingiProvider/ProviderDefinition.cs @@ -28,6 +28,7 @@ protected ProviderDefinition() public ProviderMessage Message { get; set; } public HashSet Tags { get; set; } + public bool RetroApplyTags { get; set; } [MemberwiseEqualityIgnore] public IProviderConfig Settings diff --git a/src/Radarr.Api.V3/ProviderResource.cs b/src/Radarr.Api.V3/ProviderResource.cs index c5e8a1cd6f..4cecc4f0b4 100644 --- a/src/Radarr.Api.V3/ProviderResource.cs +++ b/src/Radarr.Api.V3/ProviderResource.cs @@ -16,6 +16,7 @@ public class ProviderResource : RestResource public string InfoLink { get; set; } public ProviderMessage Message { get; set; } public HashSet Tags { get; set; } + public bool RetroApplyTags { get; set; } public List Presets { get; set; } } @@ -36,6 +37,7 @@ public virtual TProviderResource ToResource(TProviderDefinition definition) ConfigContract = definition.ConfigContract, Message = definition.Message, Tags = definition.Tags, + RetroApplyTags = definition.RetroApplyTags, Fields = SchemaBuilder.ToSchema(definition.Settings), // radarr/supported is an disambiguation page. the # should be a header on the page with appropriate details/link @@ -60,7 +62,8 @@ public virtual TProviderDefinition ToModel(TProviderResource resource, TProvider Implementation = resource.Implementation, ConfigContract = resource.ConfigContract, Message = resource.Message, - Tags = resource.Tags + Tags = resource.Tags, + RetroApplyTags = resource.RetroApplyTags, }; var configContract = ReflectionExtensions.CoreAssembly.FindTypeByName(definition.ConfigContract);