diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs index 523d2033e..b43092da0 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrent.cs @@ -40,23 +40,9 @@ protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string { _proxy.AddTorrentFromUrl(magnetLink, Settings); - // Wait until url has been resolved before returning - var TRIES = 5; - var RETRY_DELAY = 500; //ms - var ready = false; - - for (var i = 0; i < TRIES; i++) - { - ready = _proxy.HasHashTorrent(hash, Settings); - if (ready) - { - break; - } - - Thread.Sleep(RETRY_DELAY); - } - - if (ready) + var tries = 10; + var retryDelay = 500; + if (WaitForTorrent(hash, tries, retryDelay)) { _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); @@ -69,8 +55,8 @@ protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string } else { - _logger.Debug("Magnet {0} could not be resolved in {1} tries at {2} ms intervals.", magnetLink, TRIES, RETRY_DELAY); - // Remove from client, since it is discarded + _logger.Debug("rTorrent could not resolve magnet {0}. Removing", magnetLink); + RemoveItem(hash, true); return null; @@ -80,14 +66,28 @@ protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string hash, string filename, byte[] fileContent) { _proxy.AddTorrentFromFile(filename, fileContent, Settings); - _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); - SetPriority(remoteEpisode, hash); - SetDownloadDirectory(hash); + var tries = 2; + var retryDelay = 100; + if (WaitForTorrent(hash, tries, retryDelay)) + { + _proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings); - _proxy.StartTorrent(hash, Settings); + SetPriority(remoteEpisode, hash); + SetDownloadDirectory(hash); - return hash; + _proxy.StartTorrent(hash, Settings); + + return hash; + } + else + { + _logger.Debug("rTorrent could not add file"); + + RemoveItem(hash, true); + + return null; + } } public override string Name @@ -145,7 +145,7 @@ public override IEnumerable GetItems() else if (torrent.IsActive) item.Status = DownloadItemStatus.Downloading; else if (!torrent.IsActive) item.Status = DownloadItemStatus.Paused; - // Since we do not know the user's intent, do not let Sonarr to remove the torrent + // No stop ratio data is present, so do not delete item.IsReadOnly = true; items.Add(item); @@ -251,5 +251,22 @@ private void SetDownloadDirectory(string hash) _proxy.SetTorrentDownloadDirectory(hash, Settings.TvDirectory, Settings); } } + + private bool WaitForTorrent(string hash, int tries, int retryDelay) + { + for (var i = 0; i < tries; i++) + { + if (_proxy.HasHashTorrent(hash, Settings)) + { + return true; + } + + Thread.Sleep(retryDelay); + } + + _logger.Debug("Could not find hash {0} in {1} tries at {2} ms intervals.", hash, tries, retryDelay); + + return false; + } } } diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentProxy.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentProxy.cs index 7a3f21613..b90fdb47f 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentProxy.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentProxy.cs @@ -97,11 +97,13 @@ public List GetTorrents(RTorrentSettings settings) var items = new List(); foreach (object[] torrent in ret) { + var labelDecoded = System.Web.HttpUtility.UrlDecode((string) torrent[3]); + var item = new RTorrentTorrent(); item.Name = (string) torrent[0]; item.Hash = (string) torrent[1]; item.Path = (string) torrent[2]; - item.Category = (string) torrent[3]; + item.Category = labelDecoded; item.TotalSize = (long) torrent[4]; item.RemainingSize = (long) torrent[5]; item.DownRate = (long) torrent[6]; @@ -172,10 +174,12 @@ public void SetTorrentLabel(string hash, string label, RTorrentSettings settings { _logger.Debug("Executing remote method: d.set_custom1"); + var labelEncoded = System.Web.HttpUtility.UrlEncode(label); + var client = BuildClient(settings); - var setLabel = client.SetLabel(hash, label); - if (setLabel != label) + var setLabel = client.SetLabel(hash, labelEncoded); + if (setLabel != labelEncoded) { throw new DownloadClientException("Could set label on torrent: {0}.", hash); } diff --git a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs index 5983c3e40..81715246c 100644 --- a/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs +++ b/src/NzbDrone.Core/Download/Clients/rTorrent/RTorrentSettings.cs @@ -37,7 +37,7 @@ public RTorrentSettings() [FieldDefinition(1, Label = "Port", Type = FieldType.Textbox)] public int Port { get; set; } - [FieldDefinition(2, Label = "Url Base", Type = FieldType.Textbox, Advanced = true, HelpText = "Adds a suffix the rpc url, see http://[host]:[port]/[urlBase], by default this should be RPC2")] + [FieldDefinition(2, Label = "Url Path", Type = FieldType.Textbox, HelpText = "Path to the XMLRPC endpoint, see http(s)://[host]:[port]/[urlPath]. When using ruTorrent this usually is RPC2 or (path to ruTorrent)/plugins/rpc/rpc.php")] public string UrlBase { get; set; } [FieldDefinition(3, Label = "Use SSL", Type = FieldType.Checkbox)]