From 4ee97d5bb3e7a041320c720f8d84a72ea477a621 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Sun, 19 Apr 2026 17:03:08 -0500 Subject: [PATCH] fix: fix next playout building (#2855) --- .../Channels/Commands/UpdateChannelHandler.cs | 2 ++ .../Commands/SyncNextPlayoutHandler.cs | 22 ++++++++++++++++++- .../Commands/StartFFmpegNextSessionHandler.cs | 14 +++++++++--- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs b/ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs index 8b2e0ff1f..c05af5cdf 100644 --- a/ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs +++ b/ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs @@ -1,6 +1,7 @@ using System.Globalization; using System.Text.RegularExpressions; using System.Threading.Channels; +using ErsatzTV.Application.Playouts; using ErsatzTV.Application.Subtitles; using ErsatzTV.Core; using ErsatzTV.Core.Domain; @@ -160,6 +161,7 @@ public class UpdateChannelHandler( if (hasEpgChange) { await workerChannel.WriteAsync(new RefreshChannelData(c.Number), cancellationToken); + await workerChannel.WriteAsync(new SyncNextPlayout(c.Number), cancellationToken); } return ProjectToViewModel(c, c.Playouts?.Count ?? 0); diff --git a/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs b/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs index 0ac46dfe3..a48fa6696 100644 --- a/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs +++ b/ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs @@ -7,6 +7,7 @@ using ErsatzTV.Core.Extensions; using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Next; using ErsatzTV.Infrastructure.Data; +using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -78,6 +79,22 @@ public partial class SyncNextPlayoutHandler( { await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken); + TimeSpan playoutOffset = TimeSpan.Zero; + string mirrorChannelNumber = null; + Option maybeChannel = await dbContext.Channels + .AsNoTracking() + .Include(c => c.MirrorSourceChannel) + .Filter(c => c.PlayoutSource == ChannelPlayoutSource.Mirror && c.MirrorSourceChannelId != null) + .SelectOneAsync( + c => c.Number == channelNumber, + c => c.Number == channelNumber, + cancellationToken); + foreach (Channel channel in maybeChannel) + { + mirrorChannelNumber = channel.MirrorSourceChannel.Number; + playoutOffset = channel.PlayoutOffset ?? TimeSpan.Zero; + } + List localLibraryIds = await dbContext.LocalLibraries .AsNoTracking() .Map(l => l.Id) @@ -85,7 +102,7 @@ public partial class SyncNextPlayoutHandler( List playoutItems = await dbContext.PlayoutItems .AsNoTracking() - .Where(i => i.Playout.Channel.Number == channelNumber) + .Where(i => i.Playout.Channel.Number == (mirrorChannelNumber ?? channelNumber)) .Where(i => localLibraryIds.Contains(i.MediaItem.LibraryPath.LibraryId)) .Include(i => i.MediaItem) .ThenInclude(i => (i as Episode).MediaVersions) @@ -124,6 +141,9 @@ public partial class SyncNextPlayoutHandler( string path = playoutItem.MediaItem.GetHeadVersion().MediaFiles.Head().Path; + playoutItem.Start += playoutOffset; + playoutItem.Finish += playoutOffset; + var nextPlayoutItem = new ItemElement { Id = playoutItem.Id.ToString(CultureInfo.InvariantCulture), diff --git a/ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs b/ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs index 913fb1c97..d54eb5099 100644 --- a/ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs +++ b/ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs @@ -142,9 +142,17 @@ public class StartFFmpegNextSessionHandler( private Task> ChannelBinaryMustExist() { - string nextFolder = string.IsNullOrWhiteSpace(SystemEnvironment.NextFolder) - ? fileSystem.Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) - : SystemEnvironment.NextFolder; + string nextFolder = SystemEnvironment.NextFolder; + if (string.IsNullOrWhiteSpace(nextFolder)) + { + string processFileName = Environment.ProcessPath ?? string.Empty; + string processExecutable = Path.GetFileNameWithoutExtension(processFileName); + nextFolder = Path.GetDirectoryName(processFileName); + if ("dotnet".Equals(processExecutable, StringComparison.OrdinalIgnoreCase)) + { + nextFolder = AppContext.BaseDirectory; + } + } string executable = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "ersatztv-channel.exe"