Browse Source

fix: fix next playout building (#2855)

pull/2856/head
Jason Dove 1 month ago committed by GitHub
parent
commit
4ee97d5bb3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs
  2. 22
      ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs
  3. 14
      ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs

2
ErsatzTV.Application/Channels/Commands/UpdateChannelHandler.cs

@ -1,6 +1,7 @@
using System.Globalization; using System.Globalization;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Channels; using System.Threading.Channels;
using ErsatzTV.Application.Playouts;
using ErsatzTV.Application.Subtitles; using ErsatzTV.Application.Subtitles;
using ErsatzTV.Core; using ErsatzTV.Core;
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
@ -160,6 +161,7 @@ public class UpdateChannelHandler(
if (hasEpgChange) if (hasEpgChange)
{ {
await workerChannel.WriteAsync(new RefreshChannelData(c.Number), cancellationToken); await workerChannel.WriteAsync(new RefreshChannelData(c.Number), cancellationToken);
await workerChannel.WriteAsync(new SyncNextPlayout(c.Number), cancellationToken);
} }
return ProjectToViewModel(c, c.Playouts?.Count ?? 0); return ProjectToViewModel(c, c.Playouts?.Count ?? 0);

22
ErsatzTV.Application/Playouts/Commands/SyncNextPlayoutHandler.cs

@ -7,6 +7,7 @@ using ErsatzTV.Core.Extensions;
using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Interfaces.Metadata;
using ErsatzTV.Core.Next; using ErsatzTV.Core.Next;
using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Data;
using ErsatzTV.Infrastructure.Extensions;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -78,6 +79,22 @@ public partial class SyncNextPlayoutHandler(
{ {
await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken); await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken);
TimeSpan playoutOffset = TimeSpan.Zero;
string mirrorChannelNumber = null;
Option<Channel> 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<int> localLibraryIds = await dbContext.LocalLibraries List<int> localLibraryIds = await dbContext.LocalLibraries
.AsNoTracking() .AsNoTracking()
.Map(l => l.Id) .Map(l => l.Id)
@ -85,7 +102,7 @@ public partial class SyncNextPlayoutHandler(
List<PlayoutItem> playoutItems = await dbContext.PlayoutItems List<PlayoutItem> playoutItems = await dbContext.PlayoutItems
.AsNoTracking() .AsNoTracking()
.Where(i => i.Playout.Channel.Number == channelNumber) .Where(i => i.Playout.Channel.Number == (mirrorChannelNumber ?? channelNumber))
.Where(i => localLibraryIds.Contains(i.MediaItem.LibraryPath.LibraryId)) .Where(i => localLibraryIds.Contains(i.MediaItem.LibraryPath.LibraryId))
.Include(i => i.MediaItem) .Include(i => i.MediaItem)
.ThenInclude(i => (i as Episode).MediaVersions) .ThenInclude(i => (i as Episode).MediaVersions)
@ -124,6 +141,9 @@ public partial class SyncNextPlayoutHandler(
string path = playoutItem.MediaItem.GetHeadVersion().MediaFiles.Head().Path; string path = playoutItem.MediaItem.GetHeadVersion().MediaFiles.Head().Path;
playoutItem.Start += playoutOffset;
playoutItem.Finish += playoutOffset;
var nextPlayoutItem = new ItemElement var nextPlayoutItem = new ItemElement
{ {
Id = playoutItem.Id.ToString(CultureInfo.InvariantCulture), Id = playoutItem.Id.ToString(CultureInfo.InvariantCulture),

14
ErsatzTV.Application/Streaming/Commands/StartFFmpegNextSessionHandler.cs

@ -142,9 +142,17 @@ public class StartFFmpegNextSessionHandler(
private Task<Validation<BaseError, ValidationResult>> ChannelBinaryMustExist() private Task<Validation<BaseError, ValidationResult>> ChannelBinaryMustExist()
{ {
string nextFolder = string.IsNullOrWhiteSpace(SystemEnvironment.NextFolder) string nextFolder = SystemEnvironment.NextFolder;
? fileSystem.Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) if (string.IsNullOrWhiteSpace(nextFolder))
: SystemEnvironment.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) string executable = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
? "ersatztv-channel.exe" ? "ersatztv-channel.exe"

Loading…
Cancel
Save