From 52482ef2fbc9489d31aa52dc416aacb2bf3cdf86 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Mon, 19 Jun 2023 09:17:10 -0500 Subject: [PATCH] only discard items with random or shuffle playback order (#1309) --- .../Playouts/Commands/BuildPlayoutHandler.cs | 16 +++++++++++++++- .../Commands/ProgramScheduleItemCommandBase.cs | 8 +++++++- .../Scheduling/PlayoutModeSchedulerBase.cs | 2 +- .../Scheduling/PlayoutModeSchedulerDuration.cs | 6 +++--- .../Core/Metadata/LocalStatisticsProvider.cs | 2 +- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs b/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs index 94c326fe3..8a2915a62 100644 --- a/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs +++ b/ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs @@ -108,7 +108,21 @@ public class BuildPlayoutHandler : IRequestHandler> Validate(TvContext dbContext, BuildPlayout request) => - PlayoutMustExist(dbContext, request); + PlayoutMustExist(dbContext, request).BindT(DiscardAttemptsMustBeValid); + + private static Validation DiscardAttemptsMustBeValid(Playout playout) + { + foreach (ProgramScheduleItemDuration item in playout.ProgramSchedule.Items.OfType()) + { + item.DiscardToFillAttempts = item.PlaybackOrder switch + { + PlaybackOrder.Random or PlaybackOrder.Shuffle => item.DiscardToFillAttempts, + _ => 0 + }; + } + + return playout; + } private static Task> PlayoutMustExist( TvContext dbContext, diff --git a/ErsatzTV.Application/ProgramSchedules/Commands/ProgramScheduleItemCommandBase.cs b/ErsatzTV.Application/ProgramSchedules/Commands/ProgramScheduleItemCommandBase.cs index 282ce40d0..deab63833 100644 --- a/ErsatzTV.Application/ProgramSchedules/Commands/ProgramScheduleItemCommandBase.cs +++ b/ErsatzTV.Application/ProgramSchedules/Commands/ProgramScheduleItemCommandBase.cs @@ -253,7 +253,7 @@ public abstract class ProgramScheduleItemCommandBase PlaybackOrder = item.PlaybackOrder, PlayoutDuration = FixDuration(item.PlayoutDuration.GetValueOrDefault()), TailMode = item.TailMode, - DiscardToFillAttempts = item.DiscardToFillAttempts.GetValueOrDefault(), + DiscardToFillAttempts = FixDiscardToFillAttempts(item.PlaybackOrder, item.DiscardToFillAttempts.GetValueOrDefault()), CustomTitle = item.CustomTitle, GuideMode = item.GuideMode, PreRollFillerId = item.PreRollFillerId, @@ -277,4 +277,10 @@ public abstract class ProgramScheduleItemCommandBase startTime.HasValue && startTime.Value >= TimeSpan.FromDays(1) ? startTime.Value.Subtract(TimeSpan.FromDays(1)) : startTime; + + private static int FixDiscardToFillAttempts(PlaybackOrder playbackOrder, int value) => playbackOrder switch + { + PlaybackOrder.Random or PlaybackOrder.Shuffle => value, + _ => 0 + }; } diff --git a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs index 3539bd153..d4ea15ac9 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs @@ -96,7 +96,7 @@ public abstract class PlayoutModeSchedulerBase : IPlayoutModeScheduler whe if (nextState.CurrentTime + itemDuration > nextItemStart) { _logger.LogDebug( - "Filler with duration {Duration} will go past next item start {NextItemStart}", + "Filler with duration {Duration:hh\\:mm\\:ss} will go past next item start {NextItemStart}", itemDuration, nextItemStart); diff --git a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs index df64d6cb4..1e5589fea 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs @@ -60,7 +60,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase scheduleItem.PlayoutDuration) { _logger.LogWarning( - "Skipping playout item {Title} with duration {Duration} that is longer than schedule item duration {PlayoutDuration}", + "Skipping playout item {Title} with duration {Duration:hh\\:mm\\:ss} that will never fit in schedule item duration {PlayoutDuration:hh\\:mm\\:ss}", PlayoutBuilder.DisplayTitle(mediaItem), itemDuration, scheduleItem.PlayoutDuration); @@ -87,7 +87,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase scheduleItem.PlayoutDuration) { _logger.LogWarning( - "Unable to schedule duration block of {DurationBlock} which is longer than the configured playout duration {PlayoutDuration}", + "Unable to schedule duration block of {DurationBlock:hh\\:mm\\:ss} which is longer than the configured playout duration {PlayoutDuration:hh\\:mm\\:ss}", durationBlock, scheduleItem.PlayoutDuration); } diff --git a/ErsatzTV.Scanner/Core/Metadata/LocalStatisticsProvider.cs b/ErsatzTV.Scanner/Core/Metadata/LocalStatisticsProvider.cs index a8f0c49e5..2c812642d 100644 --- a/ErsatzTV.Scanner/Core/Metadata/LocalStatisticsProvider.cs +++ b/ErsatzTV.Scanner/Core/Metadata/LocalStatisticsProvider.cs @@ -315,7 +315,7 @@ public class LocalStatisticsProvider : ILocalStatisticsProvider { string time = match.Groups[1].Value; var duration = TimeSpan.Parse(time, NumberFormatInfo.InvariantInfo); - _logger.LogInformation("Analyzed duration is {Duration}", duration); + _logger.LogInformation("Analyzed duration is {Duration:hh\\:mm\\:ss}", duration); version.Duration = duration; return; }