From f069801ebaf29e8a9d9260a64b324e03f99f58dd Mon Sep 17 00:00:00 2001 From: Qstick Date: Sun, 28 Jun 2020 22:57:46 -0400 Subject: [PATCH] New: Ensure all unmapped folders are fetched when importing from a root folder Co-Authored-By: Mark McDowall #4548 --- .../ImportMovie/Import/ImportMovie.js | 31 ++++++++++++------- .../Import/ImportMovieConnector.js | 7 +++-- .../Movies/MovieBulkImportModule.cs | 2 +- .../RootFolders/RootFolderModule.cs | 2 +- .../RootFolderServiceFixture.cs | 2 +- .../RootFolders/RootFolderService.cs | 14 ++++----- .../RootFolders/RootFolderModule.cs | 5 ++- 7 files changed, 38 insertions(+), 25 deletions(-) diff --git a/frontend/src/AddMovie/ImportMovie/Import/ImportMovie.js b/frontend/src/AddMovie/ImportMovie/Import/ImportMovie.js index 3a3889ab7..2d788eef7 100644 --- a/frontend/src/AddMovie/ImportMovie/Import/ImportMovie.js +++ b/frontend/src/AddMovie/ImportMovie/Import/ImportMovie.js @@ -79,7 +79,6 @@ class ImportMovie extends Component { rootFolderId, path, rootFoldersFetching, - rootFoldersPopulated, rootFoldersError, unmappedFolders } = this.props; @@ -98,24 +97,30 @@ class ImportMovie extends Component { onScroll={this.onScroll} > { - rootFoldersFetching && !rootFoldersPopulated && - + rootFoldersFetching ? : null } { - !rootFoldersFetching && !!rootFoldersError && -
Unable to load root folders
+ !rootFoldersFetching && !!rootFoldersError ? +
Unable to load root folders
: + null } { - !rootFoldersError && rootFoldersPopulated && !unmappedFolders.length && + !rootFoldersError && + !rootFoldersFetching && + !unmappedFolders.length ?
All movies in {path} have been imported -
+ : + null } { - !rootFoldersError && rootFoldersPopulated && !!unmappedFolders.length && scroller && + !rootFoldersError && + !rootFoldersFetching && + !!unmappedFolders.length && + scroller ? + /> : + null } { - !rootFoldersError && rootFoldersPopulated && !!unmappedFolders.length && + !rootFoldersError && + !rootFoldersFetching && + !!unmappedFolders.length ? + /> : + null } ); diff --git a/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js b/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js index 4c30cfef8..963fd776a 100644 --- a/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js +++ b/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js @@ -71,15 +71,14 @@ class ImportMovieConnector extends Component { componentDidMount() { const { + rootFolderId, qualityProfiles, defaultQualityProfileId, dispatchFetchRootFolders, dispatchSetAddMovieDefault } = this.props; - if (!this.props.rootFoldersPopulated) { - dispatchFetchRootFolders(); - } + dispatchFetchRootFolders({ id: rootFolderId, timeout: false }); let setDefaults = false; const setDefaultPayload = {}; @@ -139,6 +138,8 @@ const routeMatchShape = createRouteMatchShape({ ImportMovieConnector.propTypes = { match: routeMatchShape.isRequired, + rootFolderId: PropTypes.number.isRequired, + rootFoldersFetching: PropTypes.bool.isRequired, rootFoldersPopulated: PropTypes.bool.isRequired, qualityProfiles: PropTypes.arrayOf(PropTypes.object).isRequired, defaultQualityProfileId: PropTypes.number.isRequired, diff --git a/src/NzbDrone.Api/Movies/MovieBulkImportModule.cs b/src/NzbDrone.Api/Movies/MovieBulkImportModule.cs index 8bdbd0ba6..eb3886c55 100644 --- a/src/NzbDrone.Api/Movies/MovieBulkImportModule.cs +++ b/src/NzbDrone.Api/Movies/MovieBulkImportModule.cs @@ -66,7 +66,7 @@ private object Search() Profile tempProfile = _profileService.All().First(); - RootFolder rootFolder = _rootFolderService.Get(Request.Query.Id); + RootFolder rootFolder = _rootFolderService.Get(Request.Query.Id, true); int page = Request.Query.page; int per_page = Request.Query.per_page; diff --git a/src/NzbDrone.Api/RootFolders/RootFolderModule.cs b/src/NzbDrone.Api/RootFolders/RootFolderModule.cs index 0239c4d65..c392af27a 100644 --- a/src/NzbDrone.Api/RootFolders/RootFolderModule.cs +++ b/src/NzbDrone.Api/RootFolders/RootFolderModule.cs @@ -41,7 +41,7 @@ public RootFolderModule(IRootFolderService rootFolderService, private RootFolderResource GetRootFolder(int id) { - return _rootFolderService.Get(id).ToResource(); + return _rootFolderService.Get(id, true).ToResource(); } private int CreateRootFolder(RootFolderResource rootFolderResource) diff --git a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs index 870c9147b..7f9a1a586 100644 --- a/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs +++ b/src/NzbDrone.Core.Test/RootFolderTests/RootFolderServiceFixture.cs @@ -142,7 +142,7 @@ public void should_get_root_folder_with_subfolders_excluding_special_sub_folders .Setup(s => s.GetDirectories(rootFolder.Path)) .Returns(folders); - var unmappedFolders = Subject.Get(rootFolder.Id).UnmappedFolders; + var unmappedFolders = Subject.Get(rootFolder.Id, true).UnmappedFolders; unmappedFolders.Count.Should().BeGreaterThan(0); unmappedFolders.Should().NotContain(u => u.Name == subFolder); diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index cd16873b6..8382aa0bd 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -18,7 +18,7 @@ public interface IRootFolderService List AllWithUnmappedFolders(); RootFolder Add(RootFolder rootDir); void Remove(int id); - RootFolder Get(int id); + RootFolder Get(int id, bool timeout); string GetBestRootFolderPath(string path); } @@ -73,7 +73,7 @@ public List AllWithUnmappedFolders() { if (folder.Path.IsPathValid()) { - GetDetails(folder); + GetDetails(folder, true); } } @@ -114,7 +114,7 @@ public RootFolder Add(RootFolder rootFolder) _rootFolderRepository.Insert(rootFolder); - GetDetails(rootFolder); + GetDetails(rootFolder, true); return rootFolder; } @@ -161,10 +161,10 @@ private List GetUnmappedFolders(string path) return results.OrderBy(u => u.Name, StringComparer.InvariantCultureIgnoreCase).ToList(); } - public RootFolder Get(int id) + public RootFolder Get(int id, bool timeout) { var rootFolder = _rootFolderRepository.Get(id); - GetDetails(rootFolder); + GetDetails(rootFolder, timeout); return rootFolder; } @@ -183,7 +183,7 @@ public string GetBestRootFolderPath(string path) return possibleRootFolder.Path; } - private void GetDetails(RootFolder rootFolder) + private void GetDetails(RootFolder rootFolder, bool timeout) { Task.Run(() => { @@ -194,7 +194,7 @@ private void GetDetails(RootFolder rootFolder) rootFolder.TotalSpace = _diskProvider.GetTotalSize(rootFolder.Path); rootFolder.UnmappedFolders = GetUnmappedFolders(rootFolder.Path); } - }).Wait(5000); + }).Wait(timeout ? 5000 : -1); } } } diff --git a/src/Radarr.Api.V3/RootFolders/RootFolderModule.cs b/src/Radarr.Api.V3/RootFolders/RootFolderModule.cs index 517b5fb9e..56ab08546 100644 --- a/src/Radarr.Api.V3/RootFolders/RootFolderModule.cs +++ b/src/Radarr.Api.V3/RootFolders/RootFolderModule.cs @@ -4,6 +4,7 @@ using NzbDrone.Core.Validation.Paths; using NzbDrone.SignalR; using Radarr.Http; +using Radarr.Http.Extensions; namespace Radarr.Api.V3.RootFolders { @@ -41,7 +42,9 @@ public RootFolderModule(IRootFolderService rootFolderService, private RootFolderResource GetRootFolder(int id) { - return _rootFolderService.Get(id).ToResource(); + var timeout = Request.GetBooleanQueryParameter("timeout", true); + + return _rootFolderService.Get(id, timeout).ToResource(); } private int CreateRootFolder(RootFolderResource rootFolderResource)