Browse Source

abort building playout if any collection contains a zero-duration item

pull/63/head
Jason Dove 5 years ago
parent
commit
ec5ea8b7d2
  1. 18
      ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs
  2. 19
      ErsatzTV.Core/Scheduling/PlayoutBuilder.cs
  3. 1
      ErsatzTV/Services/SchedulerService.cs

18
ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs

@ -37,6 +37,24 @@ namespace ErsatzTV.Core.Tests.Scheduling @@ -37,6 +37,24 @@ namespace ErsatzTV.Core.Tests.Scheduling
_logger = factory.CreateLogger<PlayoutBuilder>();
}
[Test]
[Timeout(2000)]
public async Task ZeroDurationItem_Should_Abort()
{
var mediaItems = new List<MediaItem>
{
TestMovie(1, TimeSpan.Zero, DateTime.Today)
};
(PlayoutBuilder builder, Playout playout) = TestDataFloodForItems(mediaItems, PlaybackOrder.Random);
DateTimeOffset start = HoursAfterMidnight(0);
DateTimeOffset finish = start + TimeSpan.FromHours(6);
Playout result = await builder.BuildPlayoutItems(playout, start, finish);
result.Items.Should().BeNull();
}
[Test]
public async Task InitialFlood_Should_StartAtMidnight()
{

19
ErsatzTV.Core/Scheduling/PlayoutBuilder.cs

@ -88,6 +88,25 @@ namespace ErsatzTV.Core.Scheduling @@ -88,6 +88,25 @@ namespace ErsatzTV.Core.Scheduling
return playout;
}
Option<CollectionKey> zeroDurationCollection = collectionMediaItems.Find(
c => c.Value.Any(
mi => mi switch
{
Movie m => m.MediaVersions.HeadOrNone().Map(mv => mv.Duration).IfNone(TimeSpan.Zero) ==
TimeSpan.Zero,
Episode e => e.MediaVersions.HeadOrNone().Map(mv => mv.Duration).IfNone(TimeSpan.Zero) ==
TimeSpan.Zero,
_ => true
})).Map(c => c.Key);
if (zeroDurationCollection.IsSome)
{
_logger.LogError(
"Unable to rebuild playout; collection {@CollectionKey} contains items with zero duration!",
zeroDurationCollection.ValueUnsafe());
return playout;
}
playout.Items ??= new List<PlayoutItem>();
playout.ProgramScheduleAnchors ??= new List<PlayoutProgramScheduleAnchor>();

1
ErsatzTV/Services/SchedulerService.cs

@ -56,7 +56,6 @@ namespace ErsatzTV.Services @@ -56,7 +56,6 @@ namespace ErsatzTV.Services
await ScanLocalMediaSources(cancellationToken);
}
private async Task BuildPlayouts(CancellationToken cancellationToken)
{
using IServiceScope scope = _serviceScopeFactory.CreateScope();

Loading…
Cancel
Save