From 3a906816fcdcca7618bbfe0c3c88e1315a88fd03 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Fri, 16 Feb 2024 13:41:52 -0600 Subject: [PATCH] allow playback of items with duration of 1 second (#1618) --- CHANGELOG.md | 1 + .../Images/Commands/UpdateImageFolderDuration.cs | 2 +- .../Commands/UpdateImageFolderDurationHandler.cs | 11 +++++++++-- ErsatzTV.Application/Streaming/HlsSessionWorker.cs | 2 +- ErsatzTV/Pages/ImageBrowser.razor | 3 +-- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1042d1b..17ebb9347 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix timestamp continuity in `HLS Segmenter` sessions - This should make *some* clients happier - Fix `Other Video`, `Song` and `Image` fallback metadata tags to always include parent folder (folder added to library) +- Allow playback of items with a duration of 1 second ### Changed - Log search index updates under scanner category at debug level, to indicate a potential cause for the UI being out of date diff --git a/ErsatzTV.Application/Images/Commands/UpdateImageFolderDuration.cs b/ErsatzTV.Application/Images/Commands/UpdateImageFolderDuration.cs index f3505f448..110962e0d 100644 --- a/ErsatzTV.Application/Images/Commands/UpdateImageFolderDuration.cs +++ b/ErsatzTV.Application/Images/Commands/UpdateImageFolderDuration.cs @@ -1,3 +1,3 @@ namespace ErsatzTV.Application.Images; -public record UpdateImageFolderDuration(int LibraryFolderId, int? ImageFolderDuration) : IRequest; +public record UpdateImageFolderDuration(int LibraryFolderId, int? ImageFolderDuration) : IRequest; diff --git a/ErsatzTV.Application/Images/Commands/UpdateImageFolderDurationHandler.cs b/ErsatzTV.Application/Images/Commands/UpdateImageFolderDurationHandler.cs index b09958689..74215fb5c 100644 --- a/ErsatzTV.Application/Images/Commands/UpdateImageFolderDurationHandler.cs +++ b/ErsatzTV.Application/Images/Commands/UpdateImageFolderDurationHandler.cs @@ -6,12 +6,17 @@ using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.Images; public class UpdateImageFolderDurationHandler(IDbContextFactory dbContextFactory) - : IRequestHandler + : IRequestHandler { - public async Task Handle(UpdateImageFolderDuration request, CancellationToken cancellationToken) + public async Task Handle(UpdateImageFolderDuration request, CancellationToken cancellationToken) { await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken); + if (request.ImageFolderDuration.IfNone(1) < 1) + { + request = request with { ImageFolderDuration = 1 }; + } + // delete entry if null if (request.ImageFolderDuration is null) { @@ -111,6 +116,8 @@ public class UpdateImageFolderDurationHandler(IDbContextFactory dbCon queue.Enqueue(new FolderWithParentDuration(child, effectiveDuration)); } } + + return request.ImageFolderDuration; } private sealed record FolderWithParentDuration(LibraryFolder LibraryFolder, int? ParentDuration); diff --git a/ErsatzTV.Application/Streaming/HlsSessionWorker.cs b/ErsatzTV.Application/Streaming/HlsSessionWorker.cs index 51dd1498c..cf0802784 100644 --- a/ErsatzTV.Application/Streaming/HlsSessionWorker.cs +++ b/ErsatzTV.Application/Streaming/HlsSessionWorker.cs @@ -344,7 +344,7 @@ public class HlsSessionWorker : IHlsSessionWorker DateTimeOffset now = _state is HlsSessionState.SeekAndWorkAhead ? DateTimeOffset.Now - : _transcodedUntil.AddSeconds(_state is HlsSessionState.SeekAndRealtime ? 0 : 1); + : _transcodedUntil.AddSeconds(_state is HlsSessionState.SeekAndRealtime ? 0 : 0.5); bool startAtZero = _state is HlsSessionState.ZeroAndWorkAhead or HlsSessionState.ZeroAndRealtime; var request = new GetPlayoutItemProcessByChannelNumber( diff --git a/ErsatzTV/Pages/ImageBrowser.razor b/ErsatzTV/Pages/ImageBrowser.razor index f874bc13b..7f9343bea 100644 --- a/ErsatzTV/Pages/ImageBrowser.razor +++ b/ErsatzTV/Pages/ImageBrowser.razor @@ -93,8 +93,7 @@ DialogResult result = await dialog.Result; if (!result.Canceled) { - var duration = result.Data as int?; - await Mediator.Send(new UpdateImageFolderDuration(item.LibraryFolderId, duration), _cts.Token); + int? duration = await Mediator.Send(new UpdateImageFolderDuration(item.LibraryFolderId, result.Data as int?), _cts.Token); item.UpdateDuration(duration); await InvokeAsync(StateHasChanged); }