| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 | using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using Jellyfin.Api.Constants;using MediaBrowser.Model.Tasks;using Microsoft.AspNetCore.Authorization;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;namespace Jellyfin.Api.Controllers{    /// <summary>    /// Scheduled Tasks Controller.    /// </summary>    [Authorize(Policy = Policies.RequiresElevation)]    public class ScheduledTasksController : BaseJellyfinApiController    {        private readonly ITaskManager _taskManager;        /// <summary>        /// Initializes a new instance of the <see cref="ScheduledTasksController"/> class.        /// </summary>        /// <param name="taskManager">Instance of the <see cref="ITaskManager"/> interface.</param>        public ScheduledTasksController(ITaskManager taskManager)        {            _taskManager = taskManager;        }        /// <summary>        /// Get tasks.        /// </summary>        /// <param name="isHidden">Optional filter tasks that are hidden, or not.</param>        /// <param name="isEnabled">Optional filter tasks that are enabled, or not.</param>        /// <response code="200">Scheduled tasks retrieved.</response>        /// <returns>The list of scheduled tasks.</returns>        [HttpGet]        [ProducesResponseType(StatusCodes.Status200OK)]        public IEnumerable<TaskInfo> GetTasks(            [FromQuery] bool? isHidden,            [FromQuery] bool? isEnabled)        {            IEnumerable<IScheduledTaskWorker> tasks = _taskManager.ScheduledTasks.OrderBy(o => o.Name);            foreach (var task in tasks)            {                if (task.ScheduledTask is IConfigurableScheduledTask scheduledTask)                {                    if (isHidden.HasValue && isHidden.Value != scheduledTask.IsHidden)                    {                        continue;                    }                    if (isEnabled.HasValue && isEnabled.Value != scheduledTask.IsEnabled)                    {                        continue;                    }                }                yield return ScheduledTaskHelpers.GetTaskInfo(task);            }        }        /// <summary>        /// Get task by id.        /// </summary>        /// <param name="taskId">Task Id.</param>        /// <response code="200">Task retrieved.</response>        /// <response code="404">Task not found.</response>        /// <returns>An <see cref="OkResult"/> containing the task on success, or a <see cref="NotFoundResult"/> if the task could not be found.</returns>        [HttpGet("{taskId}")]        [ProducesResponseType(StatusCodes.Status200OK)]        [ProducesResponseType(StatusCodes.Status404NotFound)]        public ActionResult<TaskInfo> GetTask([FromRoute, Required] string taskId)        {            var task = _taskManager.ScheduledTasks.FirstOrDefault(i =>                string.Equals(i.Id, taskId, StringComparison.OrdinalIgnoreCase));            if (task == null)            {                return NotFound();            }            return ScheduledTaskHelpers.GetTaskInfo(task);        }        /// <summary>        /// Start specified task.        /// </summary>        /// <param name="taskId">Task Id.</param>        /// <response code="204">Task started.</response>        /// <response code="404">Task not found.</response>        /// <returns>An <see cref="NoContentResult"/> on success, or a <see cref="NotFoundResult"/> if the file could not be found.</returns>        [HttpPost("Running/{taskId}")]        [ProducesResponseType(StatusCodes.Status204NoContent)]        [ProducesResponseType(StatusCodes.Status404NotFound)]        public ActionResult StartTask([FromRoute, Required] string taskId)        {            var task = _taskManager.ScheduledTasks.FirstOrDefault(o =>                o.Id.Equals(taskId, StringComparison.OrdinalIgnoreCase));            if (task == null)            {                return NotFound();            }            _taskManager.Execute(task, new TaskOptions());            return NoContent();        }        /// <summary>        /// Stop specified task.        /// </summary>        /// <param name="taskId">Task Id.</param>        /// <response code="204">Task stopped.</response>        /// <response code="404">Task not found.</response>        /// <returns>An <see cref="OkResult"/> on success, or a <see cref="NotFoundResult"/> if the file could not be found.</returns>        [HttpDelete("Running/{taskId}")]        [ProducesResponseType(StatusCodes.Status204NoContent)]        [ProducesResponseType(StatusCodes.Status404NotFound)]        public ActionResult StopTask([FromRoute, Required] string taskId)        {            var task = _taskManager.ScheduledTasks.FirstOrDefault(o =>                o.Id.Equals(taskId, StringComparison.OrdinalIgnoreCase));            if (task == null)            {                return NotFound();            }            _taskManager.Cancel(task);            return NoContent();        }        /// <summary>        /// Update specified task triggers.        /// </summary>        /// <param name="taskId">Task Id.</param>        /// <param name="triggerInfos">Triggers.</param>        /// <response code="204">Task triggers updated.</response>        /// <response code="404">Task not found.</response>        /// <returns>An <see cref="OkResult"/> on success, or a <see cref="NotFoundResult"/> if the file could not be found.</returns>        [HttpPost("{taskId}/Triggers")]        [ProducesResponseType(StatusCodes.Status204NoContent)]        [ProducesResponseType(StatusCodes.Status404NotFound)]        public ActionResult UpdateTask(            [FromRoute, Required] string taskId,            [FromBody, Required] TaskTriggerInfo[] triggerInfos)        {            var task = _taskManager.ScheduledTasks.FirstOrDefault(o =>                o.Id.Equals(taskId, StringComparison.OrdinalIgnoreCase));            if (task == null)            {                return NotFound();            }            task.Triggers = triggerInfos;            return NoContent();        }    }}
 |