fix custom title scheduling (#802)
This commit is contained in:
@@ -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
|
- 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
|
- 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`)
|
- 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
|
### Added
|
||||||
- Add `metadata_kind` field to search index to allow searching for items with a particular metdata source
|
- Add `metadata_kind` field to search index to allow searching for items with a particular metdata source
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
|
|||||||
StartTime = null,
|
StartTime = null,
|
||||||
PlayoutDuration = TimeSpan.FromHours(3),
|
PlayoutDuration = TimeSpan.FromHours(3),
|
||||||
TailMode = TailMode.None,
|
TailMode = TailMode.None,
|
||||||
PlaybackOrder = PlaybackOrder.Chronological
|
PlaybackOrder = PlaybackOrder.Chronological,
|
||||||
|
CustomTitle = "CustomTitle"
|
||||||
};
|
};
|
||||||
|
|
||||||
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
|
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
|
||||||
@@ -49,7 +50,7 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
|
|||||||
playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3));
|
playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3));
|
||||||
playoutItems.Last().FinishOffset.Should().Be(playoutBuilderState.CurrentTime);
|
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.DurationFinish.IsNone.Should().BeTrue();
|
||||||
playoutBuilderState.InFlood.Should().BeFalse();
|
playoutBuilderState.InFlood.Should().BeFalse();
|
||||||
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
|
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
|
||||||
@@ -65,18 +66,21 @@ public class PlayoutModeSchedulerDurationTests : SchedulerTestBase
|
|||||||
playoutItems[0].GuideGroup.Should().Be(1);
|
playoutItems[0].GuideGroup.Should().Be(1);
|
||||||
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
||||||
playoutItems[0].GuideFinish.HasValue.Should().BeFalse();
|
playoutItems[0].GuideFinish.HasValue.Should().BeFalse();
|
||||||
|
playoutItems[0].CustomTitle.Should().Be("CustomTitle");
|
||||||
|
|
||||||
playoutItems[1].MediaItemId.Should().Be(2);
|
playoutItems[1].MediaItemId.Should().Be(2);
|
||||||
playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddHours(1));
|
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].FillerKind.Should().Be(FillerKind.None);
|
||||||
playoutItems[1].GuideFinish.HasValue.Should().BeFalse();
|
playoutItems[1].GuideFinish.HasValue.Should().BeFalse();
|
||||||
|
playoutItems[1].CustomTitle.Should().Be("CustomTitle");
|
||||||
|
|
||||||
playoutItems[2].MediaItemId.Should().Be(1);
|
playoutItems[2].MediaItemId.Should().Be(1);
|
||||||
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.AddHours(2));
|
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].FillerKind.Should().Be(FillerKind.None);
|
||||||
playoutItems[2].GuideFinish.HasValue.Should().BeTrue();
|
playoutItems[2].GuideFinish.HasValue.Should().BeTrue();
|
||||||
|
playoutItems[2].CustomTitle.Should().Be("CustomTitle");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
|
|||||||
StartTime = null,
|
StartTime = null,
|
||||||
PlaybackOrder = PlaybackOrder.Chronological,
|
PlaybackOrder = PlaybackOrder.Chronological,
|
||||||
TailFiller = null,
|
TailFiller = null,
|
||||||
FallbackFiller = null
|
FallbackFiller = null,
|
||||||
|
CustomTitle = "CustomTitle"
|
||||||
};
|
};
|
||||||
|
|
||||||
var enumerator = new ChronologicalMediaCollectionEnumerator(
|
var enumerator = new ChronologicalMediaCollectionEnumerator(
|
||||||
@@ -55,7 +56,7 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
|
|||||||
playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3));
|
playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3));
|
||||||
playoutItems.Last().FinishOffset.Should().Be(playoutBuilderState.CurrentTime);
|
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.DurationFinish.IsNone.Should().BeTrue();
|
||||||
playoutBuilderState.InFlood.Should().BeFalse();
|
playoutBuilderState.InFlood.Should().BeFalse();
|
||||||
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
|
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
|
||||||
@@ -70,16 +71,19 @@ public class PlayoutModeSchedulerFloodTests : SchedulerTestBase
|
|||||||
playoutItems[0].StartOffset.Should().Be(startState.CurrentTime);
|
playoutItems[0].StartOffset.Should().Be(startState.CurrentTime);
|
||||||
playoutItems[0].GuideGroup.Should().Be(1);
|
playoutItems[0].GuideGroup.Should().Be(1);
|
||||||
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
||||||
|
playoutItems[0].CustomTitle.Should().Be("CustomTitle");
|
||||||
|
|
||||||
playoutItems[1].MediaItemId.Should().Be(2);
|
playoutItems[1].MediaItemId.Should().Be(2);
|
||||||
playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddHours(1));
|
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].FillerKind.Should().Be(FillerKind.None);
|
||||||
|
playoutItems[1].CustomTitle.Should().Be("CustomTitle");
|
||||||
|
|
||||||
playoutItems[2].MediaItemId.Should().Be(1);
|
playoutItems[2].MediaItemId.Should().Be(1);
|
||||||
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.AddHours(2));
|
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].FillerKind.Should().Be(FillerKind.None);
|
||||||
|
playoutItems[2].CustomTitle.Should().Be("CustomTitle");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
|
|||||||
PlaybackOrder = PlaybackOrder.Chronological,
|
PlaybackOrder = PlaybackOrder.Chronological,
|
||||||
TailFiller = null,
|
TailFiller = null,
|
||||||
FallbackFiller = null,
|
FallbackFiller = null,
|
||||||
Count = 3
|
Count = 3,
|
||||||
|
CustomTitle = "CustomTitle"
|
||||||
};
|
};
|
||||||
|
|
||||||
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
|
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
|
||||||
@@ -56,7 +57,7 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
|
|||||||
playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3));
|
playoutBuilderState.CurrentTime.Should().Be(startState.CurrentTime.AddHours(3));
|
||||||
playoutItems.Last().FinishOffset.Should().Be(playoutBuilderState.CurrentTime);
|
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.DurationFinish.IsNone.Should().BeTrue();
|
||||||
playoutBuilderState.InFlood.Should().BeFalse();
|
playoutBuilderState.InFlood.Should().BeFalse();
|
||||||
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
|
playoutBuilderState.MultipleRemaining.IsNone.Should().BeTrue();
|
||||||
@@ -71,16 +72,19 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
|
|||||||
playoutItems[0].StartOffset.Should().Be(startState.CurrentTime);
|
playoutItems[0].StartOffset.Should().Be(startState.CurrentTime);
|
||||||
playoutItems[0].GuideGroup.Should().Be(1);
|
playoutItems[0].GuideGroup.Should().Be(1);
|
||||||
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
||||||
|
playoutItems[0].CustomTitle.Should().Be("CustomTitle");
|
||||||
|
|
||||||
playoutItems[1].MediaItemId.Should().Be(2);
|
playoutItems[1].MediaItemId.Should().Be(2);
|
||||||
playoutItems[1].StartOffset.Should().Be(startState.CurrentTime.AddHours(1));
|
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].FillerKind.Should().Be(FillerKind.None);
|
||||||
|
playoutItems[1].CustomTitle.Should().Be("CustomTitle");
|
||||||
|
|
||||||
playoutItems[2].MediaItemId.Should().Be(1);
|
playoutItems[2].MediaItemId.Should().Be(1);
|
||||||
playoutItems[2].StartOffset.Should().Be(startState.CurrentTime.AddHours(2));
|
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].FillerKind.Should().Be(FillerKind.None);
|
||||||
|
playoutItems[2].CustomTitle.Should().Be("CustomTitle");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
|
|||||||
StartTime = null,
|
StartTime = null,
|
||||||
PlaybackOrder = PlaybackOrder.Chronological,
|
PlaybackOrder = PlaybackOrder.Chronological,
|
||||||
TailFiller = null,
|
TailFiller = null,
|
||||||
FallbackFiller = null
|
FallbackFiller = null,
|
||||||
|
CustomTitle = "CustomTitle"
|
||||||
};
|
};
|
||||||
|
|
||||||
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
|
var scheduleItemsEnumerator = new OrderedScheduleItemsEnumerator(
|
||||||
@@ -64,6 +65,7 @@ public class PlayoutModeSchedulerOneTests : SchedulerTestBase
|
|||||||
playoutItems[0].StartOffset.Should().Be(startState.CurrentTime);
|
playoutItems[0].StartOffset.Should().Be(startState.CurrentTime);
|
||||||
playoutItems[0].GuideGroup.Should().Be(1);
|
playoutItems[0].GuideGroup.Should().Be(1);
|
||||||
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
playoutItems[0].FillerKind.Should().Be(FillerKind.None);
|
||||||
|
playoutItems[0].CustomTitle.Should().Be("CustomTitle");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase<ProgramSchedul
|
|||||||
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
||||||
? FillerKind.Tail
|
? FillerKind.Tail
|
||||||
: FillerKind.None,
|
: FillerKind.None,
|
||||||
|
CustomTitle = scheduleItem.CustomTitle,
|
||||||
WatermarkId = scheduleItem.WatermarkId,
|
WatermarkId = scheduleItem.WatermarkId,
|
||||||
PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode,
|
PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode,
|
||||||
PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode,
|
PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode,
|
||||||
@@ -94,7 +95,11 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase<ProgramSchedul
|
|||||||
{
|
{
|
||||||
CurrentTime = itemEndTimeWithFiller,
|
CurrentTime = itemEndTimeWithFiller,
|
||||||
InFlood = true,
|
InFlood = true,
|
||||||
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();
|
contentEnumerator.MoveNext();
|
||||||
@@ -108,7 +113,11 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase<ProgramSchedul
|
|||||||
nextState = nextState with
|
nextState = nextState with
|
||||||
{
|
{
|
||||||
InFlood = nextState.CurrentTime >= hardStop,
|
InFlood = nextState.CurrentTime >= 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();
|
nextState.ScheduleItemsEnumerator.MoveNext();
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche
|
|||||||
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
||||||
? FillerKind.Tail
|
? FillerKind.Tail
|
||||||
: FillerKind.None,
|
: FillerKind.None,
|
||||||
|
CustomTitle = scheduleItem.CustomTitle,
|
||||||
WatermarkId = scheduleItem.WatermarkId,
|
WatermarkId = scheduleItem.WatermarkId,
|
||||||
PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode,
|
PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode,
|
||||||
PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode,
|
PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode,
|
||||||
@@ -81,7 +82,11 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche
|
|||||||
{
|
{
|
||||||
CurrentTime = itemEndTimeWithFiller,
|
CurrentTime = itemEndTimeWithFiller,
|
||||||
MultipleRemaining = nextState.MultipleRemaining.Map(i => i - 1),
|
MultipleRemaining = nextState.MultipleRemaining.Map(i => 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();
|
contentEnumerator.MoveNext();
|
||||||
@@ -96,7 +101,11 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche
|
|||||||
nextState = nextState with
|
nextState = nextState with
|
||||||
{
|
{
|
||||||
MultipleRemaining = None,
|
MultipleRemaining = None,
|
||||||
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();
|
nextState.ScheduleItemsEnumerator.MoveNext();
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ public class PlayoutModeSchedulerOne : PlayoutModeSchedulerBase<ProgramScheduleI
|
|||||||
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
||||||
? FillerKind.Tail
|
? FillerKind.Tail
|
||||||
: FillerKind.None,
|
: FillerKind.None,
|
||||||
|
CustomTitle = scheduleItem.CustomTitle,
|
||||||
WatermarkId = scheduleItem.WatermarkId,
|
WatermarkId = scheduleItem.WatermarkId,
|
||||||
PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode,
|
PreferredAudioLanguageCode = scheduleItem.PreferredAudioLanguageCode,
|
||||||
PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode,
|
PreferredSubtitleLanguageCode = scheduleItem.PreferredSubtitleLanguageCode,
|
||||||
|
|||||||
Reference in New Issue
Block a user