diff --git a/CHANGELOG.md b/CHANGELOG.md index b338b4972..419a3244e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Reduce memory use due to library scan operations - Fix some instances of filler getting "stuck" when a filler item is encountered that's too long for the gap - Properly ignore Plex `Other Videos` libraries (`movie` libraries where agent is `com.plexapp.agents.none`) +- Fix `Custom Title` for schedule items with `One`, `Multiple` and `Flood` playout modes ### Added - Add `metadata_kind` field to search index to allow searching for items with a particular metdata source diff --git a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerDurationTests.cs b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerDurationTests.cs index 2bade648a..cbc9e37d9 100644 --- a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerDurationTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerDurationTests.cs @@ -25,7 +25,8 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase StartTime = null, PlayoutDuration = TimeSpan.FromHours(3), TailMode = TailMode.None, - PlaybackOrder = PlaybackOrder.Chronological + PlaybackOrder = PlaybackOrder.Chronological, + CustomTitle = "CustomTitle" }; var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator( @@ -49,7 +50,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3)); playoutItems.Last().FinishOffset.Should().Be(playoutBuilderState.CurrentTime); - playoutBuilderState.NextGuideGroup.Should().Be(4); + playoutBuilderState.NextGuideGroup.Should().Be(2); // one guide group here because of custom title playoutBuilderState.DurationFinish.IsNone.Should().BeTrue(); playoutBuilderState.InFlood.Should().BeFalse(); playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue(); @@ -65,18 +66,21 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase playoutItems[0].GuideGroup.Should().Be(1); playoutItems[0].FillerKind.Should().Be(FillerKind.None); playoutItems[0].GuideFinish.HasValue.Should().BeFalse(); + playoutItems[0].CustomTitle.Should().Be("CustomTitle"); playoutItems[1].MediaItemId.Should().Be(2); playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddHours(1)); - playoutItems[1].GuideGroup.Should().Be(2); + playoutItems[1].GuideGroup.Should().Be(1); playoutItems[1].FillerKind.Should().Be(FillerKind.None); playoutItems[1].GuideFinish.HasValue.Should().BeFalse(); + playoutItems[1].CustomTitle.Should().Be("CustomTitle"); playoutItems[2].MediaItemId.Should().Be(1); playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.AddHours(2)); - playoutItems[2].GuideGroup.Should().Be(3); + playoutItems[2].GuideGroup.Should().Be(1); playoutItems[2].FillerKind.Should().Be(FillerKind.None); playoutItems[2].GuideFinish.HasValue.Should().BeTrue(); + playoutItems[2].CustomTitle.Should().Be("CustomTitle"); } [Test] diff --git a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerFloodTests.cs b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerFloodTests.cs index 96d3523b0..3cc36bafa 100644 --- a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerFloodTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerFloodTests.cs @@ -25,7 +25,8 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase StartTime = null, PlaybackOrder = PlaybackOrder.Chronological, TailFiller = null, - FallbackFiller = null + FallbackFiller = null, + CustomTitle = "CustomTitle" }; var enumerator = new ChronologicalMediaCollectionEnumerator( @@ -55,7 +56,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3)); playoutItems.Last().FinishOffset.Should().Be(playoutBuilderState.CurrentTime); - playoutBuilderState.NextGuideGroup.Should().Be(4); + playoutBuilderState.NextGuideGroup.Should().Be(2); // one guide group here because of custom title playoutBuilderState.DurationFinish.IsNone.Should().BeTrue(); playoutBuilderState.InFlood.Should().BeFalse(); playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue(); @@ -70,16 +71,19 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase playoutItems[0].StartOffset.Should().Be(startState.CurrentTime); playoutItems[0].GuideGroup.Should().Be(1); playoutItems[0].FillerKind.Should().Be(FillerKind.None); + playoutItems[0].CustomTitle.Should().Be("CustomTitle"); playoutItems[1].MediaItemId.Should().Be(2); playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddHours(1)); - playoutItems[1].GuideGroup.Should().Be(2); + playoutItems[1].GuideGroup.Should().Be(1); playoutItems[1].FillerKind.Should().Be(FillerKind.None); + playoutItems[1].CustomTitle.Should().Be("CustomTitle"); playoutItems[2].MediaItemId.Should().Be(1); playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.AddHours(2)); - playoutItems[2].GuideGroup.Should().Be(3); + playoutItems[2].GuideGroup.Should().Be(1); playoutItems[2].FillerKind.Should().Be(FillerKind.None); + playoutItems[2].CustomTitle.Should().Be("CustomTitle"); } [Test] diff --git a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs index 9615b691b..6f936fa5b 100644 --- a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs @@ -27,7 +27,8 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase PlaybackOrder = PlaybackOrder.Chronological, TailFiller = null, FallbackFiller = null, - Count = 3 + Count = 3, + CustomTitle = "CustomTitle" }; var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator( @@ -56,7 +57,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3)); playoutItems.Last().FinishOffset.Should().Be(playoutBuilderState.CurrentTime); - playoutBuilderState.NextGuideGroup.Should().Be(4); + playoutBuilderState.NextGuideGroup.Should().Be(2); // one guide group here because of custom title playoutBuilderState.DurationFinish.IsNone.Should().BeTrue(); playoutBuilderState.InFlood.Should().BeFalse(); playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue(); @@ -71,16 +72,19 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase playoutItems[0].StartOffset.Should().Be(startState.CurrentTime); playoutItems[0].GuideGroup.Should().Be(1); playoutItems[0].FillerKind.Should().Be(FillerKind.None); + playoutItems[0].CustomTitle.Should().Be("CustomTitle"); playoutItems[1].MediaItemId.Should().Be(2); playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddHours(1)); - playoutItems[1].GuideGroup.Should().Be(2); + playoutItems[1].GuideGroup.Should().Be(1); playoutItems[1].FillerKind.Should().Be(FillerKind.None); + playoutItems[1].CustomTitle.Should().Be("CustomTitle"); playoutItems[2].MediaItemId.Should().Be(1); playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.AddHours(2)); - playoutItems[2].GuideGroup.Should().Be(3); + playoutItems[2].GuideGroup.Should().Be(1); playoutItems[2].FillerKind.Should().Be(FillerKind.None); + playoutItems[2].CustomTitle.Should().Be("CustomTitle"); } [Test] diff --git a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerOneTests.cs b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerOneTests.cs index 51487adc2..bd168a312 100644 --- a/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerOneTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerOneTests.cs @@ -25,7 +25,8 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase StartTime = null, PlaybackOrder = PlaybackOrder.Chronological, TailFiller = null, - FallbackFiller = null + FallbackFiller = null, + CustomTitle = "CustomTitle" }; var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator( @@ -64,6 +65,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase playoutItems[0].StartOffset.Should().Be(startState.CurrentTime); playoutItems[0].GuideGroup.Should().Be(1); playoutItems[0].FillerKind.Should().Be(FillerKind.None); + playoutItems[0].CustomTitle.Should().Be("CustomTitle"); } [Test] diff --git a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs index 35395bd59..4f25807ce 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs @@ -50,6 +50,7 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase= hardStop, - NextGuideGroup = nextState.DecrementGuideGroup + + // only decrement guide group if it was bumped + NextGuideGroup = playoutItems.Select(pi => pi.GuideGroup).Distinct().Count() != 1 + ? nextState.DecrementGuideGroup + : nextState.NextGuideGroup }; nextState.ScheduleItemsEnumerator.MoveNext(); diff --git a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs index d120e6148..9e77ed8b6 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs @@ -60,6 +60,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase i - 1), - NextGuideGroup = nextState.IncrementGuideGroup + + // only bump guide group if we don't have a custom title + NextGuideGroup = string.IsNullOrWhiteSpace(scheduleItem.CustomTitle) + ? nextState.IncrementGuideGroup + : nextState.NextGuideGroup }; contentEnumerator.MoveNext(); @@ -96,7 +101,11 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase pi.GuideGroup).Distinct().Count() != 1 + ? nextState.DecrementGuideGroup + : nextState.NextGuideGroup }; nextState.ScheduleItemsEnumerator.MoveNext(); diff --git a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerOne.cs b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerOne.cs index a650b56ab..19dfe5d84 100644 --- a/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerOne.cs +++ b/ErsatzTV.Core/Scheduling/PlayoutModeSchedulerOne.cs @@ -41,6 +41,7 @@ public class PlayoutModeSchedulerOne : PlayoutModeSchedulerBase