From aa3f24ff50e6d03f8587c97abbbf53766dfca3ce Mon Sep 17 00:00:00 2001 From: Cucumberrbob <128094686+Cucumberrbob@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:13:05 +0000 Subject: [PATCH] Return number of selected files from `SelectFiles` so we can handle all files being excluded --- .../TorrentClients/AllDebridTorrentClient.cs | 5 +-- .../TorrentClients/DebridLinkTorrentClient.cs | 5 +-- .../Services/TorrentClients/ITorrentClient.cs | 10 +++++- .../TorrentClients/PremiumizeTorrentClient.cs | 7 ++-- .../TorrentClients/RealDebridTorrentClient.cs | 10 +++++- .../TorrentClients/TorBoxTorrentClient.cs | 5 +-- server/RdtClient.Service/Services/Torrents.cs | 32 +++++++++++++------ 7 files changed, 55 insertions(+), 19 deletions(-) diff --git a/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs index 6fd5388..afc6ed6 100644 --- a/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs @@ -155,9 +155,10 @@ public class AllDebridTorrentClient(ILogger logger, IAll return Task.FromResult>([]); } - public Task SelectFiles(Torrent torrent) + /// + public Task SelectFiles(Torrent torrent) { - return Task.CompletedTask; + return Task.FromResult(torrent.Files.Count); } public async Task Delete(String torrentId) diff --git a/server/RdtClient.Service/Services/TorrentClients/DebridLinkTorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/DebridLinkTorrentClient.cs index a4c4026..cf674d0 100644 --- a/server/RdtClient.Service/Services/TorrentClients/DebridLinkTorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/DebridLinkTorrentClient.cs @@ -136,9 +136,10 @@ public class DebridLinkClient(ILogger logger, IHttpClientFacto return Task.FromResult>([]); } - public Task SelectFiles(Data.Models.Data.Torrent torrent) + /// + public Task SelectFiles(Data.Models.Data.Torrent torrent) { - return Task.CompletedTask; + return Task.FromResult(torrent.Files.Count); } public async Task Delete(String torrentId) diff --git a/server/RdtClient.Service/Services/TorrentClients/ITorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/ITorrentClient.cs index 38121ae..c08c774 100644 --- a/server/RdtClient.Service/Services/TorrentClients/ITorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/ITorrentClient.cs @@ -10,7 +10,15 @@ public interface ITorrentClient Task AddMagnet(String magnetLink); Task AddFile(Byte[] bytes); Task> GetAvailableFiles(String hash); - Task SelectFiles(Torrent torrent); + /// + /// Tell the debrid provider which files to download. + /// + /// + /// Not all providers support this feature. + /// + /// The torrent to select files for + /// Number of files selected + Task SelectFiles(Torrent torrent); Task Delete(String torrentId); Task Unrestrict(String link); Task UpdateData(Torrent torrent, TorrentClientTorrent? torrentClientTorrent); diff --git a/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs index 5682002..fd84b8b 100644 --- a/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs @@ -121,9 +121,12 @@ public class PremiumizeTorrentClient(ILogger logger, IH return Task.FromResult>([]); } - public Task SelectFiles(Torrent torrent) + /// + public Task SelectFiles(Torrent torrent) { - return Task.CompletedTask; + // torrent.Files is not populated when this function is called + // by returning 1, we ensure no logic for "all files excluded" is followed + return Task.FromResult(1); } public async Task Delete(String id) diff --git a/server/RdtClient.Service/Services/TorrentClients/RealDebridTorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/RealDebridTorrentClient.cs index efff0a4..ad343b3 100644 --- a/server/RdtClient.Service/Services/TorrentClients/RealDebridTorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/RealDebridTorrentClient.cs @@ -142,7 +142,8 @@ public class RealDebridTorrentClient(ILogger logger, IH return Task.FromResult>([]); } - public async Task SelectFiles(Data.Models.Data.Torrent torrent) + /// + public async Task SelectFiles(Data.Models.Data.Torrent torrent) { List files; @@ -166,7 +167,14 @@ public class RealDebridTorrentClient(ILogger logger, IH var fileIds = files.Select(m => m.Id.ToString()).ToArray(); + if (fileIds.Length == 0) + { + return 0; + } + await GetClient().Torrents.SelectFilesAsync(torrent.RdId!, [.. fileIds]); + + return fileIds.Length; } public async Task Delete(String torrentId) diff --git a/server/RdtClient.Service/Services/TorrentClients/TorBoxTorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/TorBoxTorrentClient.cs index 445f27e..d5968c2 100644 --- a/server/RdtClient.Service/Services/TorrentClients/TorBoxTorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/TorBoxTorrentClient.cs @@ -171,9 +171,10 @@ public class TorBoxTorrentClient(ILogger logger, IHttpClien return []; } - public Task SelectFiles(Torrent torrent) + /// + public Task SelectFiles(Torrent torrent) { - return Task.CompletedTask; + return Task.FromResult(torrent.Files.Count); } public async Task Delete(String torrentId) diff --git a/server/RdtClient.Service/Services/Torrents.cs b/server/RdtClient.Service/Services/Torrents.cs index 9004cb3..34d80ab 100644 --- a/server/RdtClient.Service/Services/Torrents.cs +++ b/server/RdtClient.Service/Services/Torrents.cs @@ -223,7 +223,12 @@ public class Torrents( return; } - await TorrentClient.SelectFiles(torrent); + var selected = await TorrentClient.SelectFiles(torrent); + + if (selected == 0) + { + await MarkAllFilesExcluded(torrent); + } } public async Task CreateDownloads(Guid torrentId) @@ -244,14 +249,7 @@ public class Torrents( if (downloadLinks.Count == 0) { - logger.LogInformation("All files excluded by filters (IncludeRegex: {includeRegex}, ExcludeRegex: {excludeRegex}, DownloadMinSize: {downloadMinSize} {torrentInfo}", - torrent.IncludeRegex, - torrent.ExcludeRegex, - torrent.DownloadMinSize, - torrent.ToLog()); - - await torrentData.UpdateRetry(torrentId, null, torrent.TorrentRetryAttempts); - await torrentData.UpdateComplete(torrentId, "All files excluded", DateTimeOffset.Now, false); + await MarkAllFilesExcluded(torrent); return; } @@ -268,6 +266,22 @@ public class Torrents( } } + /// + /// Logs a message to the console, sets the error on the torrent and ensures it is not retried. + /// + /// The torrent to mark as "All files excluded" + private async Task MarkAllFilesExcluded(Torrent torrent) + { + logger.LogInformation("All files excluded by filters (IncludeRegex: {includeRegex}, ExcludeRegex: {excludeRegex}, DownloadMinSize: {downloadMinSize}) {torrentInfo}", + torrent.IncludeRegex, + torrent.ExcludeRegex, + torrent.DownloadMinSize, + torrent.ToLog()); + + await torrentData.UpdateRetry(torrent.TorrentId, null, torrent.TorrentRetryAttempts); + await torrentData.UpdateComplete(torrent.TorrentId, "All files excluded", DateTimeOffset.Now, false); + } + public async Task Delete(Guid torrentId, Boolean deleteData, Boolean deleteRdTorrent, Boolean deleteLocalFiles) { var torrent = await GetById(torrentId);