Browse Source

[Filler] Add random count for filler preset (#1886)

* init

* minor update

* clean up

* minor cleanup

* update changelog

* update changelog again

---------

Co-authored-by: Jason Dove <1695733+jasongdove@users.noreply.github.com>
pull/1892/head
embolon 11 months ago committed by GitHub
parent
commit
91e85cc9c1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 3
      CHANGELOG.md
  2. 3
      ErsatzTV.Core/Domain/Filler/FillerMode.cs
  3. 69
      ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs
  4. 3
      ErsatzTV/Pages/FillerPresetEditor.razor
  5. 2
      ErsatzTV/ViewModels/FillerPresetEditViewModel.cs

3
CHANGELOG.md

@ -39,6 +39,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -39,6 +39,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- POST `/api/libraries/{libraryId}/scan`
- Add Deco setting to `Use Watermark During Filler`
- This setting is turned OFF by default, meaning filler will NOT use the configured watermark unless this is manually turned on
- Add `Random Count` filler mode by @embolon
- This mode will randomly schedule between zero and the provided count number of items
- e.g. random count 3 will schedule between 0 and 3 filler items
### Fixed
- Add basic cache busting to XMLTV image URLs

3
ErsatzTV.Core/Domain/Filler/FillerMode.cs

@ -5,5 +5,6 @@ public enum FillerMode @@ -5,5 +5,6 @@ public enum FillerMode
None = 0,
Duration = 1,
Count = 2,
Pad = 3
Pad = 3,
RandomCount = 4
}

69
ErsatzTV.Core/Scheduling/PlayoutModeSchedulerBase.cs

@ -11,6 +11,8 @@ namespace ErsatzTV.Core.Scheduling; @@ -11,6 +11,8 @@ namespace ErsatzTV.Core.Scheduling;
[SuppressMessage("Design", "CA1000:Do not declare static members on generic types")]
public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> where T : ProgramScheduleItem
{
private readonly Random _random = new();
protected PlayoutModeSchedulerBase(ILogger logger) => Logger = logger;
protected ILogger Logger { get; }
@ -308,6 +310,17 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe @@ -308,6 +310,17 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
filler.AllowWatermarks,
cancellationToken));
break;
case FillerMode.RandomCount when filler.Count.HasValue:
IMediaCollectionEnumerator e3 = enumerators[CollectionKey.ForFillerPreset(filler)];
result.AddRange(
AddRandomCountFiller(
playoutBuilderState,
e3,
filler.Count.Value,
FillerKind.PreRoll,
filler.AllowWatermarks,
cancellationToken));
break;
}
}
@ -360,6 +373,25 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe @@ -360,6 +373,25 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
}
}
break;
case FillerMode.RandomCount when filler.Count.HasValue:
IMediaCollectionEnumerator e3 = enumerators[CollectionKey.ForFillerPreset(filler)];
for (var i = 0; i < effectiveChapters.Count; i++)
{
result.Add(playoutItem.ForChapter(effectiveChapters[i]));
if (i < effectiveChapters.Count - 1)
{
result.AddRange(
AddRandomCountFiller(
playoutBuilderState,
e3,
filler.Count.Value,
FillerKind.MidRoll,
filler.AllowWatermarks,
cancellationToken));
}
}
break;
}
}
@ -393,6 +425,17 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe @@ -393,6 +425,17 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
filler.AllowWatermarks,
cancellationToken));
break;
case FillerMode.RandomCount when filler.Count.HasValue:
IMediaCollectionEnumerator e3 = enumerators[CollectionKey.ForFillerPreset(filler)];
result.AddRange(
AddRandomCountFiller(
playoutBuilderState,
e3,
filler.Count.Value,
FillerKind.PostRoll,
filler.AllowWatermarks,
cancellationToken));
break;
}
}
@ -699,4 +742,30 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe @@ -699,4 +742,30 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
return None;
}
private List<PlayoutItem> AddRandomCountFiller(
PlayoutBuilderState playoutBuilderState,
IMediaCollectionEnumerator enumerator,
int count,
FillerKind fillerKind,
bool allowWatermarks,
CancellationToken cancellationToken)
{
var result = new List<PlayoutItem>();
// randomCount is from 0 to count.
int randomCount = _random.Next(count + 1);
if (randomCount != 0)
{
result = AddCountFiller(
playoutBuilderState,
enumerator,
randomCount,
fillerKind,
allowWatermarks,
cancellationToken);
}
return result;
}
}

3
ErsatzTV/Pages/FillerPresetEditor.razor

@ -35,9 +35,10 @@ @@ -35,9 +35,10 @@
<MudSelectItem Value="@(FillerMode.Duration)">Duration</MudSelectItem>
<MudSelectItem Value="@(FillerMode.Count)">Count</MudSelectItem>
<MudSelectItem Value="@(FillerMode.Pad)">Pad</MudSelectItem>
<MudSelectItem Value="@(FillerMode.RandomCount)">Random Count</MudSelectItem>
</MudSelect>
<MudTimePicker Class="mt-3" Label="Filler Duration" @bind-Time="@_model.Duration" For="@(() => _model.Duration)" Disabled="@(_model.FillerMode != FillerMode.Duration)"/>
<MudTextField Class="mt-3" Label="Filler Count" @bind-Value="@_model.Count" For="@(() => _model.Count)" Disabled="@(_model.FillerMode != FillerMode.Count)"/>
<MudTextField Class="mt-3" Label="Filler Count" @bind-Value="@_model.Count" For="@(() => _model.Count)" Disabled="@((_model.FillerMode != FillerMode.Count) && (_model.FillerMode != FillerMode.RandomCount))"/>
<MudSelect Class="mt-3" Label="Filler Pad To Nearest Minute" @bind-Value="_model.PadToNearestMinute" For="@(() => _model.PadToNearestMinute)" Disabled="@(_model.FillerMode != FillerMode.Pad)">
<MudSelectItem T="int?" Value="5">5 (:00, :05, :10, :15, :20, etc)</MudSelectItem>
<MudSelectItem T="int?" Value="10">10 (:00, :10, :20, :30, :40, :50)</MudSelectItem>

2
ErsatzTV/ViewModels/FillerPresetEditViewModel.cs

@ -47,7 +47,7 @@ public class FillerPresetEditViewModel @@ -47,7 +47,7 @@ public class FillerPresetEditViewModel
public int? Count
{
get => FillerMode == FillerMode.Count ? _count : null;
get => FillerMode is FillerMode.Count or FillerMode.RandomCount ? _count : null;
set => _count = value;
}

Loading…
Cancel
Save