aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common/ScheduledTasks
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Common/ScheduledTasks')
-rw-r--r--MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs140
-rw-r--r--MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs64
-rw-r--r--MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs30
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs8
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ITaskManager.cs29
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs26
-rw-r--r--MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs30
-rw-r--r--MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs4
-rw-r--r--MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs25
-rw-r--r--MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs23
-rw-r--r--MediaBrowser.Common/ScheduledTasks/TaskManager.cs159
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs118
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs106
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs70
-rw-r--r--MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs121
-rw-r--r--MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs30
16 files changed, 170 insertions, 813 deletions
diff --git a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs
index 845faf31a..09ceaa9ae 100644
--- a/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/BaseScheduledTask.cs
@@ -1,6 +1,5 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.Kernel;
-using MediaBrowser.Common.Serialization;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Tasks;
using System;
@@ -90,7 +89,7 @@ namespace MediaBrowser.Common.ScheduledTasks
{
try
{
- return JsonSerializer.DeserializeFromFile<TaskResult>(HistoryFilePath);
+ return TaskManager.GetLastExecutionResult(this);
}
catch (IOException)
{
@@ -110,74 +109,6 @@ namespace MediaBrowser.Common.ScheduledTasks
}
/// <summary>
- /// The _scheduled tasks data directory
- /// </summary>
- private string _scheduledTasksDataDirectory;
- /// <summary>
- /// Gets the scheduled tasks data directory.
- /// </summary>
- /// <value>The scheduled tasks data directory.</value>
- private string ScheduledTasksDataDirectory
- {
- get
- {
- if (_scheduledTasksDataDirectory == null)
- {
- _scheduledTasksDataDirectory = Path.Combine(Kernel.ApplicationPaths.DataPath, "ScheduledTasks");
-
- if (!Directory.Exists(_scheduledTasksDataDirectory))
- {
- Directory.CreateDirectory(_scheduledTasksDataDirectory);
- }
- }
- return _scheduledTasksDataDirectory;
- }
- }
-
- /// <summary>
- /// The _scheduled tasks configuration directory
- /// </summary>
- private string _scheduledTasksConfigurationDirectory;
- /// <summary>
- /// Gets the scheduled tasks configuration directory.
- /// </summary>
- /// <value>The scheduled tasks configuration directory.</value>
- private string ScheduledTasksConfigurationDirectory
- {
- get
- {
- if (_scheduledTasksConfigurationDirectory == null)
- {
- _scheduledTasksConfigurationDirectory = Path.Combine(Kernel.ApplicationPaths.ConfigurationDirectoryPath, "ScheduledTasks");
-
- if (!Directory.Exists(_scheduledTasksConfigurationDirectory))
- {
- Directory.CreateDirectory(_scheduledTasksConfigurationDirectory);
- }
- }
- return _scheduledTasksConfigurationDirectory;
- }
- }
-
- /// <summary>
- /// Gets the configuration file path.
- /// </summary>
- /// <value>The configuration file path.</value>
- private string ConfigurationFilePath
- {
- get { return Path.Combine(ScheduledTasksConfigurationDirectory, Id + ".js"); }
- }
-
- /// <summary>
- /// Gets the history file path.
- /// </summary>
- /// <value>The history file path.</value>
- private string HistoryFilePath
- {
- get { return Path.Combine(ScheduledTasksDataDirectory, Id + ".js"); }
- }
-
- /// <summary>
/// Gets the current cancellation token
/// </summary>
/// <value>The current cancellation token source.</value>
@@ -217,7 +148,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// The _triggers
/// </summary>
- private IEnumerable<BaseTaskTrigger> _triggers;
+ private IEnumerable<ITaskTrigger> _triggers;
/// <summary>
/// The _triggers initialized
/// </summary>
@@ -231,24 +162,11 @@ namespace MediaBrowser.Common.ScheduledTasks
/// </summary>
/// <value>The triggers.</value>
/// <exception cref="System.ArgumentNullException">value</exception>
- public IEnumerable<BaseTaskTrigger> Triggers
+ public IEnumerable<ITaskTrigger> Triggers
{
get
{
- LazyInitializer.EnsureInitialized(ref _triggers, ref _triggersInitialized, ref _triggersSyncLock, () =>
- {
- try
- {
- return JsonSerializer.DeserializeFromFile<IEnumerable<TaskTriggerInfo>>(ConfigurationFilePath)
- .Select(ScheduledTaskHelpers.GetTrigger)
- .ToList();
- }
- catch (IOException)
- {
- // File doesn't exist. No biggie. Return defaults.
- return GetDefaultTriggers();
- }
- });
+ LazyInitializer.EnsureInitialized(ref _triggers, ref _triggersInitialized, ref _triggersSyncLock, () => TaskManager.LoadTriggers(this));
return _triggers;
}
@@ -271,7 +189,7 @@ namespace MediaBrowser.Common.ScheduledTasks
ReloadTriggerEvents(false);
- JsonSerializer.SerializeToFile(_triggers.Select(ScheduledTaskHelpers.GetTriggerInfo), ConfigurationFilePath);
+ TaskManager.SaveTriggers(this, _triggers);
}
}
@@ -279,7 +197,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Creates the triggers that define when the task will run
/// </summary>
/// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- protected abstract IEnumerable<BaseTaskTrigger> GetDefaultTriggers();
+ public abstract IEnumerable<ITaskTrigger> GetDefaultTriggers();
/// <summary>
/// Returns the task to be executed
@@ -314,6 +232,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// The _id
/// </summary>
private Guid? _id;
+
/// <summary>
/// Gets the unique id.
/// </summary>
@@ -352,13 +271,19 @@ namespace MediaBrowser.Common.ScheduledTasks
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
- void trigger_Triggered(object sender, EventArgs e)
+ async void trigger_Triggered(object sender, EventArgs e)
{
- var trigger = (BaseTaskTrigger)sender;
+ var trigger = (ITaskTrigger)sender;
Logger.Info("{0} fired for task: {1}", trigger.GetType().Name, Name);
+ trigger.Stop();
+
TaskManager.QueueScheduledTask(this);
+
+ await Task.Delay(1000).ConfigureAwait(false);
+
+ trigger.Start(false);
}
/// <summary>
@@ -404,10 +329,9 @@ namespace MediaBrowser.Common.ScheduledTasks
status = TaskCompletionStatus.Failed;
}
+ var startTime = CurrentExecutionStartTime;
var endTime = DateTime.UtcNow;
- LogResult(endTime, status);
-
Kernel.TcpManager.SendWebSocketMessage("ScheduledTaskEndExecute", LastExecutionResult);
progress.ProgressChanged -= progress_ProgressChanged;
@@ -415,33 +339,7 @@ namespace MediaBrowser.Common.ScheduledTasks
CurrentCancellationTokenSource = null;
CurrentProgress = null;
- TaskManager.OnTaskCompleted(this);
- }
-
- /// <summary>
- /// Logs the result.
- /// </summary>
- /// <param name="endTime">The end time.</param>
- /// <param name="status">The status.</param>
- private void LogResult(DateTime endTime, TaskCompletionStatus status)
- {
- var startTime = CurrentExecutionStartTime;
- var elapsedTime = endTime - startTime;
-
- Logger.Info("{0} {1} after {2} minute(s) and {3} seconds", Name, status, Math.Truncate(elapsedTime.TotalMinutes), elapsedTime.Seconds);
-
- var result = new TaskResult
- {
- StartTimeUtc = startTime,
- EndTimeUtc = endTime,
- Status = status,
- Name = Name,
- Id = Id
- };
-
- JsonSerializer.SerializeToFile(result, HistoryFilePath);
-
- LastExecutionResult = result;
+ TaskManager.OnTaskCompleted(this, startTime, endTime, status);
}
/// <summary>
@@ -501,7 +399,7 @@ namespace MediaBrowser.Common.ScheduledTasks
if (State == TaskState.Running)
{
- LogResult(DateTime.UtcNow, TaskCompletionStatus.Aborted);
+ TaskManager.OnTaskCompleted(this, CurrentExecutionStartTime, DateTime.UtcNow, TaskCompletionStatus.Aborted);
}
if (CurrentCancellationTokenSource != null)
@@ -519,7 +417,7 @@ namespace MediaBrowser.Common.ScheduledTasks
foreach (var trigger in Triggers)
{
trigger.Triggered -= trigger_Triggered;
- trigger.Dispose();
+ trigger.Stop();
}
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs
deleted file mode 100644
index ed302ed39..000000000
--- a/MediaBrowser.Common/ScheduledTasks/BaseTaskTrigger.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-using System;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.ScheduledTasks
-{
- /// <summary>
- /// Use to indicate that a scheduled task should run
- /// </summary>
- public abstract class BaseTaskTrigger : IDisposable
- {
- /// <summary>
- /// Fires when the trigger condition is satisfied and the task should run
- /// </summary>
- internal event EventHandler<EventArgs> Triggered;
-
- /// <summary>
- /// Called when [triggered].
- /// </summary>
- protected async void OnTriggered()
- {
- Stop();
-
- if (Triggered != null)
- {
- Triggered(this, EventArgs.Empty);
- }
-
- await Task.Delay(1000).ConfigureAwait(false);
-
- Start(false);
- }
-
- /// <summary>
- /// Stars waiting for the trigger action
- /// </summary>
- protected internal abstract void Start(bool isApplicationStartup);
-
- /// <summary>
- /// Stops waiting for the trigger action
- /// </summary>
- protected internal abstract void Stop();
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- if (dispose)
- {
- Stop();
- }
- }
- }
-}
diff --git a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
index fb749f77c..bfecadee7 100644
--- a/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/DailyTrigger.cs
@@ -6,7 +6,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Represents a task trigger that fires everyday
/// </summary>
- public class DailyTrigger : BaseTaskTrigger
+ public class DailyTrigger : ITaskTrigger
{
/// <summary>
/// Get the time of day to trigger the task to run
@@ -24,7 +24,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Stars waiting for the trigger action
/// </summary>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
- protected internal override void Start(bool isApplicationStartup)
+ public void Start(bool isApplicationStartup)
{
DisposeTimer();
@@ -39,33 +39,35 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stops waiting for the trigger action
/// </summary>
- protected internal override void Stop()
+ public void Stop()
{
DisposeTimer();
}
/// <summary>
- /// Disposes this instance.
+ /// Disposes the timer.
/// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected override void Dispose(bool dispose)
+ private void DisposeTimer()
{
- if (dispose)
+ if (Timer != null)
{
- DisposeTimer();
+ Timer.Dispose();
}
-
- base.Dispose(dispose);
}
/// <summary>
- /// Disposes the timer.
+ /// Occurs when [triggered].
/// </summary>
- private void DisposeTimer()
+ public event EventHandler<EventArgs> Triggered;
+
+ /// <summary>
+ /// Called when [triggered].
+ /// </summary>
+ private void OnTriggered()
{
- if (Timer != null)
+ if (Triggered != null)
{
- Timer.Dispose();
+ Triggered(this, EventArgs.Empty);
}
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs
index cba5fc5d0..6f3a3857f 100644
--- a/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs
+++ b/MediaBrowser.Common/ScheduledTasks/IScheduledTask.cs
@@ -14,7 +14,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Gets the triggers.
/// </summary>
/// <value>The triggers.</value>
- IEnumerable<BaseTaskTrigger> Triggers { get; set; }
+ IEnumerable<ITaskTrigger> Triggers { get; set; }
/// <summary>
/// Gets the last execution result.
@@ -75,5 +75,11 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Cancels if running.
/// </summary>
void CancelIfRunning();
+
+ /// <summary>
+ /// Gets the default triggers.
+ /// </summary>
+ /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
+ IEnumerable<ITaskTrigger> GetDefaultTriggers();
}
} \ No newline at end of file
diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs
index 430208869..42d7020e6 100644
--- a/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs
+++ b/MediaBrowser.Common/ScheduledTasks/ITaskManager.cs
@@ -1,4 +1,5 @@
-using System;
+using MediaBrowser.Model.Tasks;
+using System;
using System.Collections.Generic;
namespace MediaBrowser.Common.ScheduledTasks
@@ -41,6 +42,30 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Called when [task completed].
/// </summary>
/// <param name="task">The task.</param>
- void OnTaskCompleted(IScheduledTask task);
+ /// <param name="startTime">The start time.</param>
+ /// <param name="endTime">The end time.</param>
+ /// <param name="status">The status.</param>
+ void OnTaskCompleted(IScheduledTask task, DateTime startTime, DateTime endTime, TaskCompletionStatus status);
+
+ /// <summary>
+ /// Gets the last execution result.
+ /// </summary>
+ /// <param name="task">The task.</param>
+ /// <returns>TaskResult.</returns>
+ TaskResult GetLastExecutionResult(IScheduledTask task);
+
+ /// <summary>
+ /// Loads the triggers.
+ /// </summary>
+ /// <param name="task">The task.</param>
+ /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
+ IEnumerable<ITaskTrigger> LoadTriggers(IScheduledTask task);
+
+ /// <summary>
+ /// Saves the triggers.
+ /// </summary>
+ /// <param name="task">The task.</param>
+ /// <param name="triggers">The triggers.</param>
+ void SaveTriggers(IScheduledTask task, IEnumerable<ITaskTrigger> triggers);
}
} \ No newline at end of file
diff --git a/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs
new file mode 100644
index 000000000..66701650e
--- /dev/null
+++ b/MediaBrowser.Common/ScheduledTasks/ITaskTrigger.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace MediaBrowser.Common.ScheduledTasks
+{
+ /// <summary>
+ /// Interface ITaskTrigger
+ /// </summary>
+ public interface ITaskTrigger
+ {
+ /// <summary>
+ /// Fires when the trigger condition is satisfied and the task should run
+ /// </summary>
+ event EventHandler<EventArgs> Triggered;
+
+ /// <summary>
+ /// Stars waiting for the trigger action
+ /// </summary>
+ /// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
+ void Start(bool isApplicationStartup);
+
+ /// <summary>
+ /// Stops waiting for the trigger action
+ /// </summary>
+ void Stop();
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
index 759447b10..cac6d1fa3 100644
--- a/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/IntervalTrigger.cs
@@ -6,7 +6,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Represents a task trigger that runs repeatedly on an interval
/// </summary>
- public class IntervalTrigger : BaseTaskTrigger
+ public class IntervalTrigger : ITaskTrigger
{
/// <summary>
/// Gets or sets the interval.
@@ -24,7 +24,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Stars waiting for the trigger action
/// </summary>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
- protected internal override void Start(bool isApplicationStartup)
+ public void Start(bool isApplicationStartup)
{
DisposeTimer();
@@ -34,33 +34,35 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stops waiting for the trigger action
/// </summary>
- protected internal override void Stop()
+ public void Stop()
{
DisposeTimer();
}
/// <summary>
- /// Disposes this instance.
+ /// Disposes the timer.
/// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected override void Dispose(bool dispose)
+ private void DisposeTimer()
{
- if (dispose)
+ if (Timer != null)
{
- DisposeTimer();
+ Timer.Dispose();
}
-
- base.Dispose(dispose);
}
/// <summary>
- /// Disposes the timer.
+ /// Occurs when [triggered].
/// </summary>
- private void DisposeTimer()
+ public event EventHandler<EventArgs> Triggered;
+
+ /// <summary>
+ /// Called when [triggered].
+ /// </summary>
+ private void OnTriggered()
{
- if (Timer != null)
+ if (Triggered != null)
{
- Timer.Dispose();
+ Triggered(this, EventArgs.Empty);
}
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
index 9942da17f..e67eb3626 100644
--- a/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
+++ b/MediaBrowser.Common/ScheduledTasks/ScheduledTaskHelpers.cs
@@ -35,7 +35,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// </summary>
/// <param name="trigger">The trigger.</param>
/// <returns>TaskTriggerInfo.</returns>
- public static TaskTriggerInfo GetTriggerInfo(BaseTaskTrigger trigger)
+ public static TaskTriggerInfo GetTriggerInfo(ITaskTrigger trigger)
{
var info = new TaskTriggerInfo
{
@@ -81,7 +81,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <returns>BaseTaskTrigger.</returns>
/// <exception cref="System.ArgumentNullException"></exception>
/// <exception cref="System.ArgumentException">Invalid trigger type: + info.Type</exception>
- public static BaseTaskTrigger GetTrigger(TaskTriggerInfo info)
+ public static ITaskTrigger GetTrigger(TaskTriggerInfo info)
{
if (info.Type.Equals(typeof(DailyTrigger).Name, StringComparison.OrdinalIgnoreCase))
{
diff --git a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
index a254d2be9..e48551425 100644
--- a/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/StartupTrigger.cs
@@ -1,17 +1,18 @@
-using System.Threading.Tasks;
+using System;
+using System.Threading.Tasks;
namespace MediaBrowser.Common.ScheduledTasks
{
/// <summary>
/// Class StartupTaskTrigger
/// </summary>
- public class StartupTrigger : BaseTaskTrigger
+ public class StartupTrigger : ITaskTrigger
{
/// <summary>
/// Stars waiting for the trigger action
/// </summary>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
- protected internal async override void Start(bool isApplicationStartup)
+ public async void Start(bool isApplicationStartup)
{
if (isApplicationStartup)
{
@@ -24,8 +25,24 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stops waiting for the trigger action
/// </summary>
- protected internal override void Stop()
+ public void Stop()
{
}
+
+ /// <summary>
+ /// Occurs when [triggered].
+ /// </summary>
+ public event EventHandler<EventArgs> Triggered;
+
+ /// <summary>
+ /// Called when [triggered].
+ /// </summary>
+ private void OnTriggered()
+ {
+ if (Triggered != null)
+ {
+ Triggered(this, EventArgs.Empty);
+ }
+ }
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
index 45d1fae8e..751da0ca5 100644
--- a/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/SystemEventTrigger.cs
@@ -1,5 +1,6 @@
using MediaBrowser.Model.Tasks;
using Microsoft.Win32;
+using System;
using System.Threading.Tasks;
namespace MediaBrowser.Common.ScheduledTasks
@@ -7,7 +8,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Class SystemEventTrigger
/// </summary>
- public class SystemEventTrigger : BaseTaskTrigger
+ public class SystemEventTrigger : ITaskTrigger
{
/// <summary>
/// Gets or sets the system event.
@@ -19,7 +20,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Stars waiting for the trigger action
/// </summary>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
- protected internal override void Start(bool isApplicationStartup)
+ public void Start(bool isApplicationStartup)
{
switch (SystemEvent)
{
@@ -32,7 +33,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stops waiting for the trigger action
/// </summary>
- protected internal override void Stop()
+ public void Stop()
{
SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
}
@@ -52,5 +53,21 @@ namespace MediaBrowser.Common.ScheduledTasks
OnTriggered();
}
}
+
+ /// <summary>
+ /// Occurs when [triggered].
+ /// </summary>
+ public event EventHandler<EventArgs> Triggered;
+
+ /// <summary>
+ /// Called when [triggered].
+ /// </summary>
+ private void OnTriggered()
+ {
+ if (Triggered != null)
+ {
+ Triggered(this, EventArgs.Empty);
+ }
+ }
}
}
diff --git a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs b/MediaBrowser.Common/ScheduledTasks/TaskManager.cs
deleted file mode 100644
index 946c42d2e..000000000
--- a/MediaBrowser.Common/ScheduledTasks/TaskManager.cs
+++ /dev/null
@@ -1,159 +0,0 @@
-using MediaBrowser.Model.Logging;
-using MediaBrowser.Model.Tasks;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace MediaBrowser.Common.ScheduledTasks
-{
- /// <summary>
- /// Class TaskManager
- /// </summary>
- internal class TaskManager : ITaskManager
- {
- /// <summary>
- /// Gets the list of Scheduled Tasks
- /// </summary>
- /// <value>The scheduled tasks.</value>
- public IScheduledTask[] ScheduledTasks { get; private set; }
-
- /// <summary>
- /// The _task queue
- /// </summary>
- private readonly List<Type> _taskQueue = new List<Type>();
-
- /// <summary>
- /// The _logger
- /// </summary>
- private readonly ILogger _logger;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="TaskManager" /> class.
- /// </summary>
- /// <param name="logger">The logger.</param>
- public TaskManager(ILogger logger)
- {
- if (logger == null)
- {
- throw new ArgumentException("logger");
- }
-
- _logger = logger;
-
- ScheduledTasks = new IScheduledTask[] {};
- }
-
- /// <summary>
- /// Cancels if running and queue.
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public void CancelIfRunningAndQueue<T>()
- where T : IScheduledTask
- {
- ScheduledTasks.OfType<T>().First().CancelIfRunning();
- QueueScheduledTask<T>();
- }
-
- /// <summary>
- /// Queues the scheduled task.
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public void QueueScheduledTask<T>()
- where T : IScheduledTask
- {
- var scheduledTask = ScheduledTasks.OfType<T>().First();
-
- QueueScheduledTask(scheduledTask);
- }
-
- /// <summary>
- /// Queues the scheduled task.
- /// </summary>
- /// <param name="task">The task.</param>
- public void QueueScheduledTask(IScheduledTask task)
- {
- var type = task.GetType();
-
- var scheduledTask = ScheduledTasks.First(t => t.GetType() == type);
-
- lock (_taskQueue)
- {
- // If it's idle just execute immediately
- if (scheduledTask.State == TaskState.Idle)
- {
- scheduledTask.Execute();
- return;
- }
-
- if (!_taskQueue.Contains(type))
- {
- _logger.Info("Queueing task {0}", type.Name);
- _taskQueue.Add(type);
- }
- else
- {
- _logger.Info("Task already queued: {0}", type.Name);
- }
- }
- }
-
- /// <summary>
- /// Called when [task completed].
- /// </summary>
- /// <param name="task">The task.</param>
- public void OnTaskCompleted(IScheduledTask task)
- {
- // Execute queued tasks
- lock (_taskQueue)
- {
- var copy = _taskQueue.ToList();
-
- foreach (var type in copy)
- {
- var scheduledTask = ScheduledTasks.First(t => t.GetType() == type);
-
- if (scheduledTask.State == TaskState.Idle)
- {
- scheduledTask.Execute();
-
- _taskQueue.Remove(type);
- }
- }
- }
- }
-
- /// <summary>
- /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
- /// </summary>
- public void Dispose()
- {
- Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- /// <summary>
- /// Releases unmanaged and - optionally - managed resources.
- /// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected virtual void Dispose(bool dispose)
- {
- foreach (var task in ScheduledTasks)
- {
- task.Dispose();
- }
- }
-
- /// <summary>
- /// Adds the tasks.
- /// </summary>
- /// <param name="tasks">The tasks.</param>
- public void AddTasks(IEnumerable<IScheduledTask> tasks)
- {
- var myTasks = ScheduledTasks.ToList();
-
- myTasks.AddRange(tasks);
-
- ScheduledTasks = myTasks.ToArray();
- }
- }
-}
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
deleted file mode 100644
index b06134ee2..000000000
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteCacheFileTask.cs
+++ /dev/null
@@ -1,118 +0,0 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.ScheduledTasks.Tasks
-{
- /// <summary>
- /// Deletes old cache files
- /// </summary>
- public class DeleteCacheFileTask : BaseScheduledTask<IKernel>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="DeleteCacheFileTask" /> class.
- /// </summary>
- /// <param name="kernel">The kernel.</param>
- /// <param name="taskManager">The task manager.</param>
- /// <param name="logger">The logger.</param>
- public DeleteCacheFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
- : base(kernel, taskManager, logger)
- {
- }
-
- /// <summary>
- /// Creates the triggers that define when the task will run
- /// </summary>
- /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers()
- {
- var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(2) }; //2am
-
- return new[] { trigger };
- }
-
- /// <summary>
- /// Returns the task to be executed
- /// </summary>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <param name="progress">The progress.</param>
- /// <returns>Task.</returns>
- protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
- {
- return Task.Run(() =>
- {
- var minDateModified = DateTime.UtcNow.AddMonths(-2);
-
- DeleteCacheFilesFromDirectory(cancellationToken, Kernel.ApplicationPaths.CachePath, minDateModified, progress);
- });
- }
-
-
- /// <summary>
- /// Deletes the cache files from directory with a last write time less than a given date
- /// </summary>
- /// <param name="cancellationToken">The task cancellation token.</param>
- /// <param name="directory">The directory.</param>
- /// <param name="minDateModified">The min date modified.</param>
- /// <param name="progress">The progress.</param>
- private void DeleteCacheFilesFromDirectory(CancellationToken cancellationToken, string directory, DateTime minDateModified, IProgress<double> progress)
- {
- var filesToDelete = new DirectoryInfo(directory).EnumerateFileSystemInfos("*", SearchOption.AllDirectories)
- .Where(f => !f.Attributes.HasFlag(FileAttributes.Directory) && f.LastWriteTimeUtc < minDateModified)
- .ToList();
-
- var index = 0;
-
- foreach (var file in filesToDelete)
- {
- double percent = index;
- percent /= filesToDelete.Count;
-
- progress.Report(100 * percent);
-
- cancellationToken.ThrowIfCancellationRequested();
-
- File.Delete(file.FullName);
-
- index++;
- }
-
- progress.Report(100);
- }
-
- /// <summary>
- /// Gets the name of the task
- /// </summary>
- /// <value>The name.</value>
- public override string Name
- {
- get { return "Cache file cleanup"; }
- }
-
- /// <summary>
- /// Gets the description.
- /// </summary>
- /// <value>The description.</value>
- public override string Description
- {
- get { return "Deletes cache files no longer needed by the system"; }
- }
-
- /// <summary>
- /// Gets the category.
- /// </summary>
- /// <value>The category.</value>
- public override string Category
- {
- get
- {
- return "Maintenance";
- }
- }
- }
-}
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs
deleted file mode 100644
index 0b243cb10..000000000
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/DeleteLogFileTask.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.ScheduledTasks.Tasks
-{
- /// <summary>
- /// Deletes old log files
- /// </summary>
- public class DeleteLogFileTask : BaseScheduledTask<IKernel>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="DeleteLogFileTask" /> class.
- /// </summary>
- /// <param name="kernel">The kernel.</param>
- /// <param name="taskManager">The task manager.</param>
- /// <param name="logger">The logger.</param>
- public DeleteLogFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
- : base(kernel, taskManager, logger)
- {
- }
-
- /// <summary>
- /// Creates the triggers that define when the task will run
- /// </summary>
- /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers()
- {
- var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(2) }; //2am
-
- return new[] { trigger };
- }
-
- /// <summary>
- /// Returns the task to be executed
- /// </summary>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <param name="progress">The progress.</param>
- /// <returns>Task.</returns>
- protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
- {
- return Task.Run(() =>
- {
- // Delete log files more than n days old
- var minDateModified = DateTime.UtcNow.AddDays(-(Kernel.Configuration.LogFileRetentionDays));
-
- var filesToDelete = new DirectoryInfo(Kernel.ApplicationPaths.LogDirectoryPath).EnumerateFileSystemInfos("*", SearchOption.AllDirectories)
- .Where(f => f.LastWriteTimeUtc < minDateModified)
- .ToList();
-
- var index = 0;
-
- foreach (var file in filesToDelete)
- {
- double percent = index;
- percent /= filesToDelete.Count;
-
- progress.Report(100 * percent);
-
- cancellationToken.ThrowIfCancellationRequested();
-
- File.Delete(file.FullName);
-
- index++;
- }
-
- progress.Report(100);
- });
- }
-
- /// <summary>
- /// Gets the name of the task
- /// </summary>
- /// <value>The name.</value>
- public override string Name
- {
- get { return "Log file cleanup"; }
- }
-
- /// <summary>
- /// Gets the description.
- /// </summary>
- /// <value>The description.</value>
- public override string Description
- {
- get { return string.Format("Deletes log files that are more than {0} days old.", Kernel.Configuration.LogFileRetentionDays); }
- }
-
- /// <summary>
- /// Gets the category.
- /// </summary>
- /// <value>The category.</value>
- public override string Category
- {
- get
- {
- return "Maintenance";
- }
- }
- }
-}
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs
deleted file mode 100644
index 35cbe98f1..000000000
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/ReloadLoggerTask.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.ScheduledTasks.Tasks
-{
- /// <summary>
- /// Class ReloadLoggerFileTask
- /// </summary>
- public class ReloadLoggerFileTask : BaseScheduledTask<IKernel>
- {
- /// <summary>
- /// Initializes a new instance of the <see cref="ReloadLoggerFileTask" /> class.
- /// </summary>
- /// <param name="kernel">The kernel.</param>
- /// <param name="taskManager">The task manager.</param>
- /// <param name="logger">The logger.</param>
- public ReloadLoggerFileTask(IKernel kernel, ITaskManager taskManager, ILogger logger)
- : base(kernel, taskManager, logger)
- {
- }
-
- /// <summary>
- /// Gets the default triggers.
- /// </summary>
- /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers()
- {
- var trigger = new DailyTrigger { TimeOfDay = TimeSpan.FromHours(0) }; //12am
-
- return new[] { trigger };
- }
-
- /// <summary>
- /// Executes the internal.
- /// </summary>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <param name="progress">The progress.</param>
- /// <returns>Task.</returns>
- protected override Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
- {
- cancellationToken.ThrowIfCancellationRequested();
-
- progress.Report(0);
-
- return Task.Run(() => Kernel.ReloadLogger());
- }
-
- /// <summary>
- /// Gets the name.
- /// </summary>
- /// <value>The name.</value>
- public override string Name
- {
- get { return "Start new log file"; }
- }
-
- /// <summary>
- /// Gets the description.
- /// </summary>
- /// <value>The description.</value>
- public override string Description
- {
- get { return "Moves logging to a new file to help reduce log file sizes."; }
- }
- }
-}
diff --git a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs b/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs
deleted file mode 100644
index f02293a5e..000000000
--- a/MediaBrowser.Common/ScheduledTasks/Tasks/SystemUpdateTask.cs
+++ /dev/null
@@ -1,121 +0,0 @@
-using MediaBrowser.Common.Kernel;
-using MediaBrowser.Model.Logging;
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-
-namespace MediaBrowser.Common.ScheduledTasks.Tasks
-{
- /// <summary>
- /// Plugin Update Task
- /// </summary>
- public class SystemUpdateTask : BaseScheduledTask<IKernel>
- {
- /// <summary>
- /// The _app host
- /// </summary>
- private readonly IApplicationHost _appHost;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="SystemUpdateTask" /> class.
- /// </summary>
- /// <param name="appHost">The app host.</param>
- /// <param name="taskManager">The task manager.</param>
- /// <param name="kernel">The kernel.</param>
- /// <param name="logger">The logger.</param>
- public SystemUpdateTask(IApplicationHost appHost, ITaskManager taskManager, IKernel kernel, ILogger logger)
- : base(kernel, taskManager, logger)
- {
- _appHost = appHost;
- }
-
- /// <summary>
- /// Creates the triggers that define when the task will run
- /// </summary>
- /// <returns>IEnumerable{BaseTaskTrigger}.</returns>
- protected override IEnumerable<BaseTaskTrigger> GetDefaultTriggers()
- {
- return new BaseTaskTrigger[] {
-
- // 1am
- new DailyTrigger { TimeOfDay = TimeSpan.FromHours(1) },
-
- new IntervalTrigger { Interval = TimeSpan.FromHours(2)}
- };
- }
-
- /// <summary>
- /// Returns the task to be executed
- /// </summary>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <param name="progress">The progress.</param>
- /// <returns>Task.</returns>
- protected override async Task ExecuteInternal(CancellationToken cancellationToken, IProgress<double> progress)
- {
- if (!_appHost.CanSelfUpdate) return;
-
- EventHandler<double> innerProgressHandler = (sender, e) => progress.Report(e * .1);
-
- // Create a progress object for the update check
- var innerProgress = new Progress<double>();
- innerProgress.ProgressChanged += innerProgressHandler;
-
- var updateInfo = await _appHost.CheckForApplicationUpdate(cancellationToken, innerProgress).ConfigureAwait(false);
-
- // Release the event handler
- innerProgress.ProgressChanged -= innerProgressHandler;
-
- progress.Report(10);
-
- if (!updateInfo.IsUpdateAvailable)
- {
- progress.Report(100);
- return;
- }
-
- cancellationToken.ThrowIfCancellationRequested();
-
- if (Kernel.Configuration.EnableAutoUpdate)
- {
- Logger.Info("Update Revision {0} available. Updating...", updateInfo.AvailableVersion);
-
- innerProgressHandler = (sender, e) => progress.Report((e * .9) + .1);
-
- innerProgress = new Progress<double>();
- innerProgress.ProgressChanged += innerProgressHandler;
-
- await _appHost.UpdateApplication(cancellationToken, innerProgress).ConfigureAwait(false);
-
- // Release the event handler
- innerProgress.ProgressChanged -= innerProgressHandler;
-
- Kernel.OnApplicationUpdated(updateInfo.AvailableVersion);
- }
- else
- {
- Logger.Info("A new version of Media Browser is available.");
- }
-
- progress.Report(100);
- }
-
- /// <summary>
- /// Gets the name of the task
- /// </summary>
- /// <value>The name.</value>
- public override string Name
- {
- get { return "Check for application updates"; }
- }
-
- /// <summary>
- /// Gets the description.
- /// </summary>
- /// <value>The description.</value>
- public override string Description
- {
- get { return "Downloads and installs application updates."; }
- }
- }
-}
diff --git a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
index afeacc2b3..cfb3f1fab 100644
--- a/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
+++ b/MediaBrowser.Common/ScheduledTasks/WeeklyTrigger.cs
@@ -6,7 +6,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Represents a task trigger that fires on a weekly basis
/// </summary>
- public class WeeklyTrigger : BaseTaskTrigger
+ public class WeeklyTrigger : ITaskTrigger
{
/// <summary>
/// Get the time of day to trigger the task to run
@@ -30,7 +30,7 @@ namespace MediaBrowser.Common.ScheduledTasks
/// Stars waiting for the trigger action
/// </summary>
/// <param name="isApplicationStartup">if set to <c>true</c> [is application startup].</param>
- protected internal override void Start(bool isApplicationStartup)
+ public void Start(bool isApplicationStartup)
{
DisposeTimer();
@@ -69,33 +69,35 @@ namespace MediaBrowser.Common.ScheduledTasks
/// <summary>
/// Stops waiting for the trigger action
/// </summary>
- protected internal override void Stop()
+ public void Stop()
{
DisposeTimer();
}
/// <summary>
- /// Disposes this instance.
+ /// Disposes the timer.
/// </summary>
- /// <param name="dispose"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
- protected override void Dispose(bool dispose)
+ private void DisposeTimer()
{
- if (dispose)
+ if (Timer != null)
{
- DisposeTimer();
+ Timer.Dispose();
}
-
- base.Dispose(dispose);
}
/// <summary>
- /// Disposes the timer.
+ /// Occurs when [triggered].
/// </summary>
- private void DisposeTimer()
+ public event EventHandler<EventArgs> Triggered;
+
+ /// <summary>
+ /// Called when [triggered].
+ /// </summary>
+ private void OnTriggered()
{
- if (Timer != null)
+ if (Triggered != null)
{
- Timer.Dispose();
+ Triggered(this, EventArgs.Empty);
}
}
}