[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`
|
- 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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user