From 9800bd6b439257e73e3545e125cd03900a3036bb Mon Sep 17 00:00:00 2001 From: cicomalieran <81043292+cicomalieran@users.noreply.github.com> Date: Tue, 7 Mar 2023 19:46:48 -0500 Subject: [PATCH] Fixed: Processing very long ETA from Transmission Closes #5444 --- .../TransmissionTests/TransmissionFixture.cs | 23 ++++++++++++++++++- .../VuzeTests/VuzeFixture.cs | 2 +- .../Clients/Transmission/TransmissionBase.cs | 9 +++++++- .../Transmission/TransmissionTorrent.cs | 2 +- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs index 497ee8ca3..6778fefbb 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/TransmissionTests/TransmissionFixture.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using FluentAssertions; @@ -275,7 +276,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests [TestCase(-1)] // Infinite/Unknown [TestCase(-2)] // Magnet Downloading - public void should_ignore_negative_eta(int eta) + public void should_ignore_negative_eta(long eta) { _completed.Eta = eta; @@ -284,6 +285,26 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.TransmissionTests item.RemainingTime.Should().NotHaveValue(); } + [TestCase(2147483648)] // 2038-01-19T03:14:08Z > int.MaxValue as unix timestamp can be either an int or a long + public void should_support_long_values_for_eta_in_seconds(long eta) + { + _downloading.Eta = eta; + + PrepareClientToReturnDownloadingItem(); + var item = Subject.GetItems().Single(); + item.RemainingTime.Should().Be(TimeSpan.FromSeconds(eta)); + } + + [TestCase(2147483648000)] // works with milliseconds format too + public void should_support_long_values_for_eta_in_milliseconds(long eta) + { + _downloading.Eta = eta; + + PrepareClientToReturnDownloadingItem(); + var item = Subject.GetItems().Single(); + item.RemainingTime.Should().Be(TimeSpan.FromMilliseconds(eta)); + } + [Test] public void should_not_be_removable_and_should_not_allow_move_files_if_max_ratio_reached_and_not_stopped() { diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs index eb354b1bb..89532d84f 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/VuzeTests/VuzeFixture.cs @@ -271,7 +271,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.VuzeTests [TestCase(-1)] // Infinite/Unknown [TestCase(-2)] // Magnet Downloading - public void should_ignore_negative_eta(int eta) + public void should_ignore_negative_eta(long eta) { _completed.Eta = eta; diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs index 3d8dab109..ef8af9011 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionBase.cs @@ -80,7 +80,14 @@ namespace NzbDrone.Core.Download.Clients.Transmission if (torrent.Eta >= 0) { - item.RemainingTime = TimeSpan.FromSeconds(torrent.Eta); + try + { + item.RemainingTime = TimeSpan.FromSeconds(torrent.Eta); + } + catch (OverflowException) + { + item.RemainingTime = TimeSpan.FromMilliseconds(torrent.Eta); + } } if (!torrent.ErrorString.IsNullOrWhiteSpace()) diff --git a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs index 3abb5d4e8..e72fa55a7 100644 --- a/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs +++ b/src/NzbDrone.Core/Download/Clients/Transmission/TransmissionTorrent.cs @@ -9,7 +9,7 @@ public long TotalSize { get; set; } public long LeftUntilDone { get; set; } public bool IsFinished { get; set; } - public int Eta { get; set; } + public long Eta { get; set; } public TransmissionTorrentStatus Status { get; set; } public int SecondsDownloading { get; set; } public int SecondsSeeding { get; set; }