New: Remove qBitorrent torrents that reach inactive seeding time
This commit is contained in:
parent
dc3e932102
commit
d738035fed
|
@ -108,7 +108,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||||
Subject.Definition.Settings.As<QBittorrentSettings>().RecentTvPriority = (int)QBittorrentPriority.First;
|
Subject.Definition.Settings.As<QBittorrentSettings>().RecentTvPriority = (int)QBittorrentPriority.First;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause)
|
protected void GivenGlobalSeedLimits(float maxRatio, int maxSeedingTime = -1, int maxInactiveSeedingTime = -1, QBittorrentMaxRatioAction maxRatioAction = QBittorrentMaxRatioAction.Pause)
|
||||||
{
|
{
|
||||||
Mocker.GetMock<IQBittorrentProxy>()
|
Mocker.GetMock<IQBittorrentProxy>()
|
||||||
.Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>()))
|
.Setup(s => s.GetConfig(It.IsAny<QBittorrentSettings>()))
|
||||||
|
@ -118,7 +118,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||||
MaxRatio = maxRatio,
|
MaxRatio = maxRatio,
|
||||||
MaxRatioEnabled = maxRatio >= 0,
|
MaxRatioEnabled = maxRatio >= 0,
|
||||||
MaxSeedingTime = maxSeedingTime,
|
MaxSeedingTime = maxSeedingTime,
|
||||||
MaxSeedingTimeEnabled = maxSeedingTime >= 0
|
MaxSeedingTimeEnabled = maxSeedingTime >= 0,
|
||||||
|
MaxInactiveSeedingTime = maxInactiveSeedingTime,
|
||||||
|
MaxInactiveSeedingTimeEnabled = maxInactiveSeedingTime >= 0
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -610,7 +612,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||||
float ratio = 0.1f,
|
float ratio = 0.1f,
|
||||||
float ratioLimit = -2,
|
float ratioLimit = -2,
|
||||||
int seedingTime = 1,
|
int seedingTime = 1,
|
||||||
int seedingTimeLimit = -2)
|
int seedingTimeLimit = -2,
|
||||||
|
int inactiveSeedingTimeLimit = -2,
|
||||||
|
long lastActivity = -1)
|
||||||
{
|
{
|
||||||
var torrent = new QBittorrentTorrent
|
var torrent = new QBittorrentTorrent
|
||||||
{
|
{
|
||||||
|
@ -624,7 +628,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||||
SavePath = "",
|
SavePath = "",
|
||||||
Ratio = ratio,
|
Ratio = ratio,
|
||||||
RatioLimit = ratioLimit,
|
RatioLimit = ratioLimit,
|
||||||
SeedingTimeLimit = seedingTimeLimit
|
SeedingTimeLimit = seedingTimeLimit,
|
||||||
|
InactiveSeedingTimeLimit = inactiveSeedingTimeLimit,
|
||||||
|
LastActivity = lastActivity == -1 ? DateTimeOffset.UtcNow.ToUnixTimeSeconds() : lastActivity
|
||||||
};
|
};
|
||||||
|
|
||||||
GivenTorrents(new List<QBittorrentTorrent>() { torrent });
|
GivenTorrents(new List<QBittorrentTorrent>() { torrent });
|
||||||
|
@ -739,6 +745,50 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||||
item.CanMoveFiles.Should().BeFalse();
|
item.CanMoveFiles.Should().BeFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_be_removable_and_should_not_allow_move_files_if_max_inactive_seedingtime_reached_and_not_paused()
|
||||||
|
{
|
||||||
|
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
|
||||||
|
GivenCompletedTorrent("uploading", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
|
||||||
|
|
||||||
|
var item = Subject.GetItems().Single();
|
||||||
|
item.CanBeRemoved.Should().BeFalse();
|
||||||
|
item.CanMoveFiles.Should().BeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_and_paused()
|
||||||
|
{
|
||||||
|
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
|
||||||
|
GivenCompletedTorrent("pausedUP", ratio: 2.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
|
||||||
|
|
||||||
|
var item = Subject.GetItems().Single();
|
||||||
|
item.CanBeRemoved.Should().BeTrue();
|
||||||
|
item.CanMoveFiles.Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_be_removable_and_should_allow_move_files_if_overridden_max_inactive_seedingtime_reached_and_paused()
|
||||||
|
{
|
||||||
|
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 40);
|
||||||
|
GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, inactiveSeedingTimeLimit: 10, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(15)).ToUnixTimeSeconds());
|
||||||
|
|
||||||
|
var item = Subject.GetItems().Single();
|
||||||
|
item.CanBeRemoved.Should().BeTrue();
|
||||||
|
item.CanMoveFiles.Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_not_be_removable_if_overridden_max_inactive_seedingtime_not_reached_and_paused()
|
||||||
|
{
|
||||||
|
GivenGlobalSeedLimits(-1, maxInactiveSeedingTime: 20);
|
||||||
|
GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, inactiveSeedingTimeLimit: 40, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(30)).ToUnixTimeSeconds());
|
||||||
|
|
||||||
|
var item = Subject.GetItems().Single();
|
||||||
|
item.CanBeRemoved.Should().BeFalse();
|
||||||
|
item.CanMoveFiles.Should().BeFalse();
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused()
|
public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused()
|
||||||
{
|
{
|
||||||
|
@ -750,6 +800,17 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests
|
||||||
item.CanMoveFiles.Should().BeTrue();
|
item.CanMoveFiles.Should().BeTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_be_removable_and_should_allow_move_files_if_max_inactive_seedingtime_reached_but_ratio_not_and_paused()
|
||||||
|
{
|
||||||
|
GivenGlobalSeedLimits(2.0f, maxInactiveSeedingTime: 20);
|
||||||
|
GivenCompletedTorrent("pausedUP", ratio: 1.0f, lastActivity: DateTimeOffset.UtcNow.Subtract(TimeSpan.FromMinutes(25)).ToUnixTimeSeconds());
|
||||||
|
|
||||||
|
var item = Subject.GetItems().Single();
|
||||||
|
item.CanBeRemoved.Should().BeTrue();
|
||||||
|
item.CanMoveFiles.Should().BeTrue();
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void should_not_fetch_details_twice()
|
public void should_not_fetch_details_twice()
|
||||||
{
|
{
|
||||||
|
|
|
@ -630,7 +630,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HasReachedSeedingTimeLimit(torrent, config))
|
if (HasReachedSeedingTimeLimit(torrent, config) || HasReachedInactiveSeedingTimeLimit(torrent, config))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -702,6 +702,26 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected bool HasReachedInactiveSeedingTimeLimit(QBittorrentTorrent torrent, QBittorrentPreferences config)
|
||||||
|
{
|
||||||
|
long inactiveSeedingTimeLimit;
|
||||||
|
|
||||||
|
if (torrent.InactiveSeedingTimeLimit >= 0)
|
||||||
|
{
|
||||||
|
inactiveSeedingTimeLimit = torrent.InactiveSeedingTimeLimit * 60;
|
||||||
|
}
|
||||||
|
else if (torrent.InactiveSeedingTimeLimit == -2 && config.MaxInactiveSeedingTimeEnabled)
|
||||||
|
{
|
||||||
|
inactiveSeedingTimeLimit = config.MaxInactiveSeedingTime * 60;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DateTimeOffset.UtcNow.ToUnixTimeSeconds() - torrent.LastActivity > inactiveSeedingTimeLimit;
|
||||||
|
}
|
||||||
|
|
||||||
protected void FetchTorrentDetails(QBittorrentTorrent torrent)
|
protected void FetchTorrentDetails(QBittorrentTorrent torrent)
|
||||||
{
|
{
|
||||||
var torrentProperties = Proxy.GetTorrentProperties(torrent.Hash, Settings);
|
var torrentProperties = Proxy.GetTorrentProperties(torrent.Hash, Settings);
|
||||||
|
|
|
@ -28,6 +28,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||||
[JsonProperty(PropertyName = "max_seeding_time")]
|
[JsonProperty(PropertyName = "max_seeding_time")]
|
||||||
public long MaxSeedingTime { get; set; } // Get the global share time limit in minutes
|
public long MaxSeedingTime { get; set; } // Get the global share time limit in minutes
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "max_inactive_seeding_time_enabled")]
|
||||||
|
public bool MaxInactiveSeedingTimeEnabled { get; set; } // True if share inactive time limit is enabled
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "max_inactive_seeding_time")]
|
||||||
|
public long MaxInactiveSeedingTime { get; set; } // Get the global share inactive time limit in minutes
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "max_ratio_act")]
|
[JsonProperty(PropertyName = "max_ratio_act")]
|
||||||
public QBittorrentMaxRatioAction MaxRatioAction { get; set; } // Action performed when a torrent reaches the maximum share ratio.
|
public QBittorrentMaxRatioAction MaxRatioAction { get; set; } // Action performed when a torrent reaches the maximum share ratio.
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,12 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||||
|
|
||||||
[JsonProperty(PropertyName = "seeding_time_limit")] // Per torrent seeding time limit (-2 = use global, -1 = unlimited)
|
[JsonProperty(PropertyName = "seeding_time_limit")] // Per torrent seeding time limit (-2 = use global, -1 = unlimited)
|
||||||
public long SeedingTimeLimit { get; set; } = -2;
|
public long SeedingTimeLimit { get; set; } = -2;
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "inactive_seeding_time_limit")] // Per torrent inactive seeding time limit (-2 = use global, -1 = unlimited)
|
||||||
|
public long InactiveSeedingTimeLimit { get; set; } = -2;
|
||||||
|
|
||||||
|
[JsonProperty(PropertyName = "last_activity")] // Timestamp in unix seconds when a chunk was last downloaded/uploaded
|
||||||
|
public long LastActivity { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class QBittorrentTorrentProperties
|
public class QBittorrentTorrentProperties
|
||||||
|
|
Loading…
Reference in New Issue