set guide mode filler as appropriate on playlist items (#1691)
This commit is contained in:
@@ -6,6 +6,7 @@ public interface IMediaCollectionEnumerator
|
||||
{
|
||||
CollectionEnumeratorState State { get; }
|
||||
Option<MediaItem> Current { get; }
|
||||
Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
int Count { get; }
|
||||
Option<TimeSpan> MinimumDuration { get; }
|
||||
void ResetState(CollectionEnumeratorState state);
|
||||
|
||||
+3
@@ -15,6 +15,8 @@ public class BlockPlayoutShuffledMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
IList<GroupedMediaItem> mediaItems,
|
||||
CollectionEnumeratorState state)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_mediaItems = mediaItems;
|
||||
_mediaItemCount = _mediaItems.Sum(i => 1 + Optional(i.Additional).Flatten().Count());
|
||||
|
||||
@@ -41,6 +43,7 @@ public class BlockPlayoutShuffledMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _shuffled.Any() ? _shuffled[State.Index % _mediaItemCount] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext() => State.Index++;
|
||||
|
||||
|
||||
@@ -13,6 +13,8 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
IEnumerable<MediaItem> mediaItems,
|
||||
CollectionEnumeratorState state)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_sortedMediaItems = mediaItems.OrderBy(identity, new ChronologicalMediaComparer()).ToList();
|
||||
_lazyMinimumDuration = new Lazy<Option<TimeSpan>>(
|
||||
() => _sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
|
||||
@@ -38,6 +40,7 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _sortedMediaItems.Any() ? _sortedMediaItems[State.Index] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext() => State.Index = (State.Index + 1) % _sortedMediaItems.Count;
|
||||
|
||||
|
||||
@@ -15,6 +15,8 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator
|
||||
IList<MediaItem> mediaItems,
|
||||
CollectionEnumeratorState state)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
// TODO: this will break if we allow shows and seasons
|
||||
_sortedMediaItems = collection.CollectionItems
|
||||
.OrderBy(ci => ci.CustomIndex)
|
||||
@@ -37,6 +39,7 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _sortedMediaItems.Any() ? _sortedMediaItems[State.Index] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext() => State.Index = (State.Index + 1) % _sortedMediaItems.Count;
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
|
||||
{
|
||||
private IList<IMediaCollectionEnumerator> _sortedEnumerators;
|
||||
private int _enumeratorIndex;
|
||||
private System.Collections.Generic.HashSet<int> _idsToIncludeInEPG;
|
||||
|
||||
public static async Task<PlaylistEnumerator> Create(
|
||||
IMediaCollectionRepository mediaCollectionRepository,
|
||||
@@ -19,6 +20,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
|
||||
var result = new PlaylistEnumerator
|
||||
{
|
||||
_sortedEnumerators = [],
|
||||
_idsToIncludeInEPG = [],
|
||||
Count = LCM(playlistItemMap.Values.Map(v => v.Count)) * playlistItemMap.Count
|
||||
};
|
||||
|
||||
@@ -28,6 +30,14 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
|
||||
foreach (PlaylistItem playlistItem in playlistItemMap.Keys.OrderBy(i => i.Index))
|
||||
{
|
||||
List<MediaItem> items = playlistItemMap[playlistItem];
|
||||
if (playlistItem.IncludeInProgramGuide)
|
||||
{
|
||||
foreach (MediaItem mediaItem in items)
|
||||
{
|
||||
result._idsToIncludeInEPG.Add(mediaItem.Id);
|
||||
}
|
||||
}
|
||||
|
||||
var collectionKey = CollectionKey.ForPlaylistItem(playlistItem);
|
||||
if (enumeratorMap.TryGetValue(collectionKey, out IMediaCollectionEnumerator enumerator))
|
||||
{
|
||||
@@ -101,6 +111,18 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator
|
||||
public CollectionEnumeratorState State { get; private set; }
|
||||
|
||||
public Option<MediaItem> Current => _sortedEnumerators[_enumeratorIndex].Current;
|
||||
public Option<bool> CurrentIncludeInProgramGuide
|
||||
{
|
||||
get
|
||||
{
|
||||
foreach (MediaItem mediaItem in Current)
|
||||
{
|
||||
return _idsToIncludeInEPG.Contains(mediaItem.Id);
|
||||
}
|
||||
|
||||
return Option<bool>.None;
|
||||
}
|
||||
}
|
||||
|
||||
public int Count { get; private set; }
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche
|
||||
InPoint = TimeSpan.Zero,
|
||||
OutPoint = itemDuration,
|
||||
GuideGroup = nextState.NextGuideGroup,
|
||||
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
||||
FillerKind = (scheduleItem.GuideMode == GuideMode.Filler || contentEnumerator.CurrentIncludeInProgramGuide == false)
|
||||
? FillerKind.GuideMode
|
||||
: FillerKind.None,
|
||||
CustomTitle = scheduleItem.CustomTitle,
|
||||
|
||||
@@ -57,7 +57,7 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase<ProgramSchedul
|
||||
InPoint = TimeSpan.Zero,
|
||||
OutPoint = itemDuration,
|
||||
GuideGroup = nextState.NextGuideGroup,
|
||||
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
||||
FillerKind = (scheduleItem.GuideMode == GuideMode.Filler || contentEnumerator.CurrentIncludeInProgramGuide == false)
|
||||
? FillerKind.GuideMode
|
||||
: FillerKind.None,
|
||||
CustomTitle = scheduleItem.CustomTitle,
|
||||
|
||||
@@ -65,7 +65,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche
|
||||
InPoint = TimeSpan.Zero,
|
||||
OutPoint = itemDuration,
|
||||
GuideGroup = nextState.NextGuideGroup,
|
||||
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
||||
FillerKind = (scheduleItem.GuideMode == GuideMode.Filler || contentEnumerator.CurrentIncludeInProgramGuide == false)
|
||||
? FillerKind.GuideMode
|
||||
: FillerKind.None,
|
||||
CustomTitle = scheduleItem.CustomTitle,
|
||||
|
||||
@@ -42,7 +42,7 @@ public class PlayoutModeSchedulerOne : PlayoutModeSchedulerBase<ProgramScheduleI
|
||||
InPoint = TimeSpan.Zero,
|
||||
OutPoint = itemDuration,
|
||||
GuideGroup = playoutBuilderState.NextGuideGroup,
|
||||
FillerKind = scheduleItem.GuideMode == GuideMode.Filler
|
||||
FillerKind = (scheduleItem.GuideMode == GuideMode.Filler || contentEnumerator.CurrentIncludeInProgramGuide == false)
|
||||
? FillerKind.GuideMode
|
||||
: FillerKind.None,
|
||||
CustomTitle = scheduleItem.CustomTitle,
|
||||
|
||||
@@ -13,6 +13,8 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator
|
||||
|
||||
public RandomizedMediaCollectionEnumerator(IList<MediaItem> mediaItems, CollectionEnumeratorState state)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_mediaItems = mediaItems;
|
||||
_lazyMinimumDuration =
|
||||
new Lazy<Option<TimeSpan>>(
|
||||
@@ -35,6 +37,7 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _mediaItems.Any() ? _mediaItems[_index] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext()
|
||||
{
|
||||
|
||||
@@ -13,6 +13,8 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
IEnumerable<MediaItem> mediaItems,
|
||||
CollectionEnumeratorState state)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_sortedMediaItems = mediaItems.OrderBy(identity, new SeasonEpisodeMediaComparer()).ToList();
|
||||
_lazyMinimumDuration = new Lazy<Option<TimeSpan>>(
|
||||
() => _sortedMediaItems.Bind(i => i.GetNonZeroDuration()).OrderBy(identity).HeadOrNone());
|
||||
@@ -38,6 +40,7 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _sortedMediaItems.Any() ? _sortedMediaItems[State.Index] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext() => State.Index = (State.Index + 1) % _sortedMediaItems.Count;
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ public class ShuffleInOrderCollectionEnumerator : IMediaCollectionEnumerator
|
||||
bool randomStartPoint,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_collections = collections;
|
||||
_randomStartPoint = randomStartPoint;
|
||||
_cancellationToken = cancellationToken;
|
||||
@@ -59,6 +61,7 @@ public class ShuffleInOrderCollectionEnumerator : IMediaCollectionEnumerator
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _shuffled.Any() ? _shuffled[State.Index % _mediaItemCount] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext()
|
||||
{
|
||||
|
||||
@@ -18,6 +18,8 @@ public class ShuffledMediaCollectionEnumerator : IMediaCollectionEnumerator
|
||||
CollectionEnumeratorState state,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_mediaItemCount = mediaItems.Sum(i => 1 + Optional(i.Additional).Flatten().Count());
|
||||
_mediaItems = mediaItems;
|
||||
_cancellationToken = cancellationToken;
|
||||
@@ -56,6 +58,7 @@ public class ShuffledMediaCollectionEnumerator : IMediaCollectionEnumerator
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _shuffled.Any() ? _shuffled[State.Index % _mediaItemCount] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext()
|
||||
{
|
||||
|
||||
@@ -26,6 +26,8 @@ public class MultiEpisodeShuffleCollectionEnumerator : IMediaCollectionEnumerato
|
||||
ILogger logger,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
CurrentIncludeInProgramGuide = Option<bool>.None;
|
||||
|
||||
_logger = logger;
|
||||
_cancellationToken = cancellationToken;
|
||||
|
||||
@@ -103,6 +105,7 @@ public class MultiEpisodeShuffleCollectionEnumerator : IMediaCollectionEnumerato
|
||||
public CollectionEnumeratorState State { get; }
|
||||
|
||||
public Option<MediaItem> Current => _shuffled.Any() ? _shuffled[State.Index % _mediaItemCount] : None;
|
||||
public Option<bool> CurrentIncludeInProgramGuide { get; }
|
||||
|
||||
public void MoveNext()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user