using Nancy; using Nancy.Responses; using NzbDrone.Api.Extensions; using NzbDrone.Api.REST; using NzbDrone.Core.Download; using NzbDrone.Core.Download.Pending; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.Queue; namespace NzbDrone.Api.Queue { public class QueueActionModule : NzbDroneRestModule { private readonly IQueueService _queueService; private readonly ITrackedDownloadService _trackedDownloadService; private readonly ICompletedDownloadService _completedDownloadService; private readonly IProvideDownloadClient _downloadClientProvider; private readonly IPendingReleaseService _pendingReleaseService; private readonly IDownloadService _downloadService; public QueueActionModule(IQueueService queueService, ITrackedDownloadService trackedDownloadService, ICompletedDownloadService completedDownloadService, IProvideDownloadClient downloadClientProvider, IPendingReleaseService pendingReleaseService, IDownloadService downloadService) { _queueService = queueService; _trackedDownloadService = trackedDownloadService; _completedDownloadService = completedDownloadService; _downloadClientProvider = downloadClientProvider; _pendingReleaseService = pendingReleaseService; _downloadService = downloadService; Delete[@"/(?[\d]{1,10})"] = x => Remove((int)x.Id); Post["/import"] = x => Import(); Post["/grab"] = x => Grab(); } private Response Remove(int id) { var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id); if (pendingRelease != null) { _pendingReleaseService.RemovePendingQueueItem(id); return new object().AsResponse(); } var trackedDownload = GetTrackedDownload(id); if (trackedDownload == null) { throw new NotFoundException(); } var downloadClient = _downloadClientProvider.Get(trackedDownload.DownloadClient); if (downloadClient == null) { throw new BadRequestException(); } downloadClient.RemoveItem(trackedDownload.DownloadItem.DownloadId, true); return new object().AsResponse(); } private JsonResponse Import() { var resource = Request.Body.FromJson(); var trackedDownload = GetTrackedDownload(resource.Id); _completedDownloadService.Process(trackedDownload, true); return resource.AsResponse(); } private JsonResponse Grab() { var resource = Request.Body.FromJson(); var pendingRelease = _pendingReleaseService.FindPendingQueueItem(resource.Id); if (pendingRelease == null) { throw new NotFoundException(); } _downloadService.DownloadReport(pendingRelease.RemoteEpisode); return resource.AsResponse(); } private TrackedDownload GetTrackedDownload(int queueId) { var queueItem = _queueService.Find(queueId); if (queueItem == null) { throw new NotFoundException(); } var trackedDownload = _trackedDownloadService.Find(queueItem.TrackingId); if (trackedDownload == null) { throw new NotFoundException(); } return trackedDownload; } } }