rdt-client/server/RdtClient.Service/BackgroundServices/ProviderUpdater.cs
2026-05-18 21:30:31 +02:00

76 lines
2.7 KiB
C#

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using RdtClient.Data.Enums;
using RdtClient.Data.Models.Internal;
using RdtClient.Service.Services;
namespace RdtClient.Service.BackgroundServices;
public class ProviderUpdater(ILogger<ProviderUpdater> logger, IServiceProvider serviceProvider, ISettings settings) : BackgroundService
{
private static DateTime _nextUpdate = DateTime.UtcNow;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!Startup.Ready)
{
await Task.Delay(1000, stoppingToken);
}
logger.LogInformation("ProviderUpdater started.");
while (!stoppingToken.IsCancellationRequested)
{
using var scope = serviceProvider.CreateScope();
var torrentService = scope.ServiceProvider.GetRequiredService<Torrents>();
var torrentRunner = scope.ServiceProvider.GetRequiredService<TorrentRunner>();
try
{
var torrents = await torrentService.Get();
if (_nextUpdate < DateTime.UtcNow && (settings.Current.Provider.AutoImport || torrents.Any(t => t.RdStatus != TorrentStatus.Finished) || RdtHub.HasConnections))
{
logger.LogDebug($"Updating torrent info from debrid provider");
var updateTime = settings.Current.Provider.CheckInterval * 3;
if (updateTime < 30)
{
updateTime = 30;
}
if (RdtHub.HasConnections)
{
updateTime = settings.Current.Provider.CheckInterval;
if (updateTime < 5)
{
updateTime = 5;
}
}
_nextUpdate = DateTime.UtcNow.AddSeconds(updateTime);
await torrentService.UpdateRdData();
logger.LogDebug("Finished updating torrent info from debrid provider, next update in {updateTime} seconds", updateTime);
}
}
catch (RateLimitException ex)
{
await torrentRunner.SetRateLimit(ex.RetryAfter, ex.Message);
_nextUpdate = DateTime.UtcNow.Add(ex.RetryAfter);
}
catch (Exception ex)
{
logger.LogError(ex, "Unexpected error occurred in ProviderUpdater: {ex.Message}", ex.Message);
}
await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken);
}
logger.LogInformation("ProviderUpdater stopped.");
}
}