Added Recycle Bin to server side

New: Recycle Bin is now available
This commit is contained in:
Mark McDowall
2012-09-03 23:49:04 -07:00
parent b52dcfd2ef
commit 23118871fd
13 changed files with 586 additions and 6 deletions
@@ -0,0 +1,36 @@
using System.Linq;
using System;
using Ninject;
using NLog;
using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Converting;
namespace NzbDrone.Core.Jobs
{
public class CleanupRecycleBinJob : IJob
{
private readonly RecycleBinProvider _recycleBinProvider;
[Inject]
public CleanupRecycleBinJob(RecycleBinProvider recycleBinProvider)
{
_recycleBinProvider = recycleBinProvider;
}
public string Name
{
get { return "Cleanup Recycle Bin"; }
}
public TimeSpan DefaultInterval
{
get { return TimeSpan.FromDays(24); }
}
public void Start(ProgressNotification notification, int targetId, int secondaryTargetId)
{
_recycleBinProvider.Cleanup();
}
}
}
+4 -4
View File
@@ -11,15 +11,15 @@ namespace NzbDrone.Core.Jobs
public class DeleteSeriesJob : IJob
{
private readonly SeriesProvider _seriesProvider;
private readonly DiskProvider _diskProvider;
private readonly RecycleBinProvider _recycleBinProvider;
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
[Inject]
public DeleteSeriesJob(SeriesProvider seriesProvider, DiskProvider diskProvider)
public DeleteSeriesJob(SeriesProvider seriesProvider, RecycleBinProvider recycleBinProvider)
{
_seriesProvider = seriesProvider;
_diskProvider = diskProvider;
_recycleBinProvider = recycleBinProvider;
}
public string Name
@@ -54,7 +54,7 @@ namespace NzbDrone.Core.Jobs
{
notification.CurrentMessage = String.Format("Deleting files from disk for series '{0}'", title);
_diskProvider.DeleteFolder(series.Path, true);
_recycleBinProvider.DeleteDirectory(series.Path);
notification.CurrentMessage = String.Format("Successfully deleted files from disk for series '{0}'", title);
}
+36
View File
@@ -0,0 +1,36 @@
using System.Linq;
using System;
using Ninject;
using NLog;
using NzbDrone.Core.Model.Notification;
using NzbDrone.Core.Providers;
using NzbDrone.Core.Providers.Converting;
namespace NzbDrone.Core.Jobs
{
public class EmptyRecycleBinJob : IJob
{
private readonly RecycleBinProvider _recycleBinProvider;
[Inject]
public EmptyRecycleBinJob(RecycleBinProvider recycleBinProvider)
{
_recycleBinProvider = recycleBinProvider;
}
public string Name
{
get { return "Empty Recycle Bin"; }
}
public TimeSpan DefaultInterval
{
get { return TimeSpan.FromTicks(0); }
}
public void Start(ProgressNotification notification, int targetId, int secondaryTargetId)
{
_recycleBinProvider.Empty();
}
}
}
+3
View File
@@ -253,6 +253,8 @@
<Compile Include="Helpers\EpisodeSortingHelper.cs" />
<Compile Include="Helpers\SortHelper.cs" />
<Compile Include="Helpers\SabnzbdPriorityTypeConverter.cs" />
<Compile Include="Jobs\CleanupRecycleBinJob.cs" />
<Compile Include="Jobs\EmptyRecycleBinJob.cs" />
<Compile Include="Jobs\RefreshEpsiodeMetadata.cs" />
<Compile Include="Jobs\PastWeekBacklogSearchJob.cs" />
<Compile Include="Jobs\SearchHistoryCleanupJob.cs" />
@@ -297,6 +299,7 @@
<Compile Include="Providers\MetadataProvider.cs" />
<Compile Include="Providers\Metadata\MetadataBase.cs" />
<Compile Include="Providers\Metadata\Xbmc.cs" />
<Compile Include="Providers\RecycleBinProvider.cs" />
<Compile Include="Providers\SearchHistoryProvider.cs" />
<Compile Include="Providers\SeasonProvider.cs" />
<Compile Include="Jobs\RecentBacklogSearchJob.cs" />
@@ -526,6 +526,12 @@ namespace NzbDrone.Core.Providers.Core
set { SetValue("PneumaticDirectory", value); }
}
public virtual string RecycleBin
{
get { return GetValue("RecycleBin", String.Empty); }
set { SetValue("RecycleBin", value); }
}
private string GetValue(string key)
{
return GetValue(key, String.Empty);
+5 -2
View File
@@ -23,12 +23,14 @@ namespace NzbDrone.Core.Providers
private readonly DownloadProvider _downloadProvider;
private readonly SignalRProvider _signalRProvider;
private readonly ConfigProvider _configProvider;
private readonly RecycleBinProvider _recycleBinProvider;
[Inject]
public DiskScanProvider(DiskProvider diskProvider, EpisodeProvider episodeProvider,
SeriesProvider seriesProvider, MediaFileProvider mediaFileProvider,
ExternalNotificationProvider externalNotificationProvider, DownloadProvider downloadProvider,
SignalRProvider signalRProvider, ConfigProvider configProvider)
SignalRProvider signalRProvider, ConfigProvider configProvider,
RecycleBinProvider recycleBinProvider)
{
_diskProvider = diskProvider;
_episodeProvider = episodeProvider;
@@ -38,6 +40,7 @@ namespace NzbDrone.Core.Providers
_downloadProvider = downloadProvider;
_signalRProvider = signalRProvider;
_configProvider = configProvider;
_recycleBinProvider = recycleBinProvider;
}
public DiskScanProvider()
@@ -135,7 +138,7 @@ namespace NzbDrone.Core.Providers
{
Logger.Debug("Deleting the existing file(s) on disk to upgrade to: {0}", filePath);
//Do the delete for files where there is already an episode on disk
episodes.Where(e => e.EpisodeFile != null).Select(e => e.EpisodeFile.Path).Distinct().ToList().ForEach(p => _diskProvider.DeleteFile(p));
episodes.Where(e => e.EpisodeFile != null).Select(e => e.EpisodeFile.Path).Distinct().ToList().ForEach(p => _recycleBinProvider.DeleteFile(p));
}
else
@@ -0,0 +1,142 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using NLog;
using Ninject;
using NzbDrone.Common;
using NzbDrone.Core.Providers.Core;
namespace NzbDrone.Core.Providers
{
public class RecycleBinProvider
{
private readonly DiskProvider _diskProvider;
private readonly ConfigProvider _configProvider;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
[Inject]
public RecycleBinProvider(DiskProvider diskProvider, ConfigProvider configProvider)
{
_diskProvider = diskProvider;
_configProvider = configProvider;
}
public RecycleBinProvider()
{
}
public virtual void DeleteDirectory(string path)
{
logger.Trace("Attempting to send '{0}' to recycling bin", path);
var recyclingBin = _configProvider.RecycleBin;
if (String.IsNullOrWhiteSpace(recyclingBin))
{
logger.Info("Recycling Bin has not been configured, deleting permanently.");
_diskProvider.DeleteFolder(path, true);
logger.Trace("Folder has been permanently deleted: {0}", path);
}
else
{
var destination = Path.Combine(recyclingBin, new DirectoryInfo(path).Name);
logger.Trace("Moving '{0}' to '{1}'", path, destination);
_diskProvider.MoveDirectory(path, destination);
logger.Trace("Setting last accessed: {0}", path);
_diskProvider.DirectorySetLastWriteTimeUtc(destination, DateTime.UtcNow);
foreach(var file in _diskProvider.GetFiles(destination, SearchOption.AllDirectories))
{
_diskProvider.FileSetLastWriteTimeUtc(file, DateTime.UtcNow);
}
logger.Trace("Folder has been moved to the recycling bin: {0}", destination);
}
}
public virtual void DeleteFile(string path)
{
logger.Trace("Attempting to send '{0}' to recycling bin", path);
var recyclingBin = _configProvider.RecycleBin;
if (String.IsNullOrWhiteSpace(recyclingBin))
{
logger.Info("Recycling Bin has not been configured, deleting permanently.");
_diskProvider.DeleteFile(path);
logger.Trace("File has been permanently deleted: {0}", path);
}
else
{
var destination = Path.Combine(recyclingBin, new FileInfo(path).Name);
logger.Trace("Moving '{0}' to '{1}'", path, destination);
_diskProvider.MoveFile(path, destination);
_diskProvider.FileSetLastWriteTimeUtc(destination, DateTime.UtcNow);
logger.Trace("File has been moved to the recycling bin: {0}", destination);
}
}
public virtual void Empty()
{
if (String.IsNullOrWhiteSpace(_configProvider.RecycleBin))
{
logger.Info("Recycle Bin has not been configured, cannot empty.");
return;
}
logger.Info("Removing all items from the recycling bin");
foreach (var folder in _diskProvider.GetDirectories(_configProvider.RecycleBin))
{
_diskProvider.DeleteFolder(folder, true);
}
foreach (var file in _diskProvider.GetFiles(_configProvider.RecycleBin, SearchOption.TopDirectoryOnly))
{
_diskProvider.DeleteFile(file);
}
logger.Trace("Recycling Bin has been emptied.");
}
public virtual void Cleanup()
{
if (String.IsNullOrWhiteSpace(_configProvider.RecycleBin))
{
logger.Info("Recycle Bin has not been configured, cannot cleanup.");
return;
}
logger.Info("Removing items older than 7 days from the recycling bin");
foreach (var folder in _diskProvider.GetDirectories(_configProvider.RecycleBin))
{
if (_diskProvider.GetLastDirectoryWrite(folder).AddDays(7) > DateTime.UtcNow)
{
logger.Trace("Folder hasn't expired yet, skipping: {0}", folder);
continue;
}
_diskProvider.DeleteFolder(folder, true);
}
foreach (var file in _diskProvider.GetFiles(_configProvider.RecycleBin, SearchOption.TopDirectoryOnly))
{
if (_diskProvider.GetLastFileWrite(file).AddDays(7) > DateTime.UtcNow)
{
logger.Trace("File hasn't expired yet, skipping: {0}", file);
continue;
}
_diskProvider.DeleteFile(file);
}
logger.Trace("Recycling Bin has been cleaned up.");
}
}
}