Convert more tables to use DynamicTable and implement tracker page context menu

This commit is contained in:
ahjephson
2024-07-19 19:32:07 +01:00
parent ab548bb0e8
commit 2247a08eea
39 changed files with 535 additions and 400 deletions

View File

@@ -3,7 +3,7 @@
<table width="100%">
<tbody>
<tr>
<td style="width: 100%"><MudTextField T="string" Label="Tag" Value="@Tag" ValueChanged="SetTag" ShrinkLabel Required Variant="Variant.Outlined" /></td>
<td style="width: 100%"><MudTextField T="string" Label="Tag" Value="@Tag" ValueChanged="SetTag" Required Variant="Variant.Outlined" /></td>
<td><MudIconButton Icon="@Icons.Material.Filled.Add" OnClick="AddTag" /></td>
</tr>
@foreach (var tag in Tags)
@@ -11,7 +11,7 @@
var tagRef = tag;
<tr>
<td>@tag</td>
<td><MudIconButton Icon="@Icons.Material.Filled.Delete" /></td>
<td><MudIconButton Icon="@Icons.Material.Filled.Delete" OnClick="@(e => DeleteTag(tagRef))" /></td>
</tr>
}
</tbody>

View File

@@ -34,6 +34,11 @@ namespace Lantean.QBTMudBlade.Components.Dialogs
Tag = tag;
}
protected void DeleteTag(string tag)
{
Tags.Remove(tag);
}
protected void Cancel()
{
MudDialog.Cancel();

View File

@@ -2,7 +2,7 @@
<DialogContent>
<MudGrid>
<MudItem xs="12">
<MudTextField Label="Urls" Lines="10" @bind-Value="Urls" Variant="Variant.Outlined" />
<MudTextField Label="Urls" Lines="10" @bind-Value="Urls" Variant="Variant.Outlined" AutoFocus="true" />
</MudItem>
</MudGrid>
<AddTorrentOptions @ref="TorrentOptions" ShowCookieOption="false" />

View File

@@ -0,0 +1,24 @@
<MudDialog>
<DialogContent>
<table width="100%">
<tbody>
<tr>
<td style="width: 100%"><MudTextField T="string" Label="Tag" Value="@Tracker" ValueChanged="SetTracker" Required Variant="Variant.Outlined" /></td>
<td><MudIconButton Icon="@Icons.Material.Filled.Add" OnClick="AddTracker" /></td>
</tr>
@foreach (var tracker in Trackers)
{
var trackerRef = tracker;
<tr>
<td>@tracker</td>
<td><MudIconButton Icon="@Icons.Material.Filled.Delete" OnClick="@(e => DeleteTracker(trackerRef))" /></td>
</tr>
}
</tbody>
</table>
</DialogContent>
<DialogActions>
<MudButton OnClick="Cancel">Cancel</MudButton>
<MudButton Color="Color.Primary" OnClick="Submit">Save</MudButton>
</DialogActions>
</MudDialog>

View File

@@ -0,0 +1,45 @@
using Microsoft.AspNetCore.Components;
using MudBlazor;
namespace Lantean.QBTMudBlade.Components.Dialogs
{
public partial class AddTrackerDialog
{
[CascadingParameter]
public MudDialogInstance MudDialog { get; set; } = default!;
protected HashSet<string> Trackers { get; } = [];
protected string? Tracker { get; set; }
protected void AddTracker()
{
if (string.IsNullOrEmpty(Tracker))
{
return;
}
Trackers.Add(Tracker);
Tracker = null;
}
protected void SetTracker(string tracker)
{
Tracker = tracker;
}
protected void DeleteTracker(string tracker)
{
Trackers.Remove(tracker);
}
protected void Cancel()
{
MudDialog.Cancel();
}
protected void Submit()
{
MudDialog.Close(Trackers);
}
}
}

View File

@@ -2,10 +2,10 @@
<DialogContent>
<MudGrid>
<MudItem xs="12">
<MudTextField Label="Category" @bind-Value="Category" Required ShrinkLabel Variant="Variant.Outlined" />
<MudTextField Label="Category" @bind-Value="Category" Required Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudTextField Label="Save Path" @bind-Value="SavePath" Required ShrinkLabel Variant="Variant.Outlined" />
<MudTextField Label="Save Path" @bind-Value="SavePath" Required Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</DialogContent>

View File

@@ -12,7 +12,7 @@
<MudCheckBox T="bool" ValueChanged="@(c => SetSelected(c, column.Id))" Label="@column.Header" LabelPosition="LabelPosition.End" Value="@(SelectedColumnsInternal.Contains(column.Id))" />
</MudItem>
<MudItem xs="3">
<MudTextField T="string" Value="@(GetValue(column.Width, column.Id))" ValueChanged="@(c => SetWidth(c, column.Id))" Label="Width" Variant="Variant.Text" HelperText="px" Adornment="Adornment.End" AdornmentIcon="@Icons.Material.Outlined.WidthNormal" ShrinkLabel="true" OnAdornmentClick="@(c => SetWidth("auto", column.Id))" />
<MudTextField T="string" Value="@(GetValue(column.Width, column.Id))" ValueChanged="@(c => SetWidth(c, column.Id))" Label="Width" Variant="Variant.Text" HelperText="px" Adornment="Adornment.End" AdornmentIcon="@Icons.Material.Outlined.WidthNormal" OnAdornmentClick="@(c => SetWidth("auto", column.Id))" />
</MudItem>
<MudItem xs="1">
<MudIconButton Icon="@Icons.Material.Outlined.KeyboardArrowUp" Disabled="@(index == 0)" OnClick="@(e => MoveUp(index))" />

View File

@@ -22,6 +22,8 @@ namespace Lantean.QBTMudBlade.Components.Dialogs
protected HashSet<string> SelectedColumnsInternal { get; set; } = [];
protected Dictionary<string, int?> WidthsInternal { get; set; } = [];
protected override void OnParametersSet()
{
if (SelectedColumnsInternal.Count == 0)
@@ -41,6 +43,14 @@ namespace Lantean.QBTMudBlade.Components.Dialogs
}
}
}
if (WidthsInternal.Count == 0)
{
foreach (var width in Widths)
{
WidthsInternal[width.Key] = width.Value;
}
}
}
protected void SetSelected(bool selected, string id)
@@ -64,22 +74,22 @@ namespace Lantean.QBTMudBlade.Components.Dialogs
{
if (width == defaultWidth)
{
Widths.Remove(id);
WidthsInternal.Remove(id);
}
else
{
Widths[id] = width;
WidthsInternal[id] = width;
}
}
else
{
if (defaultWidth is null)
{
Widths.Remove(id);
WidthsInternal.Remove(id);
}
else
{
Widths[id] = null;
WidthsInternal[id] = null;
}
}
}
@@ -106,7 +116,7 @@ namespace Lantean.QBTMudBlade.Components.Dialogs
protected string GetValue(int? value, string columnId)
{
if (Widths.TryGetValue(columnId, out var newWidth))
if (WidthsInternal.TryGetValue(columnId, out var newWidth))
{
value = newWidth;
}
@@ -131,7 +141,7 @@ namespace Lantean.QBTMudBlade.Components.Dialogs
protected void Submit(MouseEventArgs args)
{
MudDialog.Close(DialogResult.Ok((SelectedColumnsInternal, Widths)));
MudDialog.Close(DialogResult.Ok((SelectedColumnsInternal, WidthsInternal)));
}
}
}

View File

@@ -101,7 +101,7 @@ namespace Lantean.QBTMudBlade.Components.Dialogs
protected async Task AddTag()
{
var addedTags = await DialogService.ShowAddTagsDialog(ApiClient);
var addedTags = await DialogService.ShowAddTagsDialog();
if (addedTags is null || addedTags.Count == 0)
{

View File

@@ -4,7 +4,7 @@
<DialogContent>
<MudGrid>
<MudItem xs="12">
<MudTextField T="T" Label="@GetLabel()" Value="@Value" Disabled="Disabled" Variant="Variant.Outlined" ShrinkLabel="true" />
<MudTextField T="T" Label="@GetLabel()" Value="@Value" Disabled="Disabled" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</DialogContent>

View File

@@ -4,7 +4,7 @@
<DialogContent>
<MudGrid>
<MudItem xs="12">
<MudNumericField T="T" Label="@GetLabel()" Value="@Value" Min="@Min" Max="@Max" Disabled="Disabled" Variant="Variant.Outlined" ShrinkLabel="true" />
<MudNumericField T="T" Label="@GetLabel()" Value="@Value" Min="@Min" Max="@Max" Disabled="Disabled" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudSlider T="T" ValueLabel="true" Value="@Value" Min="@Min" Max="@Max" Disabled="Disabled" />

View File

@@ -313,7 +313,13 @@ namespace Lantean.QBTMudBlade.Components
return;
}
await DialogService.ShowAddTagsDialog(ApiClient);
var tags = await DialogService.ShowAddTagsDialog();
if (tags is null || tags.Count == 0)
{
return;
}
await ApiClient.CreateTags(tags);
}
protected async Task RemoveTag()

View File

