Browse Source

allow multiple watermarks in playback troubleshooting

pull/2280/head
Jason Dove 2 days ago
parent
commit
9f96527205
No known key found for this signature in database
  1. 1
      CHANGELOG.md
  2. 2
      ErsatzTV.Application/Troubleshooting/Commands/ArchiveTroubleshootingResults.cs
  3. 2
      ErsatzTV.Application/Troubleshooting/Commands/PrepareTroubleshootingPlayback.cs
  4. 10
      ErsatzTV.Application/Troubleshooting/Commands/PrepareTroubleshootingPlaybackHandler.cs
  5. 6
      ErsatzTV/Controllers/Api/TroubleshootController.cs
  6. 40
      ErsatzTV/Pages/PlaybackTroubleshooting.razor

1
CHANGELOG.md

@ -26,6 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -26,6 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed
- Allow multiple watermarks on a single playout item
- Allow multiple watermarks in playback troubleshooting
- YAML playout: `watermark` instruction changes:
- When value is `true`, will add named watermark to list of active watermarks
- When value is `false` and `name` is specified, will remove named watermark from list of active watermarks

2
ErsatzTV.Application/Troubleshooting/Commands/ArchiveTroubleshootingResults.cs

@ -3,6 +3,6 @@ namespace ErsatzTV.Application.Troubleshooting; @@ -3,6 +3,6 @@ namespace ErsatzTV.Application.Troubleshooting;
public record ArchiveTroubleshootingResults(
int MediaItemId,
int FFmpegProfileId,
int WatermarkId,
List<int> WatermarkIds,
bool StartFromBeginning)
: IRequest<Option<string>>;

2
ErsatzTV.Application/Troubleshooting/Commands/PrepareTroubleshootingPlayback.cs

@ -6,7 +6,7 @@ namespace ErsatzTV.Application.Troubleshooting; @@ -6,7 +6,7 @@ namespace ErsatzTV.Application.Troubleshooting;
public record PrepareTroubleshootingPlayback(
int MediaItemId,
int FFmpegProfileId,
int WatermarkId,
List<int> WatermarkIds,
int? SubtitleId,
bool StartFromBeginning)
: IRequest<Either<BaseError, PlayoutItemResult>>;

10
ErsatzTV.Application/Troubleshooting/Commands/PrepareTroubleshootingPlaybackHandler.cs

