[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>
This commit is contained in:
embolon
2024-09-03 10:25:20 -05:00
committed by GitHub
co-authored by Jason Dove
parent 2c44efb971
commit 91e85cc9c1
5 changed files with 77 additions and 3 deletions
+3
View File
@@ -39,6 +39,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- POST `/api/libraries/{libraryId}/scan` - POST `/api/libraries/{libraryId}/scan`
- Add Deco setting to `Use Watermark During Filler` - 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 - 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 ### Fixed
- Add basic cache busting to XMLTV image URLs - Add basic cache busting to XMLTV image URLs
+2 -1
View File
@@ -5,5 +5,6 @@ public enum FillerMode
None = 0, None = 0,
Duration = 1, Duration = 1,
Count = 2, Count = 2,
Pad = 3 Pad = 3,
RandomCount = 4
} }
@@ -11,6 +11,8 @@ namespace ErsatzTV.Core.Scheduling;
[SuppressMessage("Design", "CA1000:Do not declare static members on generic types")] [SuppressMessage("Design", "CA1000:Do not declare static members on generic types")]
public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> where T : ProgramScheduleItem public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> where T : ProgramScheduleItem
{ {
private readonly Random _random = new();
protected PlayoutModeSchedulerBase(ILogger logger) => Logger = logger; protected PlayoutModeSchedulerBase(ILogger logger) => Logger = logger;
protected ILogger Logger { get; } protected ILogger Logger { get; }
@@ -308,6 +310,17 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
filler.AllowWatermarks, filler.AllowWatermarks,
cancellationToken)); cancellationToken));
break; 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
} }
} }
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; break;
} }
} }
@@ -393,6 +425,17 @@ public abstract class PlayoutModeSchedulerBase<T> : IPlayoutModeScheduler<T> whe
filler.AllowWatermarks, filler.AllowWatermarks,
cancellationToken)); cancellationToken));
break; 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
return None; 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;
}
} }
+2 -1
View File
@@ -35,9 +35,10 @@
<MudSelectItem Value="@(FillerMode.Duration)">Duration</MudSelectItem> <MudSelectItem Value="@(FillerMode.Duration)">Duration</MudSelectItem>
<MudSelectItem Value="@(FillerMode.Count)">Count</MudSelectItem> <MudSelectItem Value="@(FillerMode.Count)">Count</MudSelectItem>
<MudSelectItem Value="@(FillerMode.Pad)">Pad</MudSelectItem> <MudSelectItem Value="@(FillerMode.Pad)">Pad</MudSelectItem>
<MudSelectItem Value="@(FillerMode.RandomCount)">Random Count</MudSelectItem>
</MudSelect> </MudSelect>
<MudTimePicker Class="mt-3" Label="Filler Duration" @bind-Time="@_model.Duration" For="@(() => _model.Duration)" Disabled="@(_model.FillerMode != FillerMode.Duration)"/> <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)"> <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="5">5 (:00, :05, :10, :15, :20, etc)</MudSelectItem>
<MudSelectItem T="int?" Value="10">10 (:00, :10, :20, :30, :40, :50)</MudSelectItem> <MudSelectItem T="int?" Value="10">10 (:00, :10, :20, :30, :40, :50)</MudSelectItem>
@@ -47,7 +47,7 @@ public class FillerPresetEditViewModel
public int? Count public int? Count
{ {
get => FillerMode == FillerMode.Count ? _count : null; get => FillerMode is FillerMode.Count or FillerMode.RandomCount ? _count : null;
set => _count = value; set => _count = value;
} }