mirror of
https://github.com/Radarr/Radarr.git
synced 2024-09-19 07:52:33 +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:
parent
5edbe4200b
commit
f069801eba
@ -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>
|
||||||
);
|
);
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user