1
0
mirror of https://github.com/Radarr/Radarr.git synced 2024-09-17 15:02:34 +02:00

New: Ensure all unmapped folders are fetched when importing from a root folder

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>

#4548
This commit is contained in:
Qstick 2020-06-28 22:57:46 -04:00
parent 5edbe4200b
commit f069801eba
7 changed files with 38 additions and 25 deletions

View File

@ -79,7 +79,6 @@ class ImportMovie extends Component {
rootFolderId, rootFolderId,
path, path,
rootFoldersFetching, rootFoldersFetching,
rootFoldersPopulated,
rootFoldersError, rootFoldersError,
unmappedFolders unmappedFolders
} = this.props; } = this.props;
@ -98,24 +97,30 @@ class ImportMovie extends Component {
onScroll={this.onScroll} onScroll={this.onScroll}
> >
{ {
rootFoldersFetching && !rootFoldersPopulated && rootFoldersFetching ? <LoadingIndicator /> : null
<LoadingIndicator />
} }
{ {
!rootFoldersFetching && !!rootFoldersError && !rootFoldersFetching && !!rootFoldersError ?
<div>Unable to load root folders</div> <div>Unable to load root folders</div> :
null
} }
{ {
!rootFoldersError && rootFoldersPopulated && !unmappedFolders.length && !rootFoldersError &&
!rootFoldersFetching &&
!unmappedFolders.length ?
<div> <div>
All movies in {path} have been imported All movies in {path} have been imported
</div> </div> :
null
} }
{ {
!rootFoldersError && rootFoldersPopulated && !!unmappedFolders.length && scroller && !rootFoldersError &&
!rootFoldersFetching &&
!!unmappedFolders.length &&
scroller ?
<ImportMovieTableConnector <ImportMovieTableConnector
rootFolderId={rootFolderId} rootFolderId={rootFolderId}
unmappedFolders={unmappedFolders} unmappedFolders={unmappedFolders}
@ -126,17 +131,21 @@ class ImportMovie extends Component {
onSelectAllChange={this.onSelectAllChange} onSelectAllChange={this.onSelectAllChange}
onSelectedChange={this.onSelectedChange} onSelectedChange={this.onSelectedChange}
onRemoveSelectedStateItem={this.onRemoveSelectedStateItem} onRemoveSelectedStateItem={this.onRemoveSelectedStateItem}
/> /> :
null
} }
</PageContentBody> </PageContentBody>
{ {
!rootFoldersError && rootFoldersPopulated && !!unmappedFolders.length && !rootFoldersError &&
!rootFoldersFetching &&
!!unmappedFolders.length ?
<ImportMovieFooterConnector <ImportMovieFooterConnector
selectedIds={this.getSelectedIds()} selectedIds={this.getSelectedIds()}
onInputChange={this.onInputChange} onInputChange={this.onInputChange}
onImportPress={this.onImportPress} onImportPress={this.onImportPress}
/> /> :
null
} }
</PageContent> </PageContent>
); );

View File

