Browse Source

fix multiple zero when using fill with group (#1535)

pull/1536/head
Jason Dove 2 years ago committed by GitHub
parent
commit
18ed20e203
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      CHANGELOG.md
  2. 6
      ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs
  3. 62
      ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs
  4. 46
      ErsatzTV.Core/Scheduling/PlayoutBuilder.cs
  5. 12
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs

1
CHANGELOG.md

@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed
- Fix error loading path replacements when using MySql
- Fix tray icon shortcut to open logs folder on Windows
- Unlock playout when playout build fails
### Changed
- Upgrade from .NET 7 to .NET 8

6
ErsatzTV.Application/Playouts/Commands/BuildPlayoutHandler.cs

@ -70,8 +70,6 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro @@ -70,8 +70,6 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
_ffmpegSegmenterService.PlayoutUpdated(playout.Channel.Number);
}
_entityLocker.UnlockPlayout(playout.Id);
Option<string> maybeChannelNumber = await dbContext.Connection
.QuerySingleOrDefaultAsync<string>(
@"select C.Number from Channel C
@ -103,6 +101,10 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro @@ -103,6 +101,10 @@ public class BuildPlayoutHandler : IRequestHandler<BuildPlayout, Either<BaseErro
return BaseError.New(
$"Unexpected error building playout for channel {playout.Channel.Name}: {ex.Message}");
}
finally
{
_entityLocker.UnlockPlayout(playout.Id);
}
return Unit.Default;
}

62
ErsatzTV.Core.Tests/Scheduling/PlayoutModeSchedulerMultipleTests.cs

