Browse Source

more settings updates (#2111)

* update logging settings layout

* update hdhomerun settings layout

* update scanner settings layout

* update playout settings layout

* update xmltv settings layout

* update changelog
pull/2112/head
Jason Dove 1 month ago committed by GitHub
parent
commit
93afcd2f57
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      CHANGELOG.md
  2. 42
      ErsatzTV/Pages/Settings/HDHRSettings.razor
  3. 75
      ErsatzTV/Pages/Settings/LoggingSettings.razor
  4. 52
      ErsatzTV/Pages/Settings/PlayoutSettings.razor
  5. 37
      ErsatzTV/Pages/Settings/ScannerSettings.razor
  6. 47
      ErsatzTV/Pages/Settings/XMLTVSettings.razor

2
CHANGELOG.md

@ -72,7 +72,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Remove some limits on multithreading that are no longer needed with latest ffmpeg - Remove some limits on multithreading that are no longer needed with latest ffmpeg
- Mixed transcoding (software decode, hardware filters/encode) can now use multiple decode threads - Mixed transcoding (software decode, hardware filters/encode) can now use multiple decode threads
- Split main `Settings` page into multiple pages - Split main `Settings` page into multiple pages
- Rework `FFmpeg Settings` layout to be less cramped and to work better on mobile - Update layout on all new settings pages to be less cramped and to work better on mobile
### Fixed ### Fixed
- Fix QSV acceleration in docker with older Intel devices - Fix QSV acceleration in docker with older Intel devices

42
ErsatzTV/Pages/Settings/HDHRSettings.razor

@ -1,37 +1,41 @@
@page "/settings/hdhr" @page "/settings/hdhr"
@using ErsatzTV.Annotations
@using ErsatzTV.Application.HDHR @using ErsatzTV.Application.HDHR
@implements IDisposable @implements IDisposable
@inject IMediator Mediator @inject IMediator Mediator
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject ILogger<HDHRSettings> Logger @inject ILogger<HDHRSettings> Logger
<MudForm @bind-IsValid="@_hdhrSuccess" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Disabled="@(!_hdhrSuccess)" OnClick="@(_ => SaveHDHRSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudCard Style="width: 350px"> <MudText Typo="Typo.h5" Class="mb-2">HDHomeRun</MudText>
<MudCardHeader> <MudDivider Class="mb-6" />
<CardHeaderContent> <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<MudText Typo="Typo.h6">HDHomeRun Settings</MudText> <div class="d-flex justify-md-end">
</CardHeaderContent> <MudText>UUID</MudText>
</MudCardHeader> </div>
<MudCardContent> <MudTextField @bind-Value="_uuid" Disabled="true" />
<MudTextField T="Guid" Label="UUID" @bind-Value="_uuid" ReadOnly="true" Disabled="true"/> </MudStack>
</MudCardContent> <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<MudCardContent> <div class="d-flex justify-md-end">
<MudForm @bind-IsValid="@_hdhrSuccess"> <MudText>Tuner Count</MudText>
<MudTextField T="int" Label="Tuner Count" @bind-Value="_tunerCount" Validation="@(new Func<int, string>(ValidateTunerCount))" Required="true" RequiredError="Tuner count is required!"/> </div>
</MudForm> <MudTextField @bind-Value="_tunerCount" Validation="@(new Func<int, string>(ValidateTunerCount))" Required="true" RequiredError="Tuner count is required!" />
</MudCardContent> </MudStack>
<MudCardActions>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Disabled="@(!_hdhrSuccess)" OnClick="@(_ => SaveHDHRSettings())">Save Settings</MudButton>
</MudCardActions>
</MudCard>
</MudContainer> </MudContainer>
</div>
</MudForm>
@code { @code {
private readonly CancellationTokenSource _cts = new(); private readonly CancellationTokenSource _cts = new();
private bool _hdhrSuccess; private bool _hdhrSuccess;
private int _tunerCount; private int _tunerCount;
private Guid _uuid; [UsedImplicitly] private Guid _uuid;
public void Dispose() public void Dispose()
{ {

75
ErsatzTV/Pages/Settings/LoggingSettings.razor

@ -6,69 +6,72 @@
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject ILogger<LoggingSettings> Logger @inject ILogger<LoggingSettings> Logger
<MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveLoggingSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudCard Style="width: 350px"> <MudText Typo="Typo.h5" Class="mb-2">Logging</MudText>
<MudCardHeader> <MudDivider Class="mb-6" />
<CardHeaderContent> <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<MudText Typo="Typo.h6">Logging Settings</MudText> <div class="d-flex justify-md-end">
</CardHeaderContent> <MudText>Default Minimum Log Level</MudText>
</MudCardHeader> </div>
<MudCardContent> <MudSelect @bind-Value="_loggingSettings.DefaultMinimumLogLevel">
<MudForm>
<MudSelect Class="mt-3"
Label="Default Minimum Log Level"
@bind-Value="_loggingSettings.DefaultMinimumLogLevel"
For="@(() => _loggingSettings.DefaultMinimumLogLevel)">
<MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem>
</MudSelect> </MudSelect>
<MudSelect Class="mt-3" </MudStack>
Label="Scanning Minimum Log Level" <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
@bind-Value="_loggingSettings.ScanningMinimumLogLevel" <div class="d-flex justify-md-end">
For="@(() => _loggingSettings.ScanningMinimumLogLevel)"> <MudText>Scanning Minimum Log Level</MudText>
</div>
<MudSelect @bind-Value="_loggingSettings.ScanningMinimumLogLevel">
<MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem>
</MudSelect> </MudSelect>
<MudSelect Class="mt-3" </MudStack>
Label="Scheduling Minimum Log Level" <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
@bind-Value="_loggingSettings.SchedulingMinimumLogLevel" <div class="d-flex justify-md-end">
For="@(() => _loggingSettings.SchedulingMinimumLogLevel)"> <MudText>Scheduling Minimum Log Level</MudText>
</div>
<MudSelect @bind-Value="_loggingSettings.SchedulingMinimumLogLevel">
<MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem>
</MudSelect> </MudSelect>
<MudSelect Class="mt-3" </MudStack>
Label="Streaming Minimum Log Level" <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
@bind-Value="_loggingSettings.StreamingMinimumLogLevel" <div class="d-flex justify-md-end">
For="@(() => _loggingSettings.StreamingMinimumLogLevel)"> <MudText>Streaming Minimum Log Level</MudText>
</div>
<MudSelect @bind-Value="_loggingSettings.StreamingMinimumLogLevel">
<MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem>
</MudSelect> </MudSelect>
<MudSelect Class="mt-3" </MudStack>
Label="Request Logging Minimum Log Level" <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
@bind-Value="_loggingSettings.HttpMinimumLogLevel" <div class="d-flex justify-md-end">
For="@(() => _loggingSettings.HttpMinimumLogLevel)"> <MudText>Request Logging Minimum Log Level</MudText>
</div>
<MudSelect @bind-Value="_loggingSettings.HttpMinimumLogLevel">
<MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Debug">Debug</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Information">Information</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Warning">Warning</MudSelectItem>
<MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem> <MudSelectItem Value="@LogEventLevel.Error">Error</MudSelectItem>
</MudSelect> </MudSelect>
</MudForm> </MudStack>
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveLoggingSettings())" StartIcon="@Icons.Material.Filled.Save">
Save Settings
</MudButton>
</MudCardActions>
</MudCard>
</MudContainer> </MudContainer>
</div>
</MudForm>
@code { @code {
private readonly CancellationTokenSource _cts = new(); private readonly CancellationTokenSource _cts = new();

52
ErsatzTV/Pages/Settings/PlayoutSettings.razor

@ -5,37 +5,31 @@
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject ILogger<PlayoutSettings> Logger @inject ILogger<PlayoutSettings> Logger
<MudForm @bind-IsValid="@_playoutSuccess" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Disabled="@(!_playoutSuccess)" OnClick="@(_ => SavePlayoutSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudCard Style="width: 350px"> <MudText Typo="Typo.h5" Class="mb-2">Playout</MudText>
<MudCardHeader> <MudDivider Class="mb-6" />
<CardHeaderContent> <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<MudText Typo="Typo.h6">Playout Settings</MudText> <div class="d-flex justify-md-end">
</CardHeaderContent> <MudText>Days To Build</MudText>
</MudCardHeader> </div>
<MudCardContent> <MudTextField @bind-Value="_playoutSettings.DaysToBuild" Validation="@(new Func<int, string>(ValidatePlayoutDaysToBuild))" Required="true" RequiredError="Playout days to build is required!" Adornment="Adornment.End" AdornmentText="days" />
<MudForm @bind-IsValid="@_playoutSuccess"> </MudStack>
<MudTextField T="int" <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
Label="Days To Build" <div class="d-flex justify-md-end">
@bind-Value="_playoutSettings.DaysToBuild" <MudText>Skip Missing Items</MudText>
Validation="@(new Func<int, string>(ValidatePlayoutDaysToBuild))" </div>
Required="true" <MudCheckBox @bind-Value="_playoutSettings.SkipMissingItems" Dense="true">
RequiredError="Playout days to build is required!" <MudText Typo="Typo.caption" Style="font-weight: normal">Controls whether file-not-found or unavailable items should be included in playouts</MudText>
Adornment="Adornment.End" </MudCheckBox>
AdornmentText="Days"/> </MudStack>
<MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="Controls whether file-not-found or unavailable items should be included in playouts">
<MudCheckBox Label="Skip Missing Items"
@bind-Value="_playoutSettings.SkipMissingItems"
For="@(() => _playoutSettings.SkipMissingItems)"/>
</MudTooltip>
</MudElement>
</MudForm>
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Disabled="@(!_playoutSuccess)" OnClick="@(_ => SavePlayoutSettings())">Save Settings</MudButton>
</MudCardActions>
</MudCard>
</MudContainer> </MudContainer>
</div>
</MudForm>
@code { @code {
private readonly CancellationTokenSource _cts = new(); private readonly CancellationTokenSource _cts = new();

37
ErsatzTV/Pages/Settings/ScannerSettings.razor

@ -5,30 +5,23 @@
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject ILogger<ScannerSettings> Logger @inject ILogger<ScannerSettings> Logger
<MudForm @bind-IsValid="@_scannerSuccess" Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Disabled="@(!_scannerSuccess)" OnClick="@(_ => SaveScannerSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudCard Style="width: 350px"> <MudText Typo="Typo.h5" Class="mb-2">Scanner</MudText>
<MudCardHeader> <MudDivider Class="mb-6" />
<CardHeaderContent> <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<MudText Typo="Typo.h6">Scanner Settings</MudText> <div class="d-flex justify-md-end">
</CardHeaderContent> <MudText>Library Refresh Interval</MudText>
</MudCardHeader> </div>
<MudCardContent> <MudTextField @bind-Value="_libraryRefreshInterval" Validation="@(new Func<int, string>(ValidateLibraryRefreshInterval))" Required="true" RequiredError="Library refresh interval is required!" Adornment="Adornment.End" AdornmentText="hours" />
<MudForm @bind-IsValid="@_scannerSuccess"> </MudStack>
<MudTextField T="int"
Label="Library Refresh Interval"
@bind-Value="_libraryRefreshInterval"
Validation="@(new Func<int, string>(ValidateLibraryRefreshInterval))"
Required="true"
RequiredError="Library refresh interval is required!"
Adornment="Adornment.End"
AdornmentText="Hours"/>
</MudForm>
</MudCardContent>
<MudCardActions>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Disabled="@(!_scannerSuccess)" OnClick="@(_ => SaveScannerSettings())">Save Settings</MudButton>
</MudCardActions>
</MudCard>
</MudContainer> </MudContainer>
</div>
</MudForm>
@code { @code {
private readonly CancellationTokenSource _cts = new(); private readonly CancellationTokenSource _cts = new();

47
ErsatzTV/Pages/Settings/XMLTVSettings.razor

@ -5,37 +5,32 @@
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject ILogger<XMLTVSettings> Logger @inject ILogger<XMLTVSettings> Logger
<MudForm Style="max-height: 100%">
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveXmltvSettings())" Class="ml-8" StartIcon="@Icons.Material.Filled.Save">Save Settings</MudButton>
</MudPaper>
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudCard Style="width: 350px"> <MudText Typo="Typo.h5" Class="mb-2">XMLTV</MudText>
<MudCardHeader> <MudDivider Class="mb-6" />
<CardHeaderContent> <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<MudText Typo="Typo.h6">XMLTV Settings</MudText> <div class="d-flex justify-md-end">
</CardHeaderContent> <MudText>Days To Build</MudText>
</MudCardHeader> </div>
<MudCardContent> <MudTextField @bind-Value="_xmltvSettings.DaysToBuild" Validation="@(new Func<int, string>(ValidateXmltvDaysToBuild))" Required="true" RequiredError="XMLTV days to build is required!" Adornment="Adornment.End" AdornmentText="days" />
<MudTextField T="int" </MudStack>
Label="Days To Build" <MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
@bind-Value="_xmltvSettings.DaysToBuild" <div class="d-flex justify-md-end">
Validation="@(new Func<int, string>(ValidateXmltvDaysToBuild))" <MudText>XMLTV Time Zone</MudText>
Required="true" </div>
RequiredError="XMLTV days to build is required!" <MudSelect @bind-Value="_xmltvSettings.TimeZone">
Adornment="Adornment.End"
AdornmentText="Days"/>
<MudSelect Class="mt-3"
Label="XMLTV Time Zone"
@bind-Value="_xmltvSettings.TimeZone"
For="@(() => _xmltvSettings.TimeZone)">
<MudSelectItem Value="@XmltvTimeZone.Local">Local</MudSelectItem> <MudSelectItem Value="@XmltvTimeZone.Local">Local</MudSelectItem>
<MudSelectItem Value="@XmltvTimeZone.Utc">UTC</MudSelectItem> <MudSelectItem Value="@XmltvTimeZone.Utc">UTC</MudSelectItem>
</MudSelect> </MudSelect>
</MudCardContent> </MudStack>
<MudCardActions>
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveXmltvSettings())" StartIcon="@Icons.Material.Filled.Save">
Save Settings
</MudButton>
</MudCardActions>
</MudCard>
</MudContainer> </MudContainer>
</div>
</MudForm>
@code { @code {
private readonly CancellationTokenSource _cts = new(); private readonly CancellationTokenSource _cts = new();

Loading…
Cancel
Save