Fix errors with the new version of DownloadStation (3.8.16-3566)pull/6437/head
parent
84d1a8983b
commit
143067621c
@ -0,0 +1,31 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using NzbDrone.Common.Serializer;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Download.Clients.DownloadStation
|
||||||
|
{
|
||||||
|
public class DownloadStation2Task
|
||||||
|
{
|
||||||
|
public string Username { get; set; }
|
||||||
|
|
||||||
|
public string Id { get; set; }
|
||||||
|
|
||||||
|
public string Title { get; set; }
|
||||||
|
|
||||||
|
public long Size { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// /// Possible values are: BT, NZB, http, ftp, eMule and https
|
||||||
|
/// </summary>
|
||||||
|
public string Type { get; set; }
|
||||||
|
|
||||||
|
public int Status { get; set; }
|
||||||
|
|
||||||
|
public DownloadStationTaskAdditional Additional { get; set; }
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return Title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using NLog;
|
||||||
|
using NzbDrone.Common.Cache;
|
||||||
|
using NzbDrone.Common.Http;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies
|
||||||
|
{
|
||||||
|
public interface IDownloadStationTaskProxy : IDiskStationProxy
|
||||||
|
{
|
||||||
|
bool IsApiSupported(DownloadStationSettings settings);
|
||||||
|
IEnumerable<DownloadStationTask> GetTasks(DownloadStationSettings settings);
|
||||||
|
void RemoveTask(string downloadId, DownloadStationSettings settings);
|
||||||
|
void AddTaskFromUrl(string url, string downloadDirectory, DownloadStationSettings settings);
|
||||||
|
void AddTaskFromData(byte[] data, string filename, string downloadDirectory, DownloadStationSettings settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IDownloadStationTaskProxySelector
|
||||||
|
{
|
||||||
|
IDownloadStationTaskProxy GetProxy(DownloadStationSettings settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DownloadStationTaskProxySelector : IDownloadStationTaskProxySelector
|
||||||
|
{
|
||||||
|
private readonly ICached<IDownloadStationTaskProxy> _proxyCache;
|
||||||
|
private readonly Logger _logger;
|
||||||
|
|
||||||
|
private readonly IDownloadStationTaskProxy _proxyV1;
|
||||||
|
private readonly IDownloadStationTaskProxy _proxyV2;
|
||||||
|
|
||||||
|
public DownloadStationTaskProxySelector(DownloadStationTaskProxyV1 proxyV1, DownloadStationTaskProxyV2 proxyV2, ICacheManager cacheManager, Logger logger)
|
||||||
|
{
|
||||||
|
_proxyCache = cacheManager.GetCache<IDownloadStationTaskProxy>(GetType(), "taskProxy");
|
||||||
|
_logger = logger;
|
||||||
|
|
||||||
|
_proxyV1 = proxyV1;
|
||||||
|
_proxyV2 = proxyV2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IDownloadStationTaskProxy GetProxy(DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
return GetProxyCache(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDownloadStationTaskProxy GetProxyCache(DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
var propKey = $"{settings.Host}_{settings.Port}";
|
||||||
|
|
||||||
|
return _proxyCache.Get(propKey, () => FetchProxy(settings), TimeSpan.FromMinutes(10.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
private IDownloadStationTaskProxy FetchProxy(DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
if (_proxyV2.IsApiSupported(settings))
|
||||||
|
{
|
||||||
|
_logger.Trace("Using DownloadStation Task API v2");
|
||||||
|
return _proxyV2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_proxyV1.IsApiSupported(settings))
|
||||||
|
{
|
||||||
|
_logger.Trace("Using DownloadStation Task API v1");
|
||||||
|
return _proxyV1;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new DownloadClientException("Unable to determine DownloadStations Task API version");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using NLog;
|
||||||
|
using NzbDrone.Common.Cache;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
|
using NzbDrone.Common.Http;
|
||||||
|
using NzbDrone.Core.Download.Clients.DownloadStation.Responses;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Download.Clients.DownloadStation.Proxies
|
||||||
|
{
|
||||||
|
public class DownloadStationTaskProxyV2 : DiskStationProxyBase, IDownloadStationTaskProxy
|
||||||
|
{
|
||||||
|
public DownloadStationTaskProxyV2(IHttpClient httpClient, ICacheManager cacheManager, Logger logger)
|
||||||
|
: base(DiskStationApi.DownloadStation2Task, "SYNO.DownloadStation2.Task", httpClient, cacheManager, logger)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsApiSupported(DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
return GetApiInfo(settings) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddTaskFromData(byte[] data, string filename, string downloadDirectory, DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
var requestBuilder = BuildRequest(settings, "create", 2, HttpMethod.POST);
|
||||||
|
|
||||||
|
requestBuilder.AddFormParameter("type", "\"file\"");
|
||||||
|
requestBuilder.AddFormParameter("file", "[\"fileData\"]");
|
||||||
|
requestBuilder.AddFormParameter("create_list", "false");
|
||||||
|
|
||||||
|
if (downloadDirectory.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
requestBuilder.AddFormParameter("destination", $"\"{downloadDirectory}\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
requestBuilder.AddFormUpload("fileData", filename, data);
|
||||||
|
|
||||||
|
ProcessRequest<object>(requestBuilder, $"add task from data {filename}", settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddTaskFromUrl(string url, string downloadDirectory, DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
var requestBuilder = BuildRequest(settings, "create", 2);
|
||||||
|
|
||||||
|
requestBuilder.AddQueryParam("type", "url");
|
||||||
|
requestBuilder.AddQueryParam("url", url);
|
||||||
|
requestBuilder.AddQueryParam("create_list", "false");
|
||||||
|
|
||||||
|
if (downloadDirectory.IsNotNullOrWhiteSpace())
|
||||||
|
{
|
||||||
|
requestBuilder.AddQueryParam("destination", downloadDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcessRequest<object>(requestBuilder, $"add task from url {url}", settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<DownloadStationTask> GetTasks(DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = new List<DownloadStationTask>();
|
||||||
|
|
||||||
|
var requestBuilder = BuildRequest(settings, "list", 1);
|
||||||
|
requestBuilder.AddQueryParam("additional", "detail");
|
||||||
|
|
||||||
|
var response = ProcessRequest<DownloadStation2TaskInfoResponse>(requestBuilder, "get tasks with additional detail", settings);
|
||||||
|
|
||||||
|
if (response.Success && response.Data.Total > 0)
|
||||||
|
{
|
||||||
|
requestBuilder.AddQueryParam("additional", "transfer");
|
||||||
|
var responseTransfer = ProcessRequest<DownloadStation2TaskInfoResponse>(requestBuilder, "get tasks with additional transfer", settings);
|
||||||
|
|
||||||
|
if (responseTransfer.Success)
|
||||||
|
{
|
||||||
|
foreach (var task in response.Data.Task)
|
||||||
|
{
|
||||||
|
var taskTransfer = responseTransfer.Data.Task.Where(t => t.Id == task.Id).First();
|
||||||
|
|
||||||
|
var combinedTask = new DownloadStationTask
|
||||||
|
{
|
||||||
|
Username = task.Username,
|
||||||
|
Id = task.Id,
|
||||||
|
Title = task.Title,
|
||||||
|
Size = task.Size,
|
||||||
|
Status = (DownloadStationTaskStatus)task.Status,
|
||||||
|
Type = task.Type,
|
||||||
|
Additional = new DownloadStationTaskAdditional
|
||||||
|
{
|
||||||
|
Detail = task.Additional.Detail,
|
||||||
|
Transfer = taskTransfer.Additional.Transfer
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
result.Add(combinedTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
catch (DownloadClientException e)
|
||||||
|
{
|
||||||
|
_logger.Error(e);
|
||||||
|
return new List<DownloadStationTask>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveTask(string downloadId, DownloadStationSettings settings)
|
||||||
|
{
|
||||||
|
var requestBuilder = BuildRequest(settings, "delete", 2);
|
||||||
|
requestBuilder.AddQueryParam("id", downloadId);
|
||||||
|
requestBuilder.AddQueryParam("force_complete", "false");
|
||||||
|
|
||||||
|
ProcessRequest<object>(requestBuilder, $"remove item {downloadId}", settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace NzbDrone.Core.Download.Clients.DownloadStation.Responses
|
||||||
|
{
|
||||||
|
public class DownloadStation2TaskInfoResponse
|
||||||
|
{
|
||||||
|
public int Offset { get; set; }
|
||||||
|
public List<DownloadStation2Task> Task { get; set; }
|
||||||
|
public int Total { get; set; }
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue