Cleanup, make sure the RD API adheres to the set timeout when trying to add a magnet or file.

This commit is contained in:
Roger Far 2025-07-28 21:46:20 -06:00
parent 1fe407ba5a
commit d9858409db
12 changed files with 46 additions and 42 deletions

View file

@ -8,15 +8,15 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.5" /> <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="9.0.7" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.5" /> <PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="9.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.5"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.7">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Serilog" Version="4.2.0" /> <PackageReference Include="Serilog" Version="4.3.0" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View file

@ -15,13 +15,13 @@
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="Moq" Version="4.20.72" /> <PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="TestableIO.System.IO.Abstractions" Version="22.0.14" /> <PackageReference Include="TestableIO.System.IO.Abstractions" Version="22.0.15" />
<PackageReference Include="TestableIO.System.IO.Abstractions.TestingHelpers" Version="22.0.14" /> <PackageReference Include="TestableIO.System.IO.Abstractions.TestingHelpers" Version="22.0.15" />
<PackageReference Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.0.14" /> <PackageReference Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.0.15" />
<PackageReference Include="xunit" Version="2.9.3" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0"> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.3">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>

View file

@ -13,7 +13,7 @@ public class EnricherTest : IDisposable
public EnricherTest() public EnricherTest()
{ {
_mockRepository = new MockRepository(MockBehavior.Strict); _mockRepository = new(MockBehavior.Strict);
_loggerMock = _mockRepository.Create<ILogger<Enricher>>(MockBehavior.Loose); _loggerMock = _mockRepository.Create<ILogger<Enricher>>(MockBehavior.Loose);
_trackerListGrabberMock = _mockRepository.Create<ITrackerListGrabber>(); _trackerListGrabberMock = _mockRepository.Create<ITrackerListGrabber>();
} }
@ -67,7 +67,7 @@ public class EnricherTest : IDisposable
private static BEncodedDictionary CreateTorrentDictWithOnlyAnnounce(String announceUrl) private static BEncodedDictionary CreateTorrentDictWithOnlyAnnounce(String announceUrl)
{ {
return new BEncodedDictionary return new()
{ {
["announce"] = new BEncodedString(announceUrl), ["announce"] = new BEncodedString(announceUrl),
["info"] = new BEncodedDictionary() ["info"] = new BEncodedDictionary()
@ -76,7 +76,7 @@ public class EnricherTest : IDisposable
private static BEncodedDictionary CreateTorrentDictWithNoTrackers() private static BEncodedDictionary CreateTorrentDictWithNoTrackers()
{ {
return new BEncodedDictionary return new()
{ {
["info"] = new BEncodedDictionary() ["info"] = new BEncodedDictionary()
}; };

View file

@ -14,7 +14,9 @@ public class WebsocketsUpdater(ILogger<WebsocketsUpdater> logger, IServiceProvid
await Task.Delay(1000, stoppingToken); await Task.Delay(1000, stoppingToken);
} }
var remoteService = serviceProvider.GetRequiredService<RemoteService>(); var scope = serviceProvider.CreateScope();
var remoteService = scope.ServiceProvider.GetRequiredService<RemoteService>();
while (!stoppingToken.IsCancellationRequested) while (!stoppingToken.IsCancellationRequested)
{ {

View file

@ -12,20 +12,20 @@
<PackageReference Include="AllDebrid.NET" Version="1.0.18" /> <PackageReference Include="AllDebrid.NET" Version="1.0.18" />
<PackageReference Include="Aria2.NET" Version="1.0.6" /> <PackageReference Include="Aria2.NET" Version="1.0.6" />
<PackageReference Include="DebridLinkFr.NET" Version="1.0.4" /> <PackageReference Include="DebridLinkFr.NET" Version="1.0.4" />
<PackageReference Include="Downloader" Version="3.3.4" /> <PackageReference Include="Downloader" Version="4.0.2" />
<PackageReference Include="Downloader.NET" Version="1.0.16" /> <PackageReference Include="Downloader.NET" Version="1.0.18" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.5" /> <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.5.0" /> <PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.7.0" />
<PackageReference Include="MonoTorrent" Version="3.0.2" /> <PackageReference Include="MonoTorrent" Version="3.0.2" />
<PackageReference Include="Polly" Version="8.5.2" /> <PackageReference Include="Polly" Version="8.6.2" />
<PackageReference Include="Premiumize.NET" Version="1.0.10" /> <PackageReference Include="Premiumize.NET" Version="1.0.10" />
<PackageReference Include="RD.NET" Version="2.1.11" /> <PackageReference Include="RD.NET" Version="2.1.11" />
<PackageReference Include="Serilog" Version="4.2.0" /> <PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageReference Include="SharpCompress" Version="0.39.0" /> <PackageReference Include="SharpCompress" Version="0.40.0" />
<PackageReference Include="Synology.Api.Client" Version="0.3.93" /> <PackageReference Include="Synology.Api.Client" Version="0.3.93" />
<PackageReference Include="TestableIO.System.IO.Abstractions" Version="22.0.14" /> <PackageReference Include="TestableIO.System.IO.Abstractions" Version="22.0.15" />
<PackageReference Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.0.14" /> <PackageReference Include="TestableIO.System.IO.Abstractions.Wrappers" Version="22.0.15" />
<PackageReference Include="TorBox.NET" Version="1.5.0" /> <PackageReference Include="TorBox.NET" Version="1.5.0" />
</ItemGroup> </ItemGroup>

View file

@ -32,7 +32,7 @@ public class BezzadDownloader : IDownloader
// For all options, see https://github.com/bezzad/Downloader // For all options, see https://github.com/bezzad/Downloader
_downloadConfiguration = new() _downloadConfiguration = new()
{ {
MaxTryAgainOnFailover = 5, MaxTryAgainOnFailure = 5,
RangeDownload = false, RangeDownload = false,
ClearPackageOnCompletionWithFailure = true, ClearPackageOnCompletionWithFailure = true,
ReserveStorageSpaceBeforeStartingDownload = false, ReserveStorageSpaceBeforeStartingDownload = false,

View file

@ -76,14 +76,14 @@ public sealed class Enricher(ILogger<Enricher> logger, ITrackerListGrabber track
if (!paramDict.ContainsKey(key)) if (!paramDict.ContainsKey(key))
{ {
paramDict[key] = new List<String>(); paramDict[key] = [];
} }
paramDict[key].AddRange(queryKVs.GetValues(key) ?? []); paramDict[key].AddRange(queryKVs.GetValues(key) ?? []);
} }
var existingTrackers = paramDict.TryGetValue("tr", out var value) var existingTrackers = paramDict.TryGetValue("tr", out var value)
? new HashSet<String>(value, StringComparer.OrdinalIgnoreCase) ? new(value, StringComparer.OrdinalIgnoreCase)
: new HashSet<String>(StringComparer.OrdinalIgnoreCase); : new HashSet<String>(StringComparer.OrdinalIgnoreCase);
paramDict.Remove("tr"); paramDict.Remove("tr");

View file

@ -128,14 +128,18 @@ public class RealDebridTorrentClient(ILogger<RealDebridTorrentClient> logger, IH
public async Task<String> AddMagnet(String magnetLink) public async Task<String> AddMagnet(String magnetLink)
{ {
var result = await GetClient().Torrents.AddMagnetAsync(magnetLink); var timeoutCancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(Settings.Get.Provider.Timeout));
var result = await GetClient().Torrents.AddMagnetAsync(magnetLink, timeoutCancellationToken.Token);
return result.Id; return result.Id;
} }
public async Task<String> AddFile(Byte[] bytes) public async Task<String> AddFile(Byte[] bytes)
{ {
var result = await GetClient().Torrents.AddFileAsync(bytes); var timeoutCancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(Settings.Get.Provider.Timeout));
var result = await GetClient().Torrents.AddFileAsync(bytes, timeoutCancellationToken.Token);
return result.Id; return result.Id;
} }

View file

@ -217,16 +217,16 @@ public class TorrentRunner(ILogger<TorrentRunner> logger, Torrents torrents, Dow
Log($"Unpack reported an error: {unpackClient.Error}", download, download.Torrent); Log($"Unpack reported an error: {unpackClient.Error}", download, download.Torrent);
await downloads.UpdateError(downloadId, unpackClient.Error); await downloads.UpdateError(downloadId, unpackClient.Error);
await downloads.UpdateCompleted(downloadId, DateTimeOffset.UtcNow);
} }
else else
{ {
Log($"Unpack finished successfully", download, download.Torrent); Log($"Unpack finished successfully", download, download.Torrent);
await downloads.UpdateUnpackingFinished(downloadId, DateTimeOffset.UtcNow); await downloads.UpdateUnpackingFinished(downloadId, DateTimeOffset.UtcNow);
await downloads.UpdateCompleted(downloadId, DateTimeOffset.UtcNow);
} }
await downloads.UpdateCompleted(downloadId, DateTimeOffset.UtcNow);
ActiveUnpackClients.TryRemove(downloadId, out _); ActiveUnpackClients.TryRemove(downloadId, out _);
Log($"Removed from ActiveUnpackClients", download, download.Torrent); Log($"Removed from ActiveUnpackClients", download, download.Torrent);

View file

@ -3,7 +3,6 @@ using System.IO.Abstractions;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using System.Web;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MonoTorrent; using MonoTorrent;
using RdtClient.Data.Data; using RdtClient.Data.Data;

View file

@ -1,4 +1,3 @@
using System.Net.Http.Headers;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using System.Reflection; using System.Reflection;
@ -96,7 +95,7 @@ public class TrackerListGrabber(IHttpClientFactory httpClientFactory, IMemoryCac
{ {
logger.LogError(ex, "Unable to fetch tracker list."); logger.LogError(ex, "Unable to fetch tracker list.");
throw new Exception("Unable to fetch tracker list for enrichment.", ex); throw new("Unable to fetch tracker list for enrichment.", ex);
} }
finally finally
{ {
@ -116,7 +115,7 @@ public class TrackerListGrabber(IHttpClientFactory httpClientFactory, IMemoryCac
? $"v{version[..version.LastIndexOf('.')]}" ? $"v{version[..version.LastIndexOf('.')]}"
: ""; : "";
httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("RdtClient", currentVersion)); httpClient.DefaultRequestHeaders.UserAgent.Add(new("RdtClient", currentVersion));
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(15)); using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(15));
var token = cts.Token; var token = cts.Token;
var response = await httpClient.GetAsync(trackerUri, HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false); var response = await httpClient.GetAsync(trackerUri, HttpCompletionOption.ResponseHeadersRead, token).ConfigureAwait(false);

View file

@ -30,16 +30,16 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="9.0.5" /> <PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="9.0.5" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="9.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.5"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.7">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="9.0.5" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="9.0.7" />
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="9.0.5" /> <PackageReference Include="Microsoft.Extensions.Identity.Core" Version="9.0.7" />
<PackageReference Include="Serilog" Version="4.2.0" /> <PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
</ItemGroup> </ItemGroup>