@ -71,15 +71,14 @@ class ImportMovieConnector extends Component {
componentDidMount() { componentDidMount() {
const { const {
rootFolderId,
qualityProfiles, qualityProfiles,
defaultQualityProfileId, defaultQualityProfileId,
dispatchFetchRootFolders, dispatchFetchRootFolders,
dispatchSetAddMovieDefault dispatchSetAddMovieDefault
} = this.props; } = this.props;
if (!this.props.rootFoldersPopulated) { dispatchFetchRootFolders({ id: rootFolderId, timeout: false });
dispatchFetchRootFolders();
}
let setDefaults = false; let setDefaults = false;
const setDefaultPayload = {}; const setDefaultPayload = {};
@ -139,6 +138,8 @@ const routeMatchShape = createRouteMatchShape({
ImportMovieConnector.propTypes = { ImportMovieConnector.propTypes = {
match: routeMatchShape.isRequired, match: routeMatchShape.isRequired,
rootFolderId: PropTypes.number.isRequired,
rootFoldersFetching: PropTypes.bool.isRequired,
rootFoldersPopulated: PropTypes.bool.isRequired, rootFoldersPopulated: PropTypes.bool.isRequired,
qualityProfiles: PropTypes.arrayOf(PropTypes.object).isRequired, qualityProfiles: PropTypes.arrayOf(PropTypes.object).isRequired,
defaultQualityProfileId: PropTypes.number.isRequired, defaultQualityProfileId: PropTypes.number.isRequired,

View File

@ -66,7 +66,7 @@ private object Search()
Profile tempProfile = _profileService.All().First(); 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 page = Request.Query.page;
int per_page = Request.Query.per_page; int per_page = Request.Query.per_page;

View File

@ -41,7 +41,7 @@ public RootFolderModule(IRootFolderService rootFolderService,
private RootFolderResource GetRootFolder(int id) private RootFolderResource GetRootFolder(int id)
{ {
return _rootFolderService.Get(id).ToResource(); return _rootFolderService.Get(id, true).ToResource();
} }
private int CreateRootFolder(RootFolderResource rootFolderResource) private int CreateRootFolder(RootFolderResource rootFolderResource)

View File

@ -142,7 +142,7 @@ public void should_get_root_folder_with_subfolders_excluding_special_sub_folders
.Setup(s => s.GetDirectories(rootFolder.Path)) .Setup(s => s.GetDirectories(rootFolder.Path))
.Returns(folders); .Returns(folders);
var unmappedFolders = Subject.Get(rootFolder.Id).UnmappedFolders; var unmappedFolders = Subject.Get(rootFolder.Id, true).UnmappedFolders;
unmappedFolders.Count.Should().BeGreaterThan(0); unmappedFolders.Count.Should().BeGreaterThan(0);
unmappedFolders.Should().NotContain(u => u.Name == subFolder); unmappedFolders.Should().NotContain(u => u.Name == subFolder);

View File

@ -18,7 +18,7 @@ public interface IRootFolderService
List<RootFolder> AllWithUnmappedFolders(); List<RootFolder> AllWithUnmappedFolders();
RootFolder Add(RootFolder rootDir); RootFolder Add(RootFolder rootDir);
void Remove(int id); void Remove(int id);
RootFolder Get(int id); RootFolder Get(int id, bool timeout);
string GetBestRootFolderPath(string path); string GetBestRootFolderPath(string path);
} }
@ -73,7 +73,7 @@ public List<RootFolder> AllWithUnmappedFolders()
{ {
if (folder.Path.IsPathValid()) if (folder.Path.IsPathValid())
{ {
GetDetails(folder); GetDetails(folder, true);
} }
} }
@ -114,7 +114,7 @@ public RootFolder Add(RootFolder rootFolder)
_rootFolderRepository.Insert(rootFolder); _rootFolderRepository.Insert(rootFolder);
GetDetails(rootFolder); GetDetails(rootFolder, true);
return rootFolder; return rootFolder;
} }
@ -161,10 +161,10 @@ private List<UnmappedFolder> GetUnmappedFolders(string path)
return results.OrderBy(u => u.Name, StringComparer.InvariantCultureIgnoreCase).ToList(); 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); var rootFolder = _rootFolderRepository.Get(id);
GetDetails(rootFolder); GetDetails(rootFolder, timeout);
return rootFolder; return rootFolder;
} }
@ -183,7 +183,7 @@ public string GetBestRootFolderPath(string path)
return possibleRootFolder.Path; return possibleRootFolder.Path;
} }
private void GetDetails(RootFolder rootFolder) private void GetDetails(RootFolder rootFolder, bool timeout)
{ {
Task.Run(() => Task.Run(() =>
{ {
@ -194,7 +194,7 @@ private void GetDetails(RootFolder rootFolder)
rootFolder.TotalSpace = _diskProvider.GetTotalSize(rootFolder.Path); rootFolder.TotalSpace = _diskProvider.GetTotalSize(rootFolder.Path);
rootFolder.UnmappedFolders = GetUnmappedFolders(rootFolder.Path); rootFolder.UnmappedFolders = GetUnmappedFolders(rootFolder.Path);
} }
}).Wait(5000); }).Wait(timeout ? 5000 : -1);
} }
} }
} }

View File

@ -4,6 +4,7 @@
using NzbDrone.Core.Validation.Paths; using NzbDrone.Core.Validation.Paths;
using NzbDrone.SignalR; using NzbDrone.SignalR;
using Radarr.Http; using Radarr.Http;
using Radarr.Http.Extensions;
namespace Radarr.Api.V3.RootFolders namespace Radarr.Api.V3.RootFolders
{ {
@ -41,7 +42,9 @@ public RootFolderModule(IRootFolderService rootFolderService,
private RootFolderResource GetRootFolder(int id) 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) private int CreateRootFolder(RootFolderResource rootFolderResource)