diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs index 8e4fba2e8..01d021725 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/Deluge.cs @@ -20,6 +20,7 @@ namespace NzbDrone.Core.Download.Clients.Deluge public class Deluge : TorrentClientBase { private readonly IDelugeProxy _proxy; + private bool _hasAttemptedReconnecting; public Deluge(IDelugeProxy proxy, ITorrentFileInfoReader torrentFileInfoReader, @@ -128,14 +129,9 @@ public override IEnumerable GetItems() foreach (var torrent in torrents) { - // Silently ignore torrents with no hash - if (torrent.Hash.IsNullOrWhiteSpace()) - { - continue; - } - - // Ignore torrents without a name, but track to log a single warning for all invalid torrents. - if (torrent.Name.IsNullOrWhiteSpace()) + // Ignore torrents without a hash or name, but track to log a single warning + // for all invalid torrents as well as reconnect to the Daemon. + if (torrent.Hash.IsNullOrWhiteSpace() || torrent.Name.IsNullOrWhiteSpace()) { ignoredCount++; continue; @@ -199,9 +195,20 @@ public override IEnumerable GetItems() items.Add(item); } - if (ignoredCount > 0) + if (ignoredCount > 0 && _hasAttemptedReconnecting) { - _logger.Warn("{0} torrent(s) were ignored because they did not have a title. Check Deluge and remove any invalid torrents"); + 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 + { + _hasAttemptedReconnecting = false; } return items; @@ -322,9 +329,9 @@ private ValidationFailure TestCategory() 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("MovieCategory", _localizationService.GetLocalizedString("DownloadClientDelugeValidationLabelPluginInactive")) { diff --git a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs index cbe7a985c..98f35d3fc 100644 --- a/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/Deluge/DelugeProxy.cs @@ -18,8 +18,7 @@ public interface IDelugeProxy Dictionary GetConfig(DelugeSettings settings); DelugeTorrent[] GetTorrents(DelugeSettings settings); DelugeTorrent[] GetTorrentsByLabel(string label, DelugeSettings settings); - string[] GetAvailablePlugins(DelugeSettings settings); - string[] GetEnabledPlugins(DelugeSettings settings); + string[] GetMethods(DelugeSettings settings); string[] GetAvailableLabels(DelugeSettings settings); DelugeLabel GetLabelOptions(DelugeSettings settings); void SetTorrentLabel(string hash, string label, DelugeSettings settings); @@ -30,6 +29,7 @@ public interface IDelugeProxy string AddTorrentFromFile(string filename, byte[] fileContent, DelugeSettings settings); bool RemoveTorrent(string hash, bool removeData, DelugeSettings settings); void MoveTorrentToTopInQueue(string hash, DelugeSettings settings); + void ReconnectToDaemon(DelugeSettings settings); } public class DelugeProxy : IDelugeProxy @@ -51,25 +51,14 @@ public DelugeProxy(ICacheManager cacheManager, IHttpClient httpClient, Logger lo public string GetVersion(DelugeSettings settings) { - try + var methods = GetMethods(settings); + + if (methods.Contains("daemon.get_version")) { - var response = ProcessRequest(settings, "daemon.info"); - - return response; + return ProcessRequest(settings, "daemon.get_version"); } - catch (DownloadClientException ex) - { - if (ex.Message.Contains("Unknown method")) - { - // 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(settings, "daemon.get_version"); - return response; - } - - throw; - } + return ProcessRequest(settings, "daemon.info"); } public Dictionary GetConfig(DelugeSettings settings) @@ -101,6 +90,13 @@ public DelugeTorrent[] GetTorrentsByLabel(string label, DelugeSettings settings) return GetTorrents(response); } + public string[] GetMethods(DelugeSettings settings) + { + var response = ProcessRequest(settings, "system.listMethods"); + + return response; + } + public string AddTorrentFromMagnet(string magnetLink, DelugeSettings settings) { dynamic options = new ExpandoObject(); @@ -159,20 +155,6 @@ public void MoveTorrentToTopInQueue(string hash, DelugeSettings settings) ProcessRequest(settings, "core.queue_top", (object)new string[] { hash }); } - public string[] GetAvailablePlugins(DelugeSettings settings) - { - var response = ProcessRequest(settings, "core.get_available_plugins"); - - return response; - } - - public string[] GetEnabledPlugins(DelugeSettings settings) - { - var response = ProcessRequest(settings, "core.get_enabled_plugins"); - - return response; - } - public string[] GetAvailableLabels(DelugeSettings settings) { var response = ProcessRequest(settings, "label.get_labels"); @@ -223,6 +205,12 @@ public void SetTorrentLabel(string hash, string label, DelugeSettings settings) ProcessRequest(settings, "label.set_torrent", hash, label); } + public void ReconnectToDaemon(DelugeSettings settings) + { + ProcessRequest(settings, "web.disconnect"); + ConnectDaemon(BuildRequest(settings)); + } + private JsonRpcRequestBuilder BuildRequest(DelugeSettings settings) { var url = HttpRequestBuilder.BuildBaseUrl(settings.UseSsl, settings.Host, settings.Port, settings.UrlBase);