1
0
Fork 0
mirror of https://github.com/lidarr/Lidarr synced 2024-12-22 07:42:28 +00:00

Deluge communication improvements

(cherry picked from commit 183b8b574a4dd948b5fada94d0e645b87710f223)
This commit is contained in:
Mark McDowall 2024-11-26 17:36:53 -08:00 committed by Bogdan
parent f87a8fa9f5
commit f3a697ca68
2 changed files with 39 additions and 44 deletions

View file

@ -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 @@ public override IEnumerable<DownloadClientItem> GetItems()
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 @@ public override IEnumerable<DownloadClientItem> GetItems()
items.Add(item); 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; return items;
@ -319,9 +326,9 @@ private ValidationFailure TestCategory()
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")
{ {

View file

@ -18,8 +18,7 @@ public interface IDelugeProxy
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 @@ public interface IDelugeProxy
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 @@ public DelugeProxy(ICacheManager cacheManager, IHttpClient httpClient, Logger lo
public string GetVersion(DelugeSettings settings) public string GetVersion(DelugeSettings settings)
{ {
try var methods = GetMethods(settings);
if (methods.Contains("daemon.get_version"))
{ {
var response = ProcessRequest<string>(settings, "daemon.info"); return ProcessRequest<string>(settings, "daemon.get_version");
return response;
} }
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<string>(settings, "daemon.get_version");
return response; return ProcessRequest<string>(settings, "daemon.info");
}
throw;
}
} }
public Dictionary<string, object> GetConfig(DelugeSettings settings) public Dictionary<string, object> GetConfig(DelugeSettings settings)
@ -101,6 +90,13 @@ public DelugeTorrent[] GetTorrentsByLabel(string label, DelugeSettings settings)
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 @@ public void MoveTorrentToTopInQueue(string hash, DelugeSettings settings)
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 @@ public void SetTorrentLabel(string hash, string label, DelugeSettings settings)
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);