Increased download buffer size, change the torrentrunner to only query RDT when there are any torrents, added a simple speed test.
This commit is contained in:
parent
5f84c2b317
commit
49071a7f48
4 changed files with 111 additions and 7 deletions
|
|
@ -119,7 +119,7 @@ namespace RdtClient.Service.Services
|
|||
}
|
||||
|
||||
await using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.Write);
|
||||
var buffer = new Byte[4096];
|
||||
var buffer = new Byte[64 * 1024];
|
||||
|
||||
while (fileStream.Length < response.ContentLength && !_cancelled)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
using RdtClient.Data.Data;
|
||||
using RdtClient.Data.Models.Data;
|
||||
|
|
@ -14,6 +16,8 @@ namespace RdtClient.Service.Services
|
|||
Task<String> GetString(String key);
|
||||
Task<Int32> GetNumber(String key);
|
||||
Task TestPath(String path);
|
||||
Task<Double> TestDownloadSpeed();
|
||||
Task<Double> TestWriteSpeed(String path);
|
||||
}
|
||||
|
||||
public class Settings : ISettings
|
||||
|
|
@ -43,7 +47,7 @@ namespace RdtClient.Service.Services
|
|||
{
|
||||
throw new Exception($"Setting with key {key} not found");
|
||||
}
|
||||
|
||||
|
||||
return setting.Value;
|
||||
}
|
||||
|
||||
|
|
@ -55,7 +59,7 @@ namespace RdtClient.Service.Services
|
|||
{
|
||||
throw new Exception($"Setting with key {key} not found");
|
||||
}
|
||||
|
||||
|
||||
return Int32.Parse(setting.Value);
|
||||
}
|
||||
|
||||
|
|
@ -78,5 +82,81 @@ namespace RdtClient.Service.Services
|
|||
await File.WriteAllTextAsync(testFile, "RealDebridClient Test File, you can remove this file.");
|
||||
File.Delete(testFile);
|
||||
}
|
||||
|
||||
public async Task<Double> TestDownloadSpeed()
|
||||
{
|
||||
var watch = new Stopwatch();
|
||||
|
||||
var request = WebRequest.Create(new Uri("https://34.download.real-debrid.com/speedtest/testDefault.rar/" + DateTime.Now.Ticks));
|
||||
|
||||
watch.Start();
|
||||
|
||||
using var response = await request.GetResponseAsync();
|
||||
|
||||
await using var stream = response.GetResponseStream();
|
||||
|
||||
if (stream == null)
|
||||
{
|
||||
throw new IOException("No stream");
|
||||
}
|
||||
|
||||
var buffer = new Byte[64 * 1024];
|
||||
Int64 totalRead = 0;
|
||||
|
||||
while (totalRead < response.ContentLength)
|
||||
{
|
||||
var read = await stream.ReadAsync(buffer.AsMemory(0, buffer.Length));
|
||||
|
||||
if (read > 0)
|
||||
{
|
||||
totalRead += read;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
watch.Stop();
|
||||
|
||||
var downloadSpeed = totalRead / watch.Elapsed.TotalSeconds;
|
||||
|
||||
return downloadSpeed;
|
||||
}
|
||||
|
||||
public async Task<Double> TestWriteSpeed(String path)
|
||||
{
|
||||
var testFilePath = Path.Combine(path, "test.tmp");
|
||||
|
||||
const Int32 testFileSize = 1024 * 1024 * 1024;
|
||||
|
||||
var watch = new Stopwatch();
|
||||
|
||||
if (File.Exists(testFilePath))
|
||||
{
|
||||
File.Delete(testFilePath);
|
||||
}
|
||||
|
||||
watch.Start();
|
||||
|
||||
var rnd = new Random();
|
||||
|
||||
await using var fileStream = new FileStream(testFilePath, FileMode.Create, FileAccess.Write, FileShare.Write);
|
||||
|
||||
var buffer = new Byte[64 * 1024];
|
||||
|
||||
while (fileStream.Length < testFileSize)
|
||||
{
|
||||
rnd.NextBytes(buffer);
|
||||
|
||||
fileStream.Write(buffer, 0, buffer.Length);
|
||||
}
|
||||
|
||||
watch.Stop();
|
||||
|
||||
var writeSpeed = fileStream.Length / watch.Elapsed.TotalSeconds;
|
||||
|
||||
return writeSpeed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -117,9 +117,11 @@ namespace RdtClient.Service.Services
|
|||
ActiveUnpackClients.TryRemove(downloadId, out _);
|
||||
}
|
||||
}
|
||||
|
||||
var torrents = await _torrents.Get();
|
||||
|
||||
// Only poll RealDebrid every 5 when a hub is connected, otherwise ever 30 seconds
|
||||
if (_nextUpdate < DateTime.UtcNow)
|
||||
if (_nextUpdate < DateTime.UtcNow && torrents.Count > 0)
|
||||
{
|
||||
var updateTime = 30;
|
||||
|
||||
|
|
@ -131,10 +133,11 @@ namespace RdtClient.Service.Services
|
|||
_nextUpdate = DateTime.UtcNow.AddSeconds(updateTime);
|
||||
|
||||
await _torrents.Update();
|
||||
|
||||
// Re-get torrents to account for updated info
|
||||
torrents = await _torrents.Get();
|
||||
}
|
||||
|
||||
var torrents = await _torrents.Get();
|
||||
|
||||
torrents = torrents.Where(m => m.Completed == null).ToList();
|
||||
|
||||
// Check if there are any downloads that are queued and can be started.
|
||||
|
|
|
|||
|
|
@ -50,12 +50,33 @@ namespace RdtClient.Web.Controllers
|
|||
|
||||
[HttpPost]
|
||||
[Route("TestPath")]
|
||||
public async Task<ActionResult<Profile>> TestPath([FromBody] SettingsControllerTestPathRequest request)
|
||||
public async Task<ActionResult> TestPath([FromBody] SettingsControllerTestPathRequest request)
|
||||
{
|
||||
await _settings.TestPath(request.Path);
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("TestSpeed")]
|
||||
public async Task<ActionResult> TestSpeed()
|
||||
{
|
||||
var downloadPath = await _settings.GetString("DownloadPath");
|
||||
var mappedPath = await _settings.GetString("MappedPath");
|
||||
|
||||
var downloadSpeed = await _settings.TestDownloadSpeed();
|
||||
var containerWriteSpeed = await _settings.TestWriteSpeed(downloadPath);
|
||||
var remoteWriteSpeed = await _settings.TestWriteSpeed(mappedPath);
|
||||
|
||||
var result = new
|
||||
{
|
||||
downloadSpeed,
|
||||
containerWriteSpeed,
|
||||
remoteWriteSpeed
|
||||
};
|
||||
|
||||
return Ok(result);
|
||||
}
|
||||
}
|
||||
|
||||
public class SettingsControllerUpdateRequest
|
||||
|
|
|
|||
Loading…
Reference in a new issue