Moved the responsibility for starting the Download and Unpack process to the TorrentRunner instead of the Torrents service.
This commit is contained in:
parent
63e44d02ef
commit
44d7d0f9b8
2 changed files with 89 additions and 91 deletions
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in a new issue