From f00d1ec4e93da2dd80cbbd9dd099f0dc1746cd1e Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 8 Apr 2020 02:27:22 +0200 Subject: [PATCH] Allowing tasks to take parameters --- Kyoo.Common/Controllers/ITaskManager.cs | 2 +- Kyoo.Common/Models/Task.cs | 2 +- Kyoo/Controllers/TaskManager.cs | 15 +++++++++------ Kyoo/Tasks/Crawler.cs | 5 ++++- Kyoo/Tasks/CreateDatabase.cs | 2 +- Kyoo/Tasks/PluginLoader.cs | 2 +- Kyoo/Views/API/TaskAPI.cs | 8 ++++---- 7 files changed, 21 insertions(+), 15 deletions(-) diff --git a/Kyoo.Common/Controllers/ITaskManager.cs b/Kyoo.Common/Controllers/ITaskManager.cs index 7dbe36ea..88e796fb 100644 --- a/Kyoo.Common/Controllers/ITaskManager.cs +++ b/Kyoo.Common/Controllers/ITaskManager.cs @@ -2,7 +2,7 @@ namespace Kyoo.Controllers { public interface ITaskManager { - bool StartTask(string taskSlug); + bool StartTask(string taskSlug, string arguments = null); void ReloadTask(); } diff --git a/Kyoo.Common/Models/Task.cs b/Kyoo.Common/Models/Task.cs index 55820483..998ce4e6 100644 --- a/Kyoo.Common/Models/Task.cs +++ b/Kyoo.Common/Models/Task.cs @@ -12,6 +12,6 @@ namespace Kyoo.Models public string HelpMessage { get; } public bool RunOnStartup { get; } public int Priority { get; } - public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken); + public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null); } } \ No newline at end of file diff --git a/Kyoo/Controllers/TaskManager.cs b/Kyoo/Controllers/TaskManager.cs index 958394f8..ce8ad216 100644 --- a/Kyoo/Controllers/TaskManager.cs +++ b/Kyoo/Controllers/TaskManager.cs @@ -16,7 +16,7 @@ namespace Kyoo.Controllers private List _tasks = new List(); private CancellationTokenSource _taskToken = new CancellationTokenSource(); - private Queue _queuedTasks = new Queue(); + private Queue<(ITask, string)> _queuedTasks = new Queue<(ITask, string)>(); public TaskManager(IServiceProvider serviceProvider, IPluginManager pluginManager) { @@ -29,9 +29,12 @@ namespace Kyoo.Controllers while (!cancellationToken.IsCancellationRequested) { if (_queuedTasks.Any()) - await _queuedTasks.Dequeue().Run(_serviceProvider, _taskToken.Token); + { + (ITask task, string arguments) = _queuedTasks.Dequeue(); + await task.Run(_serviceProvider, _taskToken.Token, arguments); + } else - await Task.Delay(10); + await Task.Delay(1000, cancellationToken); } } @@ -39,7 +42,7 @@ namespace Kyoo.Controllers { ReloadTask(); foreach (ITask task in _tasks.Where(x => x.RunOnStartup && x.Priority != Int32.MaxValue).OrderByDescending(x => x.Priority)) - _queuedTasks.Enqueue(task); + _queuedTasks.Enqueue((task, null)); return base.StartAsync(cancellationToken); } @@ -49,12 +52,12 @@ namespace Kyoo.Controllers return base.StopAsync(cancellationToken); } - public bool StartTask(string taskSlug) + public bool StartTask(string taskSlug, string arguments = null) { ITask task = _tasks.FirstOrDefault(x => x.Slug == taskSlug); if (task == null) return false; - _queuedTasks.Enqueue(task); + _queuedTasks.Enqueue((task, arguments)); return true; } diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index e6f2cbb0..e65fb15a 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -27,7 +27,7 @@ namespace Kyoo.Controllers private IConfiguration _config; - public async Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken) + public async Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string argument = null) { using IServiceScope serviceScope = serviceProvider.CreateScope(); _libraryManager = serviceScope.ServiceProvider.GetService(); @@ -40,6 +40,9 @@ namespace Kyoo.Controllers IEnumerable episodes = _libraryManager.GetAllEpisodes(); IEnumerable libraries = _libraryManager.GetLibraries(); + if (argument != null) + libraries = libraries.Where(x => x.Slug == argument); + foreach (Episode episode in episodes) { if (!File.Exists(episode.Path)) diff --git a/Kyoo/Tasks/CreateDatabase.cs b/Kyoo/Tasks/CreateDatabase.cs index cd5394fb..bc6e00df 100644 --- a/Kyoo/Tasks/CreateDatabase.cs +++ b/Kyoo/Tasks/CreateDatabase.cs @@ -20,7 +20,7 @@ namespace Kyoo.Tasks public bool RunOnStartup => true; public int Priority => Int32.MaxValue; - public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken) + public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null) { using IServiceScope serviceScope = serviceProvider.CreateScope(); DatabaseContext databaseContext = serviceScope.ServiceProvider.GetService(); diff --git a/Kyoo/Tasks/PluginLoader.cs b/Kyoo/Tasks/PluginLoader.cs index 8efdcabd..af610cfe 100644 --- a/Kyoo/Tasks/PluginLoader.cs +++ b/Kyoo/Tasks/PluginLoader.cs @@ -15,7 +15,7 @@ namespace Kyoo.Tasks public string HelpMessage => null; public bool RunOnStartup => true; public int Priority => Int32.MaxValue; - public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken) + public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null) { using IServiceScope serviceScope = serviceProvider.CreateScope(); IPluginManager pluginManager = serviceScope.ServiceProvider.GetService(); diff --git a/Kyoo/Views/API/TaskAPI.cs b/Kyoo/Views/API/TaskAPI.cs index 67f210a3..7de23d36 100644 --- a/Kyoo/Views/API/TaskAPI.cs +++ b/Kyoo/Views/API/TaskAPI.cs @@ -16,11 +16,11 @@ namespace Kyoo.Api } - [HttpGet("{taskSlug}")] - [Authorize(Policy="Admin")] - public IActionResult RunTask(string taskSlug) + [HttpGet("{taskSlug}/{args?}")] + // [Authorize(Policy="Admin")] + public IActionResult RunTask(string taskSlug, string args = null) { - if (_taskManager.StartTask(taskSlug)) + if (_taskManager.StartTask(taskSlug, args)) return Ok(); return NotFound(); }