New: Opt-in to delete empty series/season folders

pull/2440/head
Mark McDowall 7 years ago
parent a9c54a1f01
commit 9e7f0c859f

@ -1,4 +1,4 @@
using NzbDrone.Api.REST; using NzbDrone.Api.REST;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
@ -10,6 +10,7 @@ namespace NzbDrone.Api.Config
public string RecycleBin { get; set; } public string RecycleBin { get; set; }
public bool AutoDownloadPropers { get; set; } public bool AutoDownloadPropers { get; set; }
public bool CreateEmptySeriesFolders { get; set; } public bool CreateEmptySeriesFolders { get; set; }
public bool DeleteEmptyFolders { get; set; }
public FileDateType FileDate { get; set; } public FileDateType FileDate { get; set; }
public bool SetPermissionsLinux { get; set; } public bool SetPermissionsLinux { get; set; }
@ -35,6 +36,7 @@ namespace NzbDrone.Api.Config
RecycleBin = model.RecycleBin, RecycleBin = model.RecycleBin,
AutoDownloadPropers = model.AutoDownloadPropers, AutoDownloadPropers = model.AutoDownloadPropers,
CreateEmptySeriesFolders = model.CreateEmptySeriesFolders, CreateEmptySeriesFolders = model.CreateEmptySeriesFolders,
DeleteEmptyFolders = model.DeleteEmptyFolders,
FileDate = model.FileDate, FileDate = model.FileDate,
SetPermissionsLinux = model.SetPermissionsLinux, SetPermissionsLinux = model.SetPermissionsLinux,

@ -1,4 +1,4 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
@ -161,6 +161,13 @@ namespace NzbDrone.Core.Configuration
set { SetValue("CreateEmptySeriesFolders", value); } set { SetValue("CreateEmptySeriesFolders", value); }
} }
public bool DeleteEmptyFolders
{
get { return GetValueBoolean("DeleteEmptyFolders", false); }
set { SetValue("DeleteEmptyFolders", value); }
}
public FileDateType FileDate public FileDateType FileDate
{ {
get { return GetValueEnum("FileDate", FileDateType.None); } get { return GetValueEnum("FileDate", FileDateType.None); }

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using NzbDrone.Core.MediaFiles; using NzbDrone.Core.MediaFiles;
using NzbDrone.Common.Http.Proxy; using NzbDrone.Common.Http.Proxy;
@ -28,6 +28,7 @@ namespace NzbDrone.Core.Configuration
string RecycleBin { get; set; } string RecycleBin { get; set; }
bool AutoDownloadPropers { get; set; } bool AutoDownloadPropers { get; set; }
bool CreateEmptySeriesFolders { get; set; } bool CreateEmptySeriesFolders { get; set; }
bool DeleteEmptyFolders { get; set; }
FileDateType FileDate { get; set; } FileDateType FileDate { get; set; }
bool SkipFreeSpaceCheckWhenImporting { get; set; } bool SkipFreeSpaceCheckWhenImporting { get; set; }
bool CopyUsingHardlinks { get; set; } bool CopyUsingHardlinks { get; set; }

@ -191,10 +191,16 @@ namespace NzbDrone.Core.MediaFiles
private void RemoveEmptySeriesFolder(string path) private void RemoveEmptySeriesFolder(string path)
{ {
if (_diskProvider.GetFiles(path, SearchOption.AllDirectories).Empty() && if (_configService.DeleteEmptyFolders)
!_configService.CreateEmptySeriesFolders)
{ {
_diskProvider.DeleteFolder(path, true); if (_diskProvider.GetFiles(path, SearchOption.AllDirectories).Empty())
{
_diskProvider.DeleteFolder(path, true);
}
else
{
_diskProvider.RemoveEmptySubfolders(path);
}
} }
} }

@ -117,13 +117,24 @@ namespace NzbDrone.Core.MediaFiles
[EventHandleOrder(EventHandleOrder.Last)] [EventHandleOrder(EventHandleOrder.Last)]
public void Handle(EpisodeFileDeletedEvent message) public void Handle(EpisodeFileDeletedEvent message)
{ {
var series = message.EpisodeFile.Series.Value; if (message.Reason == DeleteMediaFileReason.Upgrade)
var path = series.Path; {
return;
}
if (_diskProvider.GetFiles(path, SearchOption.AllDirectories).Empty() && if (_configService.DeleteEmptyFolders)
!_configService.CreateEmptySeriesFolders)
{ {
_diskProvider.DeleteFolder(path, true); var series = message.EpisodeFile.Series.Value;
var seasonFolder = message.EpisodeFile.Path.GetParentPath();
if (_diskProvider.GetFiles(series.Path, SearchOption.AllDirectories).Empty())
{
_diskProvider.DeleteFolder(series.Path, true);
}
else if (_diskProvider.GetFiles(seasonFolder, SearchOption.AllDirectories).Empty())
{
_diskProvider.RemoveEmptySubfolders(seasonFolder);
}
} }
} }
} }

@ -23,6 +23,29 @@
</div> </div>
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-sm-3 control-label">Delete empty folders</label>
<div class="col-sm-9">
<div class="input-group">
<label class="checkbox toggle well">
<input type="checkbox" name="deleteEmptyFolders"/>
<p>
<span>Yes</span>
<span>No</span>
</p>
<div class="btn btn-primary slide-button"/>
</label>
<span class="help-inline-checkbox">
<i class="icon-sonarr-form-info" title="Delete empty series and season folders during disk scan and when episode files are deleted"/>
</span>
</div>
</div>
</div>
</fieldset> </fieldset>
<fieldset> <fieldset>

Loading…
Cancel
Save