Deluge communication improvements

(cherry picked from commit 183b8b574a4dd948b5fada94d0e645b87710f223)
pull/5230/head
Mark McDowall 3 weeks ago committed by Bogdan
parent f87a8fa9f5
commit f3a697ca68

@ -19,6 +19,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge
public class Deluge : TorrentClientBase<DelugeSettings> public class Deluge : TorrentClientBase<DelugeSettings>
{ {
private readonly IDelugeProxy _proxy; private readonly IDelugeProxy _proxy;
private bool _hasAttemptedReconnecting;
public Deluge(IDelugeProxy proxy, public Deluge(IDelugeProxy proxy,
ITorrentFileInfoReader torrentFileInfoReader, ITorrentFileInfoReader torrentFileInfoReader,
@ -126,14 +127,9 @@ namespace NzbDrone.Core.Download.Clients.Deluge
foreach (var torrent in torrents) foreach (var torrent in torrents)
{ {
// Silently ignore torrents with no hash // Ignore torrents without a hash or name, but track to log a single warning
if (torrent.Hash.IsNullOrWhiteSpace()) // for all invalid torrents as well as reconnect to the Daemon.
{ if (torrent.Hash.IsNullOrWhiteSpace() || torrent.Name.IsNullOrWhiteSpace())
continue;
}
// Ignore torrents without a name, but track to log a single warning for all invalid torrents.
if (torrent.Name.IsNullOrWhiteSpace())
{ {
ignoredCount++; ignoredCount++;
continue; continue;
@ -197,9 +193,20 @@ namespace NzbDrone.Core.Download.Clients.Deluge
items.Add(item); items.Add(item);
} }
if (ignoredCount > 0) if (ignoredCount > 0 && _hasAttemptedReconnecting)
{
if (_hasAttemptedReconnecting)
{
_logger.Warn("{0} torrent(s) were ignored because they did not have a hash or title. Deluge may have disconnected from it's daemon. If you continue to see this error, check Deluge for invalid torrents.", ignoredCount);
}
else
{
_proxy.ReconnectToDaemon(Settings);
}
}
else
{ {
_logger.Warn("{0} torrent(s) were ignored because they did not have a title. Check Deluge and remove any invalid torrents"); _hasAttemptedReconnecting = false;
} }
return items; return items;
@ -319,9 +326,9 @@ namespace NzbDrone.Core.Download.Clients.Deluge
return null; return null;
} }
var enabledPlugins = _proxy.GetEnabledPlugins(Settings); var methods = _proxy.GetMethods(Settings);
if (!enabledPlugins.Contains("Label")) if (!methods.Any(m => m.StartsWith("label.")))
{ {
return new NzbDroneValidationFailure("MusicCategory", "Label plugin not activated") return new NzbDroneValidationFailure("MusicCategory", "Label plugin not activated")
{ {

@ -18,8 +18,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge
Dictionary<string, object> GetConfig(DelugeSettings settings); Dictionary<string, object> GetConfig(DelugeSettings settings);
DelugeTorrent[] GetTorrents(DelugeSettings settings); DelugeTorrent[] GetTorrents(DelugeSettings settings);
DelugeTorrent[] GetTorrentsByLabel(string label, DelugeSettings settings); DelugeTorrent[] GetTorrentsByLabel(string label, DelugeSettings settings);
string[] GetAvailablePlugins(DelugeSettings settings); string[] GetMethods(DelugeSettings settings);
string[] GetEnabledPlugins(DelugeSettings settings);
string[] GetAvailableLabels(DelugeSettings settings); string[] GetAvailableLabels(DelugeSettings settings);
DelugeLabel GetLabelOptions(DelugeSettings settings); DelugeLabel GetLabelOptions(DelugeSettings settings);
void SetTorrentLabel(string hash, string label, DelugeSettings settings); void SetTorrentLabel(string hash, string label, DelugeSettings settings);
@ -30,6 +29,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge
string AddTorrentFromFile(string filename, byte[] fileContent, DelugeSettings settings); string AddTorrentFromFile(string filename, byte[] fileContent, DelugeSettings settings);
bool RemoveTorrent(string hash, bool removeData, DelugeSettings settings); bool RemoveTorrent(string hash, bool removeData, DelugeSettings settings);
void MoveTorrentToTopInQueue(string hash, DelugeSettings settings); void MoveTorrentToTopInQueue(string hash, DelugeSettings settings);
void ReconnectToDaemon(DelugeSettings settings);
} }
public class DelugeProxy : IDelugeProxy public class DelugeProxy : IDelugeProxy
@ -51,25 +51,14 @@ namespace NzbDrone.Core.Download.Clients.Deluge
public string GetVersion(DelugeSettings settings) public string GetVersion(DelugeSettings settings)
{ {
try var methods = GetMethods(settings);
{
var response = ProcessRequest<string>(settings, "daemon.info");
return response; if (methods.Contains("daemon.get_version"))
}
catch (DownloadClientException ex)
{ {
if (ex.Message.Contains("Unknown method")) return ProcessRequest<string>(settings, "daemon.get_version");
{
// Deluge v2 beta replaced 'daemon.info' with 'daemon.get_version'.
// It may return or become official, for now we just retry with the get_version api.
var response = ProcessRequest<string>(settings, "daemon.get_version");
return response;
} }
throw; return ProcessRequest<string>(settings, "daemon.info");
}
} }
public Dictionary<string, object> GetConfig(DelugeSettings settings) public Dictionary<string, object> GetConfig(DelugeSettings settings)
@ -101,6 +90,13 @@ namespace NzbDrone.Core.Download.Clients.Deluge
return GetTorrents(response); return GetTorrents(response);
} }
public string[] GetMethods(DelugeSettings settings)
{
var response = ProcessRequest<string[]>(settings, "system.listMethods");
return response;
}
public string AddTorrentFromMagnet(string magnetLink, DelugeSettings settings) public string AddTorrentFromMagnet(string magnetLink, DelugeSettings settings)
{ {
dynamic options = new ExpandoObject(); dynamic options = new ExpandoObject();
@ -158,20 +154,6 @@ namespace NzbDrone.Core.Download.Clients.Deluge
ProcessRequest<object>(settings, "core.queue_top", (object)new string[] { hash }); ProcessRequest<object>(settings, "core.queue_top", (object)new string[] { hash });
} }
public string[] GetAvailablePlugins(DelugeSettings settings)
{
var response = ProcessRequest<string[]>(settings, "core.get_available_plugins");
return response;
}
public string[] GetEnabledPlugins(DelugeSettings settings)
{
var response = ProcessRequest<string[]>(settings, "core.get_enabled_plugins");
return response;
}
public string[] GetAvailableLabels(DelugeSettings settings) public string[] GetAvailableLabels(DelugeSettings settings)
{ {
var response = ProcessRequest<string[]>(settings, "label.get_labels"); var response = ProcessRequest<string[]>(settings, "label.get_labels");
@ -222,6 +204,12 @@ namespace NzbDrone.Core.Download.Clients.Deluge
ProcessRequest<object>(settings, "label.set_torrent", hash, label); ProcessRequest<object>(settings, "label.set_torrent", hash, label);
} }
public void ReconnectToDaemon(DelugeSettings settings)
{
ProcessRequest<string>(settings, "web.disconnect");
ConnectDaemon(BuildRequest(settings));
}
private JsonRpcRequestBuilder BuildRequest(DelugeSettings settings) private JsonRpcRequestBuilder BuildRequest(DelugeSettings settings)
{ {
var url = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase); var url = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase);

Loading…
Cancel
Save