@ -1,4 +1,3 @@ @@ -1,4 +1,3 @@
using CliWrap;
using Dapper;
using ErsatzTV.Core;
using ErsatzTV.Core.Domain;
@ -79,10 +78,13 @@ public class PrepareTroubleshootingPlaybackHandler( @@ -79,10 +78,13 @@ public class PrepareTroubleshootingPlaybackHandler(
}
List<ChannelWatermark> watermarks = [];
if (request.WatermarkId > 0)
if (request.WatermarkIds.Count > 0)
{
watermarks.AddRange(await dbContext.ChannelWatermarks
.SelectOneAsync(cw => cw.Id, cw => cw.Id == request.WatermarkId));
var channelWatermarks = await dbContext.ChannelWatermarks
.Where(w => request.WatermarkIds.Contains(w.Id))
.ToListAsync();
watermarks.AddRange(channelWatermarks);
}
DateTimeOffset now = DateTimeOffset.Now;

6
ErsatzTV/Controllers/Api/TroubleshootController.cs

@ -27,7 +27,7 @@ public class TroubleshootController( @@ -27,7 +27,7 @@ public class TroubleshootController(
[FromQuery]
int ffmpegProfile,
[FromQuery]
int watermark,
List<int> watermark,
[FromQuery]
int? subtitleId,
[FromQuery]
@ -63,7 +63,7 @@ public class TroubleshootController( @@ -63,7 +63,7 @@ public class TroubleshootController(
troubleshootingInfo.FFmpegProfiles.RemoveAll(p => p.Id != ffmpegProfile);
// filter watermarks
troubleshootingInfo.Watermarks.RemoveAll(p => p.Id != watermark);
troubleshootingInfo.Watermarks.RemoveAll(p => !watermark.Contains(p.Id));
await channelWriter.WriteAsync(
new StartTroubleshootingPlayback(sessionId, playoutItemResult, mediaInfo,
@ -113,7 +113,7 @@ public class TroubleshootController( @@ -113,7 +113,7 @@ public class TroubleshootController(
[FromQuery]
int ffmpegProfile,
[FromQuery]
int watermark,
List<int> watermark,
[FromQuery]
bool startFromBeginning,
CancellationToken cancellationToken)

40
ErsatzTV/Pages/PlaybackTroubleshooting.razor

@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
Class="ml-6"
StartIcon="@Icons.Material.Filled.Download"
Disabled="@(!_hasPlayed || Locker.IsTroubleshootingPlaybackLocked())"
OnClick="DownloadResults">
OnClick="@DownloadResults">
Download Results
</MudButton>
</MudPaper>
@ -56,13 +56,12 @@ @@ -56,13 +56,12 @@
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Watermark</MudText>
<MudText>Watermarks</MudText>
</div>
<MudSelect @bind-Value="_watermarkId" For="@(() => _watermarkId)" Clearable="true">
<MudSelectItem T="int?" Value="@((int?)null)">(none)</MudSelectItem>
<MudSelect T="string" @bind-SelectedValues="_watermarkNames" Clearable="true" MultiSelection="true">
@foreach (WatermarkViewModel watermark in _watermarks)
{
<MudSelectItem T="int?" Value="@watermark.Id">@watermark.Name</MudSelectItem>
<MudSelectItem T="string" Value="@watermark.Name">@watermark.Name</MudSelectItem>
}
</MudSelect>
</MudStack>
@ -119,12 +118,12 @@ @@ -119,12 +118,12 @@
@code {
private readonly CancellationTokenSource _cts = new();
private List<FFmpegProfileViewModel> _ffmpegProfiles = [];
private List<WatermarkViewModel> _watermarks = [];
private List<SubtitleViewModel> _subtitleStreams = [];
private readonly List<FFmpegProfileViewModel> _ffmpegProfiles = [];
private readonly List<WatermarkViewModel> _watermarks = [];
private readonly List<SubtitleViewModel> _subtitleStreams = [];
private MediaItemInfo _info;
private int _ffmpegProfileId;
private int? _watermarkId;
private IEnumerable<string> _watermarkNames = new System.Collections.Generic.HashSet<string>();
private int? _subtitleId;
private bool _startFromBeginning;
private bool _hasPlayed;
@ -146,13 +145,13 @@ @@ -146,13 +145,13 @@
protected override async Task OnParametersSetAsync()
{
_ffmpegProfiles = await Mediator.Send(new GetAllFFmpegProfiles(), _cts.Token);
_ffmpegProfiles.AddRange(await Mediator.Send(new GetAllFFmpegProfiles(), _cts.Token));
if (_ffmpegProfiles.Count > 0)
{
_ffmpegProfileId = _ffmpegProfiles.Map(f => f.Id).Head();
}
_watermarks = await Mediator.Send(new GetAllWatermarks(), _cts.Token);
_watermarks.AddRange(await Mediator.Send(new GetAllWatermarks(), _cts.Token));
if (MediaItemId is not null)
{
@ -166,7 +165,14 @@ @@ -166,7 +165,14 @@
{
var uri = new UriBuilder(NavigationManager.ToAbsoluteUri(NavigationManager.Uri));
uri.Path = uri.Path.Replace("/system/troubleshooting/playback", "/api/troubleshoot/playback.m3u8");
uri.Query = $"?mediaItem={MediaItemId}&ffmpegProfile={_ffmpegProfileId}&watermark={_watermarkId ?? 0}&startFromBeginning={_startFromBeginning}";
uri.Query = $"?mediaItem={MediaItemId}&ffmpegProfile={_ffmpegProfileId}&startFromBeginning={_startFromBeginning}";
foreach (var watermarkName in _watermarkNames)
{
foreach (var watermark in _watermarks.Where(wm => wm.Name == watermarkName))
{
uri.Query += $"&watermark={watermark.Id}";
}
}
if (_subtitleId is not null)
{
uri.Query += $"&subtitleId={_subtitleId.Value}";
@ -207,7 +213,15 @@ @@ -207,7 +213,15 @@
private async Task DownloadResults()
{
await JsRuntime.InvokeVoidAsync("window.open", $"api/troubleshoot/playback/archive?mediaItem={MediaItemId ?? 0}&ffmpegProfile={_ffmpegProfileId}&watermark={_watermarkId ?? 0}&startFromBeginning={_startFromBeginning}");
var uri = $"api/troubleshoot/playback/archive?mediaItem={MediaItemId ?? 0}&ffmpegProfile={_ffmpegProfileId}&startFromBeginning={_startFromBeginning}";
foreach (var watermarkName in _watermarkNames)
{
foreach (var watermark in _watermarks.Where(wm => wm.Name == watermarkName))
{
uri += $"&watermark={watermark.Id}";
}
}
await JsRuntime.InvokeVoidAsync("window.open", uri);
}
private void HandleTroubleshootingCompleted(PlaybackTroubleshootingCompletedNotification result)

Loading…
Cancel
Save