Update database settings retrieval.
This commit is contained in:
parent
697cd58023
commit
e4c001b0ce
17 changed files with 180 additions and 161 deletions
|
|
@ -9,12 +9,10 @@ namespace RdtClient.Data.Data
|
||||||
public class DownloadData
|
public class DownloadData
|
||||||
{
|
{
|
||||||
private readonly DataContext _dataContext;
|
private readonly DataContext _dataContext;
|
||||||
private readonly TorrentData _torrentData;
|
|
||||||
|
|
||||||
public DownloadData(DataContext dataContext, TorrentData torrentData)
|
public DownloadData(DataContext dataContext)
|
||||||
{
|
{
|
||||||
_dataContext = dataContext;
|
_dataContext = dataContext;
|
||||||
_torrentData = torrentData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Download> GetById(Guid downloadId)
|
public async Task<Download> GetById(Guid downloadId)
|
||||||
|
|
@ -48,7 +46,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
|
|
||||||
return download;
|
return download;
|
||||||
}
|
}
|
||||||
|
|
@ -62,7 +60,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateDownloadStarted(Guid downloadId, DateTimeOffset? dateTime)
|
public async Task UpdateDownloadStarted(Guid downloadId, DateTimeOffset? dateTime)
|
||||||
|
|
@ -74,7 +72,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateDownloadFinished(Guid downloadId, DateTimeOffset? dateTime)
|
public async Task UpdateDownloadFinished(Guid downloadId, DateTimeOffset? dateTime)
|
||||||
|
|
@ -91,7 +89,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateUnpackingQueued(Guid downloadId, DateTimeOffset? dateTime)
|
public async Task UpdateUnpackingQueued(Guid downloadId, DateTimeOffset? dateTime)
|
||||||
|
|
@ -103,7 +101,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateUnpackingStarted(Guid downloadId, DateTimeOffset? dateTime)
|
public async Task UpdateUnpackingStarted(Guid downloadId, DateTimeOffset? dateTime)
|
||||||
|
|
@ -115,7 +113,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateUnpackingFinished(Guid downloadId, DateTimeOffset? dateTime)
|
public async Task UpdateUnpackingFinished(Guid downloadId, DateTimeOffset? dateTime)
|
||||||
|
|
@ -127,7 +125,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateCompleted(Guid downloadId, DateTimeOffset? dateTime)
|
public async Task UpdateCompleted(Guid downloadId, DateTimeOffset? dateTime)
|
||||||
|
|
@ -139,7 +137,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateError(Guid downloadId, String error)
|
public async Task UpdateError(Guid downloadId, String error)
|
||||||
|
|
@ -151,7 +149,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task UpdateRetryCount(Guid downloadId, Int32 retryCount)
|
public async Task UpdateRetryCount(Guid downloadId, Int32 retryCount)
|
||||||
|
|
@ -163,7 +161,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DeleteForTorrent(Guid torrentId)
|
public async Task DeleteForTorrent(Guid torrentId)
|
||||||
|
|
@ -176,7 +174,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Reset(Guid downloadId)
|
public async Task Reset(Guid downloadId)
|
||||||
|
|
@ -198,7 +196,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
await _torrentData.VoidCache();
|
await TorrentData.VoidCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5,12 +5,12 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using RdtClient.Data.Models.Data;
|
using RdtClient.Data.Models.Data;
|
||||||
|
using RdtClient.Data.Models.Internal;
|
||||||
|
|
||||||
namespace RdtClient.Data.Data
|
namespace RdtClient.Data.Data
|
||||||
{
|
{
|
||||||
public class SettingData
|
public class SettingData
|
||||||
{
|
{
|
||||||
private static IList<Setting> _settingCache;
|
|
||||||
private static readonly SemaphoreSlim _settingCacheLock = new(1);
|
private static readonly SemaphoreSlim _settingCacheLock = new(1);
|
||||||
|
|
||||||
private readonly DataContext _dataContext;
|
private readonly DataContext _dataContext;
|
||||||
|
|
@ -20,20 +20,37 @@ namespace RdtClient.Data.Data
|
||||||
_dataContext = dataContext;
|
_dataContext = dataContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static DbSettings Get { get; private set; }
|
||||||
|
|
||||||
|
public async Task ResetCache()
|
||||||
|
{
|
||||||
|
var allSettings = await _dataContext.Settings.AsNoTracking().ToListAsync();
|
||||||
|
|
||||||
|
String GetString(String name) => allSettings.FirstOrDefault(m => m.SettingId == name)?.Value;
|
||||||
|
Int32 GetInt32(String name) => Int32.Parse(allSettings.FirstOrDefault(m => m.SettingId == name)?.Value ?? "0");
|
||||||
|
|
||||||
|
Get = new DbSettings
|
||||||
|
{
|
||||||
|
RealDebridApiKey = GetString("RealDebridApiKey"),
|
||||||
|
DownloadPath = GetString("DownloadPath"),
|
||||||
|
DownloadClient = GetString("DownloadClient"),
|
||||||
|
TempPath = GetString("TempPath"),
|
||||||
|
MappedPath = GetString("MappedPath"),
|
||||||
|
DownloadLimit = GetInt32("DownloadLimit"),
|
||||||
|
UnpackLimit = GetInt32("UnpackLimit"),
|
||||||
|
MinFileSize = GetInt32("MinFileSize"),
|
||||||
|
OnlyDownloadAvailableFiles = GetInt32("OnlyDownloadAvailableFiles"),
|
||||||
|
DownloadChunkCount = GetInt32("DownloadChunkCount"),
|
||||||
|
DownloadMaxSpeed = GetInt32("DownloadMaxSpeed"),
|
||||||
|
ProxyServer = GetString("ProxyServer"),
|
||||||
|
LogLevel = GetString("LogLevel"),
|
||||||
|
Categories = GetString("Categories")
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<IList<Setting>> GetAll()
|
public async Task<IList<Setting>> GetAll()
|
||||||
{
|
{
|
||||||
await _settingCacheLock.WaitAsync();
|
return await _dataContext.Settings.AsNoTracking().ToListAsync();
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_settingCache ??= await _dataContext.Settings.AsNoTracking().ToListAsync();
|
|
||||||
|
|
||||||
return _settingCache;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
_settingCacheLock.Release();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Update(IList<Setting> settings)
|
public async Task Update(IList<Setting> settings)
|
||||||
|
|
@ -56,7 +73,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
_settingCache = null;
|
await ResetCache();
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
@ -81,7 +98,7 @@ namespace RdtClient.Data.Data
|
||||||
|
|
||||||
await _dataContext.SaveChangesAsync();
|
await _dataContext.SaveChangesAsync();
|
||||||
|
|
||||||
_settingCache = null;
|
await ResetCache();
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -202,7 +202,7 @@ namespace RdtClient.Data.Data
|
||||||
await VoidCache();
|
await VoidCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task VoidCache()
|
public static async Task VoidCache()
|
||||||
{
|
{
|
||||||
await _torrentCacheLock.WaitAsync();
|
await _torrentCacheLock.WaitAsync();
|
||||||
|
|
||||||
|
|
|
||||||
22
server/RdtClient.Data/Models/Internal/DbSettings.cs
Normal file
22
server/RdtClient.Data/Models/Internal/DbSettings.cs
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace RdtClient.Data.Models.Internal
|
||||||
|
{
|
||||||
|
public class DbSettings
|
||||||
|
{
|
||||||
|
public String RealDebridApiKey { get; set; }
|
||||||
|
public String DownloadPath { get; set; }
|
||||||
|
public String DownloadClient { get; set; }
|
||||||
|
public String TempPath { get; set; }
|
||||||
|
public String MappedPath { get; set; }
|
||||||
|
public Int32 DownloadLimit { get; set; }
|
||||||
|
public Int32 UnpackLimit { get; set; }
|
||||||
|
public Int32 MinFileSize { get; set; }
|
||||||
|
public Int32 OnlyDownloadAvailableFiles { get; set; }
|
||||||
|
public Int32 DownloadChunkCount { get; set; }
|
||||||
|
public Int32 DownloadMaxSpeed { get; set; }
|
||||||
|
public String ProxyServer { get; set; }
|
||||||
|
public String LogLevel { get; set; }
|
||||||
|
public String Categories { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,6 +14,8 @@ namespace RdtClient.Service
|
||||||
services.AddScoped<Settings>();
|
services.AddScoped<Settings>();
|
||||||
services.AddScoped<Torrents>();
|
services.AddScoped<Torrents>();
|
||||||
services.AddScoped<TorrentRunner>();
|
services.AddScoped<TorrentRunner>();
|
||||||
|
|
||||||
|
services.AddHostedService<Startup>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
<PackageReference Include="Serilog.Exceptions" Version="7.0.0" />
|
<PackageReference Include="Serilog.Exceptions" Version="7.0.0" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
|
||||||
<PackageReference Include="SharpCompress" Version="0.28.3" />
|
<PackageReference Include="SharpCompress" Version="0.28.3" />
|
||||||
|
<PackageReference Include="StreamJsonRpc" Version="2.8.21" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Downloader;
|
using Downloader;
|
||||||
using RdtClient.Data.Models.Data;
|
using RdtClient.Data.Models.Data;
|
||||||
|
using RdtClient.Data.Models.Internal;
|
||||||
using RdtClient.Service.Helpers;
|
using RdtClient.Service.Helpers;
|
||||||
|
|
||||||
namespace RdtClient.Service.Services
|
namespace RdtClient.Service.Services
|
||||||
|
|
@ -34,7 +34,7 @@ namespace RdtClient.Service.Services
|
||||||
public Int64 BytesTotal { get; private set; }
|
public Int64 BytesTotal { get; private set; }
|
||||||
public Int64 BytesDone { get; private set; }
|
public Int64 BytesDone { get; private set; }
|
||||||
|
|
||||||
public async Task Start(IList<Setting> settings)
|
public async Task Start(DbSettings settings)
|
||||||
{
|
{
|
||||||
BytesDone = 0;
|
BytesDone = 0;
|
||||||
BytesTotal = 0;
|
BytesTotal = 0;
|
||||||
|
|
@ -56,11 +56,9 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
var uri = new Uri(_download.Link);
|
var uri = new Uri(_download.Link);
|
||||||
|
|
||||||
await Task.Factory.StartNew(async delegate
|
await Task.Run(async delegate
|
||||||
{
|
{
|
||||||
var downloadClientSetting = settings.GetString("DownloadClient");
|
switch (settings.DownloadClient)
|
||||||
|
|
||||||
switch (downloadClientSetting)
|
|
||||||
{
|
{
|
||||||
case "Simple":
|
case "Simple":
|
||||||
await DownloadSimple(uri, filePath);
|
await DownloadSimple(uri, filePath);
|
||||||
|
|
@ -69,7 +67,7 @@ namespace RdtClient.Service.Services
|
||||||
await DownloadMultiPart(filePath, settings);
|
await DownloadMultiPart(filePath, settings);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new Exception($"Unknown download client {downloadClientSetting}");
|
throw new Exception($"Unknown download client {settings.DownloadClient}");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -126,30 +124,30 @@ namespace RdtClient.Service.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DownloadMultiPart(String filePath, IList<Setting> settings)
|
private async Task DownloadMultiPart(String filePath, DbSettings settings)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var settingTempPath = settings.GetString("TempPath");
|
var settingTempPath = settings.TempPath;
|
||||||
if (String.IsNullOrWhiteSpace(settingTempPath))
|
if (String.IsNullOrWhiteSpace(settingTempPath))
|
||||||
{
|
{
|
||||||
settingTempPath = Path.GetTempPath();
|
settingTempPath = Path.GetTempPath();
|
||||||
}
|
}
|
||||||
|
|
||||||
var settingDownloadChunkCount = settings.GetNumber("DownloadChunkCount");
|
var settingDownloadChunkCount = settings.DownloadChunkCount;
|
||||||
if (settingDownloadChunkCount <= 0)
|
if (settingDownloadChunkCount <= 0)
|
||||||
{
|
{
|
||||||
settingDownloadChunkCount = 1;
|
settingDownloadChunkCount = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var settingDownloadMaxSpeed = settings.GetNumber("DownloadMaxSpeed");
|
var settingDownloadMaxSpeed = settings.DownloadMaxSpeed;
|
||||||
if (settingDownloadMaxSpeed <= 0)
|
if (settingDownloadMaxSpeed <= 0)
|
||||||
{
|
{
|
||||||
settingDownloadMaxSpeed = 0;
|
settingDownloadMaxSpeed = 0;
|
||||||
}
|
}
|
||||||
settingDownloadMaxSpeed = settingDownloadMaxSpeed * 1024 * 1024;
|
settingDownloadMaxSpeed = settingDownloadMaxSpeed * 1024 * 1024;
|
||||||
|
|
||||||
var settingProxyServer = settings.GetString("ProxyServer");
|
var settingProxyServer = settings.ProxyServer;
|
||||||
|
|
||||||
var downloadOpt = new DownloadConfiguration
|
var downloadOpt = new DownloadConfiguration
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@ namespace RdtClient.Service.Services
|
||||||
WebUiUsername = ""
|
WebUiUsername = ""
|
||||||
};
|
};
|
||||||
|
|
||||||
var savePath = await AppDefaultSavePath();
|
var savePath = AppDefaultSavePath();
|
||||||
|
|
||||||
preferences.SavePath = savePath;
|
preferences.SavePath = savePath;
|
||||||
preferences.TempPath = $"{savePath}temp{Path.DirectorySeparatorChar}";
|
preferences.TempPath = $"{savePath}temp{Path.DirectorySeparatorChar}";
|
||||||
|
|
@ -195,9 +195,9 @@ namespace RdtClient.Service.Services
|
||||||
return preferences;
|
return preferences;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<String> AppDefaultSavePath()
|
public String AppDefaultSavePath()
|
||||||
{
|
{
|
||||||
var downloadPath = await _settings.GetString("MappedPath");
|
var downloadPath = Settings.Get.MappedPath;
|
||||||
downloadPath = downloadPath.TrimEnd('\\')
|
downloadPath = downloadPath.TrimEnd('\\')
|
||||||
.TrimEnd('/');
|
.TrimEnd('/');
|
||||||
|
|
||||||
|
|
@ -208,7 +208,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
public async Task<IList<TorrentInfo>> TorrentInfo()
|
public async Task<IList<TorrentInfo>> TorrentInfo()
|
||||||
{
|
{
|
||||||
var savePath = await AppDefaultSavePath();
|
var savePath = AppDefaultSavePath();
|
||||||
|
|
||||||
var results = new List<TorrentInfo>();
|
var results = new List<TorrentInfo>();
|
||||||
|
|
||||||
|
|
@ -337,7 +337,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
public async Task<TorrentProperties> TorrentProperties(String hash)
|
public async Task<TorrentProperties> TorrentProperties(String hash)
|
||||||
{
|
{
|
||||||
var savePath = await AppDefaultSavePath();
|
var savePath = AppDefaultSavePath();
|
||||||
|
|
||||||
var torrent = await _torrents.GetByHash(hash);
|
var torrent = await _torrents.GetByHash(hash);
|
||||||
|
|
||||||
|
|
@ -388,11 +388,11 @@ namespace RdtClient.Service.Services
|
||||||
SeedsTotal = 100,
|
SeedsTotal = 100,
|
||||||
ShareRatio = 9999,
|
ShareRatio = 9999,
|
||||||
TimeElapsed = (Int64) (DateTimeOffset.UtcNow - torrent.Added).TotalSeconds,
|
TimeElapsed = (Int64) (DateTimeOffset.UtcNow - torrent.Added).TotalSeconds,
|
||||||
TotalDownloaded = bytesTotal,
|
TotalDownloaded = bytesDone,
|
||||||
TotalDownloadedSession = bytesTotal,
|
TotalDownloadedSession = bytesDone,
|
||||||
TotalSize = bytesTotal,
|
TotalSize = bytesTotal,
|
||||||
TotalUploaded = bytesTotal,
|
TotalUploaded = bytesDone,
|
||||||
TotalUploadedSession = bytesTotal,
|
TotalUploadedSession = bytesDone,
|
||||||
TotalWasted = 0,
|
TotalWasted = 0,
|
||||||
UpLimit = -1,
|
UpLimit = -1,
|
||||||
UpSpeed = speed,
|
UpSpeed = speed,
|
||||||
|
|
@ -416,22 +416,16 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
public async Task TorrentsAddMagnet(String magnetLink, String category)
|
public async Task TorrentsAddMagnet(String magnetLink, String category)
|
||||||
{
|
{
|
||||||
var onlyDownloadAvailableFilesSetting = await _settings.GetNumber("OnlyDownloadAvailableFiles");
|
var downloadAction = Settings.Get.OnlyDownloadAvailableFiles == 1 ? TorrentDownloadAction.DownloadAvailableFiles : TorrentDownloadAction.DownloadAll;
|
||||||
var minFileSizeSetting = await _settings.GetNumber("MinFileSize");
|
|
||||||
|
|
||||||
var downloadAction = onlyDownloadAvailableFilesSetting == 1 ? TorrentDownloadAction.DownloadAvailableFiles : TorrentDownloadAction.DownloadAll;
|
await _torrents.UploadMagnet(magnetLink, category, downloadAction, TorrentFinishedAction.None, Settings.Get.MinFileSize, null);
|
||||||
|
|
||||||
await _torrents.UploadMagnet(magnetLink, category, downloadAction, TorrentFinishedAction.None, minFileSizeSetting, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task TorrentsAddFile(Byte[] fileBytes, String category)
|
public async Task TorrentsAddFile(Byte[] fileBytes, String category)
|
||||||
{
|
{
|
||||||
var onlyDownloadAvailableFilesSetting = await _settings.GetNumber("OnlyDownloadAvailableFiles");
|
var downloadAction = Settings.Get.OnlyDownloadAvailableFiles == 1 ? TorrentDownloadAction.DownloadAvailableFiles : TorrentDownloadAction.DownloadAll;
|
||||||
var minFileSizeSetting = await _settings.GetNumber("MinFileSize");
|
|
||||||
|
|
||||||
var downloadAction = onlyDownloadAvailableFilesSetting == 1 ? TorrentDownloadAction.DownloadAvailableFiles : TorrentDownloadAction.DownloadAll;
|
await _torrents.UploadFile(fileBytes, category, downloadAction, TorrentFinishedAction.None, Settings.Get.MinFileSize, null);
|
||||||
|
|
||||||
await _torrents.UploadFile(fileBytes, category, downloadAction, TorrentFinishedAction.None, minFileSizeSetting, null);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task TorrentsSetCategory(String hash, String category)
|
public async Task TorrentsSetCategory(String hash, String category)
|
||||||
|
|
@ -448,9 +442,7 @@ namespace RdtClient.Service.Services
|
||||||
.Distinct()
|
.Distinct()
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
var categorySetting = await _settings.GetString("Categories");
|
var categories = Settings.Get.Categories.Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||||
|
|
||||||
var categories = categorySetting.Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
|
||||||
|
|
||||||
torrentsToGroup.AddRange(categories);
|
torrentsToGroup.AddRange(categories);
|
||||||
|
|
||||||
|
|
@ -471,7 +463,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
public async Task CategoryCreate(String category)
|
public async Task CategoryCreate(String category)
|
||||||
{
|
{
|
||||||
var categoriesSetting = await _settings.GetString("Categories");
|
var categoriesSetting = Settings.Get.Categories;
|
||||||
|
|
||||||
if (String.IsNullOrWhiteSpace(categoriesSetting))
|
if (String.IsNullOrWhiteSpace(categoriesSetting))
|
||||||
{
|
{
|
||||||
|
|
@ -494,7 +486,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
public async Task CategoryRemove(String category)
|
public async Task CategoryRemove(String category)
|
||||||
{
|
{
|
||||||
var categoriesSetting = await _settings.GetString("Categories");
|
var categoriesSetting = Settings.Get.Categories;
|
||||||
|
|
||||||
if (String.IsNullOrWhiteSpace(categoriesSetting))
|
if (String.IsNullOrWhiteSpace(categoriesSetting))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,11 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using RdtClient.Data.Data;
|
using RdtClient.Data.Data;
|
||||||
using RdtClient.Data.Models.Data;
|
using RdtClient.Data.Models.Data;
|
||||||
|
using RdtClient.Data.Models.Internal;
|
||||||
|
|
||||||
namespace RdtClient.Service.Services
|
namespace RdtClient.Service.Services
|
||||||
{
|
{
|
||||||
|
|
@ -19,6 +19,8 @@ namespace RdtClient.Service.Services
|
||||||
_settingData = settingData;
|
_settingData = settingData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static DbSettings Get => SettingData.Get;
|
||||||
|
|
||||||
public async Task<IList<Setting>> GetAll()
|
public async Task<IList<Setting>> GetAll()
|
||||||
{
|
{
|
||||||
return await _settingData.GetAll();
|
return await _settingData.GetAll();
|
||||||
|
|
@ -34,32 +36,6 @@ namespace RdtClient.Service.Services
|
||||||
await _settingData.UpdateString(key, value);
|
await _settingData.UpdateString(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<String> GetString(String key)
|
|
||||||
{
|
|
||||||
var settings = await GetAll();
|
|
||||||
var setting = settings.FirstOrDefault(m => m.SettingId == key);
|
|
||||||
|
|
||||||
if (setting == null)
|
|
||||||
{
|
|
||||||
throw new Exception($"Setting with key {key} not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
return setting.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<Int32> GetNumber(String key)
|
|
||||||
{
|
|
||||||
var settings = await GetAll();
|
|
||||||
var setting = settings.FirstOrDefault(m => m.SettingId == key);
|
|
||||||
|
|
||||||
if (setting == null)
|
|
||||||
{
|
|
||||||
throw new Exception($"Setting with key {key} not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
return Int32.Parse(setting.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task TestPath(String path)
|
public async Task TestPath(String path)
|
||||||
{
|
{
|
||||||
if (String.IsNullOrWhiteSpace(path))
|
if (String.IsNullOrWhiteSpace(path))
|
||||||
|
|
@ -82,9 +58,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
public async Task<Double> TestDownloadSpeed(CancellationToken cancellationToken)
|
public async Task<Double> TestDownloadSpeed(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var downloadPath = await GetString("DownloadPath");
|
var downloadPath = Get.DownloadPath;
|
||||||
|
|
||||||
var settings = await GetAll();
|
|
||||||
|
|
||||||
var testFilePath = Path.Combine(downloadPath, "testDefault.rar");
|
var testFilePath = Path.Combine(downloadPath, "testDefault.rar");
|
||||||
|
|
||||||
|
|
@ -104,7 +78,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
var downloadClient = new DownloadClient(download, download.Torrent, downloadPath);
|
var downloadClient = new DownloadClient(download, download.Torrent, downloadPath);
|
||||||
|
|
||||||
await downloadClient.Start(settings);
|
await downloadClient.Start(Get);
|
||||||
|
|
||||||
while (!downloadClient.Finished)
|
while (!downloadClient.Finished)
|
||||||
{
|
{
|
||||||
|
|
@ -136,7 +110,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
public async Task<Double> TestWriteSpeed()
|
public async Task<Double> TestWriteSpeed()
|
||||||
{
|
{
|
||||||
var downloadPath = await GetString("DownloadPath");
|
var downloadPath = Get.DownloadPath;
|
||||||
|
|
||||||
var testFilePath = Path.Combine(downloadPath, "test.tmp");
|
var testFilePath = Path.Combine(downloadPath, "test.tmp");
|
||||||
|
|
||||||
|
|
@ -161,7 +135,7 @@ namespace RdtClient.Service.Services
|
||||||
{
|
{
|
||||||
rnd.NextBytes(buffer);
|
rnd.NextBytes(buffer);
|
||||||
|
|
||||||
fileStream.Write(buffer, 0, buffer.Length);
|
await fileStream.WriteAsync(buffer.AsMemory(0, buffer.Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
watch.Stop();
|
watch.Stop();
|
||||||
|
|
@ -182,7 +156,7 @@ namespace RdtClient.Service.Services
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var tempPath = GetString("TempPath").Result;
|
var tempPath = Get.TempPath;
|
||||||
|
|
||||||
if (!String.IsNullOrWhiteSpace(tempPath))
|
if (!String.IsNullOrWhiteSpace(tempPath))
|
||||||
{
|
{
|
||||||
|
|
@ -199,5 +173,10 @@ namespace RdtClient.Service.Services
|
||||||
// ignored
|
// ignored
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task ResetCache()
|
||||||
|
{
|
||||||
|
await _settingData.ResetCache();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
if (read > 0)
|
if (read > 0)
|
||||||
{
|
{
|
||||||
fileStream.Write(buffer, 0, read);
|
await fileStream.WriteAsync(buffer.AsMemory(0, read));
|
||||||
|
|
||||||
BytesDone = fileStream.Length;
|
BytesDone = fileStream.Length;
|
||||||
BytesTotal = responseLength;
|
BytesTotal = responseLength;
|
||||||
|
|
|
||||||
32
server/RdtClient.Service/Services/Startup.cs
Normal file
32
server/RdtClient.Service/Services/Startup.cs
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
|
||||||
|
namespace RdtClient.Service.Services
|
||||||
|
{
|
||||||
|
public class Startup : IHostedService
|
||||||
|
{
|
||||||
|
private readonly IServiceProvider _serviceProvider;
|
||||||
|
|
||||||
|
public Startup(IServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
_serviceProvider = serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task StartAsync(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
using var scope = _serviceProvider.CreateScope();
|
||||||
|
|
||||||
|
var settings = scope.ServiceProvider.GetRequiredService<Settings>();
|
||||||
|
|
||||||
|
await settings.ResetCache();
|
||||||
|
|
||||||
|
settings.Clean();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -6,7 +6,6 @@ using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
using RdtClient.Data.Enums;
|
using RdtClient.Data.Enums;
|
||||||
using RdtClient.Service.Helpers;
|
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
||||||
namespace RdtClient.Service.Services
|
namespace RdtClient.Service.Services
|
||||||
|
|
@ -22,12 +21,10 @@ namespace RdtClient.Service.Services
|
||||||
private readonly Downloads _downloads;
|
private readonly Downloads _downloads;
|
||||||
private readonly RemoteService _remoteService;
|
private readonly RemoteService _remoteService;
|
||||||
|
|
||||||
private readonly Settings _settings;
|
|
||||||
private readonly Torrents _torrents;
|
private readonly Torrents _torrents;
|
||||||
|
|
||||||
public TorrentRunner(Settings settings, Torrents torrents, Downloads downloads, RemoteService remoteService)
|
public TorrentRunner(Torrents torrents, Downloads downloads, RemoteService remoteService)
|
||||||
{
|
{
|
||||||
_settings = settings;
|
|
||||||
_torrents = torrents;
|
_torrents = torrents;
|
||||||
_downloads = downloads;
|
_downloads = downloads;
|
||||||
_remoteService = remoteService;
|
_remoteService = remoteService;
|
||||||
|
|
@ -66,28 +63,25 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
Log.Debug("TorrentRunner Tick Start");
|
Log.Debug("TorrentRunner Tick Start");
|
||||||
|
|
||||||
var settings = await _settings.GetAll();
|
if (String.IsNullOrWhiteSpace(Settings.Get.RealDebridApiKey))
|
||||||
|
|
||||||
var settingApiKey = settings.GetString("RealDebridApiKey");
|
|
||||||
if (String.IsNullOrWhiteSpace(settingApiKey))
|
|
||||||
{
|
{
|
||||||
Log.Debug($"No RealDebridApiKey set!");
|
Log.Debug($"No RealDebridApiKey set!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var settingDownloadLimit = settings.GetNumber("DownloadLimit");
|
var settingDownloadLimit = Settings.Get.DownloadLimit;
|
||||||
if (settingDownloadLimit < 1)
|
if (settingDownloadLimit < 1)
|
||||||
{
|
{
|
||||||
settingDownloadLimit = 1;
|
settingDownloadLimit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var settingUnpackLimit = settings.GetNumber("UnpackLimit");
|
var settingUnpackLimit = Settings.Get.UnpackLimit;
|
||||||
if (settingUnpackLimit < 1)
|
if (settingUnpackLimit < 1)
|
||||||
{
|
{
|
||||||
settingUnpackLimit = 1;
|
settingUnpackLimit = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var settingDownloadPath = settings.GetString("DownloadPath");
|
var settingDownloadPath = Settings.Get.DownloadPath;
|
||||||
if (String.IsNullOrWhiteSpace(settingDownloadPath))
|
if (String.IsNullOrWhiteSpace(settingDownloadPath))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
|
@ -253,7 +247,7 @@ namespace RdtClient.Service.Services
|
||||||
{
|
{
|
||||||
Log.Debug($"Added download {download.DownloadId} to active downloads");
|
Log.Debug($"Added download {download.DownloadId} to active downloads");
|
||||||
|
|
||||||
await downloadClient.Start(settings);
|
await downloadClient.Start(Settings.Get);
|
||||||
|
|
||||||
Log.Debug($"Download {download.DownloadId} started");
|
Log.Debug($"Download {download.DownloadId} started");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net.Http;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MonoTorrent;
|
using MonoTorrent;
|
||||||
|
|
@ -21,19 +22,32 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
private static readonly SemaphoreSlim RealDebridUpdateLock = new(1, 1);
|
private static readonly SemaphoreSlim RealDebridUpdateLock = new(1, 1);
|
||||||
|
|
||||||
private static RdNetClient _rdtNetClient;
|
|
||||||
|
|
||||||
private readonly Downloads _downloads;
|
private readonly Downloads _downloads;
|
||||||
private readonly Settings _settings;
|
private readonly IHttpClientFactory _httpClientFactory;
|
||||||
private readonly TorrentData _torrentData;
|
private readonly TorrentData _torrentData;
|
||||||
|
|
||||||
public Torrents(TorrentData torrentData, Settings settings, Downloads downloads)
|
public Torrents(IHttpClientFactory httpClientFactory, TorrentData torrentData, Downloads downloads)
|
||||||
{
|
{
|
||||||
|
_httpClientFactory = httpClientFactory;
|
||||||
_torrentData = torrentData;
|
_torrentData = torrentData;
|
||||||
_settings = settings;
|
|
||||||
_downloads = downloads;
|
_downloads = downloads;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private RdNetClient GetRdNetClient()
|
||||||
|
{
|
||||||
|
var apiKey = Settings.Get.RealDebridApiKey;
|
||||||
|
|
||||||
|
if (String.IsNullOrWhiteSpace(apiKey))
|
||||||
|
{
|
||||||
|
throw new Exception("Real-Debrid API Key not set in the settings");
|
||||||
|
}
|
||||||
|
|
||||||
|
var rdtNetClient = new RdNetClient(null, _httpClientFactory.CreateClient());
|
||||||
|
rdtNetClient.UseApiAuthentication(apiKey);
|
||||||
|
|
||||||
|
return rdtNetClient;
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<IList<Torrent>> Get()
|
public async Task<IList<Torrent>> Get()
|
||||||
{
|
{
|
||||||
var torrents = await _torrentData.Get();
|
var torrents = await _torrentData.Get();
|
||||||
|
|
@ -207,7 +221,7 @@ namespace RdtClient.Service.Services
|
||||||
|
|
||||||
if (deleteLocalFiles)
|
if (deleteLocalFiles)
|
||||||
{
|
{
|
||||||
var downloadPath = await DownloadPath(torrent);
|
var downloadPath = DownloadPath(torrent);
|
||||||
downloadPath = Path.Combine(downloadPath, torrent.RdName);
|
downloadPath = Path.Combine(downloadPath, torrent.RdName);
|
||||||
|
|
||||||
if (Directory.Exists(downloadPath))
|
if (Directory.Exists(downloadPath))
|
||||||
|
|
@ -244,7 +258,7 @@ namespace RdtClient.Service.Services
|
||||||
var torrent = await GetById(torrentId);
|
var torrent = await GetById(torrentId);
|
||||||
var download = await _downloads.GetById(downloadId);
|
var download = await _downloads.GetById(downloadId);
|
||||||
|
|
||||||
var downloadPath = await DownloadPath(torrent);
|
var downloadPath = DownloadPath(torrent);
|
||||||
|
|
||||||
var filePath = DownloadHelper.GetDownloadPath(downloadPath, torrent, download);
|
var filePath = DownloadHelper.GetDownloadPath(downloadPath, torrent, download);
|
||||||
|
|
||||||
|
|
@ -311,11 +325,6 @@ namespace RdtClient.Service.Services
|
||||||
await _downloads.UpdateError(downloadId, null);
|
await _downloads.UpdateError(downloadId, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
_rdtNetClient = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<Profile> GetProfile()
|
public async Task<Profile> GetProfile()
|
||||||
{
|
{
|
||||||
var user = await GetRdNetClient().User.GetAsync();
|
var user = await GetRdNetClient().User.GetAsync();
|
||||||
|
|
@ -472,25 +481,6 @@ namespace RdtClient.Service.Services
|
||||||
await _torrentData.UpdateFilesSelected(torrentId, datetime);
|
await _torrentData.UpdateFilesSelected(torrentId, datetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
private RdNetClient GetRdNetClient()
|
|
||||||
{
|
|
||||||
if (_rdtNetClient == null)
|
|
||||||
{
|
|
||||||
var apiKey = _settings.GetString("RealDebridApiKey")
|
|
||||||
.Result;
|
|
||||||
|
|
||||||
if (String.IsNullOrWhiteSpace(apiKey))
|
|
||||||
{
|
|
||||||
throw new Exception("Real-Debrid API Key not set in the settings");
|
|
||||||
}
|
|
||||||
|
|
||||||
_rdtNetClient = new RdNetClient();
|
|
||||||
_rdtNetClient.UseApiAuthentication(apiKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
return _rdtNetClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<Torrent> GetById(Guid torrentId)
|
public async Task<Torrent> GetById(Guid torrentId)
|
||||||
{
|
{
|
||||||
var torrent = await _torrentData.GetById(torrentId);
|
var torrent = await _torrentData.GetById(torrentId);
|
||||||
|
|
@ -558,9 +548,9 @@ namespace RdtClient.Service.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<String> DownloadPath(Torrent torrent)
|
private String DownloadPath(Torrent torrent)
|
||||||
{
|
{
|
||||||
var settingDownloadPath = await _settings.GetString("DownloadPath");
|
var settingDownloadPath = Settings.Get.DownloadPath;
|
||||||
|
|
||||||
if (!String.IsNullOrWhiteSpace(torrent.Category))
|
if (!String.IsNullOrWhiteSpace(torrent.Category))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ namespace RdtClient.Service.Services
|
||||||
throw new Exception("Invalid download path");
|
throw new Exception("Invalid download path");
|
||||||
}
|
}
|
||||||
|
|
||||||
await Task.Factory.StartNew(async delegate
|
await Task.Run(async delegate
|
||||||
{
|
{
|
||||||
if (!_cancelled)
|
if (!_cancelled)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -125,9 +125,9 @@ namespace RdtClient.Web.Controllers
|
||||||
[Route("app/defaultSavePath")]
|
[Route("app/defaultSavePath")]
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<ActionResult<AppPreferences>> AppDefaultSavePath()
|
public ActionResult<AppPreferences> AppDefaultSavePath()
|
||||||
{
|
{
|
||||||
var result = await _qBittorrent.AppDefaultSavePath();
|
var result = _qBittorrent.AppDefaultSavePath();
|
||||||
return Ok(result);
|
return Ok(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -38,11 +38,7 @@ namespace RdtClient.Web.Controllers
|
||||||
{
|
{
|
||||||
await _settings.Update(request.Settings);
|
await _settings.Update(request.Settings);
|
||||||
|
|
||||||
_torrents.Reset();
|
if (!Enum.TryParse<LogEventLevel>(Settings.Get.LogLevel, out var logLevel))
|
||||||
|
|
||||||
var logLevelSetting = await _settings.GetString("LogLevel");
|
|
||||||
|
|
||||||
if (!Enum.TryParse<LogEventLevel>(logLevelSetting, out var logLevel))
|
|
||||||
{
|
{
|
||||||
logLevel = LogEventLevel.Information;
|
logLevel = LogEventLevel.Information;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -91,7 +91,7 @@ namespace RdtClient.Web
|
||||||
Service.DiConfig.Config(services);
|
Service.DiConfig.Config(services);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger, Settings settings)
|
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILogger<Startup> logger)
|
||||||
{
|
{
|
||||||
if (env.IsDevelopment())
|
if (env.IsDevelopment())
|
||||||
{
|
{
|
||||||
|
|
@ -133,8 +133,6 @@ namespace RdtClient.Web
|
||||||
spa.Options.DefaultPage = "/index.html";
|
spa.Options.DefaultPage = "/index.html";
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
settings.Clean();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in a new issue