@@ -9,16 +9,16 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudSelect T="string" Label="Resume data storage type (requires restart)" Value="ResumeDataStorageType" ValueChanged="ResumeDataStorageTypeChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Resume data storage type (requires restart)" Value="ResumeDataStorageType" ValueChanged="ResumeDataStorageTypeChanged" Variant="Variant.Outlined">
<MudSelectItem T="string" Value="@("Legacy")">Fastresume files</MudSelectItem>
<MudSelectItem T="string" Value="@("SQLite")">SQLite database (experimental)</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Physical memory (RAM) usage limit (applied if libtorrent &gt;= 2.0)" Value="MemoryWorkingSetLimit" ValueChanged="MemoryWorkingSetLimitChanged" Min="0" HelperText="This option is less effective on Linux" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
<MudNumericField T="int" Label="Physical memory (RAM) usage limit (applied if libtorrent &gt;= 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 xs="12">
<MudSelect T="string" Label="Network interface" Value="CurrentNetworkInterface" ValueChanged="CurrentNetworkInterfaceChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Network interface" Value="CurrentNetworkInterface" ValueChanged="CurrentNetworkInterfaceChanged" Variant="Variant.Outlined">
<MudSelectItem T="string" Value="@("")">Any interface</MudSelectItem>
@foreach (var networkInterface in NetworkInterfaces)
{
@@ -27,7 +27,7 @@
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudSelect T="string" Label="Optional IP address to bind to" Value="CurrentInterfaceAddress" ValueChanged="CurrentInterfaceAddressChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Optional IP address to bind to" Value="CurrentInterfaceAddress" ValueChanged="CurrentInterfaceAddressChanged" Variant="Variant.Outlined">
<MudSelectItem T="string" Value="@("")">All addresses</MudSelectItem>
<MudSelectItem T="string" Value="@("0.0.0.0")">All IPv4 addresses</MudSelectItem>
<MudSelectItem T="string" Value="@("::")">All IPv6 addresses</MudSelectItem>
@@ -38,16 +38,16 @@
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Save resume data interval" Value="SaveResumeDataInterval" ValueChanged="SaveResumeDataIntervalChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
<MudNumericField T="int" Label="Save resume data interval" Value="SaveResumeDataInterval" ValueChanged="SaveResumeDataIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label=".torrent file size limit" Value="TorrentFileSizeLimit" ValueChanged="TorrentFileSizeLimitChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
<MudNumericField T="int" Label=".torrent file size limit" Value="TorrentFileSizeLimit" ValueChanged="TorrentFileSizeLimitChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Recheck torrents on completion" Value="RecheckCompletedTorrents" ValueChanged="RecheckCompletedTorrentsChanged" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Refresh interval" Value="RefreshInterval" ValueChanged="RefreshIntervalChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="ms" />
<MudNumericField T="int" Label="Refresh interval" Value="RefreshInterval" ValueChanged="RefreshIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="ms" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Resolve peer countries" Value="ResolvePeerCountries" ValueChanged="ResolvePeerCountriesChanged" />
@@ -59,7 +59,7 @@
<MudFieldSwitch Label="Enable embedded tracker" Value="EnableEmbeddedTracker" ValueChanged="EnableEmbeddedTrackerChanged" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Embedded tracker port" Value="EmbeddedTrackerPort" ValueChanged="EmbeddedTrackerPortChanged" Min="@Options.MinPortValue" Max="@Options.MaxPortValue" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Embedded tracker port" Value="EmbeddedTrackerPort" ValueChanged="EmbeddedTrackerPortChanged" Min="@Options.MinPortValue" Max="@Options.MaxPortValue" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Enable port forwarding for embedded tracker" Value="EmbeddedTrackerPortForwarding" ValueChanged="EmbeddedTrackerPortForwardingChanged" />
@@ -77,47 +77,47 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudNumericField T="int" Label="Bdecode depth limit" Value="BdecodeDepthLimit" ValueChanged="BdecodeDepthLimitChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Bdecode depth limit" Value="BdecodeDepthLimit" ValueChanged="BdecodeDepthLimitChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Bdecode token limit" Value="BdecodeTokenLimit" ValueChanged="BdecodeTokenLimitChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Bdecode token limit" Value="BdecodeTokenLimit" ValueChanged="BdecodeTokenLimitChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Asynchronous I/O threads" Value="AsyncIoThreads" ValueChanged="AsyncIoThreadsChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Asynchronous I/O threads" Value="AsyncIoThreads" ValueChanged="AsyncIoThreadsChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Hashing threads (requires libtorrent &gt;= 2.0)" Value="HashingThreads" ValueChanged="HashingThreadsChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Hashing threads (requires libtorrent &gt;= 2.0)" Value="HashingThreads" ValueChanged="HashingThreadsChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="File pool size" Value="FilePoolSize" ValueChanged="FilePoolSizeChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="File pool size" Value="FilePoolSize" ValueChanged="FilePoolSizeChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Outstanding memory when checking torrents" Value="CheckingMemoryUse" ValueChanged="CheckingMemoryUseChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
<MudNumericField T="int" Label="Outstanding memory when checking torrents" Value="CheckingMemoryUse" ValueChanged="CheckingMemoryUseChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Disk cache (requires libtorrent &lt; 2.0)" Value="DiskCache" ValueChanged="DiskCacheChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
<MudNumericField T="int" Label="Disk cache (requires libtorrent &lt; 2.0)" Value="DiskCache" ValueChanged="DiskCacheChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="MiB" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Disk cache expiry interval (requires libtorrent &lt; 2.0)" Value="DiskCacheTtl" ValueChanged="DiskCacheTtlChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
<MudNumericField T="int" Label="Disk cache expiry interval (requires libtorrent &lt; 2.0)" Value="DiskCacheTtl" ValueChanged="DiskCacheTtlChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Disk queue size" Value="DiskQueueSize" ValueChanged="DiskQueueSizeChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
<MudNumericField T="int" Label="Disk queue size" Value="DiskQueueSize" ValueChanged="DiskQueueSizeChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Label="Disk IO type (libtorrent &gt;= 2.0; requires restart)" Value="DiskIoType" ValueChanged="DiskIoTypeChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Label="Disk IO type (libtorrent &gt;= 2.0; requires restart)" Value="DiskIoType" ValueChanged="DiskIoTypeChanged" Variant="Variant.Outlined">
<MudSelectItem T="int" Value="0">Default</MudSelectItem>
<MudSelectItem T="int" Value="1">Memory mapped files</MudSelectItem>
<MudSelectItem T="int" Value="2">POSIX-compliant</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Label="Disk IO read mode" Value="DiskIoReadMode" ValueChanged="DiskIoReadModeChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Label="Disk IO read mode" Value="DiskIoReadMode" ValueChanged="DiskIoReadModeChanged" Variant="Variant.Outlined">
<MudSelectItem T="int" Value="0">Disable OS cache</MudSelectItem>
<MudSelectItem T="int" Value="1">Enable OS cache</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Label="Disk IO write mode" Value="DiskIoWriteMode" ValueChanged="DiskIoWriteModeChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Label="Disk IO write mode" Value="DiskIoWriteMode" ValueChanged="DiskIoWriteModeChanged" Variant="Variant.Outlined">
<MudSelectItem T="int" Value="0">Disable OS cache</MudSelectItem>
<MudSelectItem T="int" Value="1">Enable OS cache</MudSelectItem>
<MudSelectItem T="int" Value="2">Write-through (requires libtorrent &gt;= 2.0.6)</MudSelectItem>
@@ -133,40 +133,40 @@
<MudFieldSwitch Label="Send upload piece suggestions" Value="EnableUploadSuggestions" ValueChanged="EnableUploadSuggestionsChanged" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Send buffer watermark" Value="SendBufferWatermark" ValueChanged="SendBufferWatermarkChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
<MudNumericField T="int" Label="Send buffer watermark" Value="SendBufferWatermark" ValueChanged="SendBufferWatermarkChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Send buffer low watermark" Value="SendBufferLowWatermark" ValueChanged="SendBufferLowWatermarkChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
<MudNumericField T="int" Label="Send buffer low watermark" Value="SendBufferLowWatermark" ValueChanged="SendBufferLowWatermarkChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Send buffer watermark factor" Value="SendBufferWatermarkFactor" ValueChanged="SendBufferWatermarkFactorChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
<MudNumericField T="int" Label="Send buffer watermark factor" Value="SendBufferWatermarkFactor" ValueChanged="SendBufferWatermarkFactorChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Outgoing connections per second" Value="ConnectionSpeed" ValueChanged="ConnectionSpeedChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Outgoing connections per second" Value="ConnectionSpeed" ValueChanged="ConnectionSpeedChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Socket send buffer size [0: system default]" Value="SocketSendBufferSize" ValueChanged="SocketSendBufferSizeChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
<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" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Socket receive buffer size [0: system default]" Value="SocketReceiveBufferSize" ValueChanged="SocketReceiveBufferSizeChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
<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" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Socket backlog size" Value="SocketBacklogSize" ValueChanged="SocketBacklogSizeChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Socket backlog size" Value="SocketBacklogSize" ValueChanged="SocketBacklogSizeChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Outgoing ports (Min) [0: disabled]" Value="OutgoingPortsMin" ValueChanged="OutgoingPortsMinChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Outgoing ports (Min) [0: disabled]" Value="OutgoingPortsMin" ValueChanged="OutgoingPortsMinChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Outgoing ports (Max) [0: disabled]" Value="OutgoingPortsMax" ValueChanged="OutgoingPortsMaxChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Outgoing ports (Max) [0: disabled]" Value="OutgoingPortsMax" ValueChanged="OutgoingPortsMaxChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="UPnP lease duration [0: permanent lease]" Value="UpnpLeaseDuration" ValueChanged="UpnpLeaseDurationChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="UPnP lease duration [0: permanent lease]" Value="UpnpLeaseDuration" ValueChanged="UpnpLeaseDurationChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Type of service (ToS) for connections to peers" Value="PeerTos" ValueChanged="PeerTosChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Type of service (ToS) for connections to peers" Value="PeerTos" ValueChanged="PeerTosChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Label="μTP-TCP mixed mode algorithm" Value="UtpTcpMixedMode" ValueChanged="UtpTcpMixedModeChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Label="μTP-TCP mixed mode algorithm" Value="UtpTcpMixedMode" ValueChanged="UtpTcpMixedModeChanged" Variant="Variant.Outlined">
<MudSelectItem T="int" Value="0">Prefer TCP</MudSelectItem>
<MudSelectItem T="int" Value="1">Peer proportional (throttles TCP)</MudSelectItem>
</MudSelect>
@@ -187,13 +187,13 @@
<MudFieldSwitch Label="Disallow connection to peers on privileged ports" Value="BlockPeersOnPrivilegedPorts" ValueChanged="BlockPeersOnPrivilegedPortsChanged" />
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Label="Upload slots behavior" Value="UploadSlotsBehavior" ValueChanged="UploadSlotsBehaviorChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Label="Upload slots behavior" Value="UploadSlotsBehavior" ValueChanged="UploadSlotsBehaviorChanged" Variant="Variant.Outlined">
<MudSelectItem T="int" Value="0">Fixed slots</MudSelectItem>
<MudSelectItem T="int" Value="1">Upload rate based</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Label="Upload choking algorithm" Value="UploadChokingAlgorithm" ValueChanged="UploadChokingAlgorithmChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Label="Upload choking algorithm" Value="UploadChokingAlgorithm" ValueChanged="UploadChokingAlgorithmChanged" Variant="Variant.Outlined">
<MudSelectItem T="int" Value="0">Round-robin</MudSelectItem>
<MudSelectItem T="int" Value="1">Fastest upload</MudSelectItem>
<MudSelectItem T="int" Value="2">Anti-leech</MudSelectItem>
@@ -206,37 +206,37 @@
<MudFieldSwitch Label="Always announce to all tiers" Value="AnnounceToAllTiers" ValueChanged="AnnounceToAllTiersChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="IP address reported to trackers (requires restart)" Value="AnnounceIp" ValueChanged="AnnounceIpChanged" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="IP address reported to trackers (requires restart)" Value="AnnounceIp" ValueChanged="AnnounceIpChanged" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Max concurrent HTTP announces" Value="MaxConcurrentHttpAnnounces" ValueChanged="MaxConcurrentHttpAnnouncesChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Max concurrent HTTP announces" Value="MaxConcurrentHttpAnnounces" ValueChanged="MaxConcurrentHttpAnnouncesChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Stop tracker timeout [0: disabled]" Value="StopTrackerTimeout" ValueChanged="StopTrackerTimeoutChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Stop tracker timeout [0: disabled]" Value="StopTrackerTimeout" ValueChanged="StopTrackerTimeoutChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Peer turnover disconnect percentage:" Value="PeerTurnover" ValueChanged="PeerTurnoverChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
<MudNumericField T="int" Label="Peer turnover disconnect percentage:" Value="PeerTurnover" ValueChanged="PeerTurnoverChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Peer turnover threshold percentage" Value="PeerTurnoverCutoff" ValueChanged="PeerTurnoverCutoffChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
<MudNumericField T="int" Label="Peer turnover threshold percentage" Value="PeerTurnoverCutoff" ValueChanged="PeerTurnoverCutoffChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="%" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Peer turnover disconnect interval" Value="PeerTurnoverInterval" ValueChanged="PeerTurnoverIntervalChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
<MudNumericField T="int" Label="Peer turnover disconnect interval" Value="PeerTurnoverInterval" ValueChanged="PeerTurnoverIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="s" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Maximum outstanding requests to a single peer" Value="RequestQueueSize" ValueChanged="RequestQueueSizeChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Maximum outstanding requests to a single peer" Value="RequestQueueSize" ValueChanged="RequestQueueSizeChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="I2P inbound quantity (requires libtorrent &gt;= 2.0)" Value="I2pInboundQuantity" ValueChanged="I2pInboundQuantityChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="I2P inbound quantity (requires libtorrent &gt;= 2.0)" Value="I2pInboundQuantity" ValueChanged="I2pInboundQuantityChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="I2P outbound quantity (requires libtorrent &gt;= 2.0)" Value="I2pOutboundQuantity" ValueChanged="I2pOutboundQuantityChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="I2P outbound quantity (requires libtorrent &gt;= 2.0)" Value="I2pOutboundQuantity" ValueChanged="I2pOutboundQuantityChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="I2P inbound length (requires libtorrent &gt;= 2.0)" Value="I2pInboundLength" ValueChanged="I2pInboundLengthChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="I2P inbound length (requires libtorrent &gt;= 2.0)" Value="I2pInboundLength" ValueChanged="I2pInboundLengthChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="I2P outbound length (requires libtorrent &gt;= 2.0)" Value="I2pOutboundLength" ValueChanged="I2pOutboundLengthChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="I2P outbound length (requires libtorrent &gt;= 2.0)" Value="I2pOutboundLength" ValueChanged="I2pOutboundLengthChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>

View File

@@ -9,7 +9,7 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudSelect T="string" Label="User Interface Language" Value="@("en-US")" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="User Interface Language" Value="@("en-US")" Variant="Variant.Outlined">
<MudSelectItem Value="@("en-US")">English</MudSelectItem>
</MudSelect>
</MudItem>
@@ -29,13 +29,13 @@
<MudFieldSwitch Label="Log file" Value="FileLogEnabled" ValueChanged="FileLogEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Save Path" Value="FileLogPath" ValueChanged="FileLogPathChanged" Disabled="@(!FileLogEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Save Path" Value="FileLogPath" ValueChanged="FileLogPathChanged" Disabled="@(!FileLogEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="3">
<MudFieldSwitch Label="Backup the log after" Value="FileLogBackupEnabled" ValueChanged="FileLogBackupEnabledChanged" Disabled="@(!FileLogEnabled)" />
</MudItem>
<MudItem xs="9">
<MudNumericField T="int" Value="FileLogMaxSize" ValueChanged="FileLogMaxSizeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="1024000" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
<MudNumericField T="int" Value="FileLogMaxSize" ValueChanged="FileLogMaxSizeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="1024000" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB" />
</MudItem>
<MudItem xs="3">
<MudFieldSwitch Label="Delete backups older than" Value="FileLogDeleteOld" ValueChanged="FileLogDeleteOldChanged" Disabled="@(!FileLogEnabled)" />
@@ -43,10 +43,10 @@
<MudItem xs="9">
<MudGrid>
<MudItem xs="9">
<MudNumericField T="int" Value="FileLogAge" ValueChanged="FileLogAgeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="365" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Value="FileLogAge" ValueChanged="FileLogAgeChanged" Disabled="@(!FileLogEnabled)" Min="1" Max="365" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="3">
<MudSelect T="int" Value="FileLogAgeType" ValueChanged="FileLogAgeTypeChanged" Disabled="@(!FileLogEnabled)" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Value="FileLogAgeType" ValueChanged="FileLogAgeTypeChanged" Disabled="@(!FileLogEnabled)" Variant="Variant.Outlined">
<MudSelectItem Value="0">days</MudSelectItem>
<MudSelectItem Value="1">months</MudSelectItem>
<MudSelectItem Value="2">years</MudSelectItem>

View File

@@ -18,7 +18,7 @@
<MudFieldSwitch Label="Enable Local Peer Discovery to find more peers" Value="Lsd" ValueChanged="LsdChanged" />
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Label="Encryption mode" Value="Encryption" ValueChanged="EncryptionChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Label="Encryption mode" Value="Encryption" ValueChanged="EncryptionChanged" Variant="Variant.Outlined">
<MudSelectItem Value="0">Allow encryption</MudSelectItem>
<MudSelectItem Value="1">Require encryption</MudSelectItem>
<MudSelectItem Value="2">Disable encryption</MudSelectItem>
@@ -38,7 +38,7 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudNumericField T="int" Label="Max active checking torrents" Value="MaxActiveCheckingTorrents" ValueChanged="MaxActiveCheckingTorrentsChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Max active checking torrents" Value="MaxActiveCheckingTorrents" ValueChanged="MaxActiveCheckingTorrentsChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -56,25 +56,25 @@
<MudFieldSwitch Label="Queueing enabled" Value="QueueingEnabled" ValueChanged="QueueingEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Maximum active downloads" Value="MaxActiveDownloads" ValueChanged="MaxActiveDownloadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" ShrinkLabel Variant="Variant.Outlined" Validation="MaxActiveDownloadsValidation" />
<MudNumericField T="int" Label="Maximum active downloads" Value="MaxActiveDownloads" ValueChanged="MaxActiveDownloadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveDownloadsValidation" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Maximum active uploads" Value="MaxActiveUploads" ValueChanged="MaxActiveUploadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" ShrinkLabel Variant="Variant.Outlined" Validation="MaxActiveUploadsValidation" />
<MudNumericField T="int" Label="Maximum active uploads" Value="MaxActiveUploads" ValueChanged="MaxActiveUploadsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveUploadsValidation" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Maximum active torrents" Value="MaxActiveTorrents" ValueChanged="MaxActiveTorrentsChanged" Min="-1" Disabled="@(!QueueingEnabled)" ShrinkLabel Variant="Variant.Outlined" Validation="MaxActiveTorrentsValidation" />
<MudNumericField T="int" Label="Maximum active torrents" Value="MaxActiveTorrents" ValueChanged="MaxActiveTorrentsChanged" Min="-1" Disabled="@(!QueueingEnabled)" Variant="Variant.Outlined" Validation="MaxActiveTorrentsValidation" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Do not count slow torrents in these limits" Value="DontCountSlowTorrents" ValueChanged="DontCountSlowTorrentsChanged" Disabled="@(!QueueingEnabled)" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Download rate threshold" Value="SlowTorrentDlRateThreshold" ValueChanged="SlowTorrentDlRateThresholdChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentDlRateThresholdValidation" />
<MudNumericField 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 xs="12">
<MudNumericField T="int" Label="Upload rate threshold" Value="SlowTorrentUlRateThreshold" ValueChanged="SlowTorrentUlRateThresholdChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentUlRateThresholdValidation" />
<MudNumericField 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 T="int" Label="Torrent inactivity timer" Value="SlowTorrentInactiveTimer" ValueChanged="SlowTorrentInactiveTimerChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentInactiveTimerValidation" />
<MudNumericField T="int" Label="Torrent inactivity timer" Value="SlowTorrentInactiveTimer" ValueChanged="SlowTorrentInactiveTimerChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" Validation="SlowTorrentInactiveTimerValidation" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -92,22 +92,22 @@
<MudFieldSwitch Label="When ratio reaches" Value="MaxRatioEnabled" ValueChanged="MaxRatioEnabledChanged" />
</MudItem>
<MudItem xs="9">
<MudNumericField T="int" Label="" Value="MaxRatio" ValueChanged="MaxRatioChanged" Disabled="@(!MaxRatioEnabled)" Min="0" Max="9998" ShrinkLabel Variant="Variant.Outlined" Validation="MaxRatioValidation" />
<MudNumericField T="int" Label="" Value="MaxRatio" ValueChanged="MaxRatioChanged" Disabled="@(!MaxRatioEnabled)" Min="0" Max="9998" Variant="Variant.Outlined" Validation="MaxRatioValidation" />
</MudItem>
<MudItem xs="3">
<MudFieldSwitch Label="When total seeding time reaches" Value="MaxSeedingTimeEnabled" ValueChanged="MaxSeedingTimeEnabledChanged" />
</MudItem>
<MudItem xs="9">
<MudNumericField T="int" Label="minutes" Value="MaxSeedingTime" ValueChanged="MaxSeedingTimeChanged" Disabled="@(!MaxSeedingTimeEnabled)" Min="0" Max="525600" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="minutes" Validation="MaxSeedingTimeValidation" />
<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" />
</MudItem>
<MudItem xs="3">
<MudFieldSwitch Label="When inactive seeding time reaches" Value="MaxInactiveSeedingTimeEnabled" ValueChanged="MaxInactiveSeedingTimeEnabledChanged" />
</MudItem>
<MudItem xs="9">
<MudNumericField T="int" Label="minutes" Value="MaxInactiveSeedingTime" ValueChanged="MaxInactiveSeedingTimeChanged" Disabled="@(!MaxInactiveSeedingTimeEnabled)" Min="0" Max="525600" ShrinkLabel Variant="Variant.Outlined" Validation="MaxInactiveSeedingTimeValidation" />
<MudNumericField T="int" Label="minutes" Value="MaxInactiveSeedingTime" ValueChanged="MaxInactiveSeedingTimeChanged" Disabled="@(!MaxInactiveSeedingTimeEnabled)" Min="0" Max="525600" Variant="Variant.Outlined" Validation="MaxInactiveSeedingTimeValidation" />
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Value="MaxRatioAct" ValueChanged="MaxRatioActChanged" Disabled="@(!MaxRatioEnabled && !MaxSeedingTimeEnabled && !MaxInactiveSeedingTimeEnabled)" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Value="MaxRatioAct" ValueChanged="MaxRatioActChanged" Disabled="@(!MaxRatioEnabled && !MaxSeedingTimeEnabled && !MaxInactiveSeedingTimeEnabled)" Variant="Variant.Outlined">
<MudSelectItem Value="0">Stop torrent</MudSelectItem>
<MudSelectItem Value="1">Remove torrent</MudSelectItem>
<MudSelectItem Value="2">Remove torrent and its files</MudSelectItem>
@@ -130,7 +130,7 @@
<MudFieldSwitch Label="Automatically add these trackers to new downloads" Value="AddTrackersEnabled" ValueChanged="AddTrackersEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Trackers" Value="AddTrackers" ValueChanged="AddTrackersChanged" Lines="5" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Trackers" Value="AddTrackers" ValueChanged="AddTrackersChanged" Lines="5" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>

View File

@@ -4,7 +4,7 @@
<MudCardContent>
<MudGrid>
<MudItem xs="12">
<MudSelect T="int" Label="Peer connection protocol" Value="BittorrentProtocol" ValueChanged="BittorrentProtocolChanged" ShrinkLabel 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="1">TCP</MudSelectItem>
<MudSelectItem T="int" Value="2">μTP</MudSelectItem>
@@ -23,7 +23,7 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudNumericField T="int" Label="Port used for incoming connections" Value="ListenPort" ValueChanged="ListenPortChanged" Min="@MinNonNegativePortValue" Max="@MaxPortValue" ShrinkLabel 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 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 xs="12">
<MudFieldSwitch Label="Use UPnp / NAT-PMP port forwarding from my router" Value="Upnp" ValueChanged="UpnpChanged" />
@@ -44,25 +44,25 @@
<MudFieldSwitch T="bool" Label="Global maximum number of connections" Value="MaxConnecEnabled" ValueChanged="MaxConnecEnabledChanged" />
</MudItem>
<MudItem xs="12" md="6">
<MudNumericField T="int" Label="Connections" Value="MaxConnec" ValueChanged="MaxConnecChanged" Min="0" Disabled="@(!MaxConnecEnabled)" ShrinkLabel Variant="Variant.Outlined" Validation="MaxConnectValidation" />
<MudNumericField T="int" Label="Connections" Value="MaxConnec" ValueChanged="MaxConnecChanged" Min="0" Disabled="@(!MaxConnecEnabled)" Variant="Variant.Outlined" Validation="MaxConnectValidation" />
</MudItem>
<MudItem xs="12" md="6">
<MudFieldSwitch Label="Maximum number of connections per torrent" Value="MaxConnecPerTorrentEnabled" ValueChanged="MaxConnecPerTorrentEnabledChanged" />
</MudItem>
<MudItem xs="12" md="6">
<MudNumericField T="int" Label="Connections" Value="MaxConnecPerTorrent" ValueChanged="MaxConnecPerTorrentChanged" Min="0" Disabled="@(!MaxConnecPerTorrentEnabled)" ShrinkLabel Variant="Variant.Outlined" Validation="MaxConnecPerTorrentValidation" />
<MudNumericField T="int" Label="Connections" Value="MaxConnecPerTorrent" ValueChanged="MaxConnecPerTorrentChanged" Min="0" Disabled="@(!MaxConnecPerTorrentEnabled)" Variant="Variant.Outlined" Validation="MaxConnecPerTorrentValidation" />
</MudItem>
<MudItem xs="12" md="6">
<MudFieldSwitch Label="Global maximum number of upload slots" Value="MaxUploadsEnabled" ValueChanged="MaxUploadsEnabledChanged" />
</MudItem>
<MudItem xs="12" md="6">
<MudNumericField T="int" Label="Slots" Value="MaxUploads" ValueChanged="MaxUploadsChanged" Min="0" Disabled="@(!MaxUploadsEnabled)" ShrinkLabel Variant="Variant.Outlined" Validation="MaxUploadsValidation" />
<MudNumericField T="int" Label="Slots" Value="MaxUploads" ValueChanged="MaxUploadsChanged" Min="0" Disabled="@(!MaxUploadsEnabled)" Variant="Variant.Outlined" Validation="MaxUploadsValidation" />
</MudItem>
<MudItem xs="12" md="6">
<MudFieldSwitch Label="Maximum number of upload slots per torrent" Value="MaxUploadsPerTorrentEnabled" ValueChanged="MaxUploadsPerTorrentEnabledChanged" />
</MudItem>
<MudItem xs="12" md="6">
<MudNumericField T="int" Label="Slots" Value="MaxUploadsPerTorrent" ValueChanged="MaxUploadsPerTorrentChanged" Min="0" Disabled="@(!MaxUploadsPerTorrentEnabled)" ShrinkLabel Variant="Variant.Outlined" Validation="MaxUploadsPerTorrentValidation" />
<MudNumericField T="int" Label="Slots" Value="MaxUploadsPerTorrent" ValueChanged="MaxUploadsPerTorrentChanged" Min="0" Disabled="@(!MaxUploadsPerTorrentEnabled)" Variant="Variant.Outlined" Validation="MaxUploadsPerTorrentValidation" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -75,10 +75,10 @@
<MudFieldSwitch Label="I2P (Experimental)" Value="I2pEnabled" ValueChanged="I2pEnabledChanged" />
</MudItem>
<MudItem xs="12" md="6">
<MudTextField T="string" Label="Host" Value="I2pAddress" ValueChanged="I2pAddressChanged" Disabled="@(!I2pEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Host" Value="I2pAddress" ValueChanged="I2pAddressChanged" Disabled="@(!I2pEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12" md="6">
<MudNumericField T="int" Label="Slots" Value="I2pPort" ValueChanged="I2pPortChanged" Min="0" Max="65535" Disabled="@(!I2pEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Slots" Value="I2pPort" ValueChanged="I2pPortChanged" Min="0" Max="65535" Disabled="@(!I2pEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Mixed mode" Value="I2pMixedMode" ValueChanged="I2pMixedModeChanged" Disabled="@(!I2pEnabled)" HelperText="If &quot;mixed mode&quot; 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." />
@@ -96,7 +96,7 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12" md="4">
<MudSelect T="string" Label="Type" Value="ProxyType" ValueChanged="ProxyTypeChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Type" Value="ProxyType" ValueChanged="ProxyTypeChanged" Variant="Variant.Outlined">
<MudSelectItem T="string" Value="@("None")">None</MudSelectItem>
<MudSelectItem T="string" Value="@("SOCKS4")">SOCKS4</MudSelectItem>
<MudSelectItem T="string" Value="@("SOCKS5")">SOCKS5</MudSelectItem>
@@ -104,10 +104,10 @@
</MudSelect>
</MudItem>
<MudItem xs="12" md="4">
<MudTextField T="string" Label="Host" Value="ProxyIp" ValueChanged="ProxyIpChanged" Disabled="ProxyDisabled" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Host" Value="ProxyIp" ValueChanged="ProxyIpChanged" Disabled="ProxyDisabled" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12" md="4">
<MudNumericField T="int" Label="Port" Value="ProxyPort" ValueChanged="ProxyPortChanged" Min="1" Max="@ConnectionOptions.MaxPortValue" Disabled="ProxyDisabled" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Port" Value="ProxyPort" ValueChanged="ProxyPortChanged" Min="1" Max="@ConnectionOptions.MaxPortValue" Disabled="ProxyDisabled" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Perform hostname lookup via proxy" Value="ProxyHostnameLookup" ValueChanged="ProxyHostnameLookupChanged" HelperText="If checked, hostname lookups are done via the proxy." />
@@ -116,10 +116,10 @@
<MudFieldSwitch Label="Authentication" Value="ProxyAuthEnabled" ValueChanged="ProxyAuthEnabledChanged" Disabled="@(ProxyDisabled || ProxySocks4)" />
</MudItem>
<MudItem xs="12" md="6">
<MudTextField T="string" Label="Username" Value="ProxyUsername" ValueChanged="ProxyUsernameChanged" Disabled="@(ProxyDisabled || ProxySocks4)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Username" Value="ProxyUsername" ValueChanged="ProxyUsernameChanged" Disabled="@(ProxyDisabled || ProxySocks4)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12" md="6">
<MudTextField T="string" Label="Password" Value="ProxyPassword" ValueChanged="ProxyPasswordChanged" Disabled="@(ProxyDisabled || ProxySocks4)" ShrinkLabel Variant="Variant.Outlined " HelperText="Info: The password is saved unencrypted" />
<MudTextField T="string" Label="Password" Value="ProxyPassword" ValueChanged="ProxyPasswordChanged" Disabled="@(ProxyDisabled || ProxySocks4)" Variant="Variant.Outlined " HelperText="Info: The password is saved unencrypted" />
</MudItem>
<MudItem xs="12">
@@ -150,13 +150,13 @@
<MudFieldSwitch Label="IP Filter" Value="IpFilterEnabled" ValueChanged="IpFilterEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Filter path (.dat, .p2p, .p2b)" Value="IpFilterPath" ValueChanged="IpFilterPathChanged" Disabled="@(!IpFilterEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Filter path (.dat, .p2p, .p2b)" Value="IpFilterPath" ValueChanged="IpFilterPathChanged" Disabled="@(!IpFilterEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Apply to trackers" Value="IpFilterTrackers" ValueChanged="IpFilterTrackersChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Manually banned IP addresses" Value="BannedIPs" ValueChanged="BannedIPsChanged" Lines="5" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Manually banned IP addresses" Value="BannedIPs" ValueChanged="BannedIPsChanged" Lines="5" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>

View File

@@ -9,7 +9,7 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudSelect T="string" Label="Torrent content layout" Value="TorrentContentLayout" ValueChanged="TorrentContentLayoutChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Torrent content layout" Value="TorrentContentLayout" ValueChanged="TorrentContentLayoutChanged" Variant="Variant.Outlined">
<MudSelectItem Value="@("Original")">Original</MudSelectItem>
<MudSelectItem Value="@("Subfolder")">Create subfolder</MudSelectItem>
<MudSelectItem Value="@("NoSubfolder")">Don't create subfolder</MudSelectItem>
@@ -22,7 +22,7 @@
<MudFieldSwitch Label="Do not start the download automatically" Value="StartPausedEnabled" ValueChanged="StartPausedEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudSelect T="string" Label="Torrent stop condition" Value="TorrentStopCondition" ValueChanged="TorrentStopConditionChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Torrent stop condition" Value="TorrentStopCondition" ValueChanged="TorrentStopConditionChanged" Variant="Variant.Outlined">
<MudSelectItem Value="@("None")">None</MudSelectItem>
<MudSelectItem Value="@("MetadataReceived")">Metadata received</MudSelectItem>
<MudSelectItem Value="@("FilesChecked")">Files Checked</MudSelectItem>
@@ -62,25 +62,25 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudSelect T="bool" Label="Default Torrent Management Mode" Value="AutoTmmEnabled" ValueChanged="AutoDeleteModeChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="bool" Label="Default Torrent Management Mode" Value="AutoTmmEnabled" ValueChanged="AutoDeleteModeChanged" Variant="Variant.Outlined">
<MudSelectItem Value="false">Manual</MudSelectItem>
<MudSelectItem Value="true">Automatic</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudSelect T="bool" Label="When Torrent Category changed" Value="TorrentChangedTmmEnabled" ValueChanged="TorrentChangedTmmEnabledChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="bool" Label="When Torrent Category changed" Value="TorrentChangedTmmEnabled" ValueChanged="TorrentChangedTmmEnabledChanged" Variant="Variant.Outlined">
<MudSelectItem Value="true">Relocate torrent</MudSelectItem>
<MudSelectItem Value="false">Switch torrent to Manual Mode</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudSelect T="bool" Label="When Default Save Path changed" Value="SavePathChangedTmmEnabled" ValueChanged="SavePathChangedTmmEnabledChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="bool" Label="When Default Save Path changed" Value="SavePathChangedTmmEnabled" ValueChanged="SavePathChangedTmmEnabledChanged" Variant="Variant.Outlined">
<MudSelectItem Value="true">Relocate affected torrents</MudSelectItem>
<MudSelectItem Value="false">Switch affected torrents to Manual Mode</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12">
<MudSelect T="bool" Label="When Category Save Path changed" Value="CategoryChangedTmmEnabled" ValueChanged="CategoryChangedTmmEnabledChanged" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="bool" Label="When Category Save Path changed" Value="CategoryChangedTmmEnabled" ValueChanged="CategoryChangedTmmEnabledChanged" Variant="Variant.Outlined">
<MudSelectItem Value="true">Relocate affected torrents</MudSelectItem>
<MudSelectItem Value="false">Switch affected torrents to Manual Mode</MudSelectItem>
</MudSelect>
@@ -89,7 +89,7 @@
<MudFieldSwitch Label="Use Subcategories" Value="UseSubcategories" ValueChanged="UseSubcategoriesChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Default Save Path" Value="SavePath" ValueChanged="SavePathChanged" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Default Save Path" Value="SavePath" ValueChanged="SavePathChanged" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudGrid>
@@ -97,7 +97,7 @@
<MudFieldSwitch Label="Keep incomplete torrents in" Value="TempPathEnabled" ValueChanged="TempPathEnabledChanged" />
</MudItem>
<MudItem xs="12" sm="6" md="9">
<MudTextField T="string" Label="Path" Value="TempPath" ValueChanged="TempPathChanged" Disabled="@(!TempPathEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Path" Value="TempPath" ValueChanged="TempPathChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudItem>
@@ -107,7 +107,7 @@
<MudFieldSwitch Label="Copy .torrent files to" Value="ExportDirEnabled" ValueChanged="ExportDirEnabledChanged" />
</MudItem>
<MudItem xs="12" sm="6" md="9">
<MudTextField T="string" Label="Path" Value="ExportDir" ValueChanged="ExportDirChanged" Disabled="@(!TempPathEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Path" Value="ExportDir" ValueChanged="ExportDirChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudItem>
@@ -117,7 +117,7 @@
<MudFieldSwitch Label="Copy .torrent files for finished downloads to" Value="ExportDirFinEnabled" ValueChanged="ExportDirFinEnabledChanged" />
</MudItem>
<MudItem xs="12" sm="6" md="9">
<MudTextField T="string" Label="Path" Value="ExportDirFin" ValueChanged="ExportDirFinChanged" Disabled="@(!TempPathEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Path" Value="ExportDirFin" ValueChanged="ExportDirFinChanged" Disabled="@(!TempPathEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudItem>
@@ -225,7 +225,7 @@
<MudFieldSwitch Label="Excluded file names" Value="ExcludedFileNamesEnabled" ValueChanged="ExcludedFileNamesEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Excluded files names" Value="ExcludedFileNames" ValueChanged="ExcludedFileNamesChanged" Lines="5" Disabled="@(!ExcludedFileNamesEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Excluded files names" Value="ExcludedFileNames" ValueChanged="ExcludedFileNamesChanged" Lines="5" Disabled="@(!ExcludedFileNamesEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -243,13 +243,13 @@
<MudFieldSwitch Label="Email notification upon download completion" Value="MailNotificationEnabled" ValueChanged="MailNotificationEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="From" Value="MailNotificationSender" ValueChanged="MailNotificationSenderChanged" Disabled="@(!MailNotificationEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="From" Value="MailNotificationSender" ValueChanged="MailNotificationSenderChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="To" Value="MailNotificationEmail" ValueChanged="MailNotificationEmailChanged" Disabled="@(!MailNotificationEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="To" Value="MailNotificationEmail" ValueChanged="MailNotificationEmailChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="SMTP server" Value="MailNotificationSmtp" ValueChanged="MailNotificationSmtpChanged" Disabled="@(!MailNotificationEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="SMTP server" Value="MailNotificationSmtp" ValueChanged="MailNotificationSmtpChanged" Disabled="@(!MailNotificationEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="This server requires a secure connection (SSL)" Value="MailNotificationSslEnabled" ValueChanged="MailNotificationSslEnabledChanged" Disabled="@(!MailNotificationEnabled)" />
@@ -258,10 +258,10 @@
<MudFieldSwitch Label="Authentication" Value="MailNotificationAuthEnabled" ValueChanged="MailNotificationAuthEnabledChanged" Disabled="@(!MailNotificationEnabled)" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Username" Value="MailNotificationUsername" ValueChanged="MailNotificationUsernameChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Username" Value="MailNotificationUsername" ValueChanged="MailNotificationUsernameChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Password" Value="MailNotificationPassword" ValueChanged="MailNotificationPasswordChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" InputType="InputType.Password" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Password" Value="MailNotificationPassword" ValueChanged="MailNotificationPasswordChanged" Disabled="@(!(MailNotificationEnabled && MailNotificationAuthEnabled))" InputType="InputType.Password" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -279,13 +279,13 @@
<MudFieldSwitch Label="Run external program on torrent added" Value="AutorunOnTorrentAddedEnabled" ValueChanged="AutorunOnTorrentAddedEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="External program" Value="AutorunOnTorrentAddedProgram" ValueChanged="AutorunOnTorrentAddedProgramChanged" Disabled="@(!AutorunOnTorrentAddedEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="External program" Value="AutorunOnTorrentAddedProgram" ValueChanged="AutorunOnTorrentAddedProgramChanged" Disabled="@(!AutorunOnTorrentAddedEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Run external program on torrent finished" Value="AutorunEnabled" ValueChanged="AutorunEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="External program" Value="AutorunProgram" ValueChanged="AutorunProgramChanged" Disabled="@(!AutorunEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="External program" Value="AutorunProgram" ValueChanged="AutorunProgramChanged" Disabled="@(!AutorunEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudText>Supported parameters (case sensitive):</MudText>

View File

@@ -12,10 +12,10 @@
<MudFieldSwitch Label="Enable fetching RSS feeds" Value="RssProcessingEnabled" ValueChanged="RssProcessingEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Feeds refresh interval" Value="RssRefreshInterval" ValueChanged="RssRefreshIntervalChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
<MudNumericField T="int" Label="Feeds refresh interval" Value="RssRefreshInterval" ValueChanged="RssRefreshIntervalChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="min" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Maximum number of articles per feed" Value="RssMaxArticlesPerFeed" ValueChanged="RssMaxArticlesPerFeedChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Maximum number of articles per feed" Value="RssMaxArticlesPerFeed" ValueChanged="RssMaxArticlesPerFeedChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -51,7 +51,7 @@
<MudFieldSwitch Label="Download REPACK/PROPER episodes" Value="RssDownloadRepackProperEpisodes" ValueChanged="RssDownloadRepackProperEpisodesChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Filters" Value="RssSmartEpisodeFilters" ValueChanged="RssSmartEpisodeFiltersChanged" Lines="5" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Filters" Value="RssSmartEpisodeFilters" ValueChanged="RssSmartEpisodeFiltersChanged" Lines="5" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>

View File

@@ -9,10 +9,10 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudNumericField T="int" Label="Upload" Value="UpLimit" ValueChanged="UpLimitChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="UpLimitValidation" />
<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" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Download" Value="DlLimit" ValueChanged="DlLimitChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="DlLimitValidation" />
<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" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -27,10 +27,10 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudNumericField T="int" Label="Upload" Value="AltUpLimit" ValueChanged="AltUpLimitChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="AltUpLimitValidation" />
<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" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Download" Value="AltDlLimit" ValueChanged="AltDlLimitChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="KiB/s" HelperText="0 means unlimited" Validation="AltDlLimitValidation" />
<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" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Schedule the use of alternative rate limits" Value="SchedulerEnabled" ValueChanged="SchedulerEnabledChanged" />
@@ -42,7 +42,7 @@
<MudTimePicker Label="To" Editable="true" Time="ScheduleTo" TimeChanged="ScheduleToChanged" Disabled="@(!SchedulerEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudSelect T="int" Value="SchedulerDays" ValueChanged="SchedulerDaysChanged" Disabled="@(!SchedulerEnabled)" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Value="SchedulerDays" ValueChanged="SchedulerDaysChanged" Disabled="@(!SchedulerEnabled)" Variant="Variant.Outlined">
<MudSelectItem Value="0">Every day</MudSelectItem>
<MudSelectItem Value="1">Weekdays</MudSelectItem>
<MudSelectItem Value="2">Weekends</MudSelectItem>

View File

@@ -9,10 +9,10 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12" md="8">
<MudTextField T="string" Label="Host" Value="WebUiAddress" ValueChanged="WebUiAddressChanged" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Host" Value="WebUiAddress" ValueChanged="WebUiAddressChanged" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12" md="4">
<MudNumericField T="int" Label="Port" Value="WebUiPort" ValueChanged="WebUiPortChanged" Min="1" Max="@Options.MaxPortValue" ShrinkLabel Variant="Variant.Outlined" Validation="WebUiPortValidation" />
<MudNumericField T="int" Label="Port" Value="WebUiPort" ValueChanged="WebUiPortChanged" Min="1" Max="@Options.MaxPortValue" Variant="Variant.Outlined" Validation="WebUiPortValidation" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Use UPnP / NAT-PMP to forward the port from my router" Value="WebUiUpnp" ValueChanged="WebUiUpnpChanged" />
@@ -33,10 +33,10 @@
<MudFieldSwitch Label="Use HTTPS instead of HTTP" Value="UseHttps" ValueChanged="UseHttpsChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Certificate" Value="WebUiHttpsCertPath" ValueChanged="WebUiHttpsCertPathChanged" Disabled="@(!UseHttps)" ShrinkLabel Variant="Variant.Outlined" Validation="WebUiHttpsCertPathValidation" />
<MudTextField T="string" Label="Certificate" Value="WebUiHttpsCertPath" ValueChanged="WebUiHttpsCertPathChanged" Disabled="@(!UseHttps)" Variant="Variant.Outlined" Validation="WebUiHttpsCertPathValidation" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Key" Value="WebUiHttpsKeyPath" ValueChanged="WebUiHttpsKeyPathChanged" Disabled="@(!UseHttps)" ShrinkLabel Variant="Variant.Outlined" Validation="WebUiHttpsKeyPathValidation" />
<MudTextField T="string" Label="Key" Value="WebUiHttpsKeyPath" ValueChanged="WebUiHttpsKeyPathChanged" Disabled="@(!UseHttps)" Variant="Variant.Outlined" Validation="WebUiHttpsKeyPathValidation" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -51,10 +51,10 @@
<MudCardContent Class="pt-0">
<MudGrid>
<MudItem xs="12">
<MudTextField T="string" Label="Username" Value="WebUiUsername" ValueChanged="WebUiUsernameChanged" ShrinkLabel Variant="Variant.Outlined" Validation="WebUiUsernameValidation" />
<MudTextField T="string" Label="Username" Value="WebUiUsername" ValueChanged="WebUiUsernameChanged" Variant="Variant.Outlined" Validation="WebUiUsernameValidation" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Password" Value="WebUiPassword" ValueChanged="WebUiPasswordChanged" InputType="InputType.Password" ShrinkLabel Variant="Variant.Outlined" Validation="WebUiPasswordValidation" />
<MudTextField T="string" Label="Password" Value="WebUiPassword" ValueChanged="WebUiPasswordChanged" InputType="InputType.Password" Variant="Variant.Outlined" Validation="WebUiPasswordValidation" />
</MudItem>
<MudItem xs="12">
<MudFieldSwitch Label="Bypass authentication for clients on localhost" Value="BypassLocalAuth" ValueChanged="BypassLocalAuthChanged" />
@@ -63,16 +63,16 @@
<MudFieldSwitch Label="Bypass authentication for clients in whitelisted IP subnets" Value="BypassAuthSubnetWhitelistEnabled" ValueChanged="BypassAuthSubnetWhitelistEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Trackers" Value="BypassAuthSubnetWhitelist" ValueChanged="BypassAuthSubnetWhitelistChanged" Lines="5" Disabled="@(!BypassAuthSubnetWhitelistEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Trackers" Value="BypassAuthSubnetWhitelist" ValueChanged="BypassAuthSubnetWhitelistChanged" Lines="5" Disabled="@(!BypassAuthSubnetWhitelistEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Ban client after consecutive failures" Value="WebUiMaxAuthFailCount" ValueChanged="WebUiMaxAuthFailCountChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" />
<MudNumericField T="int" Label="Ban client after consecutive failures" Value="WebUiMaxAuthFailCount" ValueChanged="WebUiMaxAuthFailCountChanged" Min="0" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="ban for" Value="WebUiBanDuration" ValueChanged="WebUiBanDurationChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
<MudNumericField T="int" Label="ban for" Value="WebUiBanDuration" ValueChanged="WebUiBanDurationChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
</MudItem>
<MudItem xs="12">
<MudNumericField T="int" Label="Session timeout" Value="WebUiSessionTimeout" ValueChanged="WebUiSessionTimeoutChanged" Min="0" ShrinkLabel Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
<MudNumericField T="int" Label="Session timeout" Value="WebUiSessionTimeout" ValueChanged="WebUiSessionTimeoutChanged" Min="0" Variant="Variant.Outlined" Adornment="Adornment.End" AdornmentText="seconds" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -90,7 +90,7 @@
<MudFieldSwitch Label="Use alternative Web UI" Value="AlternativeWebuiEnabled" ValueChanged="AlternativeWebuiEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Files location" Value="AlternativeWebuiPath" ValueChanged="AlternativeWebuiPathChanged" ShrinkLabel Variant="Variant.Outlined" Validation="AlternativeWebuiPathValidation" />
<MudTextField T="string" Label="Files location" Value="AlternativeWebuiPath" ValueChanged="AlternativeWebuiPathChanged" Variant="Variant.Outlined" Validation="AlternativeWebuiPathValidation" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -117,7 +117,7 @@
<MudFieldSwitch Label="Enable Host header validation" Value="WebUiHostHeaderValidationEnabled" ValueChanged="WebUiHostHeaderValidationEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -144,7 +144,7 @@
<MudFieldSwitch Label="Enable Host header validation" Value="WebUiHostHeaderValidationEnabled" ValueChanged="WebUiHostHeaderValidationEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Server domains" Value="WebUiDomainList" ValueChanged="WebUiDomainListChanged" Lines="5" Disabled="@(!WebUiHostHeaderValidationEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -162,7 +162,7 @@
<MudFieldSwitch Label="Add custom HTTP headers" Value="WebUiUseCustomHttpHeadersEnabled" ValueChanged="WebUiUseCustomHttpHeadersEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Server domains" Value="WebUiCustomHttpHeaders" ValueChanged="WebUiCustomHttpHeadersChanged" Lines="5" Disabled="@(!WebUiUseCustomHttpHeadersEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Server domains" Value="WebUiCustomHttpHeaders" ValueChanged="WebUiCustomHttpHeadersChanged" Lines="5" Disabled="@(!WebUiUseCustomHttpHeadersEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -180,7 +180,7 @@
<MudFieldSwitch Label="Enable reverse proxy support" Value="WebUiReverseProxyEnabled" ValueChanged="WebUiReverseProxyEnabledChanged" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Trusted proxies list" Value="WebUiReverseProxiesList" ValueChanged="WebUiReverseProxiesListChanged" Lines="5" Disabled="@(!WebUiReverseProxyEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Trusted proxies list" Value="WebUiReverseProxiesList" ValueChanged="WebUiReverseProxiesListChanged" Lines="5" Disabled="@(!WebUiReverseProxyEnabled)" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>
@@ -198,7 +198,7 @@
<MudFieldSwitch Label="Update my dynamic domain name" Value="DyndnsEnabled" ValueChanged="DyndnsEnabledChanged" />
</MudItem>
<MudItem xs="8">
<MudSelect T="int" Value="DyndnsService" ValueChanged="DyndnsServiceChanged" Disabled="@(!DyndnsEnabled)" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="int" Value="DyndnsService" ValueChanged="DyndnsServiceChanged" Disabled="@(!DyndnsEnabled)" Variant="Variant.Outlined">
<MudSelectItem Value="0">DynDNS</MudSelectItem>
<MudSelectItem Value="1">NO-IP</MudSelectItem>
</MudSelect>
@@ -207,13 +207,13 @@
<MudButton OnClick="RegisterDyndnsService" Disabled="@(!DyndnsEnabled)" Variant="Variant.Filled">Register</MudButton>
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Domain name" Value="DyndnsDomain" ValueChanged="DyndnsDomainChanged" Disabled="@(!DyndnsEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Domain name" Value="DyndnsDomain" ValueChanged="DyndnsDomainChanged" Disabled="@(!DyndnsEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Username" Value="DyndnsUsername" ValueChanged="DyndnsUsernameChanged" Disabled="@(!DyndnsEnabled)" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Username" Value="DyndnsUsername" ValueChanged="DyndnsUsernameChanged" Disabled="@(!DyndnsEnabled)" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="12">
<MudTextField T="string" Label="Password" Value="DyndnsPassword" ValueChanged="DyndnsPasswordChanged" Disabled="@(!DyndnsEnabled)" InputType="InputType.Password" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Password" Value="DyndnsPassword" ValueChanged="DyndnsPasswordChanged" Disabled="@(!DyndnsEnabled)" InputType="InputType.Password" Variant="Variant.Outlined" />
</MudItem>
</MudGrid>
</MudCardContent>

View File

@@ -1,53 +1,5 @@
<MudTable
<DynamicTable T="Peer"
ColumnDefinitions="Columns"
Items="Peers"
T="Peer"
Hover="true"
FixedHeader="true"
HeaderClass="table-head-bordered"
Dense="true"
Breakpoint="Breakpoint.None"
Bordered="true"
Square="true"
LoadingProgressColor="Color.Info"
HorizontalScrollbar="true"
Virtualize="true"
AllowUnsorted="false"
SelectOnRowClick="false"
Class="details-list">
<HeaderContent>
@if (ShowFlags)
{
<MudTh>Country/Region</MudTh>
}
<MudTh>IP</MudTh>
<MudTh>Port</MudTh>
<MudTh>Connection</MudTh>
<MudTh>Flags</MudTh>
<MudTh>Client</MudTh>
<MudTh>Progress</MudTh>
<MudTh>Download Speed</MudTh>
<MudTh>Upload Speed</MudTh>
<MudTh>Downloaded</MudTh>
<MudTh>Uploaded</MudTh>
<MudTh>Relevance</MudTh>
<MudTh>Files</MudTh>
</HeaderContent>
<RowTemplate>
@if (ShowFlags)
{
<MudTd DataLabel="Country/Region"><MudImage ObjectFit="ObjectFit.Fill" Src="@($"https://flagcdn.com/20x15/{context.CountryCode}.png")"></MudImage></MudTd>
}
<MudTd DataLabel="IP">@context.IPAddress</MudTd>
<MudTd DataLabel="Port">@context.Port</MudTd>
<MudTd DataLabel="Connection">@context.Connection</MudTd>
<MudTd DataLabel="Flags">@context.Flags</MudTd>
<MudTd DataLabel="Client">@context.Client</MudTd>
<MudTd DataLabel="Progress">@DisplayHelpers.Percentage(context.Progress)</MudTd>
<MudTd DataLabel="Download Speed">@DisplayHelpers.Speed(context.DownloadSpeed)</MudTd>
<MudTd DataLabel="Upload Speed">@DisplayHelpers.Speed(context.UploadSpeed)</MudTd>
<MudTd DataLabel="Downloaded">@DisplayHelpers.Size(context.Downloaded)</MudTd>
<MudTd DataLabel="Uploaded">@DisplayHelpers.Size(context.Uploaded)</MudTd>
<MudTd DataLabel="Relevance">@DisplayHelpers.Percentage(context.Relevance)</MudTd>
<MudTd DataLabel="Files">@context.Files</MudTd>
</RowTemplate>
</MudTable>
MultiSelection="false"
Class="details-list" />

View File

@@ -2,6 +2,8 @@
using Lantean.QBTMudBlade.Models;
using Lantean.QBTMudBlade.Services;
using Microsoft.AspNetCore.Components;
using MudBlazor;
using System.Data;
using System.Net;
namespace Lantean.QBTMudBlade.Components
@@ -123,6 +125,26 @@ namespace Lantean.QBTMudBlade.Components
}
}
protected IEnumerable<ColumnDefinition<Peer>> Columns => ColumnsDefinitions.Where(c => c.Id != "country/region" || _showFlags == true);
public static List<ColumnDefinition<Peer>> ColumnsDefinitions { get; } =
[
new ColumnDefinition<Peer>("Country/Region", p => p.Country),
new ColumnDefinition<Peer>("IP", p => p.IPAddress),
new ColumnDefinition<Peer>("Port", p => p.Port),
new ColumnDefinition<Peer>("Connection", p => p.Connection),
new ColumnDefinition<Peer>("Flags", p => p.Flags),
new ColumnDefinition<Peer>("Client", p => p.Client),
new ColumnDefinition<Peer>("Progress", p => p.Progress, p => DisplayHelpers.Percentage(p.Progress)),
new ColumnDefinition<Peer>("Download Speed", p => p.DownloadSpeed, p => DisplayHelpers.Speed(p.DownloadSpeed)),
new ColumnDefinition<Peer>("Upload Speed", p => p.UploadSpeed, p => DisplayHelpers.Speed(p.UploadSpeed)),
new ColumnDefinition<Peer>("Downloaded", p => p.Downloaded, p => @DisplayHelpers.Size(p.Downloaded)),
new ColumnDefinition<Peer>("Uploaded", p => p.Uploaded, p => @DisplayHelpers.Size(p.Uploaded)),
new ColumnDefinition<Peer>("Relevance", p => p.Relevance, p => @DisplayHelpers.Percentage(p.Relevance)),
new ColumnDefinition<Peer>("Files", p => p.Files, p => p.Files),
];
protected virtual async Task DisposeAsync(bool disposing)
{
if (!_disposedValue)

View File

@@ -1,42 +1,20 @@
<MudTable
T="Lantean.QBitTorrentClient.Models.TorrentTrackers"
Items="Trackers"
Hover="true"
FixedHeader="true"
HeaderClass="table-head-bordered"
Dense="true"
Breakpoint="Breakpoint.None"
Bordered="true"
Square="true"
LoadingProgressColor="Color.Info"
HorizontalScrollbar="true"
Virtualize="true"
AllowUnsorted="false"
SelectOnRowClick="false"
Class="details-list">
<HeaderContent>
<MudTh>Tier</MudTh>
<MudTh>URL</MudTh>
<MudTh>Status</MudTh>
<MudTh>Peers</MudTh>
<MudTh>Seeds</MudTh>
<MudTh>Leeches</MudTh>
<MudTh>Times Downloaded</MudTh>
<MudTh>Message</MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Tier">
@if (context.Tier >= 0)
<ContextMenu @ref="ContextMenu" Dense="true">
<MudMenuItem Icon="@Icons.Material.Filled.AddCircle" IconColor="Color.Info" OnClick="AddTracker">Add trackers</MudMenuItem>
@if (ContextMenuItem is not null)
{
<text>@context.Tier</text>
<MudMenuItem Icon="@Icons.Material.Filled.Edit" IconColor="Color.Info" OnClick="EditTracker">Edit tracker URL</MudMenuItem>
<MudMenuItem Icon="@Icons.Material.Filled.Delete" IconColor="Color.Error" OnClick="RemoveTracker">Remove tracker</MudMenuItem>
<MudMenuItem Icon="@Icons.Material.Filled.FolderCopy" IconColor="Color.Info" OnClick="CopyTrackerUrl">Copy tracker url</MudMenuItem>
}
</MudTd>
<MudTd DataLabel="URL">@context.Url</MudTd>
<MudTd DataLabel="Status">@context.Status</MudTd>
<MudTd DataLabel="Peers">@context.Peers</MudTd>
<MudTd DataLabel="Seeds">@context.Seeds</MudTd>
<MudTd DataLabel="Leeches">@context.Leeches</MudTd>
<MudTd DataLabel="Times Downloaded">@context.Downloads</MudTd>
<MudTd DataLabel="Message">@context.Message</MudTd>
</RowTemplate>
</MudTable>
</ContextMenu>
<DynamicTable T="Lantean.QBitTorrentClient.Models.TorrentTracker"
ColumnDefinitions="Columns"
Items="Trackers"
MultiSelection="false"
PreSorted="true"
SortDirectionChanged="SortDirectionChanged"
SortColumnChanged="SortColumnChanged"
OnTableDataLongPress="TableDataLongPress"
OnTableDataContextMenu="TableDataContextMenu"
Class="details-list" />

View File

@@ -1,7 +1,10 @@
using Lantean.QBitTorrentClient;
using Lantean.QBitTorrentClient.Models;
using Lantean.QBTMudBlade.Interop;
using Lantean.QBTMudBlade.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using MudBlazor;
using System.Net;
namespace Lantean.QBTMudBlade.Components
@@ -11,6 +14,9 @@ namespace Lantean.QBTMudBlade.Components
private readonly CancellationTokenSource _timerCancellationToken = new();
private bool _disposedValue;
private string? _sortColumn;
private SortDirection _sortDirection;
[Parameter, EditorRequired]
public string? Hash { get; set; }
@@ -20,13 +26,25 @@ namespace Lantean.QBTMudBlade.Components
[CascadingParameter(Name = "RefreshInterval")]
public int RefreshInterval { get; set; }
[Inject]
protected IDialogService DialogService { get; set; } = default!;
[Inject]
protected IJSRuntime JSRuntime { get; set; } = default!;
[Inject]
protected IApiClient ApiClient { get; set; } = default!;
[Inject]
protected IDataManager DataManager { get; set; } = default!;
protected IReadOnlyList<TorrentTrackers>? Trackers { get; set; }
protected IReadOnlyList<TorrentTracker>? TrackerList { get; set; }
protected IEnumerable<TorrentTracker>? Trackers => GetTrackers();
protected TorrentTracker? ContextMenuItem { get; set; }
protected ContextMenu? ContextMenu { get; set; }
protected override async Task OnParametersSetAsync()
{
@@ -40,11 +58,125 @@ namespace Lantean.QBTMudBlade.Components
return;
}
Trackers = await ApiClient.GetTorrentTrackers(Hash);
TrackerList = await ApiClient.GetTorrentTrackers(Hash);
await InvokeAsync(StateHasChanged);
}
protected IEnumerable<TorrentTracker>? GetTrackers()
{
if (TrackerList is null)
{
return null;
}
var trackers = TrackerList.Where(t => !IsRealTracker(t)).ToList();
trackers.AddRange(TrackerList.Where(IsRealTracker).OrderByDirection(_sortDirection, GetSortSelector()));
return trackers.AsReadOnly();
}
private static bool IsRealTracker(TorrentTracker torrentTracker)
{
return !torrentTracker.Url.StartsWith("**");
}
private Func<TorrentTracker, object?> GetSortSelector()
{
var sortSelector = ColumnsDefinitions.Find(c => c.Id == _sortColumn)?.SortSelector;
return sortSelector ?? (i => i.Url);
}
protected void SortDirectionChanged(SortDirection sortDirection)
{
_sortDirection = sortDirection;
StateHasChanged();
}
protected void SortColumnChanged(string column)
{
_sortColumn = column;
StateHasChanged();
}
protected Task TableDataContextMenu(TableDataContextMenuEventArgs<TorrentTracker> eventArgs)
{
return ShowContextMenu(eventArgs.Item, eventArgs.MouseEventArgs);
}
protected Task TableDataLongPress(TableDataLongPressEventArgs<TorrentTracker> eventArgs)
{
return ShowContextMenu(eventArgs.Item, eventArgs.LongPressEventArgs);
}
protected async Task ShowContextMenu(TorrentTracker? tracker, EventArgs eventArgs)
{
if (tracker is not null && IsRealTracker(tracker))
{
ContextMenuItem = tracker;
}
else
{
ContextMenuItem = null;
}
if (ContextMenu is null)
{
return;
}
await ContextMenu.ToggleMenuAsync(eventArgs);
}
protected async Task AddTracker()
{
if (Hash is null)
{
return;
}
var trackers = await DialogService.ShowAddTrackersDialog();
if (trackers is null || trackers.Count == 0)
{
return;
}
await ApiClient.AddTrackersToTorrent(Hash, trackers);
}
protected async Task EditTracker()
{
if (Hash is null || ContextMenuItem is null)
{
return;
}
await DialogService.ShowSingleFieldDialog("Edit Tracker", "Tracker URL", ContextMenuItem.Url, async (value) => await ApiClient.EditTracker(Hash, ContextMenuItem.Url, value));
}
protected async Task RemoveTracker()
{
if (Hash is null || ContextMenuItem is null)
{
return;
}
await ApiClient.RemoveTrackers(Hash, [ContextMenuItem.Url]);
}
protected async Task CopyTrackerUrl()
{
if (Hash is null || ContextMenuItem is null)
{
return;
}
await JSRuntime.WriteToClipboard(ContextMenuItem.Url);
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
@@ -57,7 +189,7 @@ namespace Lantean.QBTMudBlade.Components
{
try
{
Trackers = await ApiClient.GetTorrentTrackers(Hash);
TrackerList = await ApiClient.GetTorrentTrackers(Hash);
}
catch (HttpRequestException exception) when (exception.StatusCode == HttpStatusCode.Forbidden || exception.StatusCode == HttpStatusCode.NotFound)
{
@@ -72,6 +204,20 @@ namespace Lantean.QBTMudBlade.Components
}
}
protected IEnumerable<ColumnDefinition<TorrentTracker>> Columns => ColumnsDefinitions;
public static List<ColumnDefinition<TorrentTracker>> ColumnsDefinitions { get; } =
[
new ColumnDefinition<TorrentTracker>("Tier", w => w.Tier, w => w.Tier > 0 ? w.Tier.ToString() : ""),
new ColumnDefinition<TorrentTracker>("URL", w => w.Url),
new ColumnDefinition<TorrentTracker>("Status", w => w.Status),
new ColumnDefinition<TorrentTracker>("Peers", w => w.Peers),
new ColumnDefinition<TorrentTracker>("Seeds", w => w.Seeds),
new ColumnDefinition<TorrentTracker>("Leeches", w => w.Leeches),
new ColumnDefinition<TorrentTracker>("Times Downloaded", w => w.Downloads),
new ColumnDefinition<TorrentTracker>("Message", w => w.Message),
];
protected virtual async Task DisposeAsync(bool disposing)
{
if (!_disposedValue)

View File

@@ -1,23 +1,5 @@
<MudTable
T="Lantean.QBitTorrentClient.Models.WebSeed"
<DynamicTable T="Lantean.QBitTorrentClient.Models.WebSeed"
ColumnDefinitions="Columns"
Items="WebSeeds"
Hover="true"
FixedHeader="true"
HeaderClass="table-head-bordered"
Dense="true"
Breakpoint="Breakpoint.None"
Bordered="true"
Square="true"
LoadingProgressColor="Color.Info"
HorizontalScrollbar="true"
Virtualize="true"
AllowUnsorted="false"
SelectOnRowClick="false"
Class="details-list">
<HeaderContent>
<MudTh>URL</MudTh>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Files">@context.Url</MudTd>
</RowTemplate>
</MudTable>
MultiSelection="false"
Class="details-list" />

View File

@@ -89,5 +89,12 @@ namespace Lantean.QBTMudBlade.Components
await InvokeAsync(StateHasChanged);
}
protected IEnumerable<ColumnDefinition<WebSeed>> Columns => ColumnsDefinitions;
public static List<ColumnDefinition<WebSeed>> ColumnsDefinitions { get; } =
[
new ColumnDefinition<WebSeed>("URL", w => w.Url, w => w.Url),
];
}
}

View File

@@ -157,7 +157,7 @@ namespace Lantean.QBTMudBlade
return updatedCategory.Name;
}
public static async Task<HashSet<string>?> ShowAddTagsDialog(this IDialogService dialogService, IApiClient apiClient)
public static async Task<HashSet<string>?> ShowAddTagsDialog(this IDialogService dialogService)
{
var reference = await dialogService.ShowAsync<AddTagDialog>("Add Tags", NonBlurFormDialogOptions);
var dialogResult = await reference.Result;
@@ -172,6 +172,21 @@ namespace Lantean.QBTMudBlade
return tags;
}
public static async Task<HashSet<string>?> ShowAddTrackersDialog(this IDialogService dialogService)
{
var reference = await dialogService.ShowAsync<AddTrackerDialog>("Add Tags", NonBlurFormDialogOptions);
var dialogResult = await reference.Result;
if (dialogResult is null || dialogResult.Canceled || dialogResult.Data is null)
{
return null;
}
var tags = (HashSet<string>)dialogResult.Data;
return tags;
}
public static async Task<bool> ShowConfirmDialog(this IDialogService dialogService, string title, string content)
{
var parameters = new DialogParameters

View File

@@ -16,7 +16,7 @@
<EditForm Model="Model" OnSubmit="Submit">
<MudGrid>
<MudItem md="10">
<MudTextField T="string" Label="Criteria" @bind-Value="Model.Criteria" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Criteria" @bind-Value="Model.Criteria" Variant="Variant.Outlined" />
</MudItem>
<MudItem md="2">
<MudButton ButtonType="ButtonType.Submit" FullWidth="true" Color="Color.Primary" EndIcon="@Icons.Material.Filled.Search" Variant="Variant.Filled" Class="mt-6">Filter</MudButton>

View File

@@ -16,10 +16,10 @@
<EditForm Model="Model" OnSubmit="Submit">
<MudGrid>
<MudItem md="7">
<MudTextField T="string" Label="Criteria" @bind-Value="Model.Criteria" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Criteria" @bind-Value="Model.Criteria" Variant="Variant.Outlined" />
</MudItem>
<MudItem md="3">
<MudSelect @ref="CategoryMudSelect" T="string" Label="Categories" SelectedValues="Model.SelectedTypes" SelectedValuesChanged="SelectedValuesChanged" ShrinkLabel Variant="Variant.Outlined" MultiSelection="true" MultiSelectionTextFunc="GenerateSelectedText" SelectAll="true">
<MudSelect @ref="CategoryMudSelect" T="string" Label="Categories" SelectedValues="Model.SelectedTypes" SelectedValuesChanged="SelectedValuesChanged" Variant="Variant.Outlined" MultiSelection="true" MultiSelectionTextFunc="GenerateSelectedText" SelectAll="true">
<MudSelectItem Value="@("Normal")">Normal</MudSelectItem>
<MudSelectItem Value="@("Info")">Info</MudSelectItem>
<MudSelectItem Value="@("Warning")">Warning</MudSelectItem>

View File

@@ -16,10 +16,10 @@
<EditForm Model="Model" OnValidSubmit="DoSearch">
<MudGrid>
<MudItem xs="12" md="4">
<MudTextField T="string" Label="Criteria" @bind-Value="Model.SearchText" ShrinkLabel Variant="Variant.Outlined" />
<MudTextField T="string" Label="Criteria" @bind-Value="Model.SearchText" Variant="Variant.Outlined" />
</MudItem>
<MudItem xs="2" md="3">
<MudSelect T="string" Label="Categories" @bind-Value="Model.SelectedCategory" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Categories" @bind-Value="Model.SelectedCategory" Variant="Variant.Outlined">
@foreach (var (value, name) in Categories)
{
<MudSelectItem Value="value">@name</MudSelectItem>
@@ -31,7 +31,7 @@
</MudSelect>
</MudItem>
<MudItem xs="2" md="3">
<MudSelect T="string" Label="Plugins" @bind-Value="Model.SelectedPlugin" ShrinkLabel Variant="Variant.Outlined">
<MudSelect T="string" Label="Plugins" @bind-Value="Model.SelectedPlugin" Variant="Variant.Outlined">
<MudSelectItem Value="@("all")">All</MudSelectItem>
<MudDivider />
@foreach (var (value, name) in Plugins)

View File

@@ -13,8 +13,6 @@
<MudTextField Value="SearchText" TextChanged="SearchTextChanged" Immediate="true" DebounceInterval="1000" Placeholder="Filter torrent list" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" IconSize="Size.Medium" Class="mt-0"></MudTextField>
</MudToolBar>
@* <TorrentActions @ref="ContextMenuActions" RenderType="RenderType.MenuWithoutActivator" Hashes="GetContextMenuTargetHashes()" PrimaryHash="@(ContextMenuItem?.Hash)" /> *@
<ContextMenu @ref="ContextMenu" Dense="true">
<TorrentActions RenderType="RenderType.MenuItems" Hashes="GetContextMenuTargetHashes()" PrimaryHash="@(ContextMenuItem?.Hash)" Torrents="MainData.Torrents" Preferences="Preferences" />
</ContextMenu>

View File

@@ -49,8 +49,6 @@ namespace Lantean.QBTMudBlade.Pages
protected DynamicTable<Torrent>? Table { get; set; }
protected TorrentActions? ContextMenuActions { get; set; }
protected Torrent? ContextMenuItem { get; set; }
protected ContextMenu? ContextMenu { get; set; }
@@ -137,62 +135,11 @@ namespace Lantean.QBTMudBlade.Pages
protected Task TableDataContextMenu(TableDataContextMenuEventArgs<Torrent> eventArgs)
{
return ShowContextMenu(eventArgs.Item, eventArgs.MouseEventArgs);
//return ShowContextMenu(eventArgs.Item, eventArgs.MouseEventArgs.ClientX, eventArgs.MouseEventArgs.ClientY);
}
protected Task TableDataLongPress(TableDataLongPressEventArgs<Torrent> eventArgs)
{
return ShowContextMenu(eventArgs.Item, eventArgs.LongPressEventArgs);
//return ShowContextMenu(eventArgs.Item, eventArgs.LongPressEventArgs.ClientX, eventArgs.LongPressEventArgs.ClientY);
}
protected async Task ShowContextMenu(Torrent? torrent, double x, double y)
{
if (torrent is not null)
{
ContextMenuItem = torrent;
}
await JSRuntime.ClearSelection();
if (ContextMenuActions is null || ContextMenuActions.ActionsMenu is null)
{
return;
}
int? maxHeight = null;
var mainContentSize = await JSRuntime.GetInnerDimensions(".mud-main-content");
var contextMenuHeight = ContextMenuActions.CalculateMenuHeight();
// the bottom position of the window will be rendered off screen
if ((y - 64 + contextMenuHeight) >= (mainContentSize.Height))
{
// adjust the top of the context menu
var overshoot = Math.Abs(mainContentSize.Height - (y + contextMenuHeight));
y -= overshoot;
if (y < 70)
{
y = 70;
}
if ((y - 64 + contextMenuHeight) >= mainContentSize.Height)
{
maxHeight = (int)mainContentSize.Height - (int)y + 64;
}
}
#pragma warning disable BL0005 // Component parameter should not be set outside of its component.
ContextMenuActions.ActionsMenu.MaxHeight = maxHeight;
#pragma warning restore BL0005 // Component parameter should not be set outside of its component.
// emulate mouseeventargs for MudBlazor
var mouseEventArgs = new MouseEventArgs
{
OffsetX = x,
OffsetY = y,
};
await ContextMenuActions.ActionsMenu.OpenMenuAsync(mouseEventArgs);
}
protected async Task ShowContextMenu(Torrent? torrent, EventArgs eventArgs)

View File

@@ -3,6 +3,7 @@ using Lantean.QBitTorrentClient;
using Lantean.QBTMudBlade.Services;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using MudBlazor;
using MudBlazor.Services;
namespace Lantean.QBTMudBlade
@@ -48,6 +49,7 @@ namespace Lantean.QBTMudBlade
builder.Logging.SetMinimumLevel(LogLevel.Error);
#endif
MudGlobal.InputDefaults.ShrinkLabel = true;
await builder.Build().RunAsync();
}
}

View File

@@ -110,31 +110,31 @@ namespace Lantean.QBTMudBlade.Services
return new ServerState();
}
return new ServerState(
serverState.AllTimeDownloaded!.Value,
serverState.AllTimeUploaded!.Value,
serverState.AverageTimeQueue!.Value,
serverState.AllTimeDownloaded.GetValueOrDefault(),
serverState.AllTimeUploaded.GetValueOrDefault(),
serverState.AverageTimeQueue.GetValueOrDefault(),
serverState.ConnectionStatus!,
serverState.DHTNodes!.Value,
serverState.DownloadInfoData!.Value,
serverState.DownloadInfoSpeed!.Value,
serverState.DownloadRateLimit!.Value,
serverState.FreeSpaceOnDisk!.Value,
serverState.GlobalRatio!.Value,
serverState.QueuedIOJobs!.Value,
serverState.Queuing!.Value,
serverState.ReadCacheHits!.Value,
serverState.ReadCacheOverload!.Value,
serverState.RefreshInterval!.Value,
serverState.TotalBuffersSize!.Value,
serverState.TotalPeerConnections!.Value,
serverState.TotalQueuedSize!.Value,
serverState.TotalWastedSession!.Value,
serverState.UploadInfoData!.Value,
serverState.UploadInfoSpeed!.Value,
serverState.UploadRateLimit!.Value,
serverState.UseAltSpeedLimits!.Value,
serverState.UseSubcategories!.Value,
serverState.WriteCacheOverload!.Value);
serverState.DHTNodes.GetValueOrDefault(),
serverState.DownloadInfoData.GetValueOrDefault(),
serverState.DownloadInfoSpeed.GetValueOrDefault(),
serverState.DownloadRateLimit.GetValueOrDefault(),
serverState.FreeSpaceOnDisk.GetValueOrDefault(),
serverState.GlobalRatio.GetValueOrDefault(),
serverState.QueuedIOJobs.GetValueOrDefault(),
serverState.Queuing.GetValueOrDefault(),
serverState.ReadCacheHits.GetValueOrDefault(),
serverState.ReadCacheOverload.GetValueOrDefault(),
serverState.RefreshInterval.GetValueOrDefault(),
serverState.TotalBuffersSize.GetValueOrDefault(),
serverState.TotalPeerConnections.GetValueOrDefault(),
serverState.TotalQueuedSize.GetValueOrDefault(),
serverState.TotalWastedSession.GetValueOrDefault(),
serverState.UploadInfoData.GetValueOrDefault(),
serverState.UploadInfoSpeed.GetValueOrDefault(),
serverState.UploadRateLimit.GetValueOrDefault(),
serverState.UseAltSpeedLimits.GetValueOrDefault(),
serverState.UseSubcategories.GetValueOrDefault(),
serverState.WriteCacheOverload.GetValueOrDefault());
}
public void MergeMainData(QBitTorrentClient.Models.MainData mainData, MainData torrentList)
@@ -469,69 +469,69 @@ namespace Lantean.QBTMudBlade.Services
peer.Connection!,
peer.Country,
peer.CountryCode,
peer.Downloaded!.Value,
peer.DownloadSpeed!.Value,
peer.Downloaded.GetValueOrDefault(),
peer.DownloadSpeed.GetValueOrDefault(),
peer.Files!,
peer.Flags!,
peer.FlagsDescription!,
peer.IPAddress!,
peer.Port!.Value,
peer.Progress!.Value,
peer.Relevance!.Value,
peer.Uploaded!.Value,
peer.UploadSpeed!.Value);
peer.Port.GetValueOrDefault(),
peer.Progress.GetValueOrDefault(),
peer.Relevance.GetValueOrDefault(),
peer.Uploaded.GetValueOrDefault(),
peer.UploadSpeed.GetValueOrDefault());
}
public Torrent CreateTorrent(string hash, QBitTorrentClient.Models.Torrent torrent)
{
return new Torrent(
hash,
torrent.AddedOn!.Value,
torrent.AmountLeft!.Value,
torrent.AutomaticTorrentManagement!.Value,
torrent.Availability!.Value,
torrent.AddedOn.GetValueOrDefault(),
torrent.AmountLeft.GetValueOrDefault(),
torrent.AutomaticTorrentManagement.GetValueOrDefault(),
torrent.Availability.GetValueOrDefault(),
torrent.Category!,
torrent.Completed!.Value,
torrent.CompletionOn!.Value,
torrent.Completed.GetValueOrDefault(),
torrent.CompletionOn.GetValueOrDefault(),
torrent.ContentPath!,
torrent.DownloadLimit!.Value,
torrent.DownloadSpeed!.Value,
torrent.Downloaded!.Value,
torrent.DownloadedSession!.Value,
torrent.EstimatedTimeOfArrival!.Value,
torrent.FirstLastPiecePriority!.Value,
torrent.ForceStart!.Value,
torrent.DownloadLimit.GetValueOrDefault(),
torrent.DownloadSpeed.GetValueOrDefault(),
torrent.Downloaded.GetValueOrDefault(),
torrent.DownloadedSession.GetValueOrDefault(),
torrent.EstimatedTimeOfArrival.GetValueOrDefault(),
torrent.FirstLastPiecePriority.GetValueOrDefault(),
torrent.ForceStart.GetValueOrDefault(),
torrent.InfoHashV1!,
torrent.InfoHashV2!,
torrent.LastActivity!.Value,
torrent.LastActivity.GetValueOrDefault(),
torrent.MagnetUri!,
torrent.MaxRatio!.Value,
torrent.MaxSeedingTime!.Value,
torrent.MaxRatio.GetValueOrDefault(),
torrent.MaxSeedingTime.GetValueOrDefault(),
torrent.Name!,
torrent.NumberComplete!.Value,
torrent.NumberIncomplete!.Value,
torrent.NumberLeeches!.Value,
torrent.NumberSeeds!.Value,
torrent.Priority!.Value,
torrent.Progress!.Value,
torrent.Ratio!.Value,
torrent.RatioLimit!.Value,
torrent.NumberComplete.GetValueOrDefault(),
torrent.NumberIncomplete.GetValueOrDefault(),
torrent.NumberLeeches.GetValueOrDefault(),
torrent.NumberSeeds.GetValueOrDefault(),
torrent.Priority.GetValueOrDefault(),
torrent.Progress.GetValueOrDefault(),
torrent.Ratio.GetValueOrDefault(),
torrent.RatioLimit.GetValueOrDefault(),
torrent.SavePath!,
torrent.SeedingTime!.Value,
torrent.SeedingTimeLimit!.Value,
torrent.SeenComplete!.Value,
torrent.SequentialDownload!.Value,
torrent.Size!.Value,
torrent.SeedingTime.GetValueOrDefault(),
torrent.SeedingTimeLimit.GetValueOrDefault(),
torrent.SeenComplete.GetValueOrDefault(),
torrent.SequentialDownload.GetValueOrDefault(),
torrent.Size.GetValueOrDefault(),
torrent.State!,
torrent.SuperSeeding!.Value,
torrent.SuperSeeding.GetValueOrDefault(),
torrent.Tags!,
torrent.TimeActive!.Value,
torrent.TotalSize!.Value,
torrent.TimeActive.GetValueOrDefault(),
torrent.TotalSize.GetValueOrDefault(),
torrent.Tracker!,
torrent.UploadLimit!.Value,
torrent.Uploaded!.Value,
torrent.UploadedSession!.Value,
torrent.UploadSpeed!.Value,
torrent.UploadLimit.GetValueOrDefault(),
torrent.Uploaded.GetValueOrDefault(),
torrent.UploadedSession.GetValueOrDefault(),
torrent.UploadSpeed.GetValueOrDefault(),
torrent.Reannounce ?? 0);
}

