New: Opt-in to delete empty series/season folders
This commit is contained in:
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;
|
|
||||||
|
|
||||||
if (_diskProvider.GetFiles(path, SearchOption.AllDirectories).Empty() &&
|
|
||||||
!_configService.CreateEmptySeriesFolders)
|
|
||||||
{
|
{
|
||||||
_diskProvider.DeleteFolder(path, true);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_configService.DeleteEmptyFolders)
|
||||||
|
{
|
||||||
|
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…
Reference in New Issue