Browse Source

Use chapters in duration filler

apocolipse 3 weeks ago
parent
commit
d87a8a240a
  1. 70
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs

70
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs

@ -715,17 +715,50 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
var result = new List<PlayoutItem>(); var result = new List<PlayoutItem>();
var candidatePlayoutItems = new List<PlayoutItem>();
TimeSpan remainingToFill = duration; // First pass: Collect all possible playout items from available media
while (enumerator.Current.IsSome && remainingToFill > TimeSpan.Zero && var processedMediaItemIds = new System.Collections.Generic.HashSet<int>();
remainingToFill >= enumerator.MinimumDuration)
while (enumerator.Current.IsSome)
{ {
bool foundNewItem = false;
foreach (MediaItem mediaItem in enumerator.Current) foreach (MediaItem mediaItem in enumerator.Current)
{ {
// Skip if we've already processed this media item
if (processedMediaItemIds.Contains(mediaItem.Id))
continue;
processedMediaItemIds.Add(mediaItem.Id);
foundNewItem = true;
TimeSpan itemDuration = DurationForMediaItem(mediaItem); TimeSpan itemDuration = DurationForMediaItem(mediaItem);
List<MediaChapter> itemChapters = ChaptersForMediaItem(mediaItem);
if (remainingToFill - itemDuration >= TimeSpan.Zero) if (itemChapters.Count > 1)
{
// Add each chapter as a separate candidate
foreach (MediaChapter chapter in itemChapters)
{
TimeSpan chapterDuration = chapter.EndTime - chapter.StartTime;
var playoutItem = new PlayoutItem
{
MediaItemId = mediaItem.Id,
Start = new DateTime(2020, 2, 1, 0, 0, 0, DateTimeKind.Utc),
Finish = new DateTime(2020, 2, 1, 0, 0, 0, DateTimeKind.Utc) + chapterDuration,
InPoint = chapter.StartTime,
OutPoint = chapter.EndTime,
GuideGroup = playoutBuilderState.NextGuideGroup,
FillerKind = fillerKind,
DisableWatermarks = !allowWatermarks
};
candidatePlayoutItems.Add(playoutItem);
}
}
else
{ {
// Add the full media item as a candidate
var playoutItem = new PlayoutItem var playoutItem = new PlayoutItem
{ {
MediaItemId = mediaItem.Id, MediaItemId = mediaItem.Id,
@ -737,10 +770,34 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
FillerKind = fillerKind, FillerKind = fillerKind,
DisableWatermarks = !allowWatermarks DisableWatermarks = !allowWatermarks
}; };
candidatePlayoutItems.Add(playoutItem);
}
}
// If we didn't find any new items, we've seen all items - break the loop
if (!foundNewItem)
break;
enumerator.MoveNext();
}
// Shuffle all candidate playout items
var random = new Random();
candidatePlayoutItems = candidatePlayoutItems.OrderBy(x => random.Next()).ToList();
// Second pass: Add shuffled items until duration is filled
TimeSpan remainingToFill = duration;
foreach (var playoutItem in candidatePlayoutItems)
{
if (remainingToFill <= TimeSpan.Zero)
break;
TimeSpan itemDuration = playoutItem.Finish - playoutItem.Start;
if (remainingToFill >= itemDuration)
{
remainingToFill -= itemDuration; remainingToFill -= itemDuration;
result.Add(playoutItem); result.Add(playoutItem);
enumerator.MoveNext();
} }
else else
{ {
@ -751,9 +808,6 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
itemDuration, itemDuration,
remainingToFill); remainingToFill);
} }
enumerator.MoveNext();
}
} }
} }

Loading…
Cancel
Save