add global and channel watermark overrides (#260)

* add global watermark setting

* add channel watermark override

* update changelog
This commit is contained in:
Jason Dove
2021-06-13 21:45:52 -05:00
committed by GitHub
parent e69569ea46
commit a0740de972
23 changed files with 313 additions and 77 deletions
+71
View File
@@ -68,6 +68,37 @@
<div style="padding-bottom: 16px; padding-top: 20px;">
<MudText Typo="Typo.h6">Watermark Settings</MudText>
</div>
<MudGrid Class="mt-3" Style="align-items: center" Justify="Justify.Center">
<MudItem xs="6">
<InputFile id="watermarkFileInput" OnChange="UploadWatermark" hidden/>
@if (!string.IsNullOrWhiteSpace(_model.Watermark))
{
<MudElement HtmlTag="img" src="@($"artwork/watermarks/{_model.Watermark}")" Style="max-height: 50px"/>
}
</MudItem>
<MudItem xs="6">
@if (string.IsNullOrWhiteSpace(_model.Watermark))
{
<MudButton Class="ml-auto" HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.CloudUpload"
for="watermarkFileInput">
Upload Watermark
</MudButton>
}
else
{
<MudButton Class="ml-auto" HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Error"
StartIcon="@Icons.Material.Filled.DeleteForever"
OnClick="DeleteWatermark">
Delete Watermark
</MudButton>
}
</MudItem>
</MudGrid>
<MudSelect Class="mt-3" Label="Mode" @bind-Value="_model.WatermarkMode"
For="@(() => _model.WatermarkMode)"
Disabled="@(_model.StreamingMode == StreamingMode.HttpLiveStreamingDirect)">
@@ -194,6 +225,7 @@
_model.StreamingMode = channelViewModel.StreamingMode;
_model.PreferredLanguageCode = channelViewModel.PreferredLanguageCode;
_model.WatermarkMode = channelViewModel.WatermarkMode;
_model.Watermark = channelViewModel.Watermark;
_model.WatermarkLocation = channelViewModel.WatermarkLocation;
_model.WatermarkSize = channelViewModel.WatermarkSize;
_model.WatermarkWidth = channelViewModel.WatermarkWidth;
@@ -218,6 +250,7 @@
_model.FFmpegProfileId = ffmpegSettings.DefaultFFmpegProfileId;
_model.StreamingMode = StreamingMode.TransportStream;
_model.WatermarkMode = ChannelWatermarkMode.None;
_model.Watermark = string.Empty;
_model.WatermarkLocation = ChannelWatermarkLocation.BottomRight;
_model.WatermarkSize = ChannelWatermarkSize.Scaled;
_model.WatermarkWidth = 15;
@@ -289,5 +322,43 @@
_logger.LogError("Unexpected error saving channel logo: {Error}", ex.Message);
}
}
private async Task UploadWatermark(InputFileChangeEventArgs e)
{
try
{
var buffer = new byte[e.File.Size];
await e.File.OpenReadStream(maxAllowedSize: 10 * 1024 * 1024).ReadAsync(buffer);
Either<BaseError, string> maybeCacheFileName = await _mediator
.Send(new SaveArtworkToDisk(buffer, ArtworkKind.Watermark));
maybeCacheFileName.Match(
relativeFileName =>
{
_model.Watermark = relativeFileName;
StateHasChanged();
},
error =>
{
_snackbar.Add($"Unexpected error saving watermark: {error.Value}", Severity.Error);
_logger.LogError("Unexpected error saving watermark: {Error}", error.Value);
});
}
catch (IOException)
{
_snackbar.Add("Watermark exceeds maximum allowed file size of 10 MB", Severity.Error);
_logger.LogError("Watermark exceeds maximum allowed file size of 10 MB");
}
catch (Exception ex)
{
_snackbar.Add($"Unexpected error saving watermark: {ex.Message}", Severity.Error);
_logger.LogError("Unexpected error saving watermark: {Error}", ex.Message);
}
}
private void DeleteWatermark()
{
_model.Watermark = null;
StateHasChanged();
}
}
+70
View File
@@ -9,6 +9,7 @@
@using ErsatzTV.Application.Configuration.Queries
@using Unit = LanguageExt.Unit
@using ErsatzTV.Application.Configuration.Commands
@using ErsatzTV.Application.Images.Commands
@inject IMediator _mediator
@inject ISnackbar _snackbar
@inject ILogger<Settings> _logger
@@ -46,6 +47,37 @@
Color="Color.Primary"
@bind-Checked="@_ffmpegSettings.SaveReports"/>
</MudElement>
<MudGrid Class="mt-3" Style="align-items: center" Justify="Justify.Center">
<MudItem xs="6">
<InputFile id="fileInput" OnChange="UploadWatermark" hidden/>
@if (!string.IsNullOrWhiteSpace(_ffmpegSettings.Watermark))
{
<MudElement HtmlTag="img" src="@($"artwork/watermarks/{_ffmpegSettings.Watermark}")" Style="max-height: 50px"/>
}
</MudItem>
<MudItem xs="6">
@if (string.IsNullOrWhiteSpace(_ffmpegSettings.Watermark))
{
<MudButton Class="ml-auto" HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Material.Filled.CloudUpload"
for="fileInput">
Upload Watermark
</MudButton>
}
else
{
<MudButton Class="ml-auto" HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Error"
StartIcon="@Icons.Material.Filled.DeleteForever"
OnClick="DeleteWatermark">
Delete Watermark
</MudButton>
}
</MudItem>
</MudGrid>
</MudForm>
</MudCardContent>
<MudCardActions>
@@ -158,5 +190,43 @@
},
Right: _ => _snackbar.Add("Successfully saved scanner settings", Severity.Success));
}
private async Task UploadWatermark(InputFileChangeEventArgs e)
{
try
{
var buffer = new byte[e.File.Size];
await e.File.OpenReadStream(maxAllowedSize: 10 * 1024 * 1024).ReadAsync(buffer);
Either<BaseError, string> maybeCacheFileName = await _mediator
.Send(new SaveArtworkToDisk(buffer, ArtworkKind.Watermark));
maybeCacheFileName.Match(
relativeFileName =>
{
_ffmpegSettings.Watermark = relativeFileName;
StateHasChanged();
},
error =>
{
_snackbar.Add($"Unexpected error saving watermark: {error.Value}", Severity.Error);
_logger.LogError("Unexpected error saving watermark: {Error}", error.Value);
});
}
catch (IOException)
{
_snackbar.Add("Watermark exceeds maximum allowed file size of 10 MB", Severity.Error);
_logger.LogError("Watermark exceeds maximum allowed file size of 10 MB");
}
catch (Exception ex)
{
_snackbar.Add($"Unexpected error saving watermark: {ex.Message}", Severity.Error);
_logger.LogError("Unexpected error saving watermark: {Error}", ex.Message);
}
}
private void DeleteWatermark()
{
_ffmpegSettings.Watermark = null;
StateHasChanged();
}
}