Return number of selected files from SelectFiles so we can handle all files being excluded

This commit is contained in:
Cucumberrbob 2025-03-27 11:13:05 +00:00
parent 3f4fb6d20a
commit aa3f24ff50
No known key found for this signature in database
GPG key ID: 2B935C47401C3614
7 changed files with 55 additions and 19 deletions

View file

@ -155,9 +155,10 @@ public class AllDebridTorrentClient(ILogger<AllDebridTorrentClient> logger, IAll
return Task.FromResult<IList<TorrentClientAvailableFile>>([]); return Task.FromResult<IList<TorrentClientAvailableFile>>([]);
} }
public Task SelectFiles(Torrent torrent) /// <inheritdoc />
public Task<Int32?> SelectFiles(Torrent torrent)
{ {
return Task.CompletedTask; return Task.FromResult<Int32?>(torrent.Files.Count);
} }
public async Task Delete(String torrentId) public async Task Delete(String torrentId)

View file

@ -136,9 +136,10 @@ public class DebridLinkClient(ILogger<DebridLinkClient> logger, IHttpClientFacto
return Task.FromResult<IList<TorrentClientAvailableFile>>([]); return Task.FromResult<IList<TorrentClientAvailableFile>>([]);
} }
public Task SelectFiles(Data.Models.Data.Torrent torrent) /// <inheritdoc />
public Task<Int32?> SelectFiles(Data.Models.Data.Torrent torrent)
{ {
return Task.CompletedTask; return Task.FromResult<Int32?>(torrent.Files.Count);
} }
public async Task Delete(String torrentId) public async Task Delete(String torrentId)

View file

@ -10,7 +10,15 @@ public interface ITorrentClient
Task<String> AddMagnet(String magnetLink); Task<String> AddMagnet(String magnetLink);
Task<String> AddFile(Byte[] bytes); Task<String> AddFile(Byte[] bytes);
Task<IList<TorrentClientAvailableFile>> GetAvailableFiles(String hash); Task<IList<TorrentClientAvailableFile>> GetAvailableFiles(String hash);
Task SelectFiles(Torrent torrent); /// <summary>
/// Tell the debrid provider which files to download.
/// </summary>
/// <remark>
/// Not all providers support this feature.
/// </remark>
/// <param name="torrent">The torrent to select files for</param>
/// <returns>Number of files selected</returns>
Task<Int32?> SelectFiles(Torrent torrent);
Task Delete(String torrentId); Task Delete(String torrentId);
Task<String> Unrestrict(String link); Task<String> Unrestrict(String link);
Task<Torrent> UpdateData(Torrent torrent, TorrentClientTorrent? torrentClientTorrent); Task<Torrent> UpdateData(Torrent torrent, TorrentClientTorrent? torrentClientTorrent);

View file

@ -121,9 +121,12 @@ public class PremiumizeTorrentClient(ILogger<PremiumizeTorrentClient> logger, IH
return Task.FromResult<IList<TorrentClientAvailableFile>>([]); return Task.FromResult<IList<TorrentClientAvailableFile>>([]);
} }
public Task SelectFiles(Torrent torrent) /// <inheritdoc />
public Task<Int32?> 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<Int32?>(1);
} }
public async Task Delete(String id) public async Task Delete(String id)

View file

@ -142,7 +142,8 @@ public class RealDebridTorrentClient(ILogger<RealDebridTorrentClient> logger, IH
return Task.FromResult<IList<TorrentClientAvailableFile>>([]); return Task.FromResult<IList<TorrentClientAvailableFile>>([]);
} }
public async Task SelectFiles(Data.Models.Data.Torrent torrent) /// <inheritdoc />
public async Task<Int32?> SelectFiles(Data.Models.Data.Torrent torrent)
{ {
List<TorrentClientFile> files; List<TorrentClientFile> files;
@ -166,7 +167,14 @@ public class RealDebridTorrentClient(ILogger<RealDebridTorrentClient> logger, IH
var fileIds = files.Select(m => m.Id.ToString()).ToArray(); var fileIds = files.Select(m => m.Id.ToString()).ToArray();
if (fileIds.Length == 0)
{
return 0;
}
await GetClient().Torrents.SelectFilesAsync(torrent.RdId!, [.. fileIds]); await GetClient().Torrents.SelectFilesAsync(torrent.RdId!, [.. fileIds]);
return fileIds.Length;
} }
public async Task Delete(String torrentId) public async Task Delete(String torrentId)

View file

@ -171,9 +171,10 @@ public class TorBoxTorrentClient(ILogger<TorBoxTorrentClient> logger, IHttpClien
return []; return [];
} }
public Task SelectFiles(Torrent torrent) /// <inheritdoc />
public Task<Int32?> SelectFiles(Torrent torrent)
{ {
return Task.CompletedTask; return Task.FromResult<Int32?>(torrent.Files.Count);
} }
public async Task Delete(String torrentId) public async Task Delete(String torrentId)

View file

@ -223,7 +223,12 @@ public class Torrents(
return; return;
} }
await TorrentClient.SelectFiles(torrent); var selected = await TorrentClient.SelectFiles(torrent);
if (selected == 0)
{
await MarkAllFilesExcluded(torrent);
}
} }
public async Task CreateDownloads(Guid torrentId) public async Task CreateDownloads(Guid torrentId)
@ -244,14 +249,7 @@ public class Torrents(
if (downloadLinks.Count == 0) if (downloadLinks.Count == 0)
{ {
logger.LogInformation("All files excluded by filters (IncludeRegex: {includeRegex}, ExcludeRegex: {excludeRegex}, DownloadMinSize: {downloadMinSize} {torrentInfo}", await MarkAllFilesExcluded(torrent);
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);
return; return;
} }
@ -268,6 +266,22 @@ public class Torrents(
} }
} }
/// <summary>
/// Logs a message to the console, sets the error on the torrent and ensures it is not retried.
/// </summary>
/// <param name="torrent">The torrent to mark as "All files excluded"</param>
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) public async Task Delete(Guid torrentId, Boolean deleteData, Boolean deleteRdTorrent, Boolean deleteLocalFiles)
{ {
var torrent = await GetById(torrentId); var torrent = await GetById(torrentId);