From 2750ad0c545be984d0ef9a9577a46842638ca526 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Mon, 20 Apr 2026 19:38:25 -0500 Subject: [PATCH] fix next playback of items with no audio --- .../Commands/SyncNextPlayoutHandler.cs | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs b/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs index 47592e0dc..968fbe6ef 100644 --- a/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs +++ b/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs @@ -125,14 +125,27 @@ public partial class SyncNextPlayoutHandler( .ThenInclude(i => (i as Episode).MediaVersions) .ThenInclude(mv => mv.MediaFiles) .Include(i => i.MediaItem) + .ThenInclude(i => (i as Episode).MediaVersions) + .ThenInclude(mv => mv.Streams) + .Include(i => i.MediaItem) .ThenInclude(i => (i as Movie).MediaVersions) .ThenInclude(mv => mv.MediaFiles) .Include(i => i.MediaItem) + .ThenInclude(i => (i as Movie).MediaVersions) + .ThenInclude(mv => mv.Streams) + .Include(i => i.MediaItem) .ThenInclude(i => (i as OtherVideo).MediaVersions) .ThenInclude(mv => mv.MediaFiles) .Include(i => i.MediaItem) + .ThenInclude(i => (i as OtherVideo).MediaVersions) + .ThenInclude(mv => mv.Streams) + .Include(i => i.MediaItem) .ThenInclude(i => (i as MusicVideo).MediaVersions) .ThenInclude(mv => mv.MediaFiles) + .Include(i => i.MediaItem) + .ThenInclude(i => (i as MusicVideo).MediaVersions) + .ThenInclude(mv => mv.Streams) + .AsSplitQuery() .ToListAsync(cancellationToken); logger.LogDebug("Located {Count} local playout items", playoutItems.Count); @@ -156,7 +169,8 @@ public partial class SyncNextPlayoutHandler( continue; } - string path = playoutItem.MediaItem.GetHeadVersion().MediaFiles.Head().Path; + MediaVersion headVersion = playoutItem.MediaItem.GetHeadVersion(); + string path = headVersion.MediaFiles.Head().Path; playoutItem.Start += playoutOffset; playoutItem.Finish += playoutOffset; @@ -173,6 +187,33 @@ public partial class SyncNextPlayoutHandler( } }; + // if no audio streams, use lavfi to insert silence + if (headVersion.Streams.All(s => s.MediaStreamKind is not MediaStreamKind.Audio)) + { + var videoSource = nextPlayoutItem.Source; + + nextPlayoutItem.Source = null; + nextPlayoutItem.Tracks = new TracksClass + { + Audio = new AudioClass + { + Source = new AudioSource + { + SourceType = SourceType.Lavfi, + Params = "anullsrc=channel_layout=stereo:sample_rate=48000" + } + }, + Video = new AudioClass + { + Source = new AudioSource + { + SourceType = videoSource.SourceType, + Path = videoSource.Path, + } + } + }; + } + playout.Items.Add(nextPlayoutItem); }