1
0
mirror of https://github.com/Sonarr/Sonarr.git synced 2024-12-16 11:37:58 +02:00

Fixed: Magnet downloads weren't being started on RTorrent.

This commit is contained in:
Taloth Saldono 2016-01-17 14:32:52 +01:00
parent 902e0dd5d6
commit cf25097cd1
2 changed files with 62 additions and 11 deletions

View File

@ -41,26 +41,30 @@ protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string
{ {
_proxy.AddTorrentFromUrl(magnetLink, Settings); _proxy.AddTorrentFromUrl(magnetLink, Settings);
// Download the magnet to the appropriate directory.
_proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings);
SetPriority(remoteEpisode, hash);
SetDownloadDirectory(hash);
// Once the magnet meta download finishes, rTorrent replaces it with the actual torrent download with default settings.
// Schedule an event to apply the appropriate settings when that happens.
var priority = (RTorrentPriority)(remoteEpisode.IsRecentEpisode() ? Settings.RecentTvPriority : Settings.OlderTvPriority);
_proxy.SetDeferredMagnetProperties(hash, Settings.TvCategory, Settings.TvDirectory, priority, Settings);
_proxy.StartTorrent(hash, Settings);
// Wait for the magnet to be resolved.
var tries = 10; var tries = 10;
var retryDelay = 500; var retryDelay = 500;
if (WaitForTorrent(hash, tries, retryDelay)) if (WaitForTorrent(hash, tries, retryDelay))
{ {
_proxy.SetTorrentLabel(hash, Settings.TvCategory, Settings);
SetPriority(remoteEpisode, hash);
SetDownloadDirectory(hash);
_proxy.StartTorrent(hash, Settings);
return hash; return hash;
} }
else else
{ {
_logger.Debug("rTorrent could not resolve magnet {0}. Removing", magnetLink); _logger.Warn("rTorrent could not resolve magnet within {0} seconds, download may remain stuck: {1}.", tries * retryDelay / 1000, magnetLink);
RemoveItem(hash, true); return hash;
return null;
} }
} }

View File

@ -21,6 +21,7 @@ public interface IRTorrentProxy
void SetTorrentDownloadDirectory(string hash, string directory, RTorrentSettings settings); void SetTorrentDownloadDirectory(string hash, string directory, RTorrentSettings settings);
bool HasHashTorrent(string hash, RTorrentSettings settings); bool HasHashTorrent(string hash, RTorrentSettings settings);
void StartTorrent(string hash, RTorrentSettings settings); void StartTorrent(string hash, RTorrentSettings settings);
void SetDeferredMagnetProperties(string hash, string category, string directory, RTorrentPriority priority, RTorrentSettings settings);
} }
public interface IRTorrent : IXmlRpcProxy public interface IRTorrent : IXmlRpcProxy
@ -46,6 +47,9 @@ public interface IRTorrent : IXmlRpcProxy
[XmlRpcMethod("d.directory.set")] [XmlRpcMethod("d.directory.set")]
int SetDirectory(string hash, string directory); int SetDirectory(string hash, string directory);
[XmlRpcMethod("system.method.set_key")]
int SetKey(string key, string cmd_key, string value);
[XmlRpcMethod("d.name")] [XmlRpcMethod("d.name")]
string GetName(string hash); string GetName(string hash);
@ -198,6 +202,49 @@ public void SetTorrentDownloadDirectory(string hash, string directory, RTorrentS
} }
} }
public void SetDeferredMagnetProperties(string hash, string category, string directory, RTorrentPriority priority, RTorrentSettings settings)
{
var commands = new List<string>();
if (category.IsNotNullOrWhiteSpace())
{
commands.Add("d.set_custom1=" + category);
}
if (directory.IsNotNullOrWhiteSpace())
{
commands.Add("d.set_directory=" + directory);
}
if (priority != RTorrentPriority.Normal)
{
commands.Add("d.set_priority=" + (long)priority);
}
if (commands.Any())
{
var key = "event.download.inserted";
var cmd_key = "sonarr_deferred_" + hash;
commands.Add(string.Format("print=\"Applying deferred properties to {0}\"", hash));
// Remove event handler once triggered.
commands.Add(string.Format("\"system.method.set_key={0},{1}\"", key, cmd_key));
var setKeyValue = string.Format("branch=\"equal=d.get_hash=,cat={0}\",{{{1}}}", hash, string.Join(",", commands));
_logger.Debug("Executing remote method: method.set_key = {0},{1},{2}", key, cmd_key, setKeyValue);
var client = BuildClient(settings);
var response = client.SetKey(key, cmd_key, setKeyValue);
if (response != 0)
{
throw new DownloadClientException("Could set properties for torrent: {0}.", hash);
}
}
}
public bool HasHashTorrent(string hash, RTorrentSettings settings) public bool HasHashTorrent(string hash, RTorrentSettings settings)
{ {
_logger.Debug("Executing remote method: d.name"); _logger.Debug("Executing remote method: d.name");