mirror of
https://github.com/Sonarr/Sonarr.git
synced 2024-12-14 11:23:42 +02:00
New: Indexer Seed Limit settings applied to new downloads for qBittorrent
closes #2607
This commit is contained in:
parent
1b939ebf4b
commit
faa2d632e5
@ -355,7 +355,7 @@ public virtual HttpRequestBuilder AddFormParameter(string key, object value)
|
|||||||
FormData.Add(new HttpFormData
|
FormData.Add(new HttpFormData
|
||||||
{
|
{
|
||||||
Name = key,
|
Name = key,
|
||||||
ContentData = Encoding.UTF8.GetBytes(value.ToString())
|
ContentData = Encoding.UTF8.GetBytes(Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture))
|
||||||
});
|
});
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
|
@ -57,6 +57,11 @@ protected override string AddFromMagnetLink(RemoteEpisode remoteEpisode, string
|
|||||||
|
|
||||||
SetInitialState(hash.ToLower());
|
SetInitialState(hash.ToLower());
|
||||||
|
|
||||||
|
if (remoteEpisode.SeedConfiguration.Ratio.HasValue || remoteEpisode.SeedConfiguration.SeedTime.HasValue)
|
||||||
|
{
|
||||||
|
Proxy.SetTorrentSeedingConfiguration(hash.ToLower(), remoteEpisode.SeedConfiguration, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,6 +98,11 @@ protected override string AddFromTorrentFile(RemoteEpisode remoteEpisode, string
|
|||||||
|
|
||||||
SetInitialState(hash.ToLower());
|
SetInitialState(hash.ToLower());
|
||||||
|
|
||||||
|
if (remoteEpisode.SeedConfiguration.Ratio.HasValue || remoteEpisode.SeedConfiguration.SeedTime.HasValue)
|
||||||
|
{
|
||||||
|
Proxy.SetTorrentSeedingConfiguration(hash.ToLower(), remoteEpisode.SeedConfiguration, Settings);
|
||||||
|
}
|
||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,9 +129,10 @@ public override IEnumerable<DownloadClientItem> GetItems()
|
|||||||
SeedRatio = torrent.Ratio,
|
SeedRatio = torrent.Ratio,
|
||||||
OutputPath = _remotePathMappingService.RemapRemoteToLocal(Settings.Host, new OsPath(torrent.SavePath)),
|
OutputPath = _remotePathMappingService.RemapRemoteToLocal(Settings.Host, new OsPath(torrent.SavePath)),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Avoid removing torrents that haven't reached the global max ratio.
|
// Avoid removing torrents that haven't reached the global max ratio.
|
||||||
// Removal also requires the torrent to be paused, in case a higher max ratio was set on the torrent itself (which is not exposed by the api).
|
// Removal also requires the torrent to be paused, in case a higher max ratio was set on the torrent itself (which is not exposed by the api).
|
||||||
item.CanMoveFiles = item.CanBeRemoved = (!config.MaxRatioEnabled || config.MaxRatio <= torrent.Ratio) && torrent.State == "pausedUP";
|
item.CanMoveFiles = item.CanBeRemoved = (torrent.State == "pausedUP" && HasReachedSeedLimit(torrent, config));
|
||||||
|
|
||||||
|
|
||||||
if (!item.OutputPath.IsEmpty && item.OutputPath.FileName != torrent.Name)
|
if (!item.OutputPath.IsEmpty && item.OutputPath.FileName != torrent.Name)
|
||||||
@ -246,7 +257,7 @@ private ValidationFailure TestConnection()
|
|||||||
|
|
||||||
// Complain if qBittorrent is configured to remove torrents on max ratio
|
// Complain if qBittorrent is configured to remove torrents on max ratio
|
||||||
var config = Proxy.GetConfig(Settings);
|
var config = Proxy.GetConfig(Settings);
|
||||||
if (config.MaxRatioEnabled && config.RemoveOnMaxRatio)
|
if ((config.MaxRatioEnabled || config.MaxSeedingTimeEnabled) && config.RemoveOnMaxRatio)
|
||||||
{
|
{
|
||||||
return new NzbDroneValidationFailure(String.Empty, "qBittorrent is configured to remove torrents when they reach their Share Ratio Limit")
|
return new NzbDroneValidationFailure(String.Empty, "qBittorrent is configured to remove torrents when they reach their Share Ratio Limit")
|
||||||
{
|
{
|
||||||
@ -371,5 +382,28 @@ private void SetInitialState(string hash)
|
|||||||
|
|
||||||
return TimeSpan.FromSeconds((int)torrent.Eta);
|
return TimeSpan.FromSeconds((int)torrent.Eta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected bool HasReachedSeedLimit(QBittorrentTorrent torrent, QBittorrentPreferences config)
|
||||||
|
{
|
||||||
|
if (torrent.RatioLimit >= 0)
|
||||||
|
{
|
||||||
|
if (torrent.Ratio < torrent.RatioLimit) return false;
|
||||||
|
}
|
||||||
|
else if (torrent.RatioLimit == -2 && config.MaxRatioEnabled)
|
||||||
|
{
|
||||||
|
if (torrent.Ratio < config.MaxRatio) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (torrent.SeedingTimeLimit >= 0)
|
||||||
|
{
|
||||||
|
if (torrent.SeedingTime < torrent.SeedingTimeLimit) return false;
|
||||||
|
}
|
||||||
|
else if (torrent.RatioLimit == -2 && config.MaxSeedingTimeEnabled)
|
||||||
|
{
|
||||||
|
if (torrent.SeedingTime < config.MaxSeedingTime) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,12 @@ public class QBittorrentPreferences
|
|||||||
[JsonProperty(PropertyName = "max_ratio")]
|
[JsonProperty(PropertyName = "max_ratio")]
|
||||||
public float MaxRatio { get; set; } // Get the global share ratio limit
|
public float MaxRatio { get; set; } // Get the global share ratio limit
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "max_seeding_time_enabled")]
|
||||||
|
public bool MaxSeedingTimeEnabled { get; set; } // True if share time limit is enabled
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "max_seeding_time")]
|
||||||
|
public long MaxSeedingTime { get; set; } // Get the global share time limit in minutes
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "max_ratio_act")]
|
[JsonProperty(PropertyName = "max_ratio_act")]
|
||||||
public bool RemoveOnMaxRatio { get; set; } // Action performed when a torrent reaches the maximum share ratio. [false = pause, true = remove]
|
public bool RemoveOnMaxRatio { get; set; } // Action performed when a torrent reaches the maximum share ratio. [false = pause, true = remove]
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ public interface IQBittorrentProxy
|
|||||||
|
|
||||||
void RemoveTorrent(string hash, Boolean removeData, QBittorrentSettings settings);
|
void RemoveTorrent(string hash, Boolean removeData, QBittorrentSettings settings);
|
||||||
void SetTorrentLabel(string hash, string label, QBittorrentSettings settings);
|
void SetTorrentLabel(string hash, string label, QBittorrentSettings settings);
|
||||||
|
void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings);
|
||||||
void MoveTorrentToTopInQueue(string hash, QBittorrentSettings settings);
|
void MoveTorrentToTopInQueue(string hash, QBittorrentSettings settings);
|
||||||
void PauseTorrent(string hash, QBittorrentSettings settings);
|
void PauseTorrent(string hash, QBittorrentSettings settings);
|
||||||
void ResumeTorrent(string hash, QBittorrentSettings settings);
|
void ResumeTorrent(string hash, QBittorrentSettings settings);
|
||||||
|
@ -177,7 +177,11 @@ public void SetTorrentLabel(string hash, string label, QBittorrentSettings setti
|
|||||||
ProcessRequest(setLabelRequest, settings);
|
ProcessRequest(setLabelRequest, settings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings)
|
||||||
|
{
|
||||||
|
// Not supported on api v1
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MoveTorrentToTopInQueue(string hash, QBittorrentSettings settings)
|
public void MoveTorrentToTopInQueue(string hash, QBittorrentSettings settings)
|
||||||
|
@ -165,6 +165,33 @@ public void SetTorrentLabel(string hash, string label, QBittorrentSettings setti
|
|||||||
ProcessRequest(request, settings);
|
ProcessRequest(request, settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings)
|
||||||
|
{
|
||||||
|
var ratioLimit = seedConfiguration.Ratio.HasValue ? seedConfiguration.Ratio : -2;
|
||||||
|
var seedingTimeLimit = seedConfiguration.SeedTime.HasValue ? (long)seedConfiguration.SeedTime.Value.TotalMinutes : -2;
|
||||||
|
|
||||||
|
var request = BuildRequest(settings).Resource("/api/v2/torrents/setShareLimits")
|
||||||
|
.Post()
|
||||||
|
.AddFormParameter("hashes", hash)
|
||||||
|
.AddFormParameter("ratioLimit", ratioLimit)
|
||||||
|
.AddFormParameter("seedingTimeLimit", seedingTimeLimit);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ProcessRequest(request, settings);
|
||||||
|
}
|
||||||
|
catch (DownloadClientException ex)
|
||||||
|
{
|
||||||
|
// setShareLimits was added in api v2.0.1 so catch it case of the unlikely event that someone has api v2.0
|
||||||
|
if (ex.InnerException is HttpException && (ex.InnerException as HttpException).Response.StatusCode == HttpStatusCode.NotFound)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void MoveTorrentToTopInQueue(string hash, QBittorrentSettings settings)
|
public void MoveTorrentToTopInQueue(string hash, QBittorrentSettings settings)
|
||||||
{
|
{
|
||||||
var request = BuildRequest(settings).Resource("/api/v2/torrents/topPrio")
|
var request = BuildRequest(settings).Resource("/api/v2/torrents/topPrio")
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace NzbDrone.Core.Download.Clients.QBittorrent
|
namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||||
@ -25,5 +25,15 @@ public class QBittorrentTorrent
|
|||||||
public string SavePath { get; set; } // Torrent save path
|
public string SavePath { get; set; } // Torrent save path
|
||||||
|
|
||||||
public float Ratio { get; set; } // Torrent share ratio
|
public float Ratio { get; set; } // Torrent share ratio
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "ratio_limit")] // Per torrent seeding ratio limit (-2 = use global, -1 = unlimited)
|
||||||
|
public float RatioLimit { get; set; } = -2;
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "seeding_time")]
|
||||||
|
public long SeedingTime { get; set; } // Torrent seeding time
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "seeding_time_limit")] // Per torrent seeding time limit (-2 = use global, -1 = unlimited)
|
||||||
|
public long SeedingTimeLimit { get; set; } = -2;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user