From 221b5afb8bbd6303974b1949e5dc9a8eac21732b Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 8 Apr 2020 21:57:13 +0200 Subject: [PATCH] Implementing scheduled tasks --- Kyoo/Controllers/TaskManager.cs | 52 +++++++++++++++++++++++++-------- Kyoo/appsettings.json | 4 +++ 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/Kyoo/Controllers/TaskManager.cs b/Kyoo/Controllers/TaskManager.cs index d63dfb0a..43a04593 100644 --- a/Kyoo/Controllers/TaskManager.cs +++ b/Kyoo/Controllers/TaskManager.cs @@ -5,6 +5,7 @@ using System.Threading; using System.Threading.Tasks; using Kyoo.Models; using Kyoo.Tasks; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; namespace Kyoo.Controllers @@ -13,16 +14,18 @@ namespace Kyoo.Controllers { private readonly IServiceProvider _serviceProvider; private readonly IPluginManager _pluginManager; + private readonly IConfiguration _configuration; - private List _tasks = new List(); + private List<(ITask task, DateTime scheduledDate)> _tasks = new List<(ITask, DateTime)>(); private CancellationTokenSource _taskToken = new CancellationTokenSource(); private ITask _runningTask; private Queue<(ITask, string)> _queuedTasks = new Queue<(ITask, string)>(); - public TaskManager(IServiceProvider serviceProvider, IPluginManager pluginManager) + public TaskManager(IServiceProvider serviceProvider, IPluginManager pluginManager, IConfiguration configuration) { _serviceProvider = serviceProvider; _pluginManager = pluginManager; + _configuration = configuration; } protected override async Task ExecuteAsync(CancellationToken cancellationToken) @@ -37,16 +40,28 @@ namespace Kyoo.Controllers } else { - - await Task.Delay(1000_000, cancellationToken); + await Task.Delay(10, cancellationToken); + QueueScheduledTasks(); } } } + private void QueueScheduledTasks() + { + List tasksToQueue = _tasks.Where(x => x.scheduledDate <= DateTime.Now) + .Select(x => x.task.Slug).ToList(); + foreach (string task in tasksToQueue) + StartTask(task); + } + public override Task StartAsync(CancellationToken cancellationToken) { ReloadTask(); - foreach (ITask task in _tasks.Where(x => x.RunOnStartup && x.Priority != Int32.MaxValue).OrderByDescending(x => x.Priority)) + + IEnumerable startupTasks = _tasks.Select(x => x.task) + .Where(x => x.RunOnStartup && x.Priority != Int32.MaxValue) + .OrderByDescending(x => x.Priority); + foreach (ITask task in startupTasks) _queuedTasks.Enqueue((task, null)); return base.StartAsync(cancellationToken); } @@ -59,12 +74,21 @@ namespace Kyoo.Controllers public bool StartTask(string taskSlug, string arguments = null) { - ITask task = _tasks.FirstOrDefault(x => x.Slug == taskSlug); - if (task == null) + int index = _tasks.FindIndex(x => x.task.Slug == taskSlug); + if (index == -1) return false; - _queuedTasks.Enqueue((task, arguments)); + _queuedTasks.Enqueue((_tasks[index].task, arguments)); + _tasks[index] = (_tasks[index].task, DateTime.Now + GetTaskDelay(taskSlug)); return true; } + + public TimeSpan GetTaskDelay(string taskSlug) + { + TimeSpan delay = _configuration.GetSection("scheduledTasks").GetValue(taskSlug); + if (delay == default) + delay = TimeSpan.FromDays(365); + return delay; + } public ITask GetRunningTask() { @@ -74,16 +98,20 @@ namespace Kyoo.Controllers public void ReloadTask() { _tasks.Clear(); - _tasks.AddRange(CoreTaskHolder.Tasks); - foreach (ITask task in _tasks.Where(x => x.RunOnStartup && x.Priority == Int32.MaxValue)) + _tasks.AddRange(CoreTaskHolder.Tasks.Select(x => (x, DateTime.Now + GetTaskDelay(x.Slug)))); + + IEnumerable prerunTasks = _tasks.Select(x => x.task) + .Where(x => x.RunOnStartup && x.Priority == Int32.MaxValue); + + foreach (ITask task in prerunTasks) task.Run(_serviceProvider, _taskToken.Token); foreach (IPlugin plugin in _pluginManager.GetAllPlugins()) - _tasks.AddRange(plugin.Tasks); + _tasks.AddRange(plugin.Tasks.Select(x => (x, DateTime.Now + GetTaskDelay(x.Slug)))); } public IEnumerable GetAllTasks() { - return _tasks; + return _tasks.Select(x => x.task); } } } \ No newline at end of file diff --git a/Kyoo/appsettings.json b/Kyoo/appsettings.json index b6d4015d..73f5338a 100644 --- a/Kyoo/appsettings.json +++ b/Kyoo/appsettings.json @@ -14,6 +14,10 @@ "Database": "Data Source=kyoo.db" }, + "scheduledTasks": { + "scan": "24:00:00" + }, + "certificatePassword": "passphrase", "transmuxTempPath": "cached/kyoo/transmux",