using System.Collections.Generic; using Nancy; using NzbDrone.Core.Download; using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.Queue; using Readarr.Http; using Readarr.Http.Extensions; using Readarr.Http.REST; namespace Readarr.Api.V1.Queue { public class QueueActionModule : ReadarrRestModule { private readonly IQueueService _queueService; private readonly ITrackedDownloadService _trackedDownloadService; private readonly IFailedDownloadService _failedDownloadService; private readonly IIgnoredDownloadService _ignoredDownloadService; private readonly IProvideDownloadClient _downloadClientProvider; private readonly IPendingReleaseService _pendingReleaseService; private readonly IDownloadService _downloadService; public QueueActionModule(IQueueService queueService, ITrackedDownloadService trackedDownloadService, IFailedDownloadService failedDownloadService, IIgnoredDownloadService ignoredDownloadService, IProvideDownloadClient downloadClientProvider, IPendingReleaseService pendingReleaseService, IDownloadService downloadService) { _queueService = queueService; _trackedDownloadService = trackedDownloadService; _failedDownloadService = failedDownloadService; _ignoredDownloadService = ignoredDownloadService; _downloadClientProvider = downloadClientProvider; _pendingReleaseService = pendingReleaseService; _downloadService = downloadService; Post(@"/grab/(?[\d]{1,10})", x => Grab((int)x.Id)); Post("/grab/bulk", x => Grab()); Delete(@"/(?[\d]{1,10})", x => Remove((int)x.Id)); Delete("/bulk", x => Remove()); } private object Grab(int id) { var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); if (pendingRelease == null) { throw new NotFoundException(); } _downloadService.DownloadReport(pendingRelease.RemoteBook); return new object(); } private object Grab() { var resource = Request.Body.FromJson(); foreach (var id in resource.Ids) { var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); if (pendingRelease == null) { throw new NotFoundException(); } _downloadService.DownloadReport(pendingRelease.RemoteBook); } return new object(); } private object Remove(int id) { var removeFromClient = Request.GetBooleanQueryParameter("removeFromClient", true); var blacklist = Request.GetBooleanQueryParameter("blacklist"); var skipReDownload = Request.GetBooleanQueryParameter("skipredownload"); var trackedDownload = Remove(id, removeFromClient, blacklist, skipReDownload); if (trackedDownload != null) { _trackedDownloadService.StopTracking(trackedDownload.DownloadItem.DownloadId); } return new object(); } private object Remove() { var removeFromClient = Request.GetBooleanQueryParameter("removeFromClient", true); var blacklist = Request.GetBooleanQueryParameter("blacklist"); var skipReDownload = Request.GetBooleanQueryParameter("skipredownload"); var resource = Request.Body.FromJson(); var trackedDownloadIds = new List(); foreach (var id in resource.Ids) { var trackedDownload = Remove(id, removeFromClient, blacklist, skipReDownload); if (trackedDownload != null) { trackedDownloadIds.Add(trackedDownload.DownloadItem.DownloadId); } } _trackedDownloadService.StopTracking(trackedDownloadIds); return new object(); } private TrackedDownload Remove(int id, bool removeFromClient, bool blacklist, bool skipReDownload) { var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); if (pendingRelease != null) { _pendingReleaseService.RemovePendingQueueItems(pendingRelease.Id); return null; } var trackedDownload = GetTrackedDownload(id); if (trackedDownload == null) { throw new NotFoundException(); } if (removeFromClient) { var downloadClient = _downloadClientProvider.Get(trackedDownload.DownloadClient); if (downloadClient == null) { throw new BadRequestException(); } downloadClient.RemoveItem(trackedDownload.DownloadItem.DownloadId, true); } if (blacklist) { _failedDownloadService.MarkAsFailed(trackedDownload.DownloadItem.DownloadId, skipReDownload); } if (!removeFromClient && !blacklist) { if (!_ignoredDownloadService.IgnoreDownload(trackedDownload)) { return null; } } return trackedDownload; } private TrackedDownload GetTrackedDownload(int queueId) { var queueItem = _queueService.Find(queueId); if (queueItem == null) { throw new NotFoundException(); } var trackedDownload = _trackedDownloadService.Find(queueItem.DownloadId); if (trackedDownload == null) { throw new NotFoundException(); } return trackedDownload; } } }