View File

@@ -5,14 +5,10 @@
- Rename multiple files dialog
- RSS feeds and dialogs
- About
- Context Menu component
- Context menu for files list, filter (categories, tags & trackers)
- Context menu for files list/trackers list/peers list
- Tag management page
- Category management page
- Update all tables to use DynamicTable
- WebSeeds
- Trackers
- Peers
- Log
- Blocks
- Search

View File

@@ -357,13 +357,13 @@ namespace Lantean.QBitTorrentClient
return await GetJson<TorrentProperties>(response.Content);
}
public async Task<IReadOnlyList<TorrentTrackers>> GetTorrentTrackers(string hash)
public async Task<IReadOnlyList<TorrentTracker>> GetTorrentTrackers(string hash)
{
var response = await _httpClient.GetAsync($"torrents/trackers?hash={hash}");
response.EnsureSuccessStatusCode();
return await GetJsonList<TorrentTrackers>(response.Content);
return await GetJsonList<TorrentTracker>(response.Content);
}
public async Task<IReadOnlyList<WebSeed>> GetTorrentWebSeeds(string hash)

View File

@@ -78,7 +78,7 @@ namespace Lantean.QBitTorrentClient
Task<TorrentProperties> GetTorrentProperties(string hash);
Task<IReadOnlyList<TorrentTrackers>> GetTorrentTrackers(string hash);
Task<IReadOnlyList<TorrentTracker>> GetTorrentTrackers(string hash);
Task<IReadOnlyList<WebSeed>> GetTorrentWebSeeds(string hash);

View File

@@ -209,7 +209,7 @@ namespace Lantean.QBitTorrentClient
return _apiClient.GetTorrentProperties(hash);
}
public Task<IReadOnlyList<TorrentTrackers>> GetTorrentTrackers(string hash)
public Task<IReadOnlyList<TorrentTracker>> GetTorrentTrackers(string hash)
{
return _apiClient.GetTorrentTrackers(hash);
}

View File

@@ -2,10 +2,10 @@
namespace Lantean.QBitTorrentClient.Models
{
public record TorrentTrackers
public record TorrentTracker
{
[JsonConstructor]
public TorrentTrackers(
public TorrentTracker(
string url,
TrackerStatus status,
int tier,