diff --git a/server/RdtClient.Service/Services/TorrentRunner.cs b/server/RdtClient.Service/Services/TorrentRunner.cs index d4e4d2b..d21e034 100644 --- a/server/RdtClient.Service/Services/TorrentRunner.cs +++ b/server/RdtClient.Service/Services/TorrentRunner.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.IO; using System.Linq; using System.Threading.Tasks; using RdtClient.Data.Enums; @@ -61,9 +62,12 @@ namespace RdtClient.Service.Services public async Task Tick() { var settingApiKey = await _settings.GetString("RealDebridApiKey"); - var minFileSizeSetting = await _settings.GetNumber("MinFileSize"); - - minFileSizeSetting = minFileSizeSetting * 1024 * 1024; + var settingMinFileSize = await _settings.GetNumber("MinFileSize"); + var settingDownloadLimit = await _settings.GetNumber("DownloadLimit"); + var settingUnpackLimit = await _settings.GetNumber("UnpackLimit"); + var settingDownloadPath = await _settings.GetString("DownloadPath"); + + settingMinFileSize = settingMinFileSize * 1024 * 1024; if (String.IsNullOrWhiteSpace(settingApiKey)) { @@ -85,6 +89,7 @@ namespace RdtClient.Service.Services else { await _downloads.UpdateDownloadFinished(downloadId, DateTimeOffset.UtcNow); + await _downloads.UpdateUnpackingQueued(downloadId, DateTimeOffset.UtcNow); } ActiveDownloadClients.TryRemove(downloadId, out _); @@ -139,7 +144,32 @@ namespace RdtClient.Service.Services foreach (var download in queuedDownloads) { - await _torrents.Download(download.DownloadId); + if (TorrentRunner.ActiveDownloadClients.Count >= settingDownloadLimit) + { + return; + } + + if (TorrentRunner.ActiveDownloadClients.ContainsKey(download.DownloadId)) + { + return; + } + + await _downloads.UpdateDownloadStarted(download.DownloadId, download.DownloadStarted); + + var downloadPath = settingDownloadPath; + + if (!String.IsNullOrWhiteSpace(download.Torrent.Category)) + { + downloadPath = Path.Combine(downloadPath, download.Torrent.Category); + } + + // Start the download process + var downloadClient = new DownloadClient(download, downloadPath); + + if (TorrentRunner.ActiveDownloadClients.TryAdd(download.DownloadId, downloadClient)) + { + await downloadClient.Start(); + } } // Check if there are any unpacks that are queued and can be started. @@ -149,7 +179,47 @@ namespace RdtClient.Service.Services foreach (var download in queuedUnpacks) { - await _torrents.Unpack(download.DownloadId); + // Check if the unpacking process is even needed + var uri = new Uri(download.Link); + var fileName = uri.Segments.Last(); + var extension = Path.GetExtension(fileName); + + if (extension != ".rar") + { + await _downloads.UpdateUnpackingStarted(download.DownloadId, DateTimeOffset.UtcNow); + await _downloads.UpdateUnpackingFinished(download.DownloadId, DateTimeOffset.UtcNow); + await _downloads.UpdateCompleted(download.DownloadId, DateTimeOffset.UtcNow); + + continue; + } + + // Check if we have reached the download limit, if so queue the download, but don't start it. + if (TorrentRunner.ActiveUnpackClients.Count >= settingUnpackLimit) + { + return; + } + + if (TorrentRunner.ActiveUnpackClients.ContainsKey(download.DownloadId)) + { + return; + } + + await _downloads.UpdateUnpackingStarted(download.DownloadId, download.UnpackingStarted); + + var downloadPath = settingDownloadPath; + + if (!String.IsNullOrWhiteSpace(download.Torrent.Category)) + { + downloadPath = Path.Combine(downloadPath, download.Torrent.Category); + } + + // Start the unpacking process + var unpackClient = new UnpackClient(download, downloadPath); + + if (TorrentRunner.ActiveUnpackClients.TryAdd(download.DownloadId, unpackClient)) + { + await unpackClient.Start(); + } } foreach (var torrent in torrents) @@ -167,10 +237,10 @@ namespace RdtClient.Service.Services .Select(m => m.Id.ToString()) .ToArray(); - if (minFileSizeSetting > 0) + if (settingMinFileSize > 0) { fileIds = torrent.Files - .Where(m => m.Bytes > minFileSizeSetting) + .Where(m => m.Bytes > settingMinFileSize) .Select(m => m.Id.ToString()) .ToArray(); } diff --git a/server/RdtClient.Service/Services/Torrents.cs b/server/RdtClient.Service/Services/Torrents.cs index ca9c4e2..8cd1bec 100644 --- a/server/RdtClient.Service/Services/Torrents.cs +++ b/server/RdtClient.Service/Services/Torrents.cs @@ -221,94 +221,22 @@ namespace RdtClient.Service.Services public async Task Download(Guid downloadId) { - var settingDownloadLimit = await _settings.GetNumber("DownloadLimit"); - - var download = await _downloads.GetById(downloadId); - - var downloadPath = await DownloadPath(download.Torrent); - - download.DownloadFinished = null; - await _downloads.UpdateDownloadFinished(download.DownloadId, null); - - download.Completed = null; - await _downloads.UpdateCompleted(download.DownloadId, null); - - download.Error = null; - await _downloads.UpdateError(download.DownloadId, null); - - // Check if we have reached the download limit, if so queue the download, but don't start it. - if (TorrentRunner.ActiveDownloadClients.Count >= settingDownloadLimit) - { - return; - } - - if (TorrentRunner.ActiveDownloadClients.ContainsKey(downloadId)) - { - return; - } - - download.DownloadStarted = DateTimeOffset.UtcNow; - await _downloads.UpdateDownloadStarted(download.DownloadId, download.DownloadStarted); - - // Start the download process - var downloadClient = new DownloadClient(download, downloadPath); - - if (TorrentRunner.ActiveDownloadClients.TryAdd(downloadId, downloadClient)) - { - await downloadClient.Start(); - } + await _downloads.UpdateDownloadStarted(downloadId, null); + await _downloads.UpdateDownloadFinished(downloadId, null); + await _downloads.UpdateUnpackingQueued(downloadId, null); + await _downloads.UpdateUnpackingStarted(downloadId, null); + await _downloads.UpdateUnpackingFinished(downloadId, null); + await _downloads.UpdateCompleted(downloadId, null); + await _downloads.UpdateError(downloadId, null); } public async Task Unpack(Guid downloadId) { - var settingUnpackLimit = await _settings.GetNumber("UnpackLimit"); - - var download = await _downloads.GetById(downloadId); - - var downloadPath = await DownloadPath(download.Torrent); - - // Check if the file is even unpackable. - var uri = new Uri(download.Link); - var fileName = uri.Segments.Last(); - var extension = Path.GetExtension(fileName); - - if (extension != ".rar") - { - await _downloads.UpdateUnpackingQueued(downloadId, DateTimeOffset.UtcNow); - await _downloads.UpdateUnpackingStarted(downloadId, DateTimeOffset.UtcNow); - await _downloads.UpdateUnpackingFinished(downloadId, DateTimeOffset.UtcNow); - - return; - } - - // This property can have a value when it is a retry. - if (download.UnpackingQueued == null) - { - download.UnpackingQueued = DateTimeOffset.UtcNow; - await _downloads.UpdateUnpackingQueued(download.DownloadId, download.UnpackingQueued); - } - - // Check if we have reached the download limit, if so queue the download, but don't start it. - if (TorrentRunner.ActiveUnpackClients.Count >= settingUnpackLimit) - { - return; - } - - if (TorrentRunner.ActiveUnpackClients.ContainsKey(downloadId)) - { - return; - } - - download.UnpackingStarted = DateTimeOffset.UtcNow; - await _downloads.UpdateUnpackingStarted(download.DownloadId, download.UnpackingStarted); - - // Start the unpacking process - var unpackClient = new UnpackClient(download, downloadPath); - - if (TorrentRunner.ActiveUnpackClients.TryAdd(downloadId, unpackClient)) - { - await unpackClient.Start(); - } + await _downloads.UpdateUnpackingQueued(downloadId, DateTimeOffset.UtcNow); + await _downloads.UpdateUnpackingStarted(downloadId, null); + await _downloads.UpdateUnpackingFinished(downloadId, null); + await _downloads.UpdateCompleted(downloadId, null); + await _downloads.UpdateError(downloadId, null); } public void Reset()