From 001de4b4271052918372d9a936129c4927974356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Thomas?= Date: Sat, 20 Apr 2024 16:27:40 +0200 Subject: [PATCH] qBittorrent: support stoppedUP and stoppedDL states In qBittorrent 5.0, pausedUP and pausedDL have been renamed to stoppedUP and stoppedDL. --- .../QBittorrentTests/QBittorrentFixture.cs | 92 +++++++++++-------- .../Clients/QBittorrent/QBittorrent.cs | 8 +- 2 files changed, 58 insertions(+), 42 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs index 3ae0edd84..1f21ed7e1 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/QBittorrentTests/QBittorrentFixture.cs @@ -176,8 +176,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests VerifyWarning(item); } - [Test] - public void paused_item_should_have_required_properties() + [TestCase("pausedDL")] + [TestCase("stoppedDL")] + public void paused_item_should_have_required_properties(string state) { var torrent = new QBittorrentTorrent { @@ -186,7 +187,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 0.7, Eta = 8640000, - State = "pausedDL", + State = state, Label = "", SavePath = "" }; @@ -198,6 +199,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests } [TestCase("pausedUP")] + [TestCase("stoppedUP")] [TestCase("queuedUP")] [TestCase("uploading")] [TestCase("stalledUP")] @@ -416,8 +418,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests result.OutputPath.FullPath.Should().Be(Path.Combine(torrent.SavePath, "Droned.S01.12")); } - [Test] - public void api_261_should_use_content_path() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void api_261_should_use_content_path(string state) { var torrent = new QBittorrentTorrent { @@ -426,7 +429,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 0.7, Eta = 8640000, - State = "pausedUP", + State = state, Label = "", SavePath = @"C:\Torrents".AsOsAgnostic(), ContentPath = @"C:\Torrents\Droned.S01.12".AsOsAgnostic() @@ -651,44 +654,48 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_not_be_removable_and_should_not_allow_move_files_if_max_ratio_is_not_set() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_and_should_not_allow_move_files_if_max_ratio_is_not_set(string state) { GivenGlobalSeedLimits(-1); - GivenCompletedTorrent("pausedUP", ratio: 1.0f); + GivenCompletedTorrent(state, ratio: 1.0f); 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_ratio_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_ratio_reached_and_paused(string state) { GivenGlobalSeedLimits(1.0f); - GivenCompletedTorrent("pausedUP", ratio: 1.0f); + GivenCompletedTorrent(state, ratio: 1.0f); 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_ratio_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_ratio_reached_and_paused(string state) { GivenGlobalSeedLimits(2.0f); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, ratioLimit: 0.8f); + GivenCompletedTorrent(state, ratio: 1.0f, ratioLimit: 0.8f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_ratio_not_reached_and_paused(string state) { GivenGlobalSeedLimits(0.2f); - GivenCompletedTorrent("pausedUP", ratio: 0.5f, ratioLimit: 0.8f); + GivenCompletedTorrent(state, ratio: 0.5f, ratioLimit: 0.8f); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -706,55 +713,60 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.CanMoveFiles.Should().BeFalse(); } - [Test] - public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20); 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_seedingtime_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_overridden_max_seedingtime_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 40); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20, seedingTimeLimit: 10); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20, seedingTimeLimit: 10); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_be_removable_if_overridden_max_seedingtime_not_reached_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_be_removable_if_overridden_max_seedingtime_not_reached_and_paused(string state) { GivenGlobalSeedLimits(-1, 20); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 30, seedingTimeLimit: 40); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 30, seedingTimeLimit: 40); 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_seedingtime_reached_but_ratio_not_and_paused() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_be_removable_and_should_allow_move_files_if_max_seedingtime_reached_but_ratio_not_and_paused(string state) { GivenGlobalSeedLimits(2.0f, 20); - GivenCompletedTorrent("pausedUP", ratio: 1.0f, seedingTime: 30); + GivenCompletedTorrent(state, ratio: 1.0f, seedingTime: 30); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeTrue(); item.CanMoveFiles.Should().BeTrue(); } - [Test] - public void should_not_fetch_details_twice() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_not_fetch_details_twice(string state) { GivenGlobalSeedLimits(-1, 30); - GivenCompletedTorrent("pausedUP", ratio: 2.0f, seedingTime: 20); + GivenCompletedTorrent(state, ratio: 2.0f, seedingTime: 20); var item = Subject.GetItems().Single(); item.CanBeRemoved.Should().BeFalse(); @@ -766,8 +778,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests .Verify(p => p.GetTorrentProperties(It.IsAny(), It.IsAny()), Times.Once()); } - [Test] - public void should_get_category_from_the_category_if_set() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_get_category_from_the_category_if_set(string state) { const string category = "tv-sonarr"; GivenGlobalSeedLimits(1.0f); @@ -779,7 +792,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 1.0, Eta = 8640000, - State = "pausedUP", + State = state, Category = category, SavePath = "", Ratio = 1.0f @@ -791,8 +804,9 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests item.Category.Should().Be(category); } - [Test] - public void should_get_category_from_the_label_if_the_category_is_not_available() + [TestCase("pausedUP")] + [TestCase("stoppedUP")] + public void should_get_category_from_the_label_if_the_category_is_not_available(string state) { const string category = "tv-sonarr"; GivenGlobalSeedLimits(1.0f); @@ -804,7 +818,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.QBittorrentTests Size = 1000, Progress = 1.0, Eta = 8640000, - State = "pausedUP", + State = state, Label = category, SavePath = "", Ratio = 1.0f diff --git a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs index b072b193d..1cf70d6e4 100644 --- a/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/QBittorrent/QBittorrent.cs @@ -239,7 +239,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent // 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). - item.CanMoveFiles = item.CanBeRemoved = torrent.State == "pausedUP" && HasReachedSeedLimit(torrent, config); + item.CanMoveFiles = item.CanBeRemoved = torrent.State is "pausedUP" or "stoppedUP" && HasReachedSeedLimit(torrent, config); switch (torrent.State) { @@ -248,7 +248,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent item.Message = _localizationService.GetLocalizedString("DownloadClientQbittorrentTorrentStateError"); break; - case "pausedDL": // torrent is paused and has NOT finished downloading + case "stoppedDL": // torrent is stopped and has NOT finished downloading + case "pausedDL": // torrent is paused and has NOT finished downloading (qBittorrent < 5) item.Status = DownloadItemStatus.Paused; break; @@ -259,7 +260,8 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent item.Status = DownloadItemStatus.Queued; break; - case "pausedUP": // torrent is paused and has finished downloading: + case "pausedUP": // torrent is paused and has finished downloading (qBittorent < 5) + case "stoppedUP": // torrent is stopped and has finished downloading case "uploading": // torrent is being seeded and data is being transferred case "stalledUP": // torrent is being seeded, but no connection were made case "queuedUP": // queuing is enabled and torrent is queued for upload