diff --git a/server/RdtClient.Data/Data/SettingData.cs b/server/RdtClient.Data/Data/SettingData.cs index d37a109..7f3d4c8 100644 --- a/server/RdtClient.Data/Data/SettingData.cs +++ b/server/RdtClient.Data/Data/SettingData.cs @@ -13,7 +13,7 @@ public class SettingData(DataContext dataContext, ILogger logger) public static IList GetAll() { - return GetSettings(Get, null).ToList(); + return GetSettings(Get, null); } public async Task Update(IList settings) @@ -75,7 +75,7 @@ public class SettingData(DataContext dataContext, ILogger logger) var newSettings = expectedSettings.Where(m => dbSettings.All(p => p.SettingId != m.SettingId)).ToList(); - if (newSettings.Any()) + if (newSettings.Count > 0) { await dataContext.Settings.AddRangeAsync(newSettings); await dataContext.SaveChangesAsync(); @@ -83,14 +83,14 @@ public class SettingData(DataContext dataContext, ILogger logger) var oldSettings = dbSettings.Where(m => expectedSettings.All(p => p.SettingId != m.SettingId)).ToList(); - if (oldSettings.Any()) + if (oldSettings.Count > 0) { dataContext.Settings.RemoveRange(oldSettings); await dataContext.SaveChangesAsync(); } } - private static IEnumerable GetSettings(Object defaultSetting, String? parent) + private static List GetSettings(Object defaultSetting, String? parent) { var result = new List(); @@ -124,7 +124,7 @@ public class SettingData(DataContext dataContext, ILogger logger) if (property.PropertyType.IsEnum) { settingProperty.Type = "Enum"; - settingProperty.EnumValues = new(); + settingProperty.EnumValues = []; foreach (var e in Enum.GetValues(property.PropertyType).Cast()) { @@ -173,8 +173,18 @@ public class SettingData(DataContext dataContext, ILogger logger) { if (property.PropertyType.IsEnum) { - var newValue = Enum.Parse(property.PropertyType, setting.Value ?? "0"); - property.SetValue(defaultSetting, newValue); + try + { + var newValue = Enum.Parse(property.PropertyType, setting.Value ?? "0"); + property.SetValue(defaultSetting, newValue); + } + catch + { + logger.LogWarning("Invalid value for setting {propertyName}: {setting.Value}", propertyName, setting.Value); + + var defaultValue = property.GetValue(defaultSetting); + property.SetValue(defaultSetting, defaultValue); + } } else { @@ -191,7 +201,10 @@ public class SettingData(DataContext dataContext, ILogger logger) } else { - logger.LogWarning($"Invalid value for setting {propertyName}: {setting.Value}"); + logger.LogWarning("Invalid value for setting {propertyName}: {setting.Value}", propertyName, setting.Value); + + var defaultValue = property.GetValue(defaultSetting); + property.SetValue(defaultSetting, defaultValue); } } } diff --git a/server/RdtClient.Data/Data/TorrentData.cs b/server/RdtClient.Data/Data/TorrentData.cs index afd4fe1..63d6cf6 100644 --- a/server/RdtClient.Data/Data/TorrentData.cs +++ b/server/RdtClient.Data/Data/TorrentData.cs @@ -21,7 +21,7 @@ public class TorrentData(DataContext dataContext) .Include(m => m.Downloads) .ToListAsync(); - return _torrentCache.OrderBy(m => m.Priority ?? 9999).ThenBy(m => m.Added).ToList(); + return [.. _torrentCache.OrderBy(m => m.Priority ?? 9999).ThenBy(m => m.Added)]; } finally { @@ -51,10 +51,12 @@ public class TorrentData(DataContext dataContext) public async Task GetByHash(String hash) { +#pragma warning disable CA1862 // Use the 'StringComparison' method overloads to perform case-insensitive string comparisons var dbTorrent = await dataContext.Torrents .AsNoTracking() .Include(m => m.Downloads) .FirstOrDefaultAsync(m => m.Hash.ToLower() == hash.ToLower()); +#pragma warning restore CA1862 // Use the 'StringComparison' method overloads to perform case-insensitive string comparisons if (dbTorrent == null) { @@ -189,7 +191,7 @@ public class TorrentData(DataContext dataContext) var downloads = await dataContext.Downloads.AsNoTracking().Where(m => m.TorrentId == torrentId).ToListAsync(); var downloadWithErrors = downloads.Where(m => !String.IsNullOrWhiteSpace(m.Error)).ToList(); - if (downloadWithErrors.Any()) + if (downloadWithErrors.Count > 0) { error = $"{downloadWithErrors.Count}/{downloads.Count} downloads failed with errors"; } diff --git a/server/RdtClient.Data/DiConfig.cs b/server/RdtClient.Data/DiConfig.cs index 4b4903b..1432338 100644 --- a/server/RdtClient.Data/DiConfig.cs +++ b/server/RdtClient.Data/DiConfig.cs @@ -11,7 +11,7 @@ public static class DiConfig { if (String.IsNullOrWhiteSpace(appSettings.Database?.Path)) { - throw new Exception("Invalid database path found in appSettings"); + throw new("Invalid database path found in appSettings"); } var connectionString = $"Data Source={appSettings.Database.Path}"; diff --git a/server/RdtClient.Data/Enums/DownloadClientLogLevel.cs b/server/RdtClient.Data/Enums/DownloadClientLogLevel.cs new file mode 100644 index 0000000..0f65400 --- /dev/null +++ b/server/RdtClient.Data/Enums/DownloadClientLogLevel.cs @@ -0,0 +1,24 @@ +using System.ComponentModel; + +namespace RdtClient.Data.Enums; + +public enum DownloadClientLogLevel +{ + [Description("Verbose")] + Verbose, + + [Description("Debug")] + Debug, + + [Description("Information")] + Information, + + [Description("Warning")] + Warning, + + [Description("Error")] + Error, + + [Description("None")] + None +} \ No newline at end of file diff --git a/server/RdtClient.Data/Enums/LogLevel.cs b/server/RdtClient.Data/Enums/LogLevel.cs index fdc43f1..a2d4099 100644 --- a/server/RdtClient.Data/Enums/LogLevel.cs +++ b/server/RdtClient.Data/Enums/LogLevel.cs @@ -4,6 +4,9 @@ namespace RdtClient.Data.Enums; public enum LogLevel { + [Description("Verbose")] + Verbose, + [Description("Debug")] Debug, diff --git a/server/RdtClient.Data/Models/Data/Torrent.cs b/server/RdtClient.Data/Models/Data/Torrent.cs index adae1e6..3ffe5b3 100644 --- a/server/RdtClient.Data/Models/Data/Torrent.cs +++ b/server/RdtClient.Data/Models/Data/Torrent.cs @@ -42,7 +42,7 @@ public class Torrent public String? Error { get; set; } [InverseProperty("Torrent")] - public IList Downloads { get; set; } = new List(); + public IList Downloads { get; set; } = []; public String? RdId { get; set; } public String? RdName { get; set; } @@ -65,16 +65,16 @@ public class Torrent { if (String.IsNullOrWhiteSpace(RdFiles)) { - return new List(); + return []; } try { - return JsonSerializer.Deserialize>(RdFiles) ?? new List(); + return JsonSerializer.Deserialize>(RdFiles) ?? []; } catch { - return new List(); + return []; } } } @@ -86,7 +86,7 @@ public class Torrent { if (String.IsNullOrWhiteSpace(DownloadManualFiles)) { - return new List(); + return []; } return DownloadManualFiles.Split(","); diff --git a/server/RdtClient.Data/Models/Internal/DbSettings.cs b/server/RdtClient.Data/Models/Internal/DbSettings.cs index b1fcb1f..2a39770 100644 --- a/server/RdtClient.Data/Models/Internal/DbSettings.cs +++ b/server/RdtClient.Data/Models/Internal/DbSettings.cs @@ -36,7 +36,7 @@ public class DbSettingsGeneral { [DisplayName("Log level")] [Description("Recommended level is Warning, set to Debug to get the most info.")] - public LogLevel LogLevel { get; set; } = LogLevel.Warning; + public LogLevel LogLevel { get; set; } = LogLevel.Error; [DisplayName("Maximum parallel downloads")] [Description("Maximum amount of torrents that get downloaded to your host at the same time.")] @@ -127,6 +127,10 @@ http://127.0.0.1:6800/jsonrpc.")] [DisplayName("Rclone mount path (only used for the Symlink Downloader)")] [Description("Path where Rclone is mounted. Required for Symlink Downloader.")] public String RcloneMountPath { get; set; } = "/mnt/rd/"; + + [DisplayName("Log level")] + [Description("Only set when trying to debug a download client, can generate a lot of logs.")] + public DownloadClientLogLevel LogLevel { get; set; } = DownloadClientLogLevel.None; } public class DbSettingsProvider diff --git a/server/RdtClient.Service/BackgroundServices/UpdateChecker.cs b/server/RdtClient.Service/BackgroundServices/UpdateChecker.cs index 672ab04..1b63026 100644 --- a/server/RdtClient.Service/BackgroundServices/UpdateChecker.cs +++ b/server/RdtClient.Service/BackgroundServices/UpdateChecker.cs @@ -1,5 +1,4 @@ -using System.Net.Http.Headers; -using System.Reflection; +using System.Reflection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Newtonsoft.Json; @@ -36,7 +35,7 @@ public class UpdateChecker(ILogger logger) : BackgroundService try { var httpClient = new HttpClient(); - httpClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("RdtClient", CurrentVersion)); + httpClient.DefaultRequestHeaders.UserAgent.Add(new("RdtClient", CurrentVersion)); var response = await httpClient.GetStringAsync($"https://api.github.com/repos/rogerfar/rdt-client/tags?per_page=1", stoppingToken); var gitHubReleases = JsonConvert.DeserializeObject>(response); diff --git a/server/RdtClient.Service/Middleware/RequestLoggingMiddleware.cs b/server/RdtClient.Service/Middleware/RequestLoggingMiddleware.cs index 79e5145..1944dab 100644 --- a/server/RdtClient.Service/Middleware/RequestLoggingMiddleware.cs +++ b/server/RdtClient.Service/Middleware/RequestLoggingMiddleware.cs @@ -24,7 +24,7 @@ public class RequestLoggingMiddleware(RequestDelegate next, ILoggerFactory logge requestLog += $", QueryString: {context.Request.QueryString}"; } - if (context.Request.HasFormContentType && context.Request.Form.Count == 0) + if (context.Request.HasFormContentType && context.Request.Form.Count > 0) { requestLog += $", Form: {String.Join(", ", context.Request.Form.Select(f => $"{f.Key}: {f.Value}"))}"; } diff --git a/server/RdtClient.Service/RdtClient.Service.csproj b/server/RdtClient.Service/RdtClient.Service.csproj index b73b7d9..aaf1ea1 100644 --- a/server/RdtClient.Service/RdtClient.Service.csproj +++ b/server/RdtClient.Service/RdtClient.Service.csproj @@ -12,7 +12,7 @@ - + diff --git a/server/RdtClient.Service/Services/Authentication.cs b/server/RdtClient.Service/Services/Authentication.cs index 9062820..8d28009 100644 --- a/server/RdtClient.Service/Services/Authentication.cs +++ b/server/RdtClient.Service/Services/Authentication.cs @@ -38,7 +38,7 @@ public class Authentication(SignInManager signInManager, UserManag public async Task Update(String newUserName, String newPassword) { - var user = await GetUser() ?? throw new Exception("No logged in user found"); + var user = await GetUser() ?? throw new("No logged in user found"); if (!String.IsNullOrWhiteSpace(newUserName)) { diff --git a/server/RdtClient.Service/Services/Downloaders/InternalDownloader.cs b/server/RdtClient.Service/Services/Downloaders/InternalDownloader.cs index b30655f..5d791a1 100644 --- a/server/RdtClient.Service/Services/Downloaders/InternalDownloader.cs +++ b/server/RdtClient.Service/Services/Downloaders/InternalDownloader.cs @@ -33,7 +33,29 @@ public class InternalDownloader : IDownloader _downloadService = new(_uri, _filePath, _downloadConfiguration); - //_downloadService.OnLog += message => Debug.WriteLine(message.Message); + _downloadService.OnLog += (message, level) => + { + if (message.Exception != null || level == 4) + { + _logger.Error(message.Exception, message.Message); + } + + switch (level) + { + case 0: + _logger.Verbose(message.Message); + break; + case 1: + _logger.Debug(message.Message); + break; + case 2: + _logger.Information(message.Message); + break; + case 3: + _logger.Warning(message.Message); + break; + } + }; _downloadService.OnProgress += (chunks, _) => { @@ -118,7 +140,8 @@ public class InternalDownloader : IDownloader { settingDownloadTimeout = 1000; } - + + _downloadConfiguration.LogLevel = (Int32)Settings.Get.DownloadClient.LogLevel; _downloadConfiguration.Parallel = settingDownloadParallelCount; _downloadConfiguration.MaximumBytesPerSecond = settingDownloadMaxSpeed; _downloadConfiguration.Timeout = settingDownloadTimeout; diff --git a/server/RdtClient.Service/Services/Settings.cs b/server/RdtClient.Service/Services/Settings.cs index b4ea2a4..fcbbc7d 100644 --- a/server/RdtClient.Service/Services/Settings.cs +++ b/server/RdtClient.Service/Services/Settings.cs @@ -48,6 +48,7 @@ public class Settings(SettingData settingData) LoggingLevelSwitch.MinimumLevel = Settings.Get.General.LogLevel switch { + LogLevel.Verbose => LogEventLevel.Verbose, LogLevel.Debug => LogEventLevel.Debug, LogLevel.Information => LogEventLevel.Information, LogLevel.Warning => LogEventLevel.Warning, diff --git a/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs index 5c33583..a46e3fe 100644 --- a/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/AllDebridTorrentClient.cs @@ -19,7 +19,7 @@ public class AllDebridTorrentClient(ILogger logger, IHtt if (String.IsNullOrWhiteSpace(apiKey)) { - throw new Exception("All-Debrid API Key not set in the settings"); + throw new("All-Debrid API Key not set in the settings"); } var httpClient = httpClientFactory.CreateClient(); @@ -45,7 +45,7 @@ public class AllDebridTorrentClient(ILogger logger, IHtt private static TorrentClientTorrent Map(Magnet torrent) { - return new TorrentClientTorrent + return new() { Id = torrent.Id.ToString(), Filename = torrent.Filename, @@ -81,14 +81,9 @@ public class AllDebridTorrentClient(ILogger logger, IHtt public async Task GetUser() { - var user = await GetClient().User.GetAsync(); + var user = await GetClient().User.GetAsync() ?? throw new("Unable to get user"); - if (user == null) - { - throw new Exception("Unable to get user"); - } - - return new TorrentClientUser + return new() { Username = user.Username, Expiration = user.PremiumUntil > 0 ? new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(user.PremiumUntil) : null @@ -101,15 +96,10 @@ public class AllDebridTorrentClient(ILogger logger, IHtt if (result?.Id == null) { - throw new Exception("Unable to add magnet link"); + throw new("Unable to add magnet link"); } - var resultId = result.Id.ToString(); - - if (resultId == null) - { - throw new Exception($"Invalid responseID {result.Id}"); - } + var resultId = result.Id.ToString() ?? throw new($"Invalid responseID {result.Id}"); return resultId; } @@ -120,15 +110,10 @@ public class AllDebridTorrentClient(ILogger logger, IHtt if (result?.Id == null) { - throw new Exception("Unable to add torrent file"); + throw new("Unable to add torrent file"); } - var resultId = result.Id.ToString(); - - if (resultId == null) - { - throw new Exception($"Invalid responseID {result.Id}"); - } + var resultId = result.Id.ToString() ?? throw new($"Invalid responseID {result.Id}"); return resultId; } @@ -139,17 +124,17 @@ public class AllDebridTorrentClient(ILogger logger, IHtt if (isAvailable) { - return new List - { + return + [ new() { Filename = "All files", Filesize = 0 } - }; + ]; } - return new List(); + return []; } public Task SelectFiles(Torrent torrent) @@ -168,7 +153,7 @@ public class AllDebridTorrentClient(ILogger logger, IHtt if (result.Link == null) { - throw new Exception("Invalid result link"); + throw new("Invalid result link"); } return result.Link; @@ -294,17 +279,12 @@ public class AllDebridTorrentClient(ILogger logger, IHtt private async Task GetInfo(String torrentId) { - var result = await GetClient().Magnet.StatusAsync(torrentId); - - if (result == null) - { - throw new Exception($"Unable to find magnet with ID {torrentId}"); - } + var result = await GetClient().Magnet.StatusAsync(torrentId) ?? throw new($"Unable to find magnet with ID {torrentId}"); return Map(result); } - private static IEnumerable GetFiles(IList files, String parent) + private static List GetFiles(IList files, String parent) { var result = new List(); @@ -324,7 +304,7 @@ public class AllDebridTorrentClient(ILogger logger, IHtt return result; } - private static IEnumerable GetFiles(IList files, String parent) + private static List GetFiles(IList files, String parent) { var result = new List(); @@ -344,7 +324,7 @@ public class AllDebridTorrentClient(ILogger logger, IHtt return result; } - private static IEnumerable GetFiles(IList files, String parent) + private static List GetFiles(IList files, String parent) { var result = new List(); diff --git a/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs b/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs index 708ae04..b7e8382 100644 --- a/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs +++ b/server/RdtClient.Service/Services/TorrentClients/PremiumizeTorrentClient.cs @@ -18,7 +18,7 @@ public class PremiumizeTorrentClient(ILogger logger, IH if (String.IsNullOrWhiteSpace(apiKey)) { - throw new Exception("Premiumize API Key not set in the settings"); + throw new("Premiumize API Key not set in the settings"); } var httpClient = httpClientFactory.CreateClient(); @@ -44,7 +44,7 @@ public class PremiumizeTorrentClient(ILogger logger, IH private static TorrentClientTorrent Map(Transfer transfer) { - return new TorrentClientTorrent + return new() { Id = transfer.Id, Filename = transfer.Name, @@ -59,11 +59,11 @@ public class PremiumizeTorrentClient(ILogger logger, IH Message = transfer.Message, StatusCode = 0, Added = null, - Files = new List(), - Links = new List - { + Files = [], + Links = + [ transfer.FolderId - }, + ], Ended = null, Speed = 0, Seeders = 0 @@ -78,14 +78,9 @@ public class PremiumizeTorrentClient(ILogger logger, IH public async Task GetUser() { - var user = await GetClient().Account.InfoAsync(); + var user = await GetClient().Account.InfoAsync() ?? throw new("Unable to get user"); - if (user == null) - { - throw new Exception("Unable to get user"); - } - - return new TorrentClientUser + return new() { Username = user.CustomerId.ToString(), Expiration = user.PremiumUntil > 0 ? new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(user.PremiumUntil.Value) : null @@ -98,15 +93,10 @@ public class PremiumizeTorrentClient(ILogger logger, IH if (result?.Id == null) { - throw new Exception("Unable to add magnet link"); + throw new("Unable to add magnet link"); } - var resultId = result.Id; - - if (resultId == null) - { - throw new Exception($"Invalid responseID {result.Id}"); - } + var resultId = result.Id ?? throw new($"Invalid responseID {result.Id}"); return resultId; } @@ -117,15 +107,10 @@ public class PremiumizeTorrentClient(ILogger logger, IH if (result?.Id == null) { - throw new Exception("Unable to add torrent file"); + throw new("Unable to add torrent file"); } - var resultId = result.Id; - - if (resultId == null) - { - throw new Exception($"Invalid responseID {result.Id}"); - } + var resultId = result.Id ?? throw new($"Invalid responseID {result.Id}"); return resultId; } @@ -222,12 +207,7 @@ public class PremiumizeTorrentClient(ILogger logger, IH Log($"Found {transfers.Count} transfers", torrent); - var transfer = transfers.FirstOrDefault(m => m.Id == torrent.RdId); - - if (transfer == null) - { - throw new Exception($"Transfer {torrent.RdId} not found!"); - } + var transfer = transfers.FirstOrDefault(m => m.Id == torrent.RdId) ?? throw new($"Transfer {torrent.RdId} not found!"); Log($"Found transfer {transfer.Name} ({transfer.Id})", torrent); @@ -265,12 +245,7 @@ public class PremiumizeTorrentClient(ILogger logger, IH private async Task GetInfo(String id) { var results = await GetClient().Transfers.ListAsync(); - var result = results.FirstOrDefault(m => m.Id == id); - - if (result == null) - { - throw new Exception($"Unable to find transfer with ID {id}"); - } + var result = results.FirstOrDefault(m => m.Id == id) ?? throw new($"Unable to find transfer with ID {id}"); return Map(result); } diff --git a/server/RdtClient.Web/Controllers/AuthController.cs b/server/RdtClient.Web/Controllers/AuthController.cs index 315a71d..5b10017 100644 --- a/server/RdtClient.Web/Controllers/AuthController.cs +++ b/server/RdtClient.Web/Controllers/AuthController.cs @@ -6,17 +6,8 @@ using RdtClient.Service.Services; namespace RdtClient.Web.Controllers; [Route("Api/Authentication")] -public class AuthController : Controller +public class AuthController(Authentication authentication, Settings settings) : Controller { - private readonly Authentication _authentication; - private readonly Settings _settings; - - public AuthController(Authentication authentication, Settings settings) - { - _authentication = authentication; - _settings = settings; - } - [AllowAnonymous] [Route("IsLoggedIn")] [HttpGet] @@ -29,7 +20,7 @@ public class AuthController : Controller if (User.Identity?.IsAuthenticated == false) { - var user = await _authentication.GetUser(); + var user = await authentication.GetUser(); if (user == null) { @@ -52,7 +43,7 @@ public class AuthController : Controller return BadRequest(); } - var user = await _authentication.GetUser(); + var user = await authentication.GetUser(); if (user != null) { @@ -64,14 +55,14 @@ public class AuthController : Controller return BadRequest("Invalid UserName or Password"); } - var registerResult = await _authentication.Register(request.UserName, request.Password); + var registerResult = await authentication.Register(request.UserName, request.Password); if (!registerResult.Succeeded) { return BadRequest(registerResult.Errors.First().Description); } - await _authentication.Login(request.UserName, request.Password); + await authentication.Login(request.UserName, request.Password); return Ok(); } @@ -91,8 +82,8 @@ public class AuthController : Controller return StatusCode(401); } - await _settings.Update("Provider:Provider", request.Provider); - await _settings.Update("Provider:ApiKey", request.Token); + await settings.Update("Provider:Provider", request.Provider); + await settings.Update("Provider:ApiKey", request.Token); return Ok(); } @@ -107,7 +98,7 @@ public class AuthController : Controller return BadRequest(); } - var user = await _authentication.GetUser(); + var user = await authentication.GetUser(); if (user == null) { @@ -119,7 +110,7 @@ public class AuthController : Controller return BadRequest("Invalid credentials"); } - var result = await _authentication.Login(request.UserName, request.Password); + var result = await authentication.Login(request.UserName, request.Password); if (!result.Succeeded) { @@ -133,7 +124,7 @@ public class AuthController : Controller [HttpPost] public async Task Logout() { - await _authentication.Logout(); + await authentication.Logout(); return Ok(); } @@ -151,7 +142,7 @@ public class AuthController : Controller return BadRequest("Invalid UserName or Password"); } - var updateResult = await _authentication.Update(request.UserName, request.Password); + var updateResult = await authentication.Update(request.UserName, request.Password); if (!updateResult.Succeeded) { diff --git a/server/RdtClient.Web/Controllers/TorrentsController.cs b/server/RdtClient.Web/Controllers/TorrentsController.cs index 86c3e42..634e9e2 100644 --- a/server/RdtClient.Web/Controllers/TorrentsController.cs +++ b/server/RdtClient.Web/Controllers/TorrentsController.cs @@ -164,7 +164,7 @@ public class TorrentsController(ILogger logger, Torrents tor return BadRequest(); } - logger.LogDebug($"Delete {torrentId}"); + logger.LogDebug("Delete {torrentId}", torrentId); await torrents.Delete(torrentId, request.DeleteData, request.DeleteRdTorrent, request.DeleteLocalFiles); @@ -175,7 +175,7 @@ public class TorrentsController(ILogger logger, Torrents tor [Route("Retry/{torrentId:guid}")] public async Task Retry(Guid torrentId) { - logger.LogDebug($"Retry {torrentId}"); + logger.LogDebug("Retry {torrentId}", torrentId); await torrents.UpdateRetry(torrentId, DateTimeOffset.UtcNow, 0); await torrents.RetryTorrent(torrentId, 0); @@ -187,7 +187,7 @@ public class TorrentsController(ILogger logger, Torrents tor [Route("RetryDownload/{downloadId:guid}")] public async Task RetryDownload(Guid downloadId) { - logger.LogDebug($"Retry download {downloadId}"); + logger.LogDebug("Retry download {downloadId}", downloadId); await torrents.RetryDownload(downloadId); @@ -285,7 +285,7 @@ public class TorrentsController(ILogger logger, Torrents tor } else { - selectedFiles = availableFiles.ToList(); + selectedFiles = [.. availableFiles]; } return Ok(new