2017-09-04 02:20:56 +00:00
|
|
|
using System.Collections.Generic;
|
2020-01-03 12:49:24 +00:00
|
|
|
using Lidarr.Http;
|
|
|
|
using Lidarr.Http.Extensions;
|
|
|
|
using Lidarr.Http.REST;
|
2017-09-04 02:20:56 +00:00
|
|
|
using Nancy;
|
|
|
|
using NzbDrone.Core.Download;
|
|
|
|
using NzbDrone.Core.Download.Pending;
|
|
|
|
using NzbDrone.Core.Download.TrackedDownloads;
|
|
|
|
using NzbDrone.Core.Queue;
|
|
|
|
|
2017-10-31 01:28:29 +00:00
|
|
|
namespace Lidarr.Api.V1.Queue
|
2017-09-04 02:20:56 +00:00
|
|
|
{
|
|
|
|
public class QueueActionModule : LidarrRestModule<QueueResource>
|
|
|
|
{
|
|
|
|
private readonly IQueueService _queueService;
|
|
|
|
private readonly ITrackedDownloadService _trackedDownloadService;
|
|
|
|
private readonly IFailedDownloadService _failedDownloadService;
|
|
|
|
private readonly IProvideDownloadClient _downloadClientProvider;
|
|
|
|
private readonly IPendingReleaseService _pendingReleaseService;
|
|
|
|
private readonly IDownloadService _downloadService;
|
|
|
|
|
|
|
|
public QueueActionModule(IQueueService queueService,
|
|
|
|
ITrackedDownloadService trackedDownloadService,
|
|
|
|
IFailedDownloadService failedDownloadService,
|
|
|
|
IProvideDownloadClient downloadClientProvider,
|
|
|
|
IPendingReleaseService pendingReleaseService,
|
|
|
|
IDownloadService downloadService)
|
|
|
|
{
|
|
|
|
_queueService = queueService;
|
|
|
|
_trackedDownloadService = trackedDownloadService;
|
|
|
|
_failedDownloadService = failedDownloadService;
|
|
|
|
_downloadClientProvider = downloadClientProvider;
|
|
|
|
_pendingReleaseService = pendingReleaseService;
|
|
|
|
_downloadService = downloadService;
|
|
|
|
|
2020-01-03 12:49:24 +00:00
|
|
|
Post(@"/grab/(?<id>[\d]{1,10})", x => Grab((int)x.Id));
|
|
|
|
Post("/grab/bulk", x => Grab());
|
2017-09-04 02:20:56 +00:00
|
|
|
|
2020-01-03 12:49:24 +00:00
|
|
|
Delete(@"/(?<id>[\d]{1,10})", x => Remove((int)x.Id));
|
|
|
|
Delete("/bulk", x => Remove());
|
2017-09-04 02:20:56 +00:00
|
|
|
}
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
private object Grab(int id)
|
2017-09-04 02:20:56 +00:00
|
|
|
{
|
|
|
|
var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id);
|
|
|
|
|
|
|
|
if (pendingRelease == null)
|
|
|
|
{
|
|
|
|
throw new NotFoundException();
|
|
|
|
}
|
|
|
|
|
|
|
|
_downloadService.DownloadReport(pendingRelease.RemoteAlbum);
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
return new object();
|
2017-09-04 02:20:56 +00:00
|
|
|
}
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
private object Grab()
|
2017-09-04 02:20:56 +00:00
|
|
|
{
|
|
|
|
var resource = Request.Body.FromJson<QueueBulkResource>();
|
|
|
|
|
|
|
|
foreach (var id in resource.Ids)
|
|
|
|
{
|
|
|
|
var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id);
|
|
|
|
|
|
|
|
if (pendingRelease == null)
|
|
|
|
{
|
|
|
|
throw new NotFoundException();
|
|
|
|
}
|
|
|
|
|
|
|
|
_downloadService.DownloadReport(pendingRelease.RemoteAlbum);
|
|
|
|
}
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
return new object();
|
2017-09-04 02:20:56 +00:00
|
|
|
}
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
private object Remove(int id)
|
2017-09-04 02:20:56 +00:00
|
|
|
{
|
|
|
|
var blacklist = Request.GetBooleanQueryParameter("blacklist");
|
2019-06-10 18:56:44 +00:00
|
|
|
var skipReDownload = Request.GetBooleanQueryParameter("skipredownload");
|
2017-09-04 02:20:56 +00:00
|
|
|
|
2019-06-10 18:56:44 +00:00
|
|
|
var trackedDownload = Remove(id, blacklist, skipReDownload);
|
2017-09-04 02:20:56 +00:00
|
|
|
|
|
|
|
if (trackedDownload != null)
|
|
|
|
{
|
|
|
|
_trackedDownloadService.StopTracking(trackedDownload.DownloadItem.DownloadId);
|
|
|
|
}
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
return new object();
|
2017-09-04 02:20:56 +00:00
|
|
|
}
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
private object Remove()
|
2017-09-04 02:20:56 +00:00
|
|
|
{
|
|
|
|
var blacklist = Request.GetBooleanQueryParameter("blacklist");
|
2019-06-10 18:56:44 +00:00
|
|
|
var skipReDownload = Request.GetBooleanQueryParameter("skipredownload");
|
2017-09-04 02:20:56 +00:00
|
|
|
|
|
|
|
var resource = Request.Body.FromJson<QueueBulkResource>();
|
|
|
|
var trackedDownloadIds = new List<string>();
|
|
|
|
|
|
|
|
foreach (var id in resource.Ids)
|
|
|
|
{
|
2019-06-10 18:56:44 +00:00
|
|
|
var trackedDownload = Remove(id, blacklist, skipReDownload);
|
2017-09-04 02:20:56 +00:00
|
|
|
|
|
|
|
if (trackedDownload != null)
|
|
|
|
{
|
|
|
|
trackedDownloadIds.Add(trackedDownload.DownloadItem.DownloadId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_trackedDownloadService.StopTracking(trackedDownloadIds);
|
|
|
|
|
2019-09-12 20:32:51 +00:00
|
|
|
return new object();
|
2017-09-04 02:20:56 +00:00
|
|
|
}
|
|
|
|
|
2019-06-10 18:56:44 +00:00
|
|
|
private TrackedDownload Remove(int id, bool blacklist, bool skipReDownload)
|
2017-09-04 02:20:56 +00:00
|
|
|
{
|
|
|
|
var pendingRelease = _pendingReleaseService.FindPendingQueueItem(id);
|
|
|
|
|
|
|
|
if (pendingRelease != null)
|
|
|
|
{
|
|
|
|
_pendingReleaseService.RemovePendingQueueItems(pendingRelease.Id);
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
if (blacklist)
|
|
|
|
{
|
2019-06-10 18:56:44 +00:00
|
|
|
_failedDownloadService.MarkAsFailed(trackedDownload.DownloadItem.DownloadId, skipReDownload);
|
2017-09-04 02:20:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|