Browse Source

set guide mode filler as appropriate on playlist items (#1691)

pull/1693/head
Jason Dove 2 years ago committed by GitHub
parent
commit
c46b3787d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs
  2. 3
      ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutShuffledMediaCollectionEnumerator.cs
  3. 3
      ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs
  4. 3
      ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs
  5. 22
      ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs
  6. 2
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs
  7. 2
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs
  8. 2
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs
  9. 2
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerOne.cs
  10. 3
      ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs
  11. 3
      ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs
  12. 3
      ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs
  13. 3
      ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs
  14. 3
      ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs

1
ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs

@ -6,6 +6,7 @@ public interface IMediaCollectionEnumerator @@ -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
ErsatzTV.Core/Scheduling/BlockScheduling/BlockPlayoutShuffledMediaCollectionEnumerator.cs

@ -15,6 +15,8 @@ public class BlockPlayoutShuffledMediaCollectionEnumerator : IMediaCollectionEnu @@ -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 @@ -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++;

3
ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs

@ -13,6 +13,8 @@ public sealed class ChronologicalMediaCollectionEnumerator : IMediaCollectionEnu @@ -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 @@ -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;

3
ErsatzTV.Core/Scheduling/CustomOrderCollectionEnumerator.cs

@ -15,6 +15,8 @@ public class CustomOrderCollectionEnumerator : IMediaCollectionEnumerator @@ -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 @@ -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;

22
ErsatzTV.Core/Scheduling/PlaylistEnumerator.cs

@ -9,6 +9,7 @@ public class PlaylistEnumerator : IMediaCollectionEnumerator @@ -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 @@ -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 @@ -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 @@ -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; }

2
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerDuration.cs

@ -107,7 +107,7 @@ public class PlayoutModeSchedulerDuration : PlayoutModeSchedulerBase<ProgramSche @@ -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,

2
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerFlood.cs

@ -57,7 +57,7 @@ public class PlayoutModeSchedulerFlood : PlayoutModeSchedulerBase<ProgramSchedul @@ -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,

2
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerMultiple.cs

@ -65,7 +65,7 @@ public class PlayoutModeSchedulerMultiple : PlayoutModeSchedulerBase<ProgramSche @@ -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,

2
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerOne.cs

@ -42,7 +42,7 @@ public class PlayoutModeSchedulerOne : PlayoutModeSchedulerBase<ProgramScheduleI @@ -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,

3
ErsatzTV.Core/Scheduling/RandomizedMediaCollectionEnumerator.cs

@ -13,6 +13,8 @@ public class RandomizedMediaCollectionEnumerator : IMediaCollectionEnumerator @@ -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 @@ -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()
{

3
ErsatzTV.Core/Scheduling/SeasonEpisodeMediaCollectionEnumerator.cs

@ -13,6 +13,8 @@ public sealed class SeasonEpisodeMediaCollectionEnumerator : IMediaCollectionEnu @@ -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 @@ -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;

3
ErsatzTV.Core/Scheduling/ShuffleInOrderCollectionEnumerator.cs

@ -20,6 +20,8 @@ public class ShuffleInOrderCollectionEnumerator : IMediaCollectionEnumerator @@ -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 @@ -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()
{

3
ErsatzTV.Core/Scheduling/ShuffledMediaCollectionEnumerator.cs

@ -18,6 +18,8 @@ public class ShuffledMediaCollectionEnumerator : IMediaCollectionEnumerator @@ -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 @@ -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()
{

3
ErsatzTV.Infrastructure/Scheduling/MultiEpisodeShuffleCollectionEnumerator.cs

@ -26,6 +26,8 @@ public class MultiEpisodeShuffleCollectionEnumerator : IMediaCollectionEnumerato @@ -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 @@ -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()
{

Loading…
Cancel
Save