mirror of
https://github.com/lantean-code/qbtmud.git
synced 2025-10-23 04:52:22 +00:00
Compare commits
24 Commits
1.0.0
...
feature/ne
Author | SHA1 | Date | |
---|---|---|---|
|
1fc62adfaa | ||
|
d4ac79af00 | ||
|
7370d73c59 | ||
|
8796cc0f24 | ||
|
9cb6643606 | ||
|
b24ae440d4 | ||
|
bb90ce5216 | ||
|
1cf9f97187 | ||
|
4f9129fd46 | ||
|
9a9d2c2ee2 | ||
|
736bc46745 | ||
|
23ae19c4c7 | ||
|
603470eb30 | ||
|
27c2406340 | ||
|
4578dcc11f | ||
|
3215fa3936 | ||
|
78e62f31d0 | ||
|
e23842fcb0 | ||
|
411c7f87cc | ||
|
4098f8f5a9 | ||
|
12f81c5978 | ||
|
717738d720 | ||
|
885c34c8cf | ||
|
ef3c68a6aa |
@@ -4,24 +4,20 @@
|
|||||||
<TargetFramework>net9.0</TargetFramework>
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
<IsPackable>false</IsPackable>
|
<IsPackable>false</IsPackable>
|
||||||
<IsTestProject>true</IsTestProject>
|
<IsTestProject>true</IsTestProject>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FluentAssertions" Version="7.1.0" AllowedVersions="[5.0.0,7.*.*)" />
|
<PackageReference Include="AwesomeAssertions" Version="9.0.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.1" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.1" />
|
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
|
|
||||||
<PackageReference Include="MudBlazor" Version="8.2.0" />
|
|
||||||
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
|
<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
|
||||||
<PackageReference Include="xunit" Version="2.9.3" />
|
<PackageReference Include="xunit" Version="2.9.3" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.1">
|
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="System.Net.Http" Version="4.3.4" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -21,7 +21,7 @@ namespace Lantean.QBTMud.Test
|
|||||||
Test2(a => a.Name);
|
Test2(a => a.Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Test2(Expression<Func<TestClass, object>> expr)
|
private void Test2(Expression<Func<TestClass, object?>> expr)
|
||||||
{
|
{
|
||||||
var body = expr.Body;
|
var body = expr.Body;
|
||||||
}
|
}
|
||||||
@@ -38,7 +38,7 @@ namespace Lantean.QBTMud.Test
|
|||||||
|
|
||||||
var l = Expression.Lambda<Func<TestClass, object>>(convertExpression, expression);
|
var l = Expression.Lambda<Func<TestClass, object>>(convertExpression, expression);
|
||||||
|
|
||||||
Expression<Func<TestClass, object>> expr2 = a => a.Name;
|
Expression<Func<TestClass, object?>> expr2 = a => a.Name;
|
||||||
|
|
||||||
var x = l.Compile();
|
var x = l.Compile();
|
||||||
var res = (long)x(new TestClass { Name = "Name", Value = 12 });
|
var res = (long)x(new TestClass { Name = "Name", Value = 12 });
|
||||||
@@ -58,9 +58,9 @@ namespace Lantean.QBTMud.Test
|
|||||||
|
|
||||||
public class TestClass
|
public class TestClass
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string? Name { get; set; }
|
||||||
|
|
||||||
public string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
|
|
||||||
public long Value { get; set; }
|
public long Value { get; set; }
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
</MudSelect>
|
</MudSelect>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Physical memory (RAM) usage limit (applied if libtorrent >= 2.0)" Value="MemoryWorkingSetLimit" ValueChanged="MemoryWorkingSetLimitChanged" Min="0" HelperText="This option is less effective on Linux" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Physical memory (RAM) usage limit (applied if libtorrent >= 2.0)" Value="MemoryWorkingSetLimit" ValueChanged="MemoryWorkingSetLimitChanged" Min="0" HelperText="This option is less effective on Linux" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudSelect T="string" Label="Network interface" Value="CurrentNetworkInterface" ValueChanged="CurrentNetworkInterfaceChanged" Variant="Variant.Outlined">
|
<MudSelect T="string" Label="Network interface" Value="CurrentNetworkInterface" ValueChanged="CurrentNetworkInterfaceChanged" Variant="Variant.Outlined">
|
||||||
@@ -38,16 +38,19 @@
|
|||||||
</MudSelect>
|
</MudSelect>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Save resume data interval" Value="SaveResumeDataInterval" ValueChanged="SaveResumeDataIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Save resume data interval" Value="SaveResumeDataInterval" ValueChanged="SaveResumeDataIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label=".torrent file size limit" Value="TorrentFileSizeLimit" ValueChanged="TorrentFileSizeLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Save transfer statistics interval" Value="SaveStatisticsInterval" ValueChanged="SaveStatisticsIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label=".torrent file size limit" Value="TorrentFileSizeLimit" ValueChanged="TorrentFileSizeLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Recheck torrents on completion" Value="RecheckCompletedTorrents" ValueChanged="RecheckCompletedTorrentsChanged" />
|
<FieldSwitch Label="Recheck torrents on completion" Value="RecheckCompletedTorrents" ValueChanged="RecheckCompletedTorrentsChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Refresh interval" Value="RefreshInterval" ValueChanged="RefreshIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="ms" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Refresh interval" Value="RefreshInterval" ValueChanged="RefreshIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="ms" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Resolve peer countries" Value="ResolvePeerCountries" ValueChanged="ResolvePeerCountriesChanged" />
|
<FieldSwitch Label="Resolve peer countries" Value="ResolvePeerCountries" ValueChanged="ResolvePeerCountriesChanged" />
|
||||||
@@ -59,7 +62,7 @@
|
|||||||
<FieldSwitch Label="Enable embedded tracker" Value="EnableEmbeddedTracker" ValueChanged="EnableEmbeddedTrackerChanged" />
|
<FieldSwitch Label="Enable embedded tracker" Value="EnableEmbeddedTracker" ValueChanged="EnableEmbeddedTrackerChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Embedded tracker port" Value="EmbeddedTrackerPort" ValueChanged="EmbeddedTrackerPortChanged" Min="@Options.MinPortValue" Max="@Options.MaxPortValue" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Embedded tracker port" Value="EmbeddedTrackerPort" ValueChanged="EmbeddedTrackerPortChanged" Min="@Options.MinPortValue" Max="@Options.MaxPortValue" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Enable port forwarding for embedded tracker" Value="EmbeddedTrackerPortForwarding" ValueChanged="EmbeddedTrackerPortForwardingChanged" />
|
<FieldSwitch Label="Enable port forwarding for embedded tracker" Value="EmbeddedTrackerPortForwarding" ValueChanged="EmbeddedTrackerPortForwardingChanged" />
|
||||||
@@ -77,31 +80,31 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Bdecode depth limit" Value="BdecodeDepthLimit" ValueChanged="BdecodeDepthLimitChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Bdecode depth limit" Value="BdecodeDepthLimit" ValueChanged="BdecodeDepthLimitChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Bdecode token limit" Value="BdecodeTokenLimit" ValueChanged="BdecodeTokenLimitChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Bdecode token limit" Value="BdecodeTokenLimit" ValueChanged="BdecodeTokenLimitChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Asynchronous I/O threads" Value="AsyncIoThreads" ValueChanged="AsyncIoThreadsChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Asynchronous I/O threads" Value="AsyncIoThreads" ValueChanged="AsyncIoThreadsChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Hashing threads (requires libtorrent >= 2.0)" Value="HashingThreads" ValueChanged="HashingThreadsChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Hashing threads (requires libtorrent >= 2.0)" Value="HashingThreads" ValueChanged="HashingThreadsChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="File pool size" Value="FilePoolSize" ValueChanged="FilePoolSizeChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="File pool size" Value="FilePoolSize" ValueChanged="FilePoolSizeChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Outstanding memory when checking torrents" Value="CheckingMemoryUse" ValueChanged="CheckingMemoryUseChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Outstanding memory when checking torrents" Value="CheckingMemoryUse" ValueChanged="CheckingMemoryUseChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Disk cache (requires libtorrent < 2.0)" Value="DiskCache" ValueChanged="DiskCacheChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Disk cache (requires libtorrent < 2.0)" Value="DiskCache" ValueChanged="DiskCacheChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Disk cache expiry interval (requires libtorrent < 2.0)" Value="DiskCacheTtl" ValueChanged="DiskCacheTtlChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Disk cache expiry interval (requires libtorrent < 2.0)" Value="DiskCacheTtl" ValueChanged="DiskCacheTtlChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Disk queue size" Value="DiskQueueSize" ValueChanged="DiskQueueSizeChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Disk queue size" Value="DiskQueueSize" ValueChanged="DiskQueueSizeChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudSelect T="int" Label="Disk IO type (libtorrent >= 2.0; requires restart)" Value="DiskIoType" ValueChanged="DiskIoTypeChanged" Variant="Variant.Outlined">
|
<MudSelect T="int" Label="Disk IO type (libtorrent >= 2.0; requires restart)" Value="DiskIoType" ValueChanged="DiskIoTypeChanged" Variant="Variant.Outlined">
|
||||||
@@ -133,40 +136,40 @@
|
|||||||
<FieldSwitch Label="Send upload piece suggestions" Value="EnableUploadSuggestions" ValueChanged="EnableUploadSuggestionsChanged" />
|
<FieldSwitch Label="Send upload piece suggestions" Value="EnableUploadSuggestions" ValueChanged="EnableUploadSuggestionsChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Send buffer watermark" Value="SendBufferWatermark" ValueChanged="SendBufferWatermarkChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Send buffer watermark" Value="SendBufferWatermark" ValueChanged="SendBufferWatermarkChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Send buffer low watermark" Value="SendBufferLowWatermark" ValueChanged="SendBufferLowWatermarkChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Send buffer low watermark" Value="SendBufferLowWatermark" ValueChanged="SendBufferLowWatermarkChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Send buffer watermark factor" Value="SendBufferWatermarkFactor" ValueChanged="SendBufferWatermarkFactorChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Send buffer watermark factor" Value="SendBufferWatermarkFactor" ValueChanged="SendBufferWatermarkFactorChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Outgoing connections per second" Value="ConnectionSpeed" ValueChanged="ConnectionSpeedChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Outgoing connections per second" Value="ConnectionSpeed" ValueChanged="ConnectionSpeedChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Socket send buffer size [0: system default]" Value="SocketSendBufferSize" ValueChanged="SocketSendBufferSizeChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Socket send buffer size [0: system default]" Value="SocketSendBufferSize" ValueChanged="SocketSendBufferSizeChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Socket receive buffer size [0: system default]" Value="SocketReceiveBufferSize" ValueChanged="SocketReceiveBufferSizeChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Socket receive buffer size [0: system default]" Value="SocketReceiveBufferSize" ValueChanged="SocketReceiveBufferSizeChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Socket backlog size" Value="SocketBacklogSize" ValueChanged="SocketBacklogSizeChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Socket backlog size" Value="SocketBacklogSize" ValueChanged="SocketBacklogSizeChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Outgoing ports (Min) [0: disabled]" Value="OutgoingPortsMin" ValueChanged="OutgoingPortsMinChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Outgoing ports (Min) [0: disabled]" Value="OutgoingPortsMin" ValueChanged="OutgoingPortsMinChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Outgoing ports (Max) [0: disabled]" Value="OutgoingPortsMax" ValueChanged="OutgoingPortsMaxChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Outgoing ports (Max) [0: disabled]" Value="OutgoingPortsMax" ValueChanged="OutgoingPortsMaxChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="UPnP lease duration [0: permanent lease]" Value="UpnpLeaseDuration" ValueChanged="UpnpLeaseDurationChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="UPnP lease duration [0: permanent lease]" Value="UpnpLeaseDuration" ValueChanged="UpnpLeaseDurationChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Type of service (ToS) for connections to peers" Value="PeerTos" ValueChanged="PeerTosChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Type of service (ToS) for connections to peers" Value="PeerTos" ValueChanged="PeerTosChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudSelect T="int" Label="μTP-TCP mixed mode algorithm" Value="UtpTcpMixedMode" ValueChanged="UtpTcpMixedModeChanged" Variant="Variant.Outlined">
|
<MudSelect T="int" Label="<EFBFBD>TP-TCP mixed mode algorithm" Value="UtpTcpMixedMode" ValueChanged="UtpTcpMixedModeChanged" Variant="Variant.Outlined">
|
||||||
<MudSelectItem T="int" Value="0">Prefer TCP</MudSelectItem>
|
<MudSelectItem T="int" Value="0">Prefer TCP</MudSelectItem>
|
||||||
<MudSelectItem T="int" Value="1">Peer proportional (throttles TCP)</MudSelectItem>
|
<MudSelectItem T="int" Value="1">Peer proportional (throttles TCP)</MudSelectItem>
|
||||||
</MudSelect>
|
</MudSelect>
|
||||||
@@ -180,6 +183,9 @@
|
|||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Validate HTTPS tracker certificate" Value="ValidateHttpsTrackerCertificate" ValueChanged="ValidateHttpsTrackerCertificateChanged" />
|
<FieldSwitch Label="Validate HTTPS tracker certificate" Value="ValidateHttpsTrackerCertificate" ValueChanged="ValidateHttpsTrackerCertificateChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<FieldSwitch Label="Ignore SSL errors" Value="IgnoreSslErrors" ValueChanged="IgnoreSslErrorsChanged" />
|
||||||
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Server-side request forgery (SSRF) mitigation" Value="SsrfMitigation" ValueChanged="SsrfMitigationChanged" />
|
<FieldSwitch Label="Server-side request forgery (SSRF) mitigation" Value="SsrfMitigation" ValueChanged="SsrfMitigationChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
@@ -206,38 +212,47 @@
|
|||||||
<FieldSwitch Label="Always announce to all tiers" Value="AnnounceToAllTiers" ValueChanged="AnnounceToAllTiersChanged" />
|
<FieldSwitch Label="Always announce to all tiers" Value="AnnounceToAllTiers" ValueChanged="AnnounceToAllTiersChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="IP address reported to trackers (requires restart)" Value="AnnounceIp" ValueChanged="AnnounceIpChanged" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="IP address reported to trackers (requires restart)" Value="AnnounceIp" ValueChanged="AnnounceIpChanged" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Max concurrent HTTP announces" Value="MaxConcurrentHttpAnnounces" ValueChanged="MaxConcurrentHttpAnnouncesChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Port reported to trackers (requires restart)" Value="AnnouncePort" ValueChanged="AnnouncePortChanged" Min="0" Max="65535" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Stop tracker timeout [0: disabled]" Value="StopTrackerTimeout" ValueChanged="StopTrackerTimeoutChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Max concurrent HTTP announces" Value="MaxConcurrentHttpAnnounces" ValueChanged="MaxConcurrentHttpAnnouncesChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Peer turnover disconnect percentage:" Value="PeerTurnover" ValueChanged="PeerTurnoverChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Stop tracker timeout [0: disabled]" Value="StopTrackerTimeout" ValueChanged="StopTrackerTimeoutChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Peer turnover threshold percentage" Value="PeerTurnoverCutoff" ValueChanged="PeerTurnoverCutoffChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Peer turnover disconnect percentage:" Value="PeerTurnover" ValueChanged="PeerTurnoverChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Peer turnover disconnect interval" Value="PeerTurnoverInterval" ValueChanged="PeerTurnoverIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Peer turnover threshold percentage" Value="PeerTurnoverCutoff" ValueChanged="PeerTurnoverCutoffChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Maximum outstanding requests to a single peer" Value="RequestQueueSize" ValueChanged="RequestQueueSizeChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Peer turnover disconnect interval" Value="PeerTurnoverInterval" ValueChanged="PeerTurnoverIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="I2P inbound quantity (requires libtorrent >= 2.0)" Value="I2pInboundQuantity" ValueChanged="I2pInboundQuantityChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Hostname lookup cache TTL" Value="HostnameCacheTtl" ValueChanged="HostnameCacheTtlChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="I2P outbound quantity (requires libtorrent >= 2.0)" Value="I2pOutboundQuantity" ValueChanged="I2pOutboundQuantityChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Maximum outstanding requests to a single peer" Value="RequestQueueSize" ValueChanged="RequestQueueSizeChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="I2P inbound length (requires libtorrent >= 2.0)" Value="I2pInboundLength" ValueChanged="I2pInboundLengthChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="I2P inbound quantity (requires libtorrent >= 2.0)" Value="I2pInboundQuantity" ValueChanged="I2pInboundQuantityChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="I2P outbound length (requires libtorrent >= 2.0)" Value="I2pOutboundLength" ValueChanged="I2pOutboundLengthChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="I2P outbound quantity (requires libtorrent >= 2.0)" Value="I2pOutboundQuantity" ValueChanged="I2pOutboundQuantityChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="I2P inbound length (requires libtorrent >= 2.0)" Value="I2pInboundLength" ValueChanged="I2pInboundLengthChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="I2P outbound length (requires libtorrent >= 2.0)" Value="I2pOutboundLength" ValueChanged="I2pOutboundLengthChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -14,6 +14,7 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
protected string? CurrentNetworkInterface { get; private set; }
|
protected string? CurrentNetworkInterface { get; private set; }
|
||||||
protected string? CurrentInterfaceAddress { get; private set; }
|
protected string? CurrentInterfaceAddress { get; private set; }
|
||||||
protected int SaveResumeDataInterval { get; private set; }
|
protected int SaveResumeDataInterval { get; private set; }
|
||||||
|
protected int SaveStatisticsInterval { get; private set; }
|
||||||
protected int TorrentFileSizeLimit { get; private set; }
|
protected int TorrentFileSizeLimit { get; private set; }
|
||||||
protected bool RecheckCompletedTorrents { get; private set; }
|
protected bool RecheckCompletedTorrents { get; private set; }
|
||||||
protected string? AppInstanceName { get; private set; }
|
protected string? AppInstanceName { get; private set; }
|
||||||
@@ -50,6 +51,7 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
protected bool IdnSupportEnabled { get; private set; }
|
protected bool IdnSupportEnabled { get; private set; }
|
||||||
protected bool EnableMultiConnectionsFromSameIp { get; private set; }
|
protected bool EnableMultiConnectionsFromSameIp { get; private set; }
|
||||||
protected bool ValidateHttpsTrackerCertificate { get; private set; }
|
protected bool ValidateHttpsTrackerCertificate { get; private set; }
|
||||||
|
protected bool IgnoreSslErrors { get; private set; }
|
||||||
protected bool SsrfMitigation { get; private set; }
|
protected bool SsrfMitigation { get; private set; }
|
||||||
protected bool BlockPeersOnPrivilegedPorts { get; private set; }
|
protected bool BlockPeersOnPrivilegedPorts { get; private set; }
|
||||||
protected bool EnableEmbeddedTracker { get; private set; }
|
protected bool EnableEmbeddedTracker { get; private set; }
|
||||||
@@ -62,11 +64,13 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
protected bool AnnounceToAllTrackers { get; private set; }
|
protected bool AnnounceToAllTrackers { get; private set; }
|
||||||
protected bool AnnounceToAllTiers { get; private set; }
|
protected bool AnnounceToAllTiers { get; private set; }
|
||||||
protected string? AnnounceIp { get; private set; }
|
protected string? AnnounceIp { get; private set; }
|
||||||
|
protected int AnnouncePort { get; private set; }
|
||||||
protected int MaxConcurrentHttpAnnounces { get; private set; }
|
protected int MaxConcurrentHttpAnnounces { get; private set; }
|
||||||
protected int StopTrackerTimeout { get; private set; }
|
protected int StopTrackerTimeout { get; private set; }
|
||||||
protected int PeerTurnover { get; private set; }
|
protected int PeerTurnover { get; private set; }
|
||||||
protected int PeerTurnoverCutoff { get; private set; }
|
protected int PeerTurnoverCutoff { get; private set; }
|
||||||
protected int PeerTurnoverInterval { get; private set; }
|
protected int PeerTurnoverInterval { get; private set; }
|
||||||
|
protected int HostnameCacheTtl { get; private set; }
|
||||||
protected int RequestQueueSize { get; private set; }
|
protected int RequestQueueSize { get; private set; }
|
||||||
protected string? DhtBootstrapNodes { get; private set; }
|
protected string? DhtBootstrapNodes { get; private set; }
|
||||||
protected int I2pInboundQuantity { get; private set; }
|
protected int I2pInboundQuantity { get; private set; }
|
||||||
@@ -95,6 +99,7 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
CurrentNetworkInterface = Preferences.CurrentNetworkInterface;
|
CurrentNetworkInterface = Preferences.CurrentNetworkInterface;
|
||||||
CurrentInterfaceAddress = Preferences.CurrentInterfaceAddress;
|
CurrentInterfaceAddress = Preferences.CurrentInterfaceAddress;
|
||||||
SaveResumeDataInterval = Preferences.SaveResumeDataInterval;
|
SaveResumeDataInterval = Preferences.SaveResumeDataInterval;
|
||||||
|
SaveStatisticsInterval = Preferences.SaveStatisticsInterval;
|
||||||
TorrentFileSizeLimit = Preferences.TorrentFileSizeLimit / 1024 / 1024;
|
TorrentFileSizeLimit = Preferences.TorrentFileSizeLimit / 1024 / 1024;
|
||||||
RecheckCompletedTorrents = Preferences.RecheckCompletedTorrents;
|
RecheckCompletedTorrents = Preferences.RecheckCompletedTorrents;
|
||||||
AppInstanceName = Preferences.AppInstanceName;
|
AppInstanceName = Preferences.AppInstanceName;
|
||||||
@@ -131,6 +136,7 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
IdnSupportEnabled = Preferences.IdnSupportEnabled;
|
IdnSupportEnabled = Preferences.IdnSupportEnabled;
|
||||||
EnableMultiConnectionsFromSameIp = Preferences.EnableMultiConnectionsFromSameIp;
|
EnableMultiConnectionsFromSameIp = Preferences.EnableMultiConnectionsFromSameIp;
|
||||||
ValidateHttpsTrackerCertificate = Preferences.ValidateHttpsTrackerCertificate;
|
ValidateHttpsTrackerCertificate = Preferences.ValidateHttpsTrackerCertificate;
|
||||||
|
IgnoreSslErrors = Preferences.IgnoreSslErrors;
|
||||||
SsrfMitigation = Preferences.SsrfMitigation;
|
SsrfMitigation = Preferences.SsrfMitigation;
|
||||||
BlockPeersOnPrivilegedPorts = Preferences.BlockPeersOnPrivilegedPorts;
|
BlockPeersOnPrivilegedPorts = Preferences.BlockPeersOnPrivilegedPorts;
|
||||||
EnableEmbeddedTracker = Preferences.EnableEmbeddedTracker;
|
EnableEmbeddedTracker = Preferences.EnableEmbeddedTracker;
|
||||||
@@ -143,11 +149,13 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
AnnounceToAllTrackers = Preferences.AnnounceToAllTrackers;
|
AnnounceToAllTrackers = Preferences.AnnounceToAllTrackers;
|
||||||
AnnounceToAllTiers = Preferences.AnnounceToAllTiers;
|
AnnounceToAllTiers = Preferences.AnnounceToAllTiers;
|
||||||
AnnounceIp = Preferences.AnnounceIp;
|
AnnounceIp = Preferences.AnnounceIp;
|
||||||
|
AnnouncePort = Preferences.AnnouncePort;
|
||||||
MaxConcurrentHttpAnnounces = Preferences.MaxConcurrentHttpAnnounces;
|
MaxConcurrentHttpAnnounces = Preferences.MaxConcurrentHttpAnnounces;
|
||||||
StopTrackerTimeout = Preferences.StopTrackerTimeout;
|
StopTrackerTimeout = Preferences.StopTrackerTimeout;
|
||||||
PeerTurnover = Preferences.PeerTurnover;
|
PeerTurnover = Preferences.PeerTurnover;
|
||||||
PeerTurnoverCutoff = Preferences.PeerTurnoverCutoff;
|
PeerTurnoverCutoff = Preferences.PeerTurnoverCutoff;
|
||||||
PeerTurnoverInterval = Preferences.PeerTurnoverInterval;
|
PeerTurnoverInterval = Preferences.PeerTurnoverInterval;
|
||||||
|
HostnameCacheTtl = Preferences.HostnameCacheTtl;
|
||||||
RequestQueueSize = Preferences.RequestQueueSize;
|
RequestQueueSize = Preferences.RequestQueueSize;
|
||||||
DhtBootstrapNodes = Preferences.DhtBootstrapNodes;
|
DhtBootstrapNodes = Preferences.DhtBootstrapNodes;
|
||||||
I2pInboundQuantity = Preferences.I2pInboundQuantity;
|
I2pInboundQuantity = Preferences.I2pInboundQuantity;
|
||||||
@@ -195,6 +203,13 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async Task SaveStatisticsIntervalChanged(int value)
|
||||||
|
{
|
||||||
|
SaveStatisticsInterval = value;
|
||||||
|
UpdatePreferences.SaveStatisticsInterval = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
protected async Task TorrentFileSizeLimitChanged(int value)
|
protected async Task TorrentFileSizeLimitChanged(int value)
|
||||||
{
|
{
|
||||||
TorrentFileSizeLimit = value;
|
TorrentFileSizeLimit = value;
|
||||||
@@ -447,6 +462,13 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async Task IgnoreSslErrorsChanged(bool value)
|
||||||
|
{
|
||||||
|
IgnoreSslErrors = value;
|
||||||
|
UpdatePreferences.IgnoreSslErrors = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
protected async Task SsrfMitigationChanged(bool value)
|
protected async Task SsrfMitigationChanged(bool value)
|
||||||
{
|
{
|
||||||
SsrfMitigation = value;
|
SsrfMitigation = value;
|
||||||
@@ -531,6 +553,13 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async Task AnnouncePortChanged(int value)
|
||||||
|
{
|
||||||
|
AnnouncePort = value;
|
||||||
|
UpdatePreferences.AnnouncePort = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
protected async Task MaxConcurrentHttpAnnouncesChanged(int value)
|
protected async Task MaxConcurrentHttpAnnouncesChanged(int value)
|
||||||
{
|
{
|
||||||
MaxConcurrentHttpAnnounces = value;
|
MaxConcurrentHttpAnnounces = value;
|
||||||
@@ -559,6 +588,13 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async Task HostnameCacheTtlChanged(int value)
|
||||||
|
{
|
||||||
|
HostnameCacheTtl = value;
|
||||||
|
UpdatePreferences.HostnameCacheTtl = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
protected async Task PeerTurnoverIntervalChanged(int value)
|
protected async Task PeerTurnoverIntervalChanged(int value)
|
||||||
{
|
{
|
||||||
PeerTurnoverInterval = value;
|
PeerTurnoverInterval = value;
|
||||||
@@ -608,4 +644,4 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
@@ -29,13 +29,13 @@
|
|||||||
<FieldSwitch Label="Log file" Value="FileLogEnabled" ValueChanged="FileLogEnabledChanged" />
|
<FieldSwitch Label="Log file" Value="FileLogEnabled" ValueChanged="FileLogEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Save Path" Value="FileLogPath" ValueChanged="FileLogPathChanged" Disabled="@(!FileLogEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Save Path" Value="FileLogPath" ValueChanged="FileLogPathChanged" Disabled="@(!FileLogEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="3">
|
<MudItem xs="3">
|
||||||
<FieldSwitch Label="Backup the log after" Value="FileLogBackupEnabled" ValueChanged="FileLogBackupEnabledChanged" Disabled="@(!FileLogEnabled)" />
|
<FieldSwitch Label="Backup the log after" Value="FileLogBackupEnabled" ValueChanged="FileLogBackupEnabledChanged" Disabled="@(!FileLogEnabled)" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="9">
|
<MudItem xs="9">
|
||||||
<MudNumericField T="int" Value="FileLogMaxSize" ValueChanged="FileLogMaxSizeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="1024000" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Value="FileLogMaxSize" ValueChanged="FileLogMaxSizeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="1024000" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="3">
|
<MudItem xs="3">
|
||||||
<FieldSwitch Label="Delete backups older than" Value="FileLogDeleteOld" ValueChanged="FileLogDeleteOldChanged" Disabled="@(!FileLogEnabled)" />
|
<FieldSwitch Label="Delete backups older than" Value="FileLogDeleteOld" ValueChanged="FileLogDeleteOldChanged" Disabled="@(!FileLogEnabled)" />
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
<MudItem xs="9">
|
<MudItem xs="9">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="9">
|
<MudItem xs="9">
|
||||||
<MudNumericField T="int" Value="FileLogAge" ValueChanged="FileLogAgeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="365" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Value="FileLogAge" ValueChanged="FileLogAgeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="365" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="3">
|
<MudItem xs="3">
|
||||||
<MudSelect T="int" Value="FileLogAgeType" ValueChanged="FileLogAgeTypeChanged" Disabled="@(!FileLogEnabled)" Variant="Variant.Outlined">
|
<MudSelect T="int" Value="FileLogAgeType" ValueChanged="FileLogAgeTypeChanged" Disabled="@(!FileLogEnabled)" Variant="Variant.Outlined">
|
||||||
@@ -71,4 +71,43 @@
|
|||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4">
|
||||||
|
<MudCardHeader>
|
||||||
|
<CardHeaderContent>
|
||||||
|
<MudText Typo="Typo.subtitle2">Status Bar</MudText>
|
||||||
|
</CardHeaderContent>
|
||||||
|
</MudCardHeader>
|
||||||
|
<MudCardContent>
|
||||||
|
<MudGrid>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<FieldSwitch Label="Display current external IP address on status bar" Value="StatusBarExternalIp" ValueChanged="StatusBarExternalIpChanged" />
|
||||||
|
</MudItem>
|
||||||
|
</MudGrid>
|
||||||
|
</MudCardContent>
|
||||||
|
</MudCard>
|
||||||
|
|
||||||
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4">
|
||||||
|
<MudCardHeader>
|
||||||
|
<CardHeaderContent>
|
||||||
|
<MudText Typo="Typo.subtitle2">Confirmation</MudText>
|
||||||
|
</CardHeaderContent>
|
||||||
|
</MudCardHeader>
|
||||||
|
<MudCardContent>
|
||||||
|
<MudGrid>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<FieldSwitch Label="Confirm when deleting torrents" Value="ConfirmTorrentDeletion" ValueChanged="ConfirmTorrentDeletionChanged" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<FieldSwitch Label="Confirm when rechecking torrents" Value="ConfirmTorrentRecheck" ValueChanged="ConfirmTorrentRecheckChanged" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<FieldSwitch Label="Also delete torrent content when deleting torrents" Value="DeleteTorrentContentFiles" ValueChanged="DeleteTorrentContentFilesChanged" />
|
||||||
|
</MudItem>
|
||||||
|
</MudGrid>
|
||||||
|
</MudCardContent>
|
||||||
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -20,6 +20,14 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
|
|
||||||
protected bool PerformanceWarning { get; set; }
|
protected bool PerformanceWarning { get; set; }
|
||||||
|
|
||||||
|
protected bool StatusBarExternalIp { get; set; }
|
||||||
|
|
||||||
|
protected bool ConfirmTorrentDeletion { get; set; }
|
||||||
|
|
||||||
|
protected bool ConfirmTorrentRecheck { get; set; }
|
||||||
|
|
||||||
|
protected bool DeleteTorrentContentFiles { get; set; }
|
||||||
|
|
||||||
protected override bool SetOptions()
|
protected override bool SetOptions()
|
||||||
{
|
{
|
||||||
if (Preferences is null)
|
if (Preferences is null)
|
||||||
@@ -35,6 +43,10 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
FileLogAge = Preferences.FileLogAge;
|
FileLogAge = Preferences.FileLogAge;
|
||||||
FileLogAgeType = Preferences.FileLogAgeType;
|
FileLogAgeType = Preferences.FileLogAgeType;
|
||||||
PerformanceWarning = Preferences.PerformanceWarning;
|
PerformanceWarning = Preferences.PerformanceWarning;
|
||||||
|
StatusBarExternalIp = Preferences.StatusBarExternalIp;
|
||||||
|
ConfirmTorrentDeletion = Preferences.ConfirmTorrentDeletion;
|
||||||
|
ConfirmTorrentRecheck = Preferences.ConfirmTorrentRecheck;
|
||||||
|
DeleteTorrentContentFiles = Preferences.DeleteTorrentContentFiles;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -95,5 +107,33 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
UpdatePreferences.PerformanceWarning = value;
|
UpdatePreferences.PerformanceWarning = value;
|
||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async Task StatusBarExternalIpChanged(bool value)
|
||||||
|
{
|
||||||
|
StatusBarExternalIp = value;
|
||||||
|
UpdatePreferences.StatusBarExternalIp = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task ConfirmTorrentDeletionChanged(bool value)
|
||||||
|
{
|
||||||
|
ConfirmTorrentDeletion = value;
|
||||||
|
UpdatePreferences.ConfirmTorrentDeletion = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task ConfirmTorrentRecheckChanged(bool value)
|
||||||
|
{
|
||||||
|
ConfirmTorrentRecheck = value;
|
||||||
|
UpdatePreferences.ConfirmTorrentRecheck = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task DeleteTorrentContentFilesChanged(bool value)
|
||||||
|
{
|
||||||
|
DeleteTorrentContentFiles = value;
|
||||||
|
UpdatePreferences.DeleteTorrentContentFiles = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Max active checking torrents" Value="MaxActiveCheckingTorrents" ValueChanged="MaxActiveCheckingTorrentsChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Max active checking torrents" Value="MaxActiveCheckingTorrents" ValueChanged="MaxActiveCheckingTorrentsChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -56,25 +56,28 @@
|
|||||||
<FieldSwitch Label="Queueing enabled" Value="QueueingEnabled" ValueChanged="QueueingEnabledChanged" />
|
<FieldSwitch Label="Queueing enabled" Value="QueueingEnabled" ValueChanged="QueueingEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Maximum active downloads" Value="MaxActiveDownloads" ValueChanged="MaxActiveDownloadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveDownloadsValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Maximum active downloads" Value="MaxActiveDownloads" ValueChanged="MaxActiveDownloadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveDownloadsValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Maximum active uploads" Value="MaxActiveUploads" ValueChanged="MaxActiveUploadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveUploadsValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Maximum active uploads" Value="MaxActiveUploads" ValueChanged="MaxActiveUploadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveUploadsValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Maximum active torrents" Value="MaxActiveTorrents" ValueChanged="MaxActiveTorrentsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveTorrentsValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Maximum active torrents" Value="MaxActiveTorrents" ValueChanged="MaxActiveTorrentsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveTorrentsValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Do not count slow torrents in these limits" Value="DontCountSlowTorrents" ValueChanged="DontCountSlowTorrentsChanged" Disabled="@(!QueueingEnabled)" />
|
<FieldSwitch Label="Do not count slow torrents in these limits" Value="DontCountSlowTorrents" ValueChanged="DontCountSlowTorrentsChanged" Disabled="@(!QueueingEnabled)" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Download rate threshold" Value="SlowTorrentDlRateThreshold" ValueChanged="SlowTorrentDlRateThresholdChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentDlRateThresholdValidation" />
|
<FieldSwitch Label="Merge trackers from different torrents" Value="MergeTrackers" ValueChanged="MergeTrackersChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Upload rate threshold" Value="SlowTorrentUlRateThreshold" ValueChanged="SlowTorrentUlRateThresholdChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentUlRateThresholdValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Download rate threshold" Value="SlowTorrentDlRateThreshold" ValueChanged="SlowTorrentDlRateThresholdChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentDlRateThresholdValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Torrent inactivity timer" Value="SlowTorrentInactiveTimer" ValueChanged="SlowTorrentInactiveTimerChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentInactiveTimerValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Upload rate threshold" Value="SlowTorrentUlRateThreshold" ValueChanged="SlowTorrentUlRateThresholdChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentUlRateThresholdValidation" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Torrent inactivity timer" Value="SlowTorrentInactiveTimer" ValueChanged="SlowTorrentInactiveTimerChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" Validation="SlowTorrentInactiveTimerValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -92,19 +95,21 @@
|
|||||||
<FieldSwitch Label="When ratio reaches" Value="MaxRatioEnabled" ValueChanged="MaxRatioEnabledChanged" />
|
<FieldSwitch Label="When ratio reaches" Value="MaxRatioEnabled" ValueChanged="MaxRatioEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="9">
|
<MudItem xs="9">
|
||||||
<MudNumericField T="int" Label="" Value="MaxRatio" ValueChanged="MaxRatioChanged" Disabled="@(!MaxRatioEnabled)" Min="0" Max="9998" Variant="Variant.Outlined" Validation="MaxRatioValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="float" Label="" Value="MaxRatio" ValueChanged="MaxRatioChanged"
|
||||||
|
Disabled="@(!MaxRatioEnabled)" Min="0" Max="9998" Variant="Variant.Outlined"
|
||||||
|
Validation="MaxRatioValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="3">
|
<MudItem xs="3">
|
||||||
<FieldSwitch Label="When total seeding time reaches" Value="MaxSeedingTimeEnabled" ValueChanged="MaxSeedingTimeEnabledChanged" />
|
<FieldSwitch Label="When total seeding time reaches" Value="MaxSeedingTimeEnabled" ValueChanged="MaxSeedingTimeEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="9">
|
<MudItem xs="9">
|
||||||
<MudNumericField T="int" Label="minutes" Value="MaxSeedingTime" ValueChanged="MaxSeedingTimeChanged" Disabled="@(!MaxSeedingTimeEnabled)" Min="0" Max="525600" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="minutes" Validation="MaxSeedingTimeValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="minutes" Value="MaxSeedingTime" ValueChanged="MaxSeedingTimeChanged" Disabled="@(!MaxSeedingTimeEnabled)" Min="0" Max="525600" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="minutes" Validation="MaxSeedingTimeValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="3">
|
<MudItem xs="3">
|
||||||
<FieldSwitch Label="When inactive seeding time reaches" Value="MaxInactiveSeedingTimeEnabled" ValueChanged="MaxInactiveSeedingTimeEnabledChanged" />
|
<FieldSwitch Label="When inactive seeding time reaches" Value="MaxInactiveSeedingTimeEnabled" ValueChanged="MaxInactiveSeedingTimeEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="9">
|
<MudItem xs="9">
|
||||||
<MudNumericField T="int" Label="minutes" Value="MaxInactiveSeedingTime" ValueChanged="MaxInactiveSeedingTimeChanged" Disabled="@(!MaxInactiveSeedingTimeEnabled)" Min="0" Max="525600" Variant="Variant.Outlined" Validation="MaxInactiveSeedingTimeValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="minutes" Value="MaxInactiveSeedingTime" ValueChanged="MaxInactiveSeedingTimeChanged" Disabled="@(!MaxInactiveSeedingTimeEnabled)" Min="0" Max="525600" Variant="Variant.Outlined" Validation="MaxInactiveSeedingTimeValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudSelect T="int" Value="MaxRatioAct" ValueChanged="MaxRatioActChanged" Disabled="@(!MaxRatioEnabled && !MaxSeedingTimeEnabled && !MaxInactiveSeedingTimeEnabled)" Variant="Variant.Outlined">
|
<MudSelect T="int" Value="MaxRatioAct" ValueChanged="MaxRatioActChanged" Disabled="@(!MaxRatioEnabled && !MaxSeedingTimeEnabled && !MaxInactiveSeedingTimeEnabled)" Variant="Variant.Outlined">
|
||||||
@@ -121,17 +126,29 @@
|
|||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
<CardHeaderContent>
|
<CardHeaderContent>
|
||||||
<MudText Typo="Typo.subtitle2">Seeding Limits</MudText>
|
<MudText Typo="Typo.subtitle2">Trackers</MudText>
|
||||||
</CardHeaderContent>
|
</CardHeaderContent>
|
||||||
</MudCardHeader>
|
</MudCardHeader>
|
||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Automatically add these trackers to new downloads" Value="AddTrackersEnabled" ValueChanged="AddTrackersEnabledChanged" />
|
<FieldSwitch Label="Automatically add these trackers to new torrents" Value="AddTrackersEnabled" ValueChanged="AddTrackersEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Trackers" Value="AddTrackers" ValueChanged="AddTrackersChanged" Lines="5" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Trackers" Value="AddTrackers" ValueChanged="AddTrackersChanged" Lines="5" Variant="Variant.Outlined" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<FieldSwitch Label="Fetch additional trackers from URL" Value="AddTrackersFromUrlEnabled" ValueChanged="AddTrackersFromUrlEnabledChanged" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Trackers URL" Value="AddTrackersUrl" ValueChanged="AddTrackersUrlChanged" Disabled="@(!AddTrackersFromUrlEnabled)" Variant="Variant.Outlined" />
|
||||||
|
</MudItem>
|
||||||
|
<MudItem xs="12">
|
||||||
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Last fetched trackers" Value="AddTrackersUrlList" ValueChanged="AddTrackersUrlListChanged" Disabled="@(!AddTrackersFromUrlEnabled)" Lines="5" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
protected int SlowTorrentUlRateThreshold { get; private set; }
|
protected int SlowTorrentUlRateThreshold { get; private set; }
|
||||||
protected int SlowTorrentInactiveTimer { get; private set; }
|
protected int SlowTorrentInactiveTimer { get; private set; }
|
||||||
protected bool MaxRatioEnabled { get; private set; }
|
protected bool MaxRatioEnabled { get; private set; }
|
||||||
protected int MaxRatio { get; private set; }
|
protected float MaxRatio { get; private set; }
|
||||||
protected bool MaxSeedingTimeEnabled { get; private set; }
|
protected bool MaxSeedingTimeEnabled { get; private set; }
|
||||||
protected int MaxSeedingTime { get; private set; }
|
protected int MaxSeedingTime { get; private set; }
|
||||||
protected int MaxRatioAct { get; private set; }
|
protected int MaxRatioAct { get; private set; }
|
||||||
@@ -25,6 +25,10 @@
|
|||||||
protected int MaxInactiveSeedingTime { get; private set; }
|
protected int MaxInactiveSeedingTime { get; private set; }
|
||||||
protected bool AddTrackersEnabled { get; private set; }
|
protected bool AddTrackersEnabled { get; private set; }
|
||||||
protected string? AddTrackers { get; private set; }
|
protected string? AddTrackers { get; private set; }
|
||||||
|
protected bool AddTrackersFromUrlEnabled { get; private set; }
|
||||||
|
protected string? AddTrackersUrl { get; private set; }
|
||||||
|
protected string? AddTrackersUrlList { get; private set; }
|
||||||
|
protected bool MergeTrackers { get; private set; }
|
||||||
|
|
||||||
protected Func<int, string?> MaxActiveDownloadsValidation = value =>
|
protected Func<int, string?> MaxActiveDownloadsValidation = value =>
|
||||||
{
|
{
|
||||||
@@ -166,6 +170,10 @@
|
|||||||
|
|
||||||
AddTrackersEnabled = Preferences.AddTrackersEnabled;
|
AddTrackersEnabled = Preferences.AddTrackersEnabled;
|
||||||
AddTrackers = Preferences.AddTrackers;
|
AddTrackers = Preferences.AddTrackers;
|
||||||
|
AddTrackersFromUrlEnabled = Preferences.AddTrackersFromUrlEnabled;
|
||||||
|
AddTrackersUrl = Preferences.AddTrackersUrl;
|
||||||
|
AddTrackersUrlList = Preferences.AddTrackersUrlList;
|
||||||
|
MergeTrackers = Preferences.MergeTrackers;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -275,7 +283,7 @@
|
|||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task MaxRatioChanged(int value)
|
protected async Task MaxRatioChanged(float value)
|
||||||
{
|
{
|
||||||
MaxRatio = value;
|
MaxRatio = value;
|
||||||
UpdatePreferences.MaxRatio = value;
|
UpdatePreferences.MaxRatio = value;
|
||||||
@@ -330,5 +338,33 @@
|
|||||||
UpdatePreferences.AddTrackers = value;
|
UpdatePreferences.AddTrackers = value;
|
||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async Task AddTrackersFromUrlEnabledChanged(bool value)
|
||||||
|
{
|
||||||
|
AddTrackersFromUrlEnabled = value;
|
||||||
|
UpdatePreferences.AddTrackersFromUrlEnabled = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task AddTrackersUrlChanged(string value)
|
||||||
|
{
|
||||||
|
AddTrackersUrl = value;
|
||||||
|
UpdatePreferences.AddTrackersUrl = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task AddTrackersUrlListChanged(string value)
|
||||||
|
{
|
||||||
|
AddTrackersUrlList = value;
|
||||||
|
UpdatePreferences.AddTrackersUrlList = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected async Task MergeTrackersChanged(bool value)
|
||||||
|
{
|
||||||
|
MergeTrackers = value;
|
||||||
|
UpdatePreferences.MergeTrackers = value;
|
||||||
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardContent>
|
<MudCardContent>
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudSelect T="int" Label="Peer connection protocol" Value="BittorrentProtocol" ValueChanged="BittorrentProtocolChanged" Variant="Variant.Outlined">
|
<MudSelect T="int" Label="Peer connection protocol" Value="BittorrentProtocol" ValueChanged="BittorrentProtocolChanged" Variant="Variant.Outlined">
|
||||||
<MudSelectItem T="int" Value="0">TCP and μTP</MudSelectItem>
|
<MudSelectItem T="int" Value="0">TCP and <EFBFBD>TP</MudSelectItem>
|
||||||
<MudSelectItem T="int" Value="1">TCP</MudSelectItem>
|
<MudSelectItem T="int" Value="1">TCP</MudSelectItem>
|
||||||
<MudSelectItem T="int" Value="2">μTP</MudSelectItem>
|
<MudSelectItem T="int" Value="2"><EFBFBD>TP</MudSelectItem>
|
||||||
</MudSelect>
|
</MudSelect>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Port used for incoming connections" Value="ListenPort" ValueChanged="ListenPortChanged" Min="@MinNonNegativePortValue" Max="@MaxPortValue" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentIcon="@CustomIcons.Random" OnAdornmentClick="GenerateRandomPort" HelperText="Set to 0 to let your system pick an unused port" Validation="PortNonNegativeValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Port used for incoming connections" Value="ListenPort" ValueChanged="ListenPortChanged" Min="@MinNonNegativePortValue" Max="@MaxPortValue" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentIcon="@CustomIcons.Random" OnAdornmentClick="GenerateRandomPort" HelperText="Set to 0 to let your system pick an unused port" Validation="PortNonNegativeValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Use UPnp / NAT-PMP port forwarding from my router" Value="Upnp" ValueChanged="UpnpChanged" />
|
<FieldSwitch Label="Use UPnp / NAT-PMP port forwarding from my router" Value="Upnp" ValueChanged="UpnpChanged" />
|
||||||
@@ -44,25 +44,25 @@
|
|||||||
<FieldSwitch Label="Global maximum number of connections" Value="MaxConnecEnabled" ValueChanged="MaxConnecEnabledChanged" />
|
<FieldSwitch Label="Global maximum number of connections" Value="MaxConnecEnabled" ValueChanged="MaxConnecEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudNumericField T="int" Label="Connections" Value="MaxConnec" ValueChanged="MaxConnecChanged" Min="0" Disabled="@(!MaxConnecEnabled)" Variant="Variant.Outlined" Validation="MaxConnectValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Connections" Value="MaxConnec" ValueChanged="MaxConnecChanged" Min="0" Disabled="@(!MaxConnecEnabled)" Variant="Variant.Outlined" Validation="MaxConnectValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<FieldSwitch Label="Maximum number of connections per torrent" Value="MaxConnecPerTorrentEnabled" ValueChanged="MaxConnecPerTorrentEnabledChanged" />
|
<FieldSwitch Label="Maximum number of connections per torrent" Value="MaxConnecPerTorrentEnabled" ValueChanged="MaxConnecPerTorrentEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudNumericField T="int" Label="Connections" Value="MaxConnecPerTorrent" ValueChanged="MaxConnecPerTorrentChanged" Min="0" Disabled="@(!MaxConnecPerTorrentEnabled)" Variant="Variant.Outlined" Validation="MaxConnecPerTorrentValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Connections" Value="MaxConnecPerTorrent" ValueChanged="MaxConnecPerTorrentChanged" Min="0" Disabled="@(!MaxConnecPerTorrentEnabled)" Variant="Variant.Outlined" Validation="MaxConnecPerTorrentValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<FieldSwitch Label="Global maximum number of upload slots" Value="MaxUploadsEnabled" ValueChanged="MaxUploadsEnabledChanged" />
|
<FieldSwitch Label="Global maximum number of upload slots" Value="MaxUploadsEnabled" ValueChanged="MaxUploadsEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudNumericField T="int" Label="Slots" Value="MaxUploads" ValueChanged="MaxUploadsChanged" Min="0" Disabled="@(!MaxUploadsEnabled)" Variant="Variant.Outlined" Validation="MaxUploadsValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Slots" Value="MaxUploads" ValueChanged="MaxUploadsChanged" Min="0" Disabled="@(!MaxUploadsEnabled)" Variant="Variant.Outlined" Validation="MaxUploadsValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<FieldSwitch Label="Maximum number of upload slots per torrent" Value="MaxUploadsPerTorrentEnabled" ValueChanged="MaxUploadsPerTorrentEnabledChanged" />
|
<FieldSwitch Label="Maximum number of upload slots per torrent" Value="MaxUploadsPerTorrentEnabled" ValueChanged="MaxUploadsPerTorrentEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudNumericField T="int" Label="Slots" Value="MaxUploadsPerTorrent" ValueChanged="MaxUploadsPerTorrentChanged" Min="0" Disabled="@(!MaxUploadsPerTorrentEnabled)" Variant="Variant.Outlined" Validation="MaxUploadsPerTorrentValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Slots" Value="MaxUploadsPerTorrent" ValueChanged="MaxUploadsPerTorrentChanged" Min="0" Disabled="@(!MaxUploadsPerTorrentEnabled)" Variant="Variant.Outlined" Validation="MaxUploadsPerTorrentValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -75,10 +75,10 @@
|
|||||||
<FieldSwitch Label="I2P (Experimental)" Value="I2pEnabled" ValueChanged="I2pEnabledChanged" />
|
<FieldSwitch Label="I2P (Experimental)" Value="I2pEnabled" ValueChanged="I2pEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudTextField T="string" Label="Host" Value="I2pAddress" ValueChanged="I2pAddressChanged" Disabled="@(!I2pEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Host" Value="I2pAddress" ValueChanged="I2pAddressChanged" Disabled="@(!I2pEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudNumericField T="int" Label="Slots" Value="I2pPort" ValueChanged="I2pPortChanged" Min="0" Max="65535" Disabled="@(!I2pEnabled)" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Slots" Value="I2pPort" ValueChanged="I2pPortChanged" Min="0" Max="65535" Disabled="@(!I2pEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Mixed mode" Value="I2pMixedMode" ValueChanged="I2pMixedModeChanged" Disabled="@(!I2pEnabled)" HelperText="If "mixed mode" is enabled, I2P torrents are allowed to also get peers from other sources than the tracker, and connect to regular IPs, not providing any anonymization. This may be useful if the user is not interested in the anonymization of I2P, but still wants to be able to connect to I2P peers." />
|
<FieldSwitch Label="Mixed mode" Value="I2pMixedMode" ValueChanged="I2pMixedModeChanged" Disabled="@(!I2pEnabled)" HelperText="If "mixed mode" is enabled, I2P torrents are allowed to also get peers from other sources than the tracker, and connect to regular IPs, not providing any anonymization. This may be useful if the user is not interested in the anonymization of I2P, but still wants to be able to connect to I2P peers." />
|
||||||
@@ -104,10 +104,10 @@
|
|||||||
</MudSelect>
|
</MudSelect>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="4">
|
<MudItem xs="12" md="4">
|
||||||
<MudTextField T="string" Label="Host" Value="ProxyIp" ValueChanged="ProxyIpChanged" Disabled="ProxyDisabled" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Host" Value="ProxyIp" ValueChanged="ProxyIpChanged" Disabled="ProxyDisabled" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="4">
|
<MudItem xs="12" md="4">
|
||||||
<MudNumericField T="int" Label="Port" Value="ProxyPort" ValueChanged="ProxyPortChanged" Min="1" Max="@ConnectionOptions.MaxPortValue" Disabled="ProxyDisabled" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Port" Value="ProxyPort" ValueChanged="ProxyPortChanged" Min="1" Max="@ConnectionOptions.MaxPortValue" Disabled="ProxyDisabled" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Perform hostname lookup via proxy" Value="ProxyHostnameLookup" ValueChanged="ProxyHostnameLookupChanged" HelperText="If checked, hostname lookups are done via the proxy." />
|
<FieldSwitch Label="Perform hostname lookup via proxy" Value="ProxyHostnameLookup" ValueChanged="ProxyHostnameLookupChanged" HelperText="If checked, hostname lookups are done via the proxy." />
|
||||||
@@ -116,10 +116,10 @@
|
|||||||
<FieldSwitch Label="Authentication" Value="ProxyAuthEnabled" ValueChanged="ProxyAuthEnabledChanged" Disabled="@(ProxyDisabled || ProxySocks4)" />
|
<FieldSwitch Label="Authentication" Value="ProxyAuthEnabled" ValueChanged="ProxyAuthEnabledChanged" Disabled="@(ProxyDisabled || ProxySocks4)" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudTextField T="string" Label="Username" Value="ProxyUsername" ValueChanged="ProxyUsernameChanged" Disabled="@(ProxyDisabled || ProxySocks4)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Username" Value="ProxyUsername" ValueChanged="ProxyUsernameChanged" Disabled="@(ProxyDisabled || ProxySocks4)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="6">
|
<MudItem xs="12" md="6">
|
||||||
<MudTextField T="string" Label="Password" Value="ProxyPassword" ValueChanged="ProxyPasswordChanged" Disabled="@(ProxyDisabled || ProxySocks4)" Variant="Variant.Outlined " HelperText="Info: The password is saved unencrypted" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Password" Value="ProxyPassword" ValueChanged="ProxyPasswordChanged" Disabled="@(ProxyDisabled || ProxySocks4)" Variant="Variant.Outlined " HelperText="Info: The password is saved unencrypted" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
|
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
@@ -150,14 +150,17 @@
|
|||||||
<FieldSwitch Label="IP Filter" Value="IpFilterEnabled" ValueChanged="IpFilterEnabledChanged" />
|
<FieldSwitch Label="IP Filter" Value="IpFilterEnabled" ValueChanged="IpFilterEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Filter path (.dat, .p2p, .p2b)" Value="IpFilterPath" ValueChanged="IpFilterPathChanged" Disabled="@(!IpFilterEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Filter path (.dat, .p2p, .p2b)" Value="IpFilterPath" ValueChanged="IpFilterPathChanged" Disabled="@(!IpFilterEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Apply to trackers" Value="IpFilterTrackers" ValueChanged="IpFilterTrackersChanged" />
|
<FieldSwitch Label="Apply to trackers" Value="IpFilterTrackers" ValueChanged="IpFilterTrackersChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Manually banned IP addresses" Value="BannedIPs" ValueChanged="BannedIPsChanged" Lines="5" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Manually banned IP addresses" Value="BannedIPs" ValueChanged="BannedIPsChanged" Lines="5" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
@@ -29,7 +29,11 @@
|
|||||||
</MudSelect>
|
</MudSelect>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Delete .torrent files afterwards" Value="AutoDeleteMode" ValueChanged="AutoDeleteModeChanged" />
|
<MudSelect T="int" Label="Delete .torrent files afterwards" Value="AutoDeleteMode" ValueChanged="AutoDeleteModeChanged" Variant="Variant.Outlined">
|
||||||
|
<MudSelectItem Value="0">Never</MudSelectItem>
|
||||||
|
<MudSelectItem Value="1">If added successfully</MudSelectItem>
|
||||||
|
<MudSelectItem Value="2">Always</MudSelectItem>
|
||||||
|
</MudSelect>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -62,7 +66,7 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudSelect T="bool" Label="Default Torrent Management Mode" Value="AutoTmmEnabled" ValueChanged="AutoDeleteModeChanged" Variant="Variant.Outlined">
|
<MudSelect T="bool" Label="Default Torrent Management Mode" Value="AutoTmmEnabled" ValueChanged="AutoTmmEnabledChanged" Variant="Variant.Outlined">
|
||||||
<MudSelectItem Value="false">Manual</MudSelectItem>
|
<MudSelectItem Value="false">Manual</MudSelectItem>
|
||||||
<MudSelectItem Value="true">Automatic</MudSelectItem>
|
<MudSelectItem Value="true">Automatic</MudSelectItem>
|
||||||
</MudSelect>
|
</MudSelect>
|
||||||
@@ -89,7 +93,7 @@
|
|||||||
<FieldSwitch Label="Use Subcategories" Value="UseSubcategories" ValueChanged="UseSubcategoriesChanged" />
|
<FieldSwitch Label="Use Subcategories" Value="UseSubcategories" ValueChanged="UseSubcategoriesChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Default Save Path" Value="SavePath" ValueChanged="SavePathChanged" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Default Save Path" Value="SavePath" ValueChanged="SavePathChanged" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
@@ -97,7 +101,7 @@
|
|||||||
<FieldSwitch Label="Keep incomplete torrents in" Value="TempPathEnabled" ValueChanged="TempPathEnabledChanged" />
|
<FieldSwitch Label="Keep incomplete torrents in" Value="TempPathEnabled" ValueChanged="TempPathEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" sm="6" md="9">
|
<MudItem xs="12" sm="6" md="9">
|
||||||
<MudTextField T="string" Label="Path" Value="TempPath" ValueChanged="TempPathChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Path" Value="TempPath" ValueChanged="TempPathChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
@@ -107,7 +111,7 @@
|
|||||||
<FieldSwitch Label="Copy .torrent files to" Value="ExportDirEnabled" ValueChanged="ExportDirEnabledChanged" />
|
<FieldSwitch Label="Copy .torrent files to" Value="ExportDirEnabled" ValueChanged="ExportDirEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" sm="6" md="9">
|
<MudItem xs="12" sm="6" md="9">
|
||||||
<MudTextField T="string" Label="Path" Value="ExportDir" ValueChanged="ExportDirChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Path" Value="ExportDir" ValueChanged="ExportDirChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
@@ -117,7 +121,7 @@
|
|||||||
<FieldSwitch Label="Copy .torrent files for finished downloads to" Value="ExportDirFinEnabled" ValueChanged="ExportDirFinEnabledChanged" />
|
<FieldSwitch Label="Copy .torrent files for finished downloads to" Value="ExportDirFinEnabled" ValueChanged="ExportDirFinEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" sm="6" md="9">
|
<MudItem xs="12" sm="6" md="9">
|
||||||
<MudTextField T="string" Label="Path" Value="ExportDirFin" ValueChanged="ExportDirFinChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Path" Value="ExportDirFin" ValueChanged="ExportDirFinChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
@@ -144,7 +148,7 @@
|
|||||||
{
|
{
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<MudTextField T="string" Label="Path" Value="@item.Key" ValueChanged="@(v => ScanDirsKeyChanged(item.Key, v))" Validation="IsValidNewKey" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Path" Value="@item.Key" ValueChanged="@(v => ScanDirsKeyChanged(item.Key, v))" Validation="IsValidNewKey" />
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
@@ -158,7 +162,7 @@
|
|||||||
@if (item.Value.SavePath is not null)
|
@if (item.Value.SavePath is not null)
|
||||||
{
|
{
|
||||||
<MudItem xs="8">
|
<MudItem xs="8">
|
||||||
<MudTextField T="string" Label="Path" Value="@item.Value.SavePath" ValueChanged="@(v => ScanDirsValueChanged(item.Key, v))" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Path" Value="@item.Value.SavePath" ValueChanged="@(v => ScanDirsValueChanged(item.Key, v))" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
}
|
}
|
||||||
<MudItem xs="1">
|
<MudItem xs="1">
|
||||||
@@ -177,7 +181,7 @@
|
|||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<MudTextField T="string" Label="Path" Value="@item.Key" ValueChanged="@(v => AddedScanDirsKeyChanged(index, v))" Validation="IsValidNewKey" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Path" Value="@item.Key" ValueChanged="@(v => AddedScanDirsKeyChanged(index, v))" Validation="IsValidNewKey" />
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
@@ -191,7 +195,7 @@
|
|||||||
@if (item.Value.SavePath is not null)
|
@if (item.Value.SavePath is not null)
|
||||||
{
|
{
|
||||||
<MudItem xs="@(isLast ? 8 : 9)">
|
<MudItem xs="@(isLast ? 8 : 9)">
|
||||||
<MudTextField T="string" Label="Path" Value="@item.Value.SavePath" ValueChanged="@(v => AddedScanDirsValueChanged(index, v))" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Path" Value="@item.Value.SavePath" ValueChanged="@(v => AddedScanDirsValueChanged(index, v))" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
}
|
}
|
||||||
<MudItem xs="1">
|
<MudItem xs="1">
|
||||||
@@ -225,7 +229,7 @@
|
|||||||
<FieldSwitch Label="Excluded file names" Value="ExcludedFileNamesEnabled" ValueChanged="ExcludedFileNamesEnabledChanged" />
|
<FieldSwitch Label="Excluded file names" Value="ExcludedFileNamesEnabled" ValueChanged="ExcludedFileNamesEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Excluded files names" Value="ExcludedFileNames" ValueChanged="ExcludedFileNamesChanged" Lines="5" Disabled="@(!ExcludedFileNamesEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Excluded files names" Value="ExcludedFileNames" ValueChanged="ExcludedFileNamesChanged" Lines="5" Disabled="@(!ExcludedFileNamesEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -243,13 +247,13 @@
|
|||||||
<FieldSwitch Label="Email notification upon download completion" Value="MailNotificationEnabled" ValueChanged="MailNotificationEnabledChanged" />
|
<FieldSwitch Label="Email notification upon download completion" Value="MailNotificationEnabled" ValueChanged="MailNotificationEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="From" Value="MailNotificationSender" ValueChanged="MailNotificationSenderChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="From" Value="MailNotificationSender" ValueChanged="MailNotificationSenderChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="To" Value="MailNotificationEmail" ValueChanged="MailNotificationEmailChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="To" Value="MailNotificationEmail" ValueChanged="MailNotificationEmailChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="SMTP server" Value="MailNotificationSmtp" ValueChanged="MailNotificationSmtpChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="SMTP server" Value="MailNotificationSmtp" ValueChanged="MailNotificationSmtpChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="This server requires a secure connection (SSL)" Value="MailNotificationSslEnabled" ValueChanged="MailNotificationSslEnabledChanged" Disabled="@(!MailNotificationEnabled)" />
|
<FieldSwitch Label="This server requires a secure connection (SSL)" Value="MailNotificationSslEnabled" ValueChanged="MailNotificationSslEnabledChanged" Disabled="@(!MailNotificationEnabled)" />
|
||||||
@@ -258,10 +262,10 @@
|
|||||||
<FieldSwitch Label="Authentication" Value="MailNotificationAuthEnabled" ValueChanged="MailNotificationAuthEnabledChanged" Disabled="@(!MailNotificationEnabled)" />
|
<FieldSwitch Label="Authentication" Value="MailNotificationAuthEnabled" ValueChanged="MailNotificationAuthEnabledChanged" Disabled="@(!MailNotificationEnabled)" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Username" Value="MailNotificationUsername" ValueChanged="MailNotificationUsernameChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Username" Value="MailNotificationUsername" ValueChanged="MailNotificationUsernameChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Password" Value="MailNotificationPassword" ValueChanged="MailNotificationPasswordChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" InputType="InputType.Password" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Password" Value="MailNotificationPassword" ValueChanged="MailNotificationPasswordChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" InputType="InputType.Password" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -279,13 +283,13 @@
|
|||||||
<FieldSwitch Label="Run external program on torrent added" Value="AutorunOnTorrentAddedEnabled" ValueChanged="AutorunOnTorrentAddedEnabledChanged" />
|
<FieldSwitch Label="Run external program on torrent added" Value="AutorunOnTorrentAddedEnabled" ValueChanged="AutorunOnTorrentAddedEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="External program" Value="AutorunOnTorrentAddedProgram" ValueChanged="AutorunOnTorrentAddedProgramChanged" Disabled="@(!AutorunOnTorrentAddedEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="External program" Value="AutorunOnTorrentAddedProgram" ValueChanged="AutorunOnTorrentAddedProgramChanged" Disabled="@(!AutorunOnTorrentAddedEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Run external program on torrent finished" Value="AutorunEnabled" ValueChanged="AutorunEnabledChanged" />
|
<FieldSwitch Label="Run external program on torrent finished" Value="AutorunEnabled" ValueChanged="AutorunEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="External program" Value="AutorunProgram" ValueChanged="AutorunProgramChanged" Disabled="@(!AutorunEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="External program" Value="AutorunProgram" ValueChanged="AutorunProgramChanged" Disabled="@(!AutorunEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudText>Supported parameters (case sensitive):</MudText>
|
<MudText>Supported parameters (case sensitive):</MudText>
|
||||||
@@ -306,4 +310,7 @@
|
|||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -8,7 +8,7 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
protected bool AddToTopOfQueue { get; set; }
|
protected bool AddToTopOfQueue { get; set; }
|
||||||
protected bool StartPausedEnabled { get; set; }
|
protected bool StartPausedEnabled { get; set; }
|
||||||
protected string? TorrentStopCondition { get; set; }
|
protected string? TorrentStopCondition { get; set; }
|
||||||
protected bool AutoDeleteMode { get; set; }
|
protected int AutoDeleteMode { get; set; }
|
||||||
protected bool PreallocateAll { get; set; }
|
protected bool PreallocateAll { get; set; }
|
||||||
protected bool IncompleteFilesExt { get; set; }
|
protected bool IncompleteFilesExt { get; set; }
|
||||||
protected bool AutoTmmEnabled { get; set; }
|
protected bool AutoTmmEnabled { get; set; }
|
||||||
@@ -51,9 +51,9 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
// when adding a torrent
|
// when adding a torrent
|
||||||
TorrentContentLayout = Preferences.TorrentContentLayout;
|
TorrentContentLayout = Preferences.TorrentContentLayout;
|
||||||
AddToTopOfQueue = Preferences.AddToTopOfQueue;
|
AddToTopOfQueue = Preferences.AddToTopOfQueue;
|
||||||
StartPausedEnabled = Preferences.StartPausedEnabled;
|
StartPausedEnabled = Preferences.AddStoppedEnabled || Preferences.StartPausedEnabled;
|
||||||
TorrentStopCondition = Preferences.TorrentStopCondition;
|
TorrentStopCondition = Preferences.TorrentStopCondition;
|
||||||
AutoDeleteMode = Preferences.AutoDeleteMode == 1;
|
AutoDeleteMode = Preferences.AutoDeleteMode is >= 0 and <= 2 ? Preferences.AutoDeleteMode : 0;
|
||||||
PreallocateAll = Preferences.PreallocateAll;
|
PreallocateAll = Preferences.PreallocateAll;
|
||||||
IncompleteFilesExt = Preferences.IncompleteFilesExt;
|
IncompleteFilesExt = Preferences.IncompleteFilesExt;
|
||||||
|
|
||||||
@@ -120,6 +120,7 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
{
|
{
|
||||||
StartPausedEnabled = value;
|
StartPausedEnabled = value;
|
||||||
UpdatePreferences.StartPausedEnabled = value;
|
UpdatePreferences.StartPausedEnabled = value;
|
||||||
|
UpdatePreferences.AddStoppedEnabled = value;
|
||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,10 +131,10 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task AutoDeleteModeChanged(bool value)
|
protected async Task AutoDeleteModeChanged(int value)
|
||||||
{
|
{
|
||||||
AutoDeleteMode = value;
|
AutoDeleteMode = value;
|
||||||
UpdatePreferences.AutoDeleteMode = value ? 1 : 0;
|
UpdatePreferences.AutoDeleteMode = value;
|
||||||
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
await PreferencesChanged.InvokeAsync(UpdatePreferences);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,4 +411,4 @@ namespace Lantean.QBTMud.Components.Options
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
@@ -12,10 +12,10 @@
|
|||||||
<FieldSwitch Label="Enable fetching RSS feeds" Value="RssProcessingEnabled" ValueChanged="RssProcessingEnabledChanged" />
|
<FieldSwitch Label="Enable fetching RSS feeds" Value="RssProcessingEnabled" ValueChanged="RssProcessingEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Feeds refresh interval" Value="RssRefreshInterval" ValueChanged="RssRefreshIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Feeds refresh interval" Value="RssRefreshInterval" ValueChanged="RssRefreshIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Maximum number of articles per feed" Value="RssMaxArticlesPerFeed" ValueChanged="RssMaxArticlesPerFeedChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Maximum number of articles per feed" Value="RssMaxArticlesPerFeed" ValueChanged="RssMaxArticlesPerFeedChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -51,8 +51,11 @@
|
|||||||
<FieldSwitch Label="Download REPACK/PROPER episodes" Value="RssDownloadRepackProperEpisodes" ValueChanged="RssDownloadRepackProperEpisodesChanged" />
|
<FieldSwitch Label="Download REPACK/PROPER episodes" Value="RssDownloadRepackProperEpisodes" ValueChanged="RssDownloadRepackProperEpisodesChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Filters" Value="RssSmartEpisodeFilters" ValueChanged="RssSmartEpisodeFiltersChanged" Lines="5" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Filters" Value="RssSmartEpisodeFilters" ValueChanged="RssSmartEpisodeFiltersChanged" Lines="5" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
@@ -9,10 +9,10 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Upload" Value="UpLimit" ValueChanged="UpLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="UpLimitValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Upload" Value="UpLimit" ValueChanged="UpLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="UpLimitValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Download" Value="DlLimit" ValueChanged="DlLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="DlLimitValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Download" Value="DlLimit" ValueChanged="DlLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="DlLimitValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -27,10 +27,10 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Upload" Value="AltUpLimit" ValueChanged="AltUpLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="AltUpLimitValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Upload" Value="AltUpLimit" ValueChanged="AltUpLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="AltUpLimitValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Download" Value="AltDlLimit" ValueChanged="AltDlLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="AltDlLimitValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Download" Value="AltDlLimit" ValueChanged="AltDlLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="AltDlLimitValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Schedule the use of alternative rate limits" Value="SchedulerEnabled" ValueChanged="SchedulerEnabledChanged" />
|
<FieldSwitch Label="Schedule the use of alternative rate limits" Value="SchedulerEnabled" ValueChanged="SchedulerEnabledChanged" />
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Apply rate limit to µTP protocol" Value="LimitUtpRate" ValueChanged="LimitUtpRateChanged" />
|
<FieldSwitch Label="Apply rate limit to <EFBFBD>TP protocol" Value="LimitUtpRate" ValueChanged="LimitUtpRateChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Apply rate limit to transport overhead" Value="LimitTcpOverhead" ValueChanged="LimitTcpOverheadChanged" />
|
<FieldSwitch Label="Apply rate limit to transport overhead" Value="LimitTcpOverhead" ValueChanged="LimitTcpOverheadChanged" />
|
||||||
@@ -78,4 +78,6 @@
|
|||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
@inherits Options
|
@inherits Options
|
||||||
|
|
||||||
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
<MudCard Elevation="1" Class="ml-4 mr-4 mb-4 mt-4">
|
||||||
<MudCardHeader>
|
<MudCardHeader>
|
||||||
@@ -9,10 +9,10 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12" md="8">
|
<MudItem xs="12" md="8">
|
||||||
<MudTextField T="string" Label="Host" Value="WebUiAddress" ValueChanged="WebUiAddressChanged" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Host" Value="WebUiAddress" ValueChanged="WebUiAddressChanged" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12" md="4">
|
<MudItem xs="12" md="4">
|
||||||
<MudNumericField T="int" Label="Port" Value="WebUiPort" ValueChanged="WebUiPortChanged" Min="1" Max="@Options.MaxPortValue" Variant="Variant.Outlined" Validation="WebUiPortValidation" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Port" Value="WebUiPort" ValueChanged="WebUiPortChanged" Min="1" Max="@Options.MaxPortValue" Variant="Variant.Outlined" Validation="WebUiPortValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Use UPnP / NAT-PMP to forward the port from my router" Value="WebUiUpnp" ValueChanged="WebUiUpnpChanged" />
|
<FieldSwitch Label="Use UPnP / NAT-PMP to forward the port from my router" Value="WebUiUpnp" ValueChanged="WebUiUpnpChanged" />
|
||||||
@@ -33,10 +33,10 @@
|
|||||||
<FieldSwitch Label="Use HTTPS instead of HTTP" Value="UseHttps" ValueChanged="UseHttpsChanged" />
|
<FieldSwitch Label="Use HTTPS instead of HTTP" Value="UseHttps" ValueChanged="UseHttpsChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Certificate" Value="WebUiHttpsCertPath" ValueChanged="WebUiHttpsCertPathChanged" Disabled="@(!UseHttps)" Variant="Variant.Outlined" Validation="WebUiHttpsCertPathValidation" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Certificate" Value="WebUiHttpsCertPath" ValueChanged="WebUiHttpsCertPathChanged" Disabled="@(!UseHttps)" Variant="Variant.Outlined" Validation="WebUiHttpsCertPathValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Key" Value="WebUiHttpsKeyPath" ValueChanged="WebUiHttpsKeyPathChanged" Disabled="@(!UseHttps)" Variant="Variant.Outlined" Validation="WebUiHttpsKeyPathValidation" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Key" Value="WebUiHttpsKeyPath" ValueChanged="WebUiHttpsKeyPathChanged" Disabled="@(!UseHttps)" Variant="Variant.Outlined" Validation="WebUiHttpsKeyPathValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -51,10 +51,10 @@
|
|||||||
<MudCardContent Class="pt-0">
|
<MudCardContent Class="pt-0">
|
||||||
<MudGrid>
|
<MudGrid>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Username" Value="WebUiUsername" ValueChanged="WebUiUsernameChanged" Variant="Variant.Outlined" Validation="WebUiUsernameValidation" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Username" Value="WebUiUsername" ValueChanged="WebUiUsernameChanged" Variant="Variant.Outlined" Validation="WebUiUsernameValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Password" Value="WebUiPassword" ValueChanged="WebUiPasswordChanged" InputType="InputType.Password" Variant="Variant.Outlined" Validation="WebUiPasswordValidation" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Password" Value="WebUiPassword" ValueChanged="WebUiPasswordChanged" InputType="InputType.Password" Variant="Variant.Outlined" Validation="WebUiPasswordValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<FieldSwitch Label="Bypass authentication for clients on localhost" Value="BypassLocalAuth" ValueChanged="BypassLocalAuthChanged" />
|
<FieldSwitch Label="Bypass authentication for clients on localhost" Value="BypassLocalAuth" ValueChanged="BypassLocalAuthChanged" />
|
||||||
@@ -63,16 +63,16 @@
|
|||||||
<FieldSwitch Label="Bypass authentication for clients in whitelisted IP subnets" Value="BypassAuthSubnetWhitelistEnabled" ValueChanged="BypassAuthSubnetWhitelistEnabledChanged" />
|
<FieldSwitch Label="Bypass authentication for clients in whitelisted IP subnets" Value="BypassAuthSubnetWhitelistEnabled" ValueChanged="BypassAuthSubnetWhitelistEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Trackers" Value="BypassAuthSubnetWhitelist" ValueChanged="BypassAuthSubnetWhitelistChanged" Lines="5" Disabled="@(!BypassAuthSubnetWhitelistEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Trackers" Value="BypassAuthSubnetWhitelist" ValueChanged="BypassAuthSubnetWhitelistChanged" Lines="5" Disabled="@(!BypassAuthSubnetWhitelistEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Ban client after consecutive failures" Value="WebUiMaxAuthFailCount" ValueChanged="WebUiMaxAuthFailCountChanged" Min="0" Variant="Variant.Outlined" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Ban client after consecutive failures" Value="WebUiMaxAuthFailCount" ValueChanged="WebUiMaxAuthFailCountChanged" Min="0" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="ban for" Value="WebUiBanDuration" ValueChanged="WebUiBanDurationChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="ban for" Value="WebUiBanDuration" ValueChanged="WebUiBanDurationChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudNumericField T="int" Label="Session timeout" Value="WebUiSessionTimeout" ValueChanged="WebUiSessionTimeoutChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
|
<MudNumericField Immediate="true" DebounceInterval="250" T="int" Label="Session timeout" Value="WebUiSessionTimeout" ValueChanged="WebUiSessionTimeoutChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
<FieldSwitch Label="Use alternative Web UI" Value="AlternativeWebuiEnabled" ValueChanged="AlternativeWebuiEnabledChanged" />
|
<FieldSwitch Label="Use alternative Web UI" Value="AlternativeWebuiEnabled" ValueChanged="AlternativeWebuiEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Files location" Value="AlternativeWebuiPath" ValueChanged="AlternativeWebuiPathChanged" Variant="Variant.Outlined" Validation="AlternativeWebuiPathValidation" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Files location" Value="AlternativeWebuiPath" ValueChanged="AlternativeWebuiPathChanged" Variant="Variant.Outlined" Validation="AlternativeWebuiPathValidation" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -117,7 +117,7 @@
|
|||||||
<FieldSwitch Label="Enable Host header validation" Value="WebUiHostHeaderValidationEnabled" ValueChanged="WebUiHostHeaderValidationEnabledChanged" />
|
<FieldSwitch Label="Enable Host header validation" Value="WebUiHostHeaderValidationEnabled" ValueChanged="WebUiHostHeaderValidationEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -144,7 +144,7 @@
|
|||||||
<FieldSwitch Label="Enable Host header validation" Value="WebUiHostHeaderValidationEnabled" ValueChanged="WebUiHostHeaderValidationEnabledChanged" />
|
<FieldSwitch Label="Enable Host header validation" Value="WebUiHostHeaderValidationEnabled" ValueChanged="WebUiHostHeaderValidationEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -162,7 +162,7 @@
|
|||||||
<FieldSwitch Label="Add custom HTTP headers" Value="WebUiUseCustomHttpHeadersEnabled" ValueChanged="WebUiUseCustomHttpHeadersEnabledChanged" />
|
<FieldSwitch Label="Add custom HTTP headers" Value="WebUiUseCustomHttpHeadersEnabled" ValueChanged="WebUiUseCustomHttpHeadersEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Server domains" Value="WebUiCustomHttpHeaders" ValueChanged="WebUiCustomHttpHeadersChanged" Lines="5" Disabled="@(!WebUiUseCustomHttpHeadersEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Server domains" Value="WebUiCustomHttpHeaders" ValueChanged="WebUiCustomHttpHeadersChanged" Lines="5" Disabled="@(!WebUiUseCustomHttpHeadersEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -180,7 +180,7 @@
|
|||||||
<FieldSwitch Label="Enable reverse proxy support" Value="WebUiReverseProxyEnabled" ValueChanged="WebUiReverseProxyEnabledChanged" />
|
<FieldSwitch Label="Enable reverse proxy support" Value="WebUiReverseProxyEnabled" ValueChanged="WebUiReverseProxyEnabledChanged" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Trusted proxies list" Value="WebUiReverseProxiesList" ValueChanged="WebUiReverseProxiesListChanged" Lines="5" Disabled="@(!WebUiReverseProxyEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Trusted proxies list" Value="WebUiReverseProxiesList" ValueChanged="WebUiReverseProxiesListChanged" Lines="5" Disabled="@(!WebUiReverseProxyEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
@@ -207,14 +207,17 @@
|
|||||||
<MudButton OnClick="RegisterDyndnsService" Disabled="@(!DyndnsEnabled)" Variant="Variant.Filled">Register</MudButton>
|
<MudButton OnClick="RegisterDyndnsService" Disabled="@(!DyndnsEnabled)" Variant="Variant.Filled">Register</MudButton>
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Domain name" Value="DyndnsDomain" ValueChanged="DyndnsDomainChanged" Disabled="@(!DyndnsEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Domain name" Value="DyndnsDomain" ValueChanged="DyndnsDomainChanged" Disabled="@(!DyndnsEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Username" Value="DyndnsUsername" ValueChanged="DyndnsUsernameChanged" Disabled="@(!DyndnsEnabled)" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Username" Value="DyndnsUsername" ValueChanged="DyndnsUsernameChanged" Disabled="@(!DyndnsEnabled)" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
<MudItem xs="12">
|
<MudItem xs="12">
|
||||||
<MudTextField T="string" Label="Password" Value="DyndnsPassword" ValueChanged="DyndnsPasswordChanged" Disabled="@(!DyndnsEnabled)" InputType="InputType.Password" Variant="Variant.Outlined" />
|
<MudTextField Immediate="true" DebounceInterval="250" T="string" Label="Password" Value="DyndnsPassword" ValueChanged="DyndnsPasswordChanged" Disabled="@(!DyndnsEnabled)" InputType="InputType.Password" Variant="Variant.Outlined" />
|
||||||
</MudItem>
|
</MudItem>
|
||||||
</MudGrid>
|
</MudGrid>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -12,10 +12,7 @@ namespace Lantean.QBTMud.Components
|
|||||||
{
|
{
|
||||||
public partial class TorrentActions : IAsyncDisposable
|
public partial class TorrentActions : IAsyncDisposable
|
||||||
{
|
{
|
||||||
private const int _defaultVersion = 5;
|
|
||||||
|
|
||||||
private bool _disposedValue;
|
private bool _disposedValue;
|
||||||
private int? _version;
|
|
||||||
|
|
||||||
private List<UIAction>? _actions;
|
private List<UIAction>? _actions;
|
||||||
|
|
||||||
@@ -74,30 +71,7 @@ namespace Lantean.QBTMud.Components
|
|||||||
|
|
||||||
protected bool OverlayVisible { get; set; }
|
protected bool OverlayVisible { get; set; }
|
||||||
|
|
||||||
protected int MajorVersion
|
protected int MajorVersion => VersionHelper.GetMajorVersion(Version);
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (_version is not null)
|
|
||||||
{
|
|
||||||
return _version.Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(Version))
|
|
||||||
{
|
|
||||||
return _defaultVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!System.Version.TryParse(Version.Replace("v", ""), out var version))
|
|
||||||
{
|
|
||||||
return _defaultVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
_version = version.Major;
|
|
||||||
|
|
||||||
return _version.Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
@@ -441,7 +415,7 @@ namespace Lantean.QBTMud.Components
|
|||||||
thereAreFirstLastPiecePrio = true;
|
thereAreFirstLastPiecePrio = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (torrent.Progress > 0.999999) // not downloaded
|
if (torrent.Progress < 0.999999) // not downloaded
|
||||||
{
|
{
|
||||||
allAreDownloaded = false;
|
allAreDownloaded = false;
|
||||||
}
|
}
|
||||||
|
@@ -19,28 +19,28 @@ namespace Lantean.QBTMud.Helpers
|
|||||||
{
|
{
|
||||||
if (seconds is null)
|
if (seconds is null)
|
||||||
{
|
{
|
||||||
return "";
|
return string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seconds == 8640000)
|
const long InfiniteEtaSentinelSeconds = 8_640_000; // ~100 days, used by qBittorrent for "infinite" ETA.
|
||||||
|
var value = seconds.Value;
|
||||||
|
|
||||||
|
if (value >= long.MaxValue || value >= TimeSpan.MaxValue.TotalSeconds || value == InfiniteEtaSentinelSeconds)
|
||||||
{
|
{
|
||||||
return "∞";
|
return "∞";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (seconds < 60)
|
if (value <= 0)
|
||||||
{
|
{
|
||||||
return "< 1m";
|
return "< 1m";
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeSpan time;
|
var time = TimeSpan.FromSeconds(value);
|
||||||
try
|
if (time.TotalMinutes < 1)
|
||||||
{
|
{
|
||||||
time = TimeSpan.FromSeconds(seconds.Value);
|
return "< 1m";
|
||||||
}
|
|
||||||
catch (OverflowException)
|
|
||||||
{
|
|
||||||
return "∞";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
if (prefix is not null)
|
if (prefix is not null)
|
||||||
{
|
{
|
||||||
@@ -83,6 +83,7 @@ namespace Lantean.QBTMud.Helpers
|
|||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Formats a file size in bytes into an appropriate unit based on the size.
|
/// Formats a file size in bytes into an appropriate unit based on the size.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -129,7 +130,7 @@ namespace Lantean.QBTMud.Helpers
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
return Size(size);
|
return Size(size, prefix, suffix);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -119,34 +119,34 @@ namespace Lantean.QBTMud.Helpers
|
|||||||
switch (category)
|
switch (category)
|
||||||
{
|
{
|
||||||
case CATEGORY_ALL:
|
case CATEGORY_ALL:
|
||||||
break;
|
return true;
|
||||||
|
|
||||||
case CATEGORY_UNCATEGORIZED:
|
case CATEGORY_UNCATEGORIZED:
|
||||||
if (!string.IsNullOrEmpty(torrent.Category))
|
if (!string.IsNullOrEmpty(torrent.Category))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
|
return true;
|
||||||
default:
|
default:
|
||||||
|
if (string.IsNullOrEmpty(torrent.Category))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!useSubcategories)
|
if (!useSubcategories)
|
||||||
{
|
{
|
||||||
if (torrent.Category != category)
|
return string.Equals(torrent.Category, category, StringComparison.Ordinal);
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!torrent.Category.StartsWith(category))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
if (string.Equals(torrent.Category, category, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var prefix = string.Concat(category, "/");
|
||||||
|
return torrent.Category.StartsWith(prefix, StringComparison.Ordinal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool FilterTag(Torrent torrent, string tag)
|
public static bool FilterTag(Torrent torrent, string tag)
|
||||||
@@ -207,7 +207,7 @@ namespace Lantean.QBTMud.Helpers
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Status.Paused:
|
case Status.Paused:
|
||||||
if (!state.Contains("paused") || !state.Contains("stopped"))
|
if (!state.Contains("paused") && !state.Contains("stopped"))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
34
Lantean.QBTMud/Helpers/VersionHelper.cs
Normal file
34
Lantean.QBTMud/Helpers/VersionHelper.cs
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
|
||||||
|
namespace Lantean.QBTMud.Helpers
|
||||||
|
{
|
||||||
|
internal static class VersionHelper
|
||||||
|
{
|
||||||
|
private static int? _version;
|
||||||
|
|
||||||
|
private const int _defaultVersion = 5;
|
||||||
|
|
||||||
|
public static int DefaultVersion => _defaultVersion;
|
||||||
|
|
||||||
|
public static int GetMajorVersion(string? version)
|
||||||
|
{
|
||||||
|
if (_version is not null)
|
||||||
|
{
|
||||||
|
return _version.Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(version))
|
||||||
|
{
|
||||||
|
return _defaultVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Version.TryParse(version?.Replace("v", ""), out var theVersion))
|
||||||
|
{
|
||||||
|
return _defaultVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
_version = theVersion.Major;
|
||||||
|
|
||||||
|
return _version.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -4,21 +4,19 @@
|
|||||||
<TargetFramework>net9.0</TargetFramework>
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
<CompressionEnabled>false</CompressionEnabled>
|
<CompressionEnabled>false</CompressionEnabled>
|
||||||
<LangVersion>12</LangVersion>
|
<LangVersion>12</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
|
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
|
||||||
<PackageReference Include="ByteSize" Version="2.1.2" />
|
<PackageReference Include="ByteSize" Version="2.1.2" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.1" />
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="9.0.5" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.1" PrivateAssets="all" />
|
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="9.0.5" PrivateAssets="all" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.5" />
|
||||||
<PackageReference Include="MudBlazor" Version="8.2.0" />
|
<PackageReference Include="MudBlazor" Version="8.7.0" />
|
||||||
<PackageReference Include="MudBlazor.ThemeManager" Version="3.0.0" />
|
<PackageReference Include="MudBlazor.ThemeManager" Version="3.0.0" />
|
||||||
<!-- added to fix vuln in dependency -->
|
|
||||||
<PackageReference Include="System.Text.Json" Version="9.0.1" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@@ -83,7 +83,7 @@ namespace Lantean.QBTMud.Layout
|
|||||||
Preferences = await ApiClient.GetApplicationPreferences();
|
Preferences = await ApiClient.GetApplicationPreferences();
|
||||||
Version = await ApiClient.GetApplicationVersion();
|
Version = await ApiClient.GetApplicationVersion();
|
||||||
var data = await ApiClient.GetMainData(_requestId);
|
var data = await ApiClient.GetMainData(_requestId);
|
||||||
MainData = DataManager.CreateMainData(data);
|
MainData = DataManager.CreateMainData(data, Version);
|
||||||
|
|
||||||
_requestId = data.ResponseId;
|
_requestId = data.ResponseId;
|
||||||
_refreshInterval = MainData.ServerState.RefreshInterval;
|
_refreshInterval = MainData.ServerState.RefreshInterval;
|
||||||
@@ -128,7 +128,7 @@ namespace Lantean.QBTMud.Layout
|
|||||||
|
|
||||||
if (MainData is null || data.FullUpdate)
|
if (MainData is null || data.FullUpdate)
|
||||||
{
|
{
|
||||||
MainData = DataManager.CreateMainData(data);
|
MainData = DataManager.CreateMainData(data, Version);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -13,9 +13,6 @@ namespace Lantean.QBTMud.Layout
|
|||||||
|
|
||||||
private bool _disposedValue;
|
private bool _disposedValue;
|
||||||
|
|
||||||
[Inject]
|
|
||||||
protected NavigationManager NavigationManager { get; set; } = default!;
|
|
||||||
|
|
||||||
[Inject]
|
[Inject]
|
||||||
private IBrowserViewportService BrowserViewportService { get; set; } = default!;
|
private IBrowserViewportService BrowserViewportService { get; set; } = default!;
|
||||||
|
|
||||||
@@ -78,13 +75,13 @@ namespace Lantean.QBTMud.Layout
|
|||||||
{
|
{
|
||||||
IsDarkMode = isDarkMode.Value;
|
IsDarkMode = isDarkMode.Value;
|
||||||
}
|
}
|
||||||
await MudThemeProvider.WatchSystemPreference(OnSystemPreferenceChanged);
|
await MudThemeProvider.WatchSystemDarkModeAsync(OnSystemDarkModeChanged);
|
||||||
await BrowserViewportService.SubscribeAsync(this, fireImmediately: true);
|
await BrowserViewportService.SubscribeAsync(this, fireImmediately: true);
|
||||||
await InvokeAsync(StateHasChanged);
|
await InvokeAsync(StateHasChanged);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Task OnSystemPreferenceChanged(bool value)
|
protected Task OnSystemDarkModeChanged(bool value)
|
||||||
{
|
{
|
||||||
IsDarkMode = value;
|
IsDarkMode = value;
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
@@ -11,7 +11,8 @@
|
|||||||
Dictionary<string, HashSet<string>> tagState,
|
Dictionary<string, HashSet<string>> tagState,
|
||||||
Dictionary<string, HashSet<string>> categoriesState,
|
Dictionary<string, HashSet<string>> categoriesState,
|
||||||
Dictionary<string, HashSet<string>> statusState,
|
Dictionary<string, HashSet<string>> statusState,
|
||||||
Dictionary<string, HashSet<string>> trackersState)
|
Dictionary<string, HashSet<string>> trackersState,
|
||||||
|
int majorVersion)
|
||||||
{
|
{
|
||||||
Torrents = torrents.ToDictionary();
|
Torrents = torrents.ToDictionary();
|
||||||
Tags = tags.ToHashSet();
|
Tags = tags.ToHashSet();
|
||||||
@@ -22,6 +23,7 @@
|
|||||||
CategoriesState = categoriesState;
|
CategoriesState = categoriesState;
|
||||||
StatusState = statusState;
|
StatusState = statusState;
|
||||||
TrackersState = trackersState;
|
TrackersState = trackersState;
|
||||||
|
MajorVersion = majorVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Dictionary<string, Torrent> Torrents { get; }
|
public Dictionary<string, Torrent> Torrents { get; }
|
||||||
@@ -36,5 +38,6 @@
|
|||||||
public Dictionary<string, HashSet<string>> TrackersState { get; }
|
public Dictionary<string, HashSet<string>> TrackersState { get; }
|
||||||
public string? SelectedTorrentHash { get; set; }
|
public string? SelectedTorrentHash { get; set; }
|
||||||
public bool LostConnection { get; set; }
|
public bool LostConnection { get; set; }
|
||||||
|
public int MajorVersion { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -8,6 +8,7 @@
|
|||||||
Completed,
|
Completed,
|
||||||
Resumed,
|
Resumed,
|
||||||
Paused,
|
Paused,
|
||||||
|
Stopped,
|
||||||
Active,
|
Active,
|
||||||
Inactive,
|
Inactive,
|
||||||
Stalled,
|
Stalled,
|
||||||
@@ -15,6 +16,6 @@
|
|||||||
StalledDownloading,
|
StalledDownloading,
|
||||||
Checking,
|
Checking,
|
||||||
Errored,
|
Errored,
|
||||||
Stopped
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -5,7 +5,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
{
|
{
|
||||||
public class DataManager : IDataManager
|
public class DataManager : IDataManager
|
||||||
{
|
{
|
||||||
private static readonly Status[] _statuses = Enum.GetValues<Status>();
|
private static Status[]? _statusArray = null;
|
||||||
|
|
||||||
public PeerList CreatePeerList(QBitTorrentClient.Models.TorrentPeers torrentPeers)
|
public PeerList CreatePeerList(QBitTorrentClient.Models.TorrentPeers torrentPeers)
|
||||||
{
|
{
|
||||||
@@ -25,8 +25,9 @@ namespace Lantean.QBTMud.Services
|
|||||||
return peerList;
|
return peerList;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MainData CreateMainData(QBitTorrentClient.Models.MainData mainData)
|
public MainData CreateMainData(QBitTorrentClient.Models.MainData mainData, string version)
|
||||||
{
|
{
|
||||||
|
var majorVersion = VersionHelper.GetMajorVersion(version);
|
||||||
var torrents = new Dictionary<string, Torrent>(mainData.Torrents?.Count ?? 0);
|
var torrents = new Dictionary<string, Torrent>(mainData.Torrents?.Count ?? 0);
|
||||||
if (mainData.Torrents is not null)
|
if (mainData.Torrents is not null)
|
||||||
{
|
{
|
||||||
@@ -38,12 +39,19 @@ namespace Lantean.QBTMud.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var tags = new List<string>(mainData.Tags?.Count ?? 0);
|
var tags = new List<string>();
|
||||||
if (mainData.Tags is not null)
|
if (mainData.Tags is not null)
|
||||||
{
|
{
|
||||||
|
var seenTags = new HashSet<string>(StringComparer.Ordinal);
|
||||||
foreach (var tag in mainData.Tags)
|
foreach (var tag in mainData.Tags)
|
||||||
{
|
{
|
||||||
tags.Add(tag);
|
var normalizedTag = NormalizeTag(tag);
|
||||||
|
if (string.IsNullOrEmpty(normalizedTag) || !seenTags.Add(normalizedTag))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
tags.Add(normalizedTag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,8 +95,9 @@ namespace Lantean.QBTMud.Services
|
|||||||
categoriesState.Add(category, torrents.Values.Where(t => FilterHelper.FilterCategory(t, category, serverState.UseSubcategories)).ToHashesHashSet());
|
categoriesState.Add(category, torrents.Values.Where(t => FilterHelper.FilterCategory(t, category, serverState.UseSubcategories)).ToHashesHashSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
var statusState = new Dictionary<string, HashSet<string>>(_statuses.Length + 2);
|
var statuses = GetStatuses(majorVersion).ToArray();
|
||||||
foreach (var status in _statuses)
|
var statusState = new Dictionary<string, HashSet<string>>(statuses.Length + 2);
|
||||||
|
foreach (var status in statuses)
|
||||||
{
|
{
|
||||||
statusState.Add(status.ToString(), torrents.Values.Where(t => FilterHelper.FilterStatus(t, status)).ToHashesHashSet());
|
statusState.Add(status.ToString(), torrents.Values.Where(t => FilterHelper.FilterStatus(t, status)).ToHashesHashSet());
|
||||||
}
|
}
|
||||||
@@ -101,7 +110,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
trackersState.Add(tracker, torrents.Values.Where(t => FilterHelper.FilterTracker(t, tracker)).ToHashesHashSet());
|
trackersState.Add(tracker, torrents.Values.Where(t => FilterHelper.FilterTracker(t, tracker)).ToHashesHashSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
var torrentList = new MainData(torrents, tags, categories, trackers, serverState, tagState, categoriesState, statusState, trackersState);
|
var torrentList = new MainData(torrents, tags, categories, trackers, serverState, tagState, categoriesState, statusState, trackersState, majorVersion);
|
||||||
|
|
||||||
return torrentList;
|
return torrentList;
|
||||||
}
|
}
|
||||||
@@ -155,8 +164,14 @@ namespace Lantean.QBTMud.Services
|
|||||||
{
|
{
|
||||||
foreach (var tag in mainData.TagsRemoved)
|
foreach (var tag in mainData.TagsRemoved)
|
||||||
{
|
{
|
||||||
torrentList.Tags.Remove(tag);
|
var normalizedTag = NormalizeTag(tag);
|
||||||
torrentList.TagState.Remove(tag);
|
if (string.IsNullOrEmpty(normalizedTag))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
torrentList.Tags.Remove(normalizedTag);
|
||||||
|
torrentList.TagState.Remove(normalizedTag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,7 +213,18 @@ namespace Lantean.QBTMud.Services
|
|||||||
{
|
{
|
||||||
foreach (var tag in mainData.Tags)
|
foreach (var tag in mainData.Tags)
|
||||||
{
|
{
|
||||||
torrentList.Tags.Add(tag);
|
var normalizedTag = NormalizeTag(tag);
|
||||||
|
if (string.IsNullOrEmpty(normalizedTag))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
torrentList.Tags.Add(normalizedTag);
|
||||||
|
var matchingHashes = torrentList.Torrents
|
||||||
|
.Where(pair => FilterHelper.FilterTag(pair.Value, normalizedTag))
|
||||||
|
.Select(pair => pair.Key)
|
||||||
|
.ToHashSet();
|
||||||
|
torrentList.TagState[normalizedTag] = matchingHashes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,7 +232,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
{
|
{
|
||||||
foreach (var (url, hashes) in mainData.Trackers)
|
foreach (var (url, hashes) in mainData.Trackers)
|
||||||
{
|
{
|
||||||
if (!torrentList.Trackers.TryGetValue(url, out var existingHashes))
|
if (!torrentList.Trackers.TryGetValue(url, out _))
|
||||||
{
|
{
|
||||||
torrentList.Trackers.Add(url, hashes);
|
torrentList.Trackers.Add(url, hashes);
|
||||||
}
|
}
|
||||||
@@ -225,7 +251,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
{
|
{
|
||||||
var newTorrent = CreateTorrent(hash, torrent);
|
var newTorrent = CreateTorrent(hash, torrent);
|
||||||
torrentList.Torrents.Add(hash, newTorrent);
|
torrentList.Torrents.Add(hash, newTorrent);
|
||||||
AddTorrentToStates(torrentList, hash);
|
AddTorrentToStates(torrentList, hash, torrentList.MajorVersion);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -241,7 +267,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void AddTorrentToStates(MainData torrentList, string hash)
|
private static void AddTorrentToStates(MainData torrentList, string hash, int version)
|
||||||
{
|
{
|
||||||
var torrent = torrentList.Torrents[hash];
|
var torrent = torrentList.Torrents[hash];
|
||||||
|
|
||||||
@@ -271,7 +297,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
value.AddIfTrue(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories));
|
value.AddIfTrue(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var status in _statuses)
|
foreach (var status in GetStatuses(version))
|
||||||
{
|
{
|
||||||
torrentList.StatusState[status.ToString()].AddIfTrue(hash, FilterHelper.FilterStatus(torrent, status));
|
torrentList.StatusState[status.ToString()].AddIfTrue(hash, FilterHelper.FilterStatus(torrent, status));
|
||||||
}
|
}
|
||||||
@@ -289,6 +315,25 @@ namespace Lantean.QBTMud.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Status[] GetStatuses(int version)
|
||||||
|
{
|
||||||
|
if (_statusArray is not null)
|
||||||
|
{
|
||||||
|
return _statusArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version == 5)
|
||||||
|
{
|
||||||
|
_statusArray = Enum.GetValues<Status>().Where(s => s != Status.Paused).ToArray();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_statusArray = Enum.GetValues<Status>().Where(s => s != Status.Stopped).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _statusArray;
|
||||||
|
}
|
||||||
|
|
||||||
private static void UpdateTorrentStates(MainData torrentList, string hash)
|
private static void UpdateTorrentStates(MainData torrentList, string hash)
|
||||||
{
|
{
|
||||||
var torrent = torrentList.Torrents[hash];
|
var torrent = torrentList.Torrents[hash];
|
||||||
@@ -317,7 +362,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
value.AddIfTrueOrRemove(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories));
|
value.AddIfTrueOrRemove(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var status in _statuses)
|
foreach (var status in GetStatuses(torrentList.MajorVersion))
|
||||||
{
|
{
|
||||||
torrentList.StatusState[status.ToString()].AddIfTrueOrRemove(hash, FilterHelper.FilterStatus(torrent, status));
|
torrentList.StatusState[status.ToString()].AddIfTrueOrRemove(hash, FilterHelper.FilterStatus(torrent, status));
|
||||||
}
|
}
|
||||||
@@ -361,7 +406,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
categoryState.RemoveIfTrue(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories));
|
categoryState.RemoveIfTrue(hash, FilterHelper.FilterCategory(torrent, category, torrentList.ServerState.UseSubcategories));
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var status in _statuses)
|
foreach (var status in GetStatuses(torrentList.MajorVersion))
|
||||||
{
|
{
|
||||||
if (!torrentList.StatusState.TryGetValue(status.ToString(), out var statusState))
|
if (!torrentList.StatusState.TryGetValue(status.ToString(), out var statusState))
|
||||||
{
|
{
|
||||||
@@ -487,6 +532,12 @@ namespace Lantean.QBTMud.Services
|
|||||||
|
|
||||||
public Torrent CreateTorrent(string hash, QBitTorrentClient.Models.Torrent torrent)
|
public Torrent CreateTorrent(string hash, QBitTorrentClient.Models.Torrent torrent)
|
||||||
{
|
{
|
||||||
|
var normalizedTags = torrent.Tags?
|
||||||
|
.Select(NormalizeTag)
|
||||||
|
.Where(static tag => !string.IsNullOrEmpty(tag))
|
||||||
|
.ToList()
|
||||||
|
?? new List<string>();
|
||||||
|
|
||||||
return new Torrent(
|
return new Torrent(
|
||||||
hash,
|
hash,
|
||||||
torrent.AddedOn.GetValueOrDefault(),
|
torrent.AddedOn.GetValueOrDefault(),
|
||||||
@@ -527,7 +578,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
torrent.Size.GetValueOrDefault(),
|
torrent.Size.GetValueOrDefault(),
|
||||||
torrent.State!,
|
torrent.State!,
|
||||||
torrent.SuperSeeding.GetValueOrDefault(),
|
torrent.SuperSeeding.GetValueOrDefault(),
|
||||||
torrent.Tags!,
|
normalizedTags,
|
||||||
torrent.TimeActive.GetValueOrDefault(),
|
torrent.TimeActive.GetValueOrDefault(),
|
||||||
torrent.TotalSize.GetValueOrDefault(),
|
torrent.TotalSize.GetValueOrDefault(),
|
||||||
torrent.Tracker!,
|
torrent.Tracker!,
|
||||||
@@ -540,6 +591,19 @@ namespace Lantean.QBTMud.Services
|
|||||||
torrent.MaxInactiveSeedingTime.GetValueOrDefault());
|
torrent.MaxInactiveSeedingTime.GetValueOrDefault());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string NormalizeTag(string? tag)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(tag))
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
var separatorIndex = tag.IndexOf('\t');
|
||||||
|
var normalized = (separatorIndex >= 0) ? tag[..separatorIndex] : tag;
|
||||||
|
|
||||||
|
return normalized.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
private static void UpdateCategory(Category existingCategory, QBitTorrentClient.Models.Category category)
|
private static void UpdateCategory(Category existingCategory, QBitTorrentClient.Models.Category category)
|
||||||
{
|
{
|
||||||
existingCategory.SavePath = category.SavePath ?? existingCategory.SavePath;
|
existingCategory.SavePath = category.SavePath ?? existingCategory.SavePath;
|
||||||
@@ -588,7 +652,14 @@ namespace Lantean.QBTMud.Services
|
|||||||
if (torrent.Tags is not null)
|
if (torrent.Tags is not null)
|
||||||
{
|
{
|
||||||
existingTorrent.Tags.Clear();
|
existingTorrent.Tags.Clear();
|
||||||
existingTorrent.Tags.AddRange(torrent.Tags);
|
foreach (var tag in torrent.Tags)
|
||||||
|
{
|
||||||
|
var normalizedTag = NormalizeTag(tag);
|
||||||
|
if (!string.IsNullOrEmpty(normalizedTag))
|
||||||
|
{
|
||||||
|
existingTorrent.Tags.Add(normalizedTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
existingTorrent.TimeActive = torrent.TimeActive ?? existingTorrent.TimeActive;
|
existingTorrent.TimeActive = torrent.TimeActive ?? existingTorrent.TimeActive;
|
||||||
existingTorrent.TotalSize = torrent.TotalSize ?? existingTorrent.TotalSize;
|
existingTorrent.TotalSize = torrent.TotalSize ?? existingTorrent.TotalSize;
|
||||||
@@ -689,13 +760,18 @@ namespace Lantean.QBTMud.Services
|
|||||||
original = new QBitTorrentClient.Models.UpdatePreferences
|
original = new QBitTorrentClient.Models.UpdatePreferences
|
||||||
{
|
{
|
||||||
AddToTopOfQueue = changed.AddToTopOfQueue,
|
AddToTopOfQueue = changed.AddToTopOfQueue,
|
||||||
|
AddStoppedEnabled = changed.AddStoppedEnabled,
|
||||||
AddTrackers = changed.AddTrackers,
|
AddTrackers = changed.AddTrackers,
|
||||||
AddTrackersEnabled = changed.AddTrackersEnabled,
|
AddTrackersEnabled = changed.AddTrackersEnabled,
|
||||||
|
AddTrackersFromUrlEnabled = changed.AddTrackersFromUrlEnabled,
|
||||||
|
AddTrackersUrl = changed.AddTrackersUrl,
|
||||||
|
AddTrackersUrlList = changed.AddTrackersUrlList,
|
||||||
AltDlLimit = changed.AltDlLimit,
|
AltDlLimit = changed.AltDlLimit,
|
||||||
AltUpLimit = changed.AltUpLimit,
|
AltUpLimit = changed.AltUpLimit,
|
||||||
AlternativeWebuiEnabled = changed.AlternativeWebuiEnabled,
|
AlternativeWebuiEnabled = changed.AlternativeWebuiEnabled,
|
||||||
AlternativeWebuiPath = changed.AlternativeWebuiPath,
|
AlternativeWebuiPath = changed.AlternativeWebuiPath,
|
||||||
AnnounceIp = changed.AnnounceIp,
|
AnnounceIp = changed.AnnounceIp,
|
||||||
|
AnnouncePort = changed.AnnouncePort,
|
||||||
AnnounceToAllTiers = changed.AnnounceToAllTiers,
|
AnnounceToAllTiers = changed.AnnounceToAllTiers,
|
||||||
AnnounceToAllTrackers = changed.AnnounceToAllTrackers,
|
AnnounceToAllTrackers = changed.AnnounceToAllTrackers,
|
||||||
AnonymousMode = changed.AnonymousMode,
|
AnonymousMode = changed.AnonymousMode,
|
||||||
@@ -715,11 +791,14 @@ namespace Lantean.QBTMud.Services
|
|||||||
BypassAuthSubnetWhitelistEnabled = changed.BypassAuthSubnetWhitelistEnabled,
|
BypassAuthSubnetWhitelistEnabled = changed.BypassAuthSubnetWhitelistEnabled,
|
||||||
BypassLocalAuth = changed.BypassLocalAuth,
|
BypassLocalAuth = changed.BypassLocalAuth,
|
||||||
CategoryChangedTmmEnabled = changed.CategoryChangedTmmEnabled,
|
CategoryChangedTmmEnabled = changed.CategoryChangedTmmEnabled,
|
||||||
|
ConfirmTorrentDeletion = changed.ConfirmTorrentDeletion,
|
||||||
|
ConfirmTorrentRecheck = changed.ConfirmTorrentRecheck,
|
||||||
CheckingMemoryUse = changed.CheckingMemoryUse,
|
CheckingMemoryUse = changed.CheckingMemoryUse,
|
||||||
ConnectionSpeed = changed.ConnectionSpeed,
|
ConnectionSpeed = changed.ConnectionSpeed,
|
||||||
CurrentInterfaceAddress = changed.CurrentInterfaceAddress,
|
CurrentInterfaceAddress = changed.CurrentInterfaceAddress,
|
||||||
CurrentInterfaceName = changed.CurrentInterfaceName,
|
CurrentInterfaceName = changed.CurrentInterfaceName,
|
||||||
CurrentNetworkInterface = changed.CurrentNetworkInterface,
|
CurrentNetworkInterface = changed.CurrentNetworkInterface,
|
||||||
|
DeleteTorrentContentFiles = changed.DeleteTorrentContentFiles,
|
||||||
Dht = changed.Dht,
|
Dht = changed.Dht,
|
||||||
DiskCache = changed.DiskCache,
|
DiskCache = changed.DiskCache,
|
||||||
DiskCacheTtl = changed.DiskCacheTtl,
|
DiskCacheTtl = changed.DiskCacheTtl,
|
||||||
@@ -755,6 +834,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
FileLogPath = changed.FileLogPath,
|
FileLogPath = changed.FileLogPath,
|
||||||
FilePoolSize = changed.FilePoolSize,
|
FilePoolSize = changed.FilePoolSize,
|
||||||
HashingThreads = changed.HashingThreads,
|
HashingThreads = changed.HashingThreads,
|
||||||
|
HostnameCacheTtl = changed.HostnameCacheTtl,
|
||||||
I2pAddress = changed.I2pAddress,
|
I2pAddress = changed.I2pAddress,
|
||||||
I2pEnabled = changed.I2pEnabled,
|
I2pEnabled = changed.I2pEnabled,
|
||||||
I2pInboundLength = changed.I2pInboundLength,
|
I2pInboundLength = changed.I2pInboundLength,
|
||||||
@@ -764,6 +844,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
I2pOutboundQuantity = changed.I2pOutboundQuantity,
|
I2pOutboundQuantity = changed.I2pOutboundQuantity,
|
||||||
I2pPort = changed.I2pPort,
|
I2pPort = changed.I2pPort,
|
||||||
IdnSupportEnabled = changed.IdnSupportEnabled,
|
IdnSupportEnabled = changed.IdnSupportEnabled,
|
||||||
|
IgnoreSslErrors = changed.IgnoreSslErrors,
|
||||||
IncompleteFilesExt = changed.IncompleteFilesExt,
|
IncompleteFilesExt = changed.IncompleteFilesExt,
|
||||||
IpFilterEnabled = changed.IpFilterEnabled,
|
IpFilterEnabled = changed.IpFilterEnabled,
|
||||||
IpFilterPath = changed.IpFilterPath,
|
IpFilterPath = changed.IpFilterPath,
|
||||||
@@ -837,6 +918,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
SavePath = changed.SavePath,
|
SavePath = changed.SavePath,
|
||||||
SavePathChangedTmmEnabled = changed.SavePathChangedTmmEnabled,
|
SavePathChangedTmmEnabled = changed.SavePathChangedTmmEnabled,
|
||||||
SaveResumeDataInterval = changed.SaveResumeDataInterval,
|
SaveResumeDataInterval = changed.SaveResumeDataInterval,
|
||||||
|
SaveStatisticsInterval = changed.SaveStatisticsInterval,
|
||||||
ScanDirs = changed.ScanDirs,
|
ScanDirs = changed.ScanDirs,
|
||||||
ScheduleFromHour = changed.ScheduleFromHour,
|
ScheduleFromHour = changed.ScheduleFromHour,
|
||||||
ScheduleFromMin = changed.ScheduleFromMin,
|
ScheduleFromMin = changed.ScheduleFromMin,
|
||||||
@@ -853,13 +935,17 @@ namespace Lantean.QBTMud.Services
|
|||||||
SocketBacklogSize = changed.SocketBacklogSize,
|
SocketBacklogSize = changed.SocketBacklogSize,
|
||||||
SocketReceiveBufferSize = changed.SocketReceiveBufferSize,
|
SocketReceiveBufferSize = changed.SocketReceiveBufferSize,
|
||||||
SocketSendBufferSize = changed.SocketSendBufferSize,
|
SocketSendBufferSize = changed.SocketSendBufferSize,
|
||||||
|
SslEnabled = changed.SslEnabled,
|
||||||
|
SslListenPort = changed.SslListenPort,
|
||||||
SsrfMitigation = changed.SsrfMitigation,
|
SsrfMitigation = changed.SsrfMitigation,
|
||||||
StartPausedEnabled = changed.StartPausedEnabled,
|
StartPausedEnabled = changed.StartPausedEnabled,
|
||||||
|
StatusBarExternalIp = changed.StatusBarExternalIp,
|
||||||
StopTrackerTimeout = changed.StopTrackerTimeout,
|
StopTrackerTimeout = changed.StopTrackerTimeout,
|
||||||
TempPath = changed.TempPath,
|
TempPath = changed.TempPath,
|
||||||
TempPathEnabled = changed.TempPathEnabled,
|
TempPathEnabled = changed.TempPathEnabled,
|
||||||
TorrentChangedTmmEnabled = changed.TorrentChangedTmmEnabled,
|
TorrentChangedTmmEnabled = changed.TorrentChangedTmmEnabled,
|
||||||
TorrentContentLayout = changed.TorrentContentLayout,
|
TorrentContentLayout = changed.TorrentContentLayout,
|
||||||
|
TorrentContentRemoveOption = changed.TorrentContentRemoveOption,
|
||||||
TorrentFileSizeLimit = changed.TorrentFileSizeLimit,
|
TorrentFileSizeLimit = changed.TorrentFileSizeLimit,
|
||||||
TorrentStopCondition = changed.TorrentStopCondition,
|
TorrentStopCondition = changed.TorrentStopCondition,
|
||||||
UpLimit = changed.UpLimit,
|
UpLimit = changed.UpLimit,
|
||||||
@@ -870,9 +956,11 @@ namespace Lantean.QBTMud.Services
|
|||||||
UseCategoryPathsInManualMode = changed.UseCategoryPathsInManualMode,
|
UseCategoryPathsInManualMode = changed.UseCategoryPathsInManualMode,
|
||||||
UseHttps = changed.UseHttps,
|
UseHttps = changed.UseHttps,
|
||||||
UseSubcategories = changed.UseSubcategories,
|
UseSubcategories = changed.UseSubcategories,
|
||||||
|
UseUnwantedFolder = changed.UseUnwantedFolder,
|
||||||
UtpTcpMixedMode = changed.UtpTcpMixedMode,
|
UtpTcpMixedMode = changed.UtpTcpMixedMode,
|
||||||
ValidateHttpsTrackerCertificate = changed.ValidateHttpsTrackerCertificate,
|
ValidateHttpsTrackerCertificate = changed.ValidateHttpsTrackerCertificate,
|
||||||
WebUiAddress = changed.WebUiAddress,
|
WebUiAddress = changed.WebUiAddress,
|
||||||
|
WebUiApiKey = changed.WebUiApiKey,
|
||||||
WebUiBanDuration = changed.WebUiBanDuration,
|
WebUiBanDuration = changed.WebUiBanDuration,
|
||||||
WebUiClickjackingProtectionEnabled = changed.WebUiClickjackingProtectionEnabled,
|
WebUiClickjackingProtectionEnabled = changed.WebUiClickjackingProtectionEnabled,
|
||||||
WebUiCsrfProtectionEnabled = changed.WebUiCsrfProtectionEnabled,
|
WebUiCsrfProtectionEnabled = changed.WebUiCsrfProtectionEnabled,
|
||||||
@@ -895,13 +983,18 @@ namespace Lantean.QBTMud.Services
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
original.AddToTopOfQueue = changed.AddToTopOfQueue ?? original.AddToTopOfQueue;
|
original.AddToTopOfQueue = changed.AddToTopOfQueue ?? original.AddToTopOfQueue;
|
||||||
|
original.AddStoppedEnabled = changed.AddStoppedEnabled ?? original.AddStoppedEnabled;
|
||||||
original.AddTrackers = changed.AddTrackers ?? original.AddTrackers;
|
original.AddTrackers = changed.AddTrackers ?? original.AddTrackers;
|
||||||
original.AddTrackersEnabled = changed.AddTrackersEnabled ?? original.AddTrackersEnabled;
|
original.AddTrackersEnabled = changed.AddTrackersEnabled ?? original.AddTrackersEnabled;
|
||||||
|
original.AddTrackersFromUrlEnabled = changed.AddTrackersFromUrlEnabled ?? original.AddTrackersFromUrlEnabled;
|
||||||
|
original.AddTrackersUrl = changed.AddTrackersUrl ?? original.AddTrackersUrl;
|
||||||
|
original.AddTrackersUrlList = changed.AddTrackersUrlList ?? original.AddTrackersUrlList;
|
||||||
original.AltDlLimit = changed.AltDlLimit ?? original.AltDlLimit;
|
original.AltDlLimit = changed.AltDlLimit ?? original.AltDlLimit;
|
||||||
original.AltUpLimit = changed.AltUpLimit ?? original.AltUpLimit;
|
original.AltUpLimit = changed.AltUpLimit ?? original.AltUpLimit;
|
||||||
original.AlternativeWebuiEnabled = changed.AlternativeWebuiEnabled ?? original.AlternativeWebuiEnabled;
|
original.AlternativeWebuiEnabled = changed.AlternativeWebuiEnabled ?? original.AlternativeWebuiEnabled;
|
||||||
original.AlternativeWebuiPath = changed.AlternativeWebuiPath ?? original.AlternativeWebuiPath;
|
original.AlternativeWebuiPath = changed.AlternativeWebuiPath ?? original.AlternativeWebuiPath;
|
||||||
original.AnnounceIp = changed.AnnounceIp ?? original.AnnounceIp;
|
original.AnnounceIp = changed.AnnounceIp ?? original.AnnounceIp;
|
||||||
|
original.AnnouncePort = changed.AnnouncePort ?? original.AnnouncePort;
|
||||||
original.AnnounceToAllTiers = changed.AnnounceToAllTiers ?? original.AnnounceToAllTiers;
|
original.AnnounceToAllTiers = changed.AnnounceToAllTiers ?? original.AnnounceToAllTiers;
|
||||||
original.AnnounceToAllTrackers = changed.AnnounceToAllTrackers ?? original.AnnounceToAllTrackers;
|
original.AnnounceToAllTrackers = changed.AnnounceToAllTrackers ?? original.AnnounceToAllTrackers;
|
||||||
original.AnonymousMode = changed.AnonymousMode ?? original.AnonymousMode;
|
original.AnonymousMode = changed.AnonymousMode ?? original.AnonymousMode;
|
||||||
@@ -921,11 +1014,14 @@ namespace Lantean.QBTMud.Services
|
|||||||
original.BypassAuthSubnetWhitelistEnabled = changed.BypassAuthSubnetWhitelistEnabled ?? original.BypassAuthSubnetWhitelistEnabled;
|
original.BypassAuthSubnetWhitelistEnabled = changed.BypassAuthSubnetWhitelistEnabled ?? original.BypassAuthSubnetWhitelistEnabled;
|
||||||
original.BypassLocalAuth = changed.BypassLocalAuth ?? original.BypassLocalAuth;
|
original.BypassLocalAuth = changed.BypassLocalAuth ?? original.BypassLocalAuth;
|
||||||
original.CategoryChangedTmmEnabled = changed.CategoryChangedTmmEnabled ?? original.CategoryChangedTmmEnabled;
|
original.CategoryChangedTmmEnabled = changed.CategoryChangedTmmEnabled ?? original.CategoryChangedTmmEnabled;
|
||||||
|
original.ConfirmTorrentDeletion = changed.ConfirmTorrentDeletion ?? original.ConfirmTorrentDeletion;
|
||||||
|
original.ConfirmTorrentRecheck = changed.ConfirmTorrentRecheck ?? original.ConfirmTorrentRecheck;
|
||||||
original.CheckingMemoryUse = changed.CheckingMemoryUse ?? original.CheckingMemoryUse;
|
original.CheckingMemoryUse = changed.CheckingMemoryUse ?? original.CheckingMemoryUse;
|
||||||
original.ConnectionSpeed = changed.ConnectionSpeed ?? original.ConnectionSpeed;
|
original.ConnectionSpeed = changed.ConnectionSpeed ?? original.ConnectionSpeed;
|
||||||
original.CurrentInterfaceAddress = changed.CurrentInterfaceAddress ?? original.CurrentInterfaceAddress;
|
original.CurrentInterfaceAddress = changed.CurrentInterfaceAddress ?? original.CurrentInterfaceAddress;
|
||||||
original.CurrentInterfaceName = changed.CurrentInterfaceName ?? original.CurrentInterfaceName;
|
original.CurrentInterfaceName = changed.CurrentInterfaceName ?? original.CurrentInterfaceName;
|
||||||
original.CurrentNetworkInterface = changed.CurrentNetworkInterface ?? original.CurrentNetworkInterface;
|
original.CurrentNetworkInterface = changed.CurrentNetworkInterface ?? original.CurrentNetworkInterface;
|
||||||
|
original.DeleteTorrentContentFiles = changed.DeleteTorrentContentFiles ?? original.DeleteTorrentContentFiles;
|
||||||
original.Dht = changed.Dht ?? original.Dht;
|
original.Dht = changed.Dht ?? original.Dht;
|
||||||
original.DiskCache = changed.DiskCache ?? original.DiskCache;
|
original.DiskCache = changed.DiskCache ?? original.DiskCache;
|
||||||
original.DiskCacheTtl = changed.DiskCacheTtl ?? original.DiskCacheTtl;
|
original.DiskCacheTtl = changed.DiskCacheTtl ?? original.DiskCacheTtl;
|
||||||
@@ -961,6 +1057,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
original.FileLogPath = changed.FileLogPath ?? original.FileLogPath;
|
original.FileLogPath = changed.FileLogPath ?? original.FileLogPath;
|
||||||
original.FilePoolSize = changed.FilePoolSize ?? original.FilePoolSize;
|
original.FilePoolSize = changed.FilePoolSize ?? original.FilePoolSize;
|
||||||
original.HashingThreads = changed.HashingThreads ?? original.HashingThreads;
|
original.HashingThreads = changed.HashingThreads ?? original.HashingThreads;
|
||||||
|
original.HostnameCacheTtl = changed.HostnameCacheTtl ?? original.HostnameCacheTtl;
|
||||||
original.I2pAddress = changed.I2pAddress ?? original.I2pAddress;
|
original.I2pAddress = changed.I2pAddress ?? original.I2pAddress;
|
||||||
original.I2pEnabled = changed.I2pEnabled ?? original.I2pEnabled;
|
original.I2pEnabled = changed.I2pEnabled ?? original.I2pEnabled;
|
||||||
original.I2pInboundLength = changed.I2pInboundLength ?? original.I2pInboundLength;
|
original.I2pInboundLength = changed.I2pInboundLength ?? original.I2pInboundLength;
|
||||||
@@ -970,6 +1067,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
original.I2pOutboundQuantity = changed.I2pOutboundQuantity ?? original.I2pOutboundQuantity;
|
original.I2pOutboundQuantity = changed.I2pOutboundQuantity ?? original.I2pOutboundQuantity;
|
||||||
original.I2pPort = changed.I2pPort ?? original.I2pPort;
|
original.I2pPort = changed.I2pPort ?? original.I2pPort;
|
||||||
original.IdnSupportEnabled = changed.IdnSupportEnabled ?? original.IdnSupportEnabled;
|
original.IdnSupportEnabled = changed.IdnSupportEnabled ?? original.IdnSupportEnabled;
|
||||||
|
original.IgnoreSslErrors = changed.IgnoreSslErrors ?? original.IgnoreSslErrors;
|
||||||
original.IncompleteFilesExt = changed.IncompleteFilesExt ?? original.IncompleteFilesExt;
|
original.IncompleteFilesExt = changed.IncompleteFilesExt ?? original.IncompleteFilesExt;
|
||||||
original.IpFilterEnabled = changed.IpFilterEnabled ?? original.IpFilterEnabled;
|
original.IpFilterEnabled = changed.IpFilterEnabled ?? original.IpFilterEnabled;
|
||||||
original.IpFilterPath = changed.IpFilterPath ?? original.IpFilterPath;
|
original.IpFilterPath = changed.IpFilterPath ?? original.IpFilterPath;
|
||||||
@@ -1043,6 +1141,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
original.SavePath = changed.SavePath ?? original.SavePath;
|
original.SavePath = changed.SavePath ?? original.SavePath;
|
||||||
original.SavePathChangedTmmEnabled = changed.SavePathChangedTmmEnabled ?? original.SavePathChangedTmmEnabled;
|
original.SavePathChangedTmmEnabled = changed.SavePathChangedTmmEnabled ?? original.SavePathChangedTmmEnabled;
|
||||||
original.SaveResumeDataInterval = changed.SaveResumeDataInterval ?? original.SaveResumeDataInterval;
|
original.SaveResumeDataInterval = changed.SaveResumeDataInterval ?? original.SaveResumeDataInterval;
|
||||||
|
original.SaveStatisticsInterval = changed.SaveStatisticsInterval ?? original.SaveStatisticsInterval;
|
||||||
original.ScanDirs = changed.ScanDirs ?? original.ScanDirs;
|
original.ScanDirs = changed.ScanDirs ?? original.ScanDirs;
|
||||||
original.ScheduleFromHour = changed.ScheduleFromHour ?? original.ScheduleFromHour;
|
original.ScheduleFromHour = changed.ScheduleFromHour ?? original.ScheduleFromHour;
|
||||||
original.ScheduleFromMin = changed.ScheduleFromMin ?? original.ScheduleFromMin;
|
original.ScheduleFromMin = changed.ScheduleFromMin ?? original.ScheduleFromMin;
|
||||||
@@ -1059,13 +1158,17 @@ namespace Lantean.QBTMud.Services
|
|||||||
original.SocketBacklogSize = changed.SocketBacklogSize ?? original.SocketBacklogSize;
|
original.SocketBacklogSize = changed.SocketBacklogSize ?? original.SocketBacklogSize;
|
||||||
original.SocketReceiveBufferSize = changed.SocketReceiveBufferSize ?? original.SocketReceiveBufferSize;
|
original.SocketReceiveBufferSize = changed.SocketReceiveBufferSize ?? original.SocketReceiveBufferSize;
|
||||||
original.SocketSendBufferSize = changed.SocketSendBufferSize ?? original.SocketSendBufferSize;
|
original.SocketSendBufferSize = changed.SocketSendBufferSize ?? original.SocketSendBufferSize;
|
||||||
|
original.SslEnabled = changed.SslEnabled ?? original.SslEnabled;
|
||||||
|
original.SslListenPort = changed.SslListenPort ?? original.SslListenPort;
|
||||||
original.SsrfMitigation = changed.SsrfMitigation ?? original.SsrfMitigation;
|
original.SsrfMitigation = changed.SsrfMitigation ?? original.SsrfMitigation;
|
||||||
original.StartPausedEnabled = changed.StartPausedEnabled ?? original.StartPausedEnabled;
|
original.StartPausedEnabled = changed.StartPausedEnabled ?? original.StartPausedEnabled;
|
||||||
|
original.StatusBarExternalIp = changed.StatusBarExternalIp ?? original.StatusBarExternalIp;
|
||||||
original.StopTrackerTimeout = changed.StopTrackerTimeout ?? original.StopTrackerTimeout;
|
original.StopTrackerTimeout = changed.StopTrackerTimeout ?? original.StopTrackerTimeout;
|
||||||
original.TempPath = changed.TempPath ?? original.TempPath;
|
original.TempPath = changed.TempPath ?? original.TempPath;
|
||||||
original.TempPathEnabled = changed.TempPathEnabled ?? original.TempPathEnabled;
|
original.TempPathEnabled = changed.TempPathEnabled ?? original.TempPathEnabled;
|
||||||
original.TorrentChangedTmmEnabled = changed.TorrentChangedTmmEnabled ?? original.TorrentChangedTmmEnabled;
|
original.TorrentChangedTmmEnabled = changed.TorrentChangedTmmEnabled ?? original.TorrentChangedTmmEnabled;
|
||||||
original.TorrentContentLayout = changed.TorrentContentLayout ?? original.TorrentContentLayout;
|
original.TorrentContentLayout = changed.TorrentContentLayout ?? original.TorrentContentLayout;
|
||||||
|
original.TorrentContentRemoveOption = changed.TorrentContentRemoveOption ?? original.TorrentContentRemoveOption;
|
||||||
original.TorrentFileSizeLimit = changed.TorrentFileSizeLimit ?? original.TorrentFileSizeLimit;
|
original.TorrentFileSizeLimit = changed.TorrentFileSizeLimit ?? original.TorrentFileSizeLimit;
|
||||||
original.TorrentStopCondition = changed.TorrentStopCondition ?? original.TorrentStopCondition;
|
original.TorrentStopCondition = changed.TorrentStopCondition ?? original.TorrentStopCondition;
|
||||||
original.UpLimit = changed.UpLimit ?? original.UpLimit;
|
original.UpLimit = changed.UpLimit ?? original.UpLimit;
|
||||||
@@ -1076,9 +1179,11 @@ namespace Lantean.QBTMud.Services
|
|||||||
original.UseCategoryPathsInManualMode = changed.UseCategoryPathsInManualMode ?? original.UseCategoryPathsInManualMode;
|
original.UseCategoryPathsInManualMode = changed.UseCategoryPathsInManualMode ?? original.UseCategoryPathsInManualMode;
|
||||||
original.UseHttps = changed.UseHttps ?? original.UseHttps;
|
original.UseHttps = changed.UseHttps ?? original.UseHttps;
|
||||||
original.UseSubcategories = changed.UseSubcategories ?? original.UseSubcategories;
|
original.UseSubcategories = changed.UseSubcategories ?? original.UseSubcategories;
|
||||||
|
original.UseUnwantedFolder = changed.UseUnwantedFolder ?? original.UseUnwantedFolder;
|
||||||
original.UtpTcpMixedMode = changed.UtpTcpMixedMode ?? original.UtpTcpMixedMode;
|
original.UtpTcpMixedMode = changed.UtpTcpMixedMode ?? original.UtpTcpMixedMode;
|
||||||
original.ValidateHttpsTrackerCertificate = changed.ValidateHttpsTrackerCertificate ?? original.ValidateHttpsTrackerCertificate;
|
original.ValidateHttpsTrackerCertificate = changed.ValidateHttpsTrackerCertificate ?? original.ValidateHttpsTrackerCertificate;
|
||||||
original.WebUiAddress = changed.WebUiAddress ?? original.WebUiAddress;
|
original.WebUiAddress = changed.WebUiAddress ?? original.WebUiAddress;
|
||||||
|
original.WebUiApiKey = changed.WebUiApiKey ?? original.WebUiApiKey;
|
||||||
original.WebUiBanDuration = changed.WebUiBanDuration ?? original.WebUiBanDuration;
|
original.WebUiBanDuration = changed.WebUiBanDuration ?? original.WebUiBanDuration;
|
||||||
original.WebUiClickjackingProtectionEnabled = changed.WebUiClickjackingProtectionEnabled ?? original.WebUiClickjackingProtectionEnabled;
|
original.WebUiClickjackingProtectionEnabled = changed.WebUiClickjackingProtectionEnabled ?? original.WebUiClickjackingProtectionEnabled;
|
||||||
original.WebUiCsrfProtectionEnabled = changed.WebUiCsrfProtectionEnabled ?? original.WebUiCsrfProtectionEnabled;
|
original.WebUiCsrfProtectionEnabled = changed.WebUiCsrfProtectionEnabled ?? original.WebUiCsrfProtectionEnabled;
|
||||||
@@ -1154,4 +1259,4 @@ namespace Lantean.QBTMud.Services
|
|||||||
return new RssList(feeds, articles);
|
return new RssList(feeds, articles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,7 +4,7 @@ namespace Lantean.QBTMud.Services
|
|||||||
{
|
{
|
||||||
public interface IDataManager
|
public interface IDataManager
|
||||||
{
|
{
|
||||||
MainData CreateMainData(QBitTorrentClient.Models.MainData mainData);
|
MainData CreateMainData(QBitTorrentClient.Models.MainData mainData, string version);
|
||||||
|
|
||||||
Torrent CreateTorrent(string hash, QBitTorrentClient.Models.Torrent torrent);
|
Torrent CreateTorrent(string hash, QBitTorrentClient.Models.Torrent torrent);
|
||||||
|
|
||||||
|
@@ -9,12 +9,12 @@
|
|||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&display=swap" rel="stylesheet">
|
<link href="https://fonts.googleapis.com/css2?family=Nunito+Sans:ital,opsz,wght@0,6..12,200..1000;1,6..12,200..1000&display=swap" rel="stylesheet">
|
||||||
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
|
<link href="./_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
|
||||||
<link rel="stylesheet" href="css/app.css" />
|
<link rel="stylesheet" href="./css/app.css" />
|
||||||
<link rel="icon" type="image/png" href="images/qbittorrent32.png" />
|
<link rel="icon" type="image/png" href="images/qbittorrent32.png" />
|
||||||
<link rel="icon" href="images/qbittorrent-tray.svg">
|
<link rel="icon" href="./images/qbittorrent-tray.svg">
|
||||||
<link rel="mask-icon" href="images/qbittorrent-tray.svg" color="#000000">
|
<link rel="mask-icon" href="./images/qbittorrent-tray.svg" color="#000000">
|
||||||
<link rel="apple-touch-icon" href="images/qbittorrent32.png">
|
<link rel="apple-touch-icon" href="./images/qbittorrent32.png">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@@ -31,10 +31,10 @@
|
|||||||
<a href="" class="reload">Reload</a>
|
<a href="" class="reload">Reload</a>
|
||||||
<a class="dismiss">🗙</a>
|
<a class="dismiss">🗙</a>
|
||||||
</div>
|
</div>
|
||||||
<script src="_framework/blazor.webassembly.js"></script>
|
<script src="./_framework/blazor.webassembly.js"></script>
|
||||||
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
|
<script src="./_content/MudBlazor/MudBlazor.min.js"></script>
|
||||||
<script src="js/piecesbar.js"></script>
|
<script src="./js/piecesbar.js"></script>
|
||||||
<script src="js/interop.js"></script>
|
<script src="./js/interop.js"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<TargetFramework>net9.0</TargetFramework>
|
<TargetFramework>net9.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@@ -112,7 +112,7 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
int maxConnecPerTorrent,
|
int maxConnecPerTorrent,
|
||||||
int maxInactiveSeedingTime,
|
int maxInactiveSeedingTime,
|
||||||
bool maxInactiveSeedingTimeEnabled,
|
bool maxInactiveSeedingTimeEnabled,
|
||||||
int maxRatio,
|
float maxRatio,
|
||||||
int maxRatioAct,
|
int maxRatioAct,
|
||||||
bool maxRatioEnabled,
|
bool maxRatioEnabled,
|
||||||
int maxSeedingTime,
|
int maxSeedingTime,
|
||||||
@@ -429,12 +429,24 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("add_to_top_of_queue")]
|
[JsonPropertyName("add_to_top_of_queue")]
|
||||||
public bool AddToTopOfQueue { get; }
|
public bool AddToTopOfQueue { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_stopped_enabled")]
|
||||||
|
public bool AddStoppedEnabled { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("add_trackers")]
|
[JsonPropertyName("add_trackers")]
|
||||||
public string AddTrackers { get; }
|
public string AddTrackers { get; }
|
||||||
|
|
||||||
[JsonPropertyName("add_trackers_enabled")]
|
[JsonPropertyName("add_trackers_enabled")]
|
||||||
public bool AddTrackersEnabled { get; }
|
public bool AddTrackersEnabled { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_trackers_from_url_enabled")]
|
||||||
|
public bool AddTrackersFromUrlEnabled { get; init; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_trackers_url")]
|
||||||
|
public string? AddTrackersUrl { get; init; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_trackers_url_list")]
|
||||||
|
public string? AddTrackersUrlList { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("alt_dl_limit")]
|
[JsonPropertyName("alt_dl_limit")]
|
||||||
public int AltDlLimit { get; }
|
public int AltDlLimit { get; }
|
||||||
|
|
||||||
@@ -450,6 +462,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("announce_ip")]
|
[JsonPropertyName("announce_ip")]
|
||||||
public string AnnounceIp { get; }
|
public string AnnounceIp { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("announce_port")]
|
||||||
|
public int AnnouncePort { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("announce_to_all_tiers")]
|
[JsonPropertyName("announce_to_all_tiers")]
|
||||||
public bool AnnounceToAllTiers { get; }
|
public bool AnnounceToAllTiers { get; }
|
||||||
|
|
||||||
@@ -510,6 +525,12 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("category_changed_tmm_enabled")]
|
[JsonPropertyName("category_changed_tmm_enabled")]
|
||||||
public bool CategoryChangedTmmEnabled { get; }
|
public bool CategoryChangedTmmEnabled { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("confirm_torrent_deletion")]
|
||||||
|
public bool ConfirmTorrentDeletion { get; init; }
|
||||||
|
|
||||||
|
[JsonPropertyName("confirm_torrent_recheck")]
|
||||||
|
public bool ConfirmTorrentRecheck { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("checking_memory_use")]
|
[JsonPropertyName("checking_memory_use")]
|
||||||
public int CheckingMemoryUse { get; }
|
public int CheckingMemoryUse { get; }
|
||||||
|
|
||||||
@@ -525,6 +546,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("current_network_interface")]
|
[JsonPropertyName("current_network_interface")]
|
||||||
public string CurrentNetworkInterface { get; }
|
public string CurrentNetworkInterface { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("delete_torrent_content_files")]
|
||||||
|
public bool DeleteTorrentContentFiles { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("dht")]
|
[JsonPropertyName("dht")]
|
||||||
public bool Dht { get; }
|
public bool Dht { get; }
|
||||||
|
|
||||||
@@ -633,6 +657,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("hashing_threads")]
|
[JsonPropertyName("hashing_threads")]
|
||||||
public int HashingThreads { get; }
|
public int HashingThreads { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("hostname_cache_ttl")]
|
||||||
|
public int HostnameCacheTtl { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("i2p_address")]
|
[JsonPropertyName("i2p_address")]
|
||||||
public string I2pAddress { get; }
|
public string I2pAddress { get; }
|
||||||
|
|
||||||
@@ -660,6 +687,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("idn_support_enabled")]
|
[JsonPropertyName("idn_support_enabled")]
|
||||||
public bool IdnSupportEnabled { get; }
|
public bool IdnSupportEnabled { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("ignore_ssl_errors")]
|
||||||
|
public bool IgnoreSslErrors { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("incomplete_files_ext")]
|
[JsonPropertyName("incomplete_files_ext")]
|
||||||
public bool IncompleteFilesExt { get; }
|
public bool IncompleteFilesExt { get; }
|
||||||
|
|
||||||
@@ -745,7 +775,7 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
public bool MaxInactiveSeedingTimeEnabled { get; }
|
public bool MaxInactiveSeedingTimeEnabled { get; }
|
||||||
|
|
||||||
[JsonPropertyName("max_ratio")]
|
[JsonPropertyName("max_ratio")]
|
||||||
public int MaxRatio { get; }
|
public float MaxRatio { get; }
|
||||||
|
|
||||||
[JsonPropertyName("max_ratio_act")]
|
[JsonPropertyName("max_ratio_act")]
|
||||||
public int MaxRatioAct { get; }
|
public int MaxRatioAct { get; }
|
||||||
@@ -888,6 +918,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("save_resume_data_interval")]
|
[JsonPropertyName("save_resume_data_interval")]
|
||||||
public int SaveResumeDataInterval { get; }
|
public int SaveResumeDataInterval { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("save_statistics_interval")]
|
||||||
|
public int SaveStatisticsInterval { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("scan_dirs")]
|
[JsonPropertyName("scan_dirs")]
|
||||||
public Dictionary<string, SaveLocation> ScanDirs { get; }
|
public Dictionary<string, SaveLocation> ScanDirs { get; }
|
||||||
|
|
||||||
@@ -936,12 +969,21 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("socket_send_buffer_size")]
|
[JsonPropertyName("socket_send_buffer_size")]
|
||||||
public int SocketSendBufferSize { get; }
|
public int SocketSendBufferSize { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("ssl_enabled")]
|
||||||
|
public bool SslEnabled { get; init; }
|
||||||
|
|
||||||
|
[JsonPropertyName("ssl_listen_port")]
|
||||||
|
public int SslListenPort { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("ssrf_mitigation")]
|
[JsonPropertyName("ssrf_mitigation")]
|
||||||
public bool SsrfMitigation { get; }
|
public bool SsrfMitigation { get; }
|
||||||
|
|
||||||
[JsonPropertyName("start_paused_enabled")]
|
[JsonPropertyName("start_paused_enabled")]
|
||||||
public bool StartPausedEnabled { get; }
|
public bool StartPausedEnabled { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("status_bar_external_ip")]
|
||||||
|
public bool StatusBarExternalIp { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("stop_tracker_timeout")]
|
[JsonPropertyName("stop_tracker_timeout")]
|
||||||
public int StopTrackerTimeout { get; }
|
public int StopTrackerTimeout { get; }
|
||||||
|
|
||||||
@@ -957,6 +999,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("torrent_content_layout")]
|
[JsonPropertyName("torrent_content_layout")]
|
||||||
public string TorrentContentLayout { get; }
|
public string TorrentContentLayout { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("torrent_content_remove_option")]
|
||||||
|
public string? TorrentContentRemoveOption { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("torrent_file_size_limit")]
|
[JsonPropertyName("torrent_file_size_limit")]
|
||||||
public int TorrentFileSizeLimit { get; }
|
public int TorrentFileSizeLimit { get; }
|
||||||
|
|
||||||
@@ -987,6 +1032,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("use_subcategories")]
|
[JsonPropertyName("use_subcategories")]
|
||||||
public bool UseSubcategories { get; }
|
public bool UseSubcategories { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("use_unwanted_folder")]
|
||||||
|
public bool UseUnwantedFolder { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("utp_tcp_mixed_mode")]
|
[JsonPropertyName("utp_tcp_mixed_mode")]
|
||||||
public int UtpTcpMixedMode { get; }
|
public int UtpTcpMixedMode { get; }
|
||||||
|
|
||||||
@@ -996,6 +1044,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("web_ui_address")]
|
[JsonPropertyName("web_ui_address")]
|
||||||
public string WebUiAddress { get; }
|
public string WebUiAddress { get; }
|
||||||
|
|
||||||
|
[JsonPropertyName("web_ui_api_key")]
|
||||||
|
public string? WebUiApiKey { get; init; }
|
||||||
|
|
||||||
[JsonPropertyName("web_ui_ban_duration")]
|
[JsonPropertyName("web_ui_ban_duration")]
|
||||||
public int WebUiBanDuration { get; }
|
public int WebUiBanDuration { get; }
|
||||||
|
|
||||||
@@ -1050,4 +1101,4 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("web_ui_password")]
|
[JsonPropertyName("web_ui_password")]
|
||||||
public string WebUiPassword { get; }
|
public string WebUiPassword { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,12 +7,24 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("add_to_top_of_queue")]
|
[JsonPropertyName("add_to_top_of_queue")]
|
||||||
public bool? AddToTopOfQueue { get; set; }
|
public bool? AddToTopOfQueue { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_stopped_enabled")]
|
||||||
|
public bool? AddStoppedEnabled { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("add_trackers")]
|
[JsonPropertyName("add_trackers")]
|
||||||
public string? AddTrackers { get; set; }
|
public string? AddTrackers { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("add_trackers_enabled")]
|
[JsonPropertyName("add_trackers_enabled")]
|
||||||
public bool? AddTrackersEnabled { get; set; }
|
public bool? AddTrackersEnabled { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_trackers_from_url_enabled")]
|
||||||
|
public bool? AddTrackersFromUrlEnabled { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_trackers_url")]
|
||||||
|
public string? AddTrackersUrl { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("add_trackers_url_list")]
|
||||||
|
public string? AddTrackersUrlList { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("alt_dl_limit")]
|
[JsonPropertyName("alt_dl_limit")]
|
||||||
public int? AltDlLimit { get; set; }
|
public int? AltDlLimit { get; set; }
|
||||||
|
|
||||||
@@ -28,6 +40,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("announce_ip")]
|
[JsonPropertyName("announce_ip")]
|
||||||
public string? AnnounceIp { get; set; }
|
public string? AnnounceIp { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("announce_port")]
|
||||||
|
public int? AnnouncePort { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("announce_to_all_tiers")]
|
[JsonPropertyName("announce_to_all_tiers")]
|
||||||
public bool? AnnounceToAllTiers { get; set; }
|
public bool? AnnounceToAllTiers { get; set; }
|
||||||
|
|
||||||
@@ -88,6 +103,12 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("category_changed_tmm_enabled")]
|
[JsonPropertyName("category_changed_tmm_enabled")]
|
||||||
public bool? CategoryChangedTmmEnabled { get; set; }
|
public bool? CategoryChangedTmmEnabled { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("confirm_torrent_deletion")]
|
||||||
|
public bool? ConfirmTorrentDeletion { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("confirm_torrent_recheck")]
|
||||||
|
public bool? ConfirmTorrentRecheck { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("checking_memory_use")]
|
[JsonPropertyName("checking_memory_use")]
|
||||||
public int? CheckingMemoryUse { get; set; }
|
public int? CheckingMemoryUse { get; set; }
|
||||||
|
|
||||||
@@ -103,6 +124,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("current_network_interface")]
|
[JsonPropertyName("current_network_interface")]
|
||||||
public string? CurrentNetworkInterface { get; set; }
|
public string? CurrentNetworkInterface { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("delete_torrent_content_files")]
|
||||||
|
public bool? DeleteTorrentContentFiles { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("dht")]
|
[JsonPropertyName("dht")]
|
||||||
public bool? Dht { get; set; }
|
public bool? Dht { get; set; }
|
||||||
|
|
||||||
@@ -211,6 +235,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("hashing_threads")]
|
[JsonPropertyName("hashing_threads")]
|
||||||
public int? HashingThreads { get; set; }
|
public int? HashingThreads { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("hostname_cache_ttl")]
|
||||||
|
public int? HostnameCacheTtl { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("i2p_address")]
|
[JsonPropertyName("i2p_address")]
|
||||||
public string? I2pAddress { get; set; }
|
public string? I2pAddress { get; set; }
|
||||||
|
|
||||||
@@ -238,6 +265,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("idn_support_enabled")]
|
[JsonPropertyName("idn_support_enabled")]
|
||||||
public bool? IdnSupportEnabled { get; set; }
|
public bool? IdnSupportEnabled { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("ignore_ssl_errors")]
|
||||||
|
public bool? IgnoreSslErrors { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("incomplete_files_ext")]
|
[JsonPropertyName("incomplete_files_ext")]
|
||||||
public bool? IncompleteFilesExt { get; set; }
|
public bool? IncompleteFilesExt { get; set; }
|
||||||
|
|
||||||
@@ -323,7 +353,7 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
public bool? MaxInactiveSeedingTimeEnabled { get; set; }
|
public bool? MaxInactiveSeedingTimeEnabled { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("max_ratio")]
|
[JsonPropertyName("max_ratio")]
|
||||||
public int? MaxRatio { get; set; }
|
public float? MaxRatio { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("max_ratio_act")]
|
[JsonPropertyName("max_ratio_act")]
|
||||||
public int? MaxRatioAct { get; set; }
|
public int? MaxRatioAct { get; set; }
|
||||||
@@ -466,6 +496,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("save_resume_data_interval")]
|
[JsonPropertyName("save_resume_data_interval")]
|
||||||
public int? SaveResumeDataInterval { get; set; }
|
public int? SaveResumeDataInterval { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("save_statistics_interval")]
|
||||||
|
public int? SaveStatisticsInterval { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("scan_dirs")]
|
[JsonPropertyName("scan_dirs")]
|
||||||
public Dictionary<string, SaveLocation>? ScanDirs { get; set; }
|
public Dictionary<string, SaveLocation>? ScanDirs { get; set; }
|
||||||
|
|
||||||
@@ -514,12 +547,21 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("socket_send_buffer_size")]
|
[JsonPropertyName("socket_send_buffer_size")]
|
||||||
public int? SocketSendBufferSize { get; set; }
|
public int? SocketSendBufferSize { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("ssl_enabled")]
|
||||||
|
public bool? SslEnabled { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("ssl_listen_port")]
|
||||||
|
public int? SslListenPort { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("ssrf_mitigation")]
|
[JsonPropertyName("ssrf_mitigation")]
|
||||||
public bool? SsrfMitigation { get; set; }
|
public bool? SsrfMitigation { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("start_paused_enabled")]
|
[JsonPropertyName("start_paused_enabled")]
|
||||||
public bool? StartPausedEnabled { get; set; }
|
public bool? StartPausedEnabled { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("status_bar_external_ip")]
|
||||||
|
public bool? StatusBarExternalIp { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("stop_tracker_timeout")]
|
[JsonPropertyName("stop_tracker_timeout")]
|
||||||
public int? StopTrackerTimeout { get; set; }
|
public int? StopTrackerTimeout { get; set; }
|
||||||
|
|
||||||
@@ -535,6 +577,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("torrent_content_layout")]
|
[JsonPropertyName("torrent_content_layout")]
|
||||||
public string? TorrentContentLayout { get; set; }
|
public string? TorrentContentLayout { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("torrent_content_remove_option")]
|
||||||
|
public string? TorrentContentRemoveOption { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("torrent_file_size_limit")]
|
[JsonPropertyName("torrent_file_size_limit")]
|
||||||
public int? TorrentFileSizeLimit { get; set; }
|
public int? TorrentFileSizeLimit { get; set; }
|
||||||
|
|
||||||
@@ -565,6 +610,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("use_subcategories")]
|
[JsonPropertyName("use_subcategories")]
|
||||||
public bool? UseSubcategories { get; set; }
|
public bool? UseSubcategories { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("use_unwanted_folder")]
|
||||||
|
public bool? UseUnwantedFolder { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("utp_tcp_mixed_mode")]
|
[JsonPropertyName("utp_tcp_mixed_mode")]
|
||||||
public int? UtpTcpMixedMode { get; set; }
|
public int? UtpTcpMixedMode { get; set; }
|
||||||
|
|
||||||
@@ -574,6 +622,9 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("web_ui_address")]
|
[JsonPropertyName("web_ui_address")]
|
||||||
public string? WebUiAddress { get; set; }
|
public string? WebUiAddress { get; set; }
|
||||||
|
|
||||||
|
[JsonPropertyName("web_ui_api_key")]
|
||||||
|
public string? WebUiApiKey { get; set; }
|
||||||
|
|
||||||
[JsonPropertyName("web_ui_ban_duration")]
|
[JsonPropertyName("web_ui_ban_duration")]
|
||||||
public int? WebUiBanDuration { get; set; }
|
public int? WebUiBanDuration { get; set; }
|
||||||
|
|
||||||
@@ -628,4 +679,4 @@ namespace Lantean.QBitTorrentClient.Models
|
|||||||
[JsonPropertyName("web_ui_password")]
|
[JsonPropertyName("web_ui_password")]
|
||||||
public string? WebUiPassword { get; set; }
|
public string? WebUiPassword { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
94
readme.md
94
readme.md
@@ -1,14 +1,84 @@
|
|||||||
# qbt-mud
|
# qbtmud
|
||||||
|
|
||||||
## To-Do
|
qbtmud is a drop-in replacement for qBittorrent's default WebUI, implementing all of its functionality with a modern and user-friendly interface.
|
||||||
|
|
||||||
- Rename multiple files dialog
|
## Features
|
||||||
- ~~RSS feeds and dialogs~~
|
|
||||||
- ~~About~~
|
qbtmud replicates all core features of the qBittorrent WebUI, including:
|
||||||
- ~~Context menu for files list/trackers list/peers list~~
|
|
||||||
- ~~Tag management page~~
|
- **Torrent Management** – Add, remove, and control torrents.
|
||||||
- ~~Category management page~~
|
- **Tracker Control** – View and manage trackers.
|
||||||
- ~~Update all tables to use DynamicTable~~
|
- **Peer Management** – Monitor and manage peers connected to torrents.
|
||||||
- ~~Log~~
|
- **File Prioritization** – Select and prioritize specific files within a torrent.
|
||||||
- ~~Blocks~~
|
- **Speed Limits** – Set global and per-torrent speed limits.
|
||||||
- ~~Search~~
|
- **RSS Integration** – Subscribe to RSS feeds for automated torrent downloads.
|
||||||
|
- **Search Functionality** – Integrated torrent search.
|
||||||
|
- **Sequential Downloading** – Download files in order for media streaming.
|
||||||
|
- **Super Seeding Mode** – Efficiently distribute torrents as an initial seeder.
|
||||||
|
- **IP Filtering** – Improve security by filtering specific IP addresses.
|
||||||
|
- **IPv6 Support** – Full support for IPv6 networks.
|
||||||
|
- **Bandwidth Scheduler** – Schedule bandwidth limits.
|
||||||
|
- **WebUI Access** – Remotely manage torrents through the WebUI.
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
For a detailed explanation of these features, refer to the [qBittorrent Options Guide](https://github.com/qbittorrent/qBittorrent/wiki/Explanation-of-Options-in-qBittorrent).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install qbtmud without building from source:
|
||||||
|
|
||||||
|
### 1. Download the Latest Release
|
||||||
|
- Go to the [qbtmud Releases](https://github.com/lantean-code/qbtmud/releases) page.
|
||||||
|
- Download the latest release archive for your operating system.
|
||||||
|
|
||||||
|
### 2. Extract the Archive
|
||||||
|
- Extract the contents of the downloaded archive to a directory of your choice.
|
||||||
|
|
||||||
|
### 3. Configure qBittorrent to Use qbtmud
|
||||||
|
- Open qBittorrent and navigate to `Tools` > `Options` > `Web UI`.
|
||||||
|
- Enable the option **"Use alternative WebUI"**.
|
||||||
|
- Set the **"Root Folder"** to the directory where you extracted qbtmud.
|
||||||
|
- Click **OK** to save the settings.
|
||||||
|
|
||||||
|
### 4. Access qbtmud
|
||||||
|
- Open your web browser and go to `http://localhost:8080` (or the port configured in qBittorrent).
|
||||||
|
|
||||||
|
For more detailed instructions, refer to the [Alternate WebUI Usage Guide](https://github.com/qbittorrent/qBittorrent/wiki/Alternate-WebUI-usage).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Building from Source
|
||||||
|
|
||||||
|
To build qbtmud from source, you need to have the **.NET 9.0 SDK** installed on your system.
|
||||||
|
|
||||||
|
### 1. Clone the Repository
|
||||||
|
```sh
|
||||||
|
git clone https://github.com/lantean-code/qbtmud.git
|
||||||
|
cd qbtmud
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Restore Dependencies
|
||||||
|
```sh
|
||||||
|
dotnet restore
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Build and Publish the Application
|
||||||
|
```sh
|
||||||
|
dotnet publish --configuration Release
|
||||||
|
```
|
||||||
|
|
||||||
|
This will output the Web UI files to `Lantean.QBTMud\bin\Release\net9.0\publish\wwwroot`.
|
||||||
|
|
||||||
|
### 4. Configure qBittorrent to Use qbtmud
|
||||||
|
Follow the same steps as in the **Installation** section to set qbtmud as your WebUI.
|
||||||
|
|
||||||
|
### 5. Run qbtmud
|
||||||
|
Navigate to the directory containing the built files and run the application using the appropriate command for your OS.
|
||||||
|
|
||||||
|
By following these steps, you can set up qbtmud to manage your qBittorrent server with an improved web interface, offering better functionality and usability.
|
||||||
|
Reference in New Issue
Block a user