[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:
@@ -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
|
||||
|
||||
@@ -5,5 +5,6 @@ public enum FillerMode
|
||||
None = 0,
|
||||
Duration = 1,
|
||||
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")]
|
||||
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
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user