@ -44,14 +44,14 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -44,14 +44,14 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
collectionOne.MediaItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator),
@ -119,14 +119,14 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -119,14 +119,14 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
collectionOne.MediaItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator),
@ -201,15 +201,15 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -201,15 +201,15 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
collectionTwo.MediaItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -300,15 +300,15 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -300,15 +300,15 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
collectionTwo.MediaItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionTwo.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionTwo.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.FallbackFiller, enumerator2),
@ -389,15 +389,15 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -389,15 +389,15 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
collectionTwo.MediaItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator1, scheduleItem.TailFiller, enumerator2),
@ -498,16 +498,16 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -498,16 +498,16 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
collectionThree.MediaItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionThree.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems.Count },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionThree.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(
@ -620,16 +620,16 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -620,16 +620,16 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
collectionThree.MediaItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionThree.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count },
{ CollectionKey.ForFillerPreset(scheduleItem.TailFiller), collectionTwo.MediaItems.Count },
{ CollectionKey.ForFillerPreset(scheduleItem.FallbackFiller), collectionThree.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(
@ -708,14 +708,14 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase @@ -708,14 +708,14 @@ public class PlayoutModeSchedulerMultipleTests : SchedulerTestBase
sortedScheduleItems,
new CollectionEnumeratorState());
var collectionMediaItems = new Dictionary<CollectionKey, List<MediaItem>>
var collectionItemCount = new Dictionary<CollectionKey, int>
{
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems }
{ CollectionKey.ForScheduleItem(scheduleItem), collectionOne.MediaItems.Count }
}.ToMap();
PlayoutBuilderState startState = StartState(scheduleItemsEnumerator);
var scheduler = new PlayoutModeSchedulerMultiple(collectionMediaItems, Substitute.For<ILogger>());
var scheduler = new PlayoutModeSchedulerMultiple(collectionItemCount, Substitute.For<ILogger>());
(PlayoutBuilderState playoutBuilderState, List<PlayoutItem> playoutItems) = scheduler.Schedule(
startState,
CollectionEnumerators(scheduleItem, enumerator),

46
ErsatzTV.Core/Scheduling/PlayoutBuilder.cs

@ -406,7 +406,27 @@ public class PlayoutBuilder : IPlayoutBuilder @@ -406,7 +406,27 @@ public class PlayoutBuilder : IPlayoutBuilder
: new OrderedScheduleItemsEnumerator(activeSchedule.Items, scheduleItemsEnumeratorState);
var collectionEnumerators = new Dictionary<CollectionKey, IMediaCollectionEnumerator>();
foreach ((CollectionKey collectionKey, List<MediaItem> mediaItems) in collectionMediaItems)
{
// use configured playback order for primary collection, shuffle for filler
Option<ProgramScheduleItem> maybeScheduleItem = sortedScheduleItems
.FirstOrDefault(item => CollectionKey.ForScheduleItem(item) == collectionKey);
PlaybackOrder playbackOrder = maybeScheduleItem
.Match(item => item.PlaybackOrder, () => PlaybackOrder.Shuffle);
IMediaCollectionEnumerator enumerator =
await GetMediaCollectionEnumerator(
playout,
activeSchedule,
collectionKey,
mediaItems,
playbackOrder,
randomStartPoint,
cancellationToken);
collectionEnumerators.Add(collectionKey, enumerator);
}
var collectionItemCount = collectionMediaItems.Map((k, v) => (k, v.Count)).Values.ToDictionary();
var scheduleItemsFillGroupEnumerators = new Dictionary<int, IScheduleItemsEnumerator>();
foreach (ProgramScheduleItem scheduleItem in sortedScheduleItems.Where(si => si.FillWithGroupMode is not FillWithGroupMode.None))
{
@ -453,6 +473,9 @@ public class PlayoutBuilder : IPlayoutBuilder @@ -453,6 +473,9 @@ public class PlayoutBuilder : IPlayoutBuilder
cancellationToken);
collectionEnumerators.Add(key, enumerator);
// this makes multiple (0) work - since it needs the number of items in the collection
collectionItemCount.Add(key, fakeCollection.MediaItems.Count);
}
CollectionEnumeratorState enumeratorState =
@ -476,25 +499,6 @@ public class PlayoutBuilder : IPlayoutBuilder @@ -476,25 +499,6 @@ public class PlayoutBuilder : IPlayoutBuilder
}
}
}
foreach ((CollectionKey collectionKey, List<MediaItem> mediaItems) in collectionMediaItems)
{
// use configured playback order for primary collection, shuffle for filler
Option<ProgramScheduleItem> maybeScheduleItem = sortedScheduleItems
.FirstOrDefault(item => CollectionKey.ForScheduleItem(item) == collectionKey);
PlaybackOrder playbackOrder = maybeScheduleItem
.Match(item => item.PlaybackOrder, () => PlaybackOrder.Shuffle);
IMediaCollectionEnumerator enumerator =
await GetMediaCollectionEnumerator(
playout,
activeSchedule,
collectionKey,
mediaItems,
playbackOrder,
randomStartPoint,
cancellationToken);
collectionEnumerators.Add(collectionKey, enumerator);
}
// find start anchor
PlayoutAnchor startAnchor = FindStartAnchor(playout, playoutStart, scheduleItemsEnumerator);
@ -537,7 +541,7 @@ public class PlayoutBuilder : IPlayoutBuilder @@ -537,7 +541,7 @@ public class PlayoutBuilder : IPlayoutBuilder
currentTime);
var schedulerOne = new PlayoutModeSchedulerOne(_logger);
var schedulerMultiple = new PlayoutModeSchedulerMultiple(collectionMediaItems, _logger);
var schedulerMultiple = new PlayoutModeSchedulerMultiple(collectionItemCount.ToMap(), _logger);
var schedulerDuration = new PlayoutModeSchedulerDuration(_logger);
var schedulerFlood = new PlayoutModeSchedulerFlood(_logger);

12
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs

@ -8,11 +8,13 @@ namespace ErsatzTV.Core.Scheduling; @@ -8,11 +8,13 @@ namespace ErsatzTV.Core.Scheduling;
public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramScheduleItemMultiple>
{
private readonly Map<CollectionKey, List<MediaItem>> _collectionMediaItems;
private readonly Map<CollectionKey, int> _collectionItemCount;
public PlayoutModeSchedulerMultiple(Map<CollectionKey, List<MediaItem>> collectionMediaItems, ILogger logger)
: base(logger) =>
_collectionMediaItems = collectionMediaItems;
public PlayoutModeSchedulerMultiple(Map<CollectionKey, int> collectionItemCount, ILogger logger)
: base(logger)
{
_collectionItemCount = collectionItemCount;
}
public override Tuple<PlayoutBuilderState, List<PlayoutItem>> Schedule(
PlayoutBuilderState playoutBuilderState,
@ -40,7 +42,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche @@ -40,7 +42,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche
{
nextState = nextState with
{
MultipleRemaining = _collectionMediaItems[CollectionKey.ForScheduleItem(scheduleItem)].Count
MultipleRemaining = _collectionItemCount[CollectionKey.ForScheduleItem(scheduleItem)]
};
}

Loading…
Cancel
Save