add deco setting to use watermarks during filler (#1861)
This commit is contained in:
@@ -37,6 +37,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- POST `/api/channels/{channelNumber}/playout/reset`
|
- POST `/api/channels/{channelNumber}/playout/reset`
|
||||||
- Scan library
|
- Scan library
|
||||||
- POST `/api/libraries/{libraryId}/scan`
|
- 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
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Add basic cache busting to XMLTV image URLs
|
- Add basic cache busting to XMLTV image URLs
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ public record UpdateDeco(
|
|||||||
string Name,
|
string Name,
|
||||||
DecoMode WatermarkMode,
|
DecoMode WatermarkMode,
|
||||||
int? WatermarkId,
|
int? WatermarkId,
|
||||||
|
bool UseWatermarkDuringFiller,
|
||||||
DecoMode DefaultFillerMode,
|
DecoMode DefaultFillerMode,
|
||||||
ProgramScheduleItemCollectionType DefaultFillerCollectionType,
|
ProgramScheduleItemCollectionType DefaultFillerCollectionType,
|
||||||
int? DefaultFillerCollectionId,
|
int? DefaultFillerCollectionId,
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ public class UpdateDecoHandler(IDbContextFactory<TvContext> dbContextFactory)
|
|||||||
// watermark
|
// watermark
|
||||||
existing.WatermarkMode = request.WatermarkMode;
|
existing.WatermarkMode = request.WatermarkMode;
|
||||||
existing.WatermarkId = request.WatermarkMode is DecoMode.Override ? request.WatermarkId : null;
|
existing.WatermarkId = request.WatermarkMode is DecoMode.Override ? request.WatermarkId : null;
|
||||||
|
existing.UseWatermarkDuringFiller =
|
||||||
|
request.WatermarkMode is DecoMode.Override && request.UseWatermarkDuringFiller;
|
||||||
|
|
||||||
// default filler
|
// default filler
|
||||||
existing.DefaultFillerMode = request.DefaultFillerMode;
|
existing.DefaultFillerMode = request.DefaultFillerMode;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ public record DecoViewModel(
|
|||||||
string Name,
|
string Name,
|
||||||
DecoMode WatermarkMode,
|
DecoMode WatermarkMode,
|
||||||
int? WatermarkId,
|
int? WatermarkId,
|
||||||
|
bool UseWatermarkDuringFiller,
|
||||||
DecoMode DefaultFillerMode,
|
DecoMode DefaultFillerMode,
|
||||||
ProgramScheduleItemCollectionType DefaultFillerCollectionType,
|
ProgramScheduleItemCollectionType DefaultFillerCollectionType,
|
||||||
int? DefaultFillerCollectionId,
|
int? DefaultFillerCollectionId,
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ internal static class Mapper
|
|||||||
deco.Name,
|
deco.Name,
|
||||||
deco.WatermarkMode,
|
deco.WatermarkMode,
|
||||||
deco.WatermarkId,
|
deco.WatermarkId,
|
||||||
|
deco.UseWatermarkDuringFiller,
|
||||||
deco.DefaultFillerMode,
|
deco.DefaultFillerMode,
|
||||||
deco.DefaultFillerCollectionType,
|
deco.DefaultFillerCollectionType,
|
||||||
deco.DefaultFillerCollectionId,
|
deco.DefaultFillerCollectionId,
|
||||||
|
|||||||
+23
-8
@@ -232,7 +232,7 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
|
|||||||
|
|
||||||
Option<ChannelWatermark> playoutItemWatermark = Optional(playoutItemWithPath.PlayoutItem.Watermark);
|
Option<ChannelWatermark> playoutItemWatermark = Optional(playoutItemWithPath.PlayoutItem.Watermark);
|
||||||
bool disableWatermarks = playoutItemWithPath.PlayoutItem.DisableWatermarks;
|
bool disableWatermarks = playoutItemWithPath.PlayoutItem.DisableWatermarks;
|
||||||
WatermarkResult watermarkResult = GetPlayoutItemWatermark(playoutItemWithPath.PlayoutItem.Playout, now);
|
WatermarkResult watermarkResult = GetPlayoutItemWatermark(playoutItemWithPath.PlayoutItem, now);
|
||||||
switch (watermarkResult)
|
switch (watermarkResult)
|
||||||
{
|
{
|
||||||
case InheritWatermark:
|
case InheritWatermark:
|
||||||
@@ -464,7 +464,10 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
|
|||||||
case CustomDeadAirFallback custom:
|
case CustomDeadAirFallback custom:
|
||||||
maybeFallback = new FillerPreset
|
maybeFallback = new FillerPreset
|
||||||
{
|
{
|
||||||
AllowWatermarks = false, // TODO: does this need to be configurable?
|
// always allow watermarks here
|
||||||
|
// deco settings will disable watermarks if appropriate
|
||||||
|
AllowWatermarks = true,
|
||||||
|
|
||||||
CollectionType = custom.CollectionType,
|
CollectionType = custom.CollectionType,
|
||||||
CollectionId = custom.CollectionId,
|
CollectionId = custom.CollectionId,
|
||||||
MediaItemId = custom.MediaItemId,
|
MediaItemId = custom.MediaItemId,
|
||||||
@@ -657,9 +660,9 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private WatermarkResult GetPlayoutItemWatermark(Playout playout, DateTimeOffset now)
|
private WatermarkResult GetPlayoutItemWatermark(PlayoutItem playoutItem, DateTimeOffset now)
|
||||||
{
|
{
|
||||||
DecoEntries decoEntries = GetDecoEntries(playout, now);
|
DecoEntries decoEntries = GetDecoEntries(playoutItem.Playout, now);
|
||||||
|
|
||||||
// first, check deco template / active deco
|
// first, check deco template / active deco
|
||||||
foreach (Deco templateDeco in decoEntries.TemplateDeco)
|
foreach (Deco templateDeco in decoEntries.TemplateDeco)
|
||||||
@@ -667,8 +670,14 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
|
|||||||
switch (templateDeco.WatermarkMode)
|
switch (templateDeco.WatermarkMode)
|
||||||
{
|
{
|
||||||
case DecoMode.Override:
|
case DecoMode.Override:
|
||||||
_logger.LogDebug("Watermark will come from template deco (override)");
|
if (playoutItem.FillerKind is FillerKind.None || templateDeco.UseWatermarkDuringFiller)
|
||||||
return new CustomWatermark(templateDeco.Watermark);
|
{
|
||||||
|
_logger.LogDebug("Watermark will come from template deco (override)");
|
||||||
|
return new CustomWatermark(templateDeco.Watermark);
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogDebug("Watermark is disabled by template deco during filler");
|
||||||
|
return new DisableWatermark();
|
||||||
case DecoMode.Disable:
|
case DecoMode.Disable:
|
||||||
_logger.LogDebug("Watermark is disabled by template deco");
|
_logger.LogDebug("Watermark is disabled by template deco");
|
||||||
return new DisableWatermark();
|
return new DisableWatermark();
|
||||||
@@ -684,8 +693,14 @@ public class GetPlayoutItemProcessByChannelNumberHandler : FFmpegProcessHandler<
|
|||||||
switch (playoutDeco.WatermarkMode)
|
switch (playoutDeco.WatermarkMode)
|
||||||
{
|
{
|
||||||
case DecoMode.Override:
|
case DecoMode.Override:
|
||||||
_logger.LogDebug("Watermark will come from playout deco (override)");
|
if (playoutItem.FillerKind is FillerKind.None || playoutDeco.UseWatermarkDuringFiller)
|
||||||
return new CustomWatermark(playoutDeco.Watermark);
|
{
|
||||||
|
_logger.LogDebug("Watermark will come from playout deco (override)");
|
||||||
|
return new CustomWatermark(playoutDeco.Watermark);
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogDebug("Watermark is disabled by playout deco during filler");
|
||||||
|
return new DisableWatermark();
|
||||||
case DecoMode.Disable:
|
case DecoMode.Disable:
|
||||||
_logger.LogDebug("Watermark is disabled by playout deco");
|
_logger.LogDebug("Watermark is disabled by playout deco");
|
||||||
return new DisableWatermark();
|
return new DisableWatermark();
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ public class Deco
|
|||||||
public DecoMode WatermarkMode { get; set; }
|
public DecoMode WatermarkMode { get; set; }
|
||||||
public int? WatermarkId { get; set; }
|
public int? WatermarkId { get; set; }
|
||||||
public ChannelWatermark Watermark { get; set; }
|
public ChannelWatermark Watermark { get; set; }
|
||||||
|
public bool UseWatermarkDuringFiller { get; set; }
|
||||||
|
|
||||||
// default filler
|
// default filler
|
||||||
public DecoMode DefaultFillerMode { get; set; }
|
public DecoMode DefaultFillerMode { get; set; }
|
||||||
|
|||||||
+5869
File diff suppressed because it is too large
Load Diff
+29
@@ -0,0 +1,29 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace ErsatzTV.Infrastructure.MySql.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class Add_Deco_UseWatermarkDuringFiller : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<bool>(
|
||||||
|
name: "UseWatermarkDuringFiller",
|
||||||
|
table: "Deco",
|
||||||
|
type: "tinyint(1)",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "UseWatermarkDuringFiller",
|
||||||
|
table: "Deco");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2312,6 +2312,9 @@ namespace ErsatzTV.Infrastructure.MySql.Migrations
|
|||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.HasColumnType("varchar(255)");
|
.HasColumnType("varchar(255)");
|
||||||
|
|
||||||
|
b.Property<bool>("UseWatermarkDuringFiller")
|
||||||
|
.HasColumnType("tinyint(1)");
|
||||||
|
|
||||||
b.Property<int?>("WatermarkId")
|
b.Property<int?>("WatermarkId")
|
||||||
.HasColumnType("int");
|
.HasColumnType("int");
|
||||||
|
|
||||||
|
|||||||
+5708
File diff suppressed because it is too large
Load Diff
+29
@@ -0,0 +1,29 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
#nullable disable
|
||||||
|
|
||||||
|
namespace ErsatzTV.Infrastructure.Sqlite.Migrations
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
public partial class Add_Deco_UseWatermarkDuringFiller : Migration
|
||||||
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.AddColumn<bool>(
|
||||||
|
name: "UseWatermarkDuringFiller",
|
||||||
|
table: "Deco",
|
||||||
|
type: "INTEGER",
|
||||||
|
nullable: false,
|
||||||
|
defaultValue: false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropColumn(
|
||||||
|
name: "UseWatermarkDuringFiller",
|
||||||
|
table: "Deco");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2197,6 +2197,9 @@ namespace ErsatzTV.Infrastructure.Sqlite.Migrations
|
|||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.HasColumnType("TEXT");
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<bool>("UseWatermarkDuringFiller")
|
||||||
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<int?>("WatermarkId")
|
b.Property<int?>("WatermarkId")
|
||||||
.HasColumnType("INTEGER");
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,12 @@
|
|||||||
<MudSelectItem T="int?" Value="@watermark.Id">@watermark.Name</MudSelectItem>
|
<MudSelectItem T="int?" Value="@watermark.Id">@watermark.Name</MudSelectItem>
|
||||||
}
|
}
|
||||||
</MudSelect>
|
</MudSelect>
|
||||||
|
<MudSwitch T="bool"
|
||||||
|
Class="mt-3"
|
||||||
|
Disabled="@(_deco.WatermarkMode != DecoMode.Override)"
|
||||||
|
@bind-Value="_deco.UseWatermarkDuringFiller"
|
||||||
|
Color="Color.Primary"
|
||||||
|
Label="Use Watermark During Filler"/>
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
<MudCard Class="mb-6" Style="width: 350px">
|
<MudCard Class="mb-6" Style="width: 350px">
|
||||||
@@ -159,7 +165,12 @@
|
|||||||
}
|
}
|
||||||
</MudSelect>
|
</MudSelect>
|
||||||
}
|
}
|
||||||
<MudSwitch T="bool" Class="mt-3" Label="Trim To Fit" @bind-Value="_deco.DefaultFillerTrimToFit" Color="Color.Primary" />
|
<MudSwitch T="bool"
|
||||||
|
Class="mt-3"
|
||||||
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
||||||
|
Label="Trim To Fit"
|
||||||
|
@bind-Value="_deco.DefaultFillerTrimToFit"
|
||||||
|
Color="Color.Primary" />
|
||||||
</MudCardContent>
|
</MudCardContent>
|
||||||
</MudCard>
|
</MudCard>
|
||||||
<MudCard Class="mb-6" Style="width: 350px">
|
<MudCard Class="mb-6" Style="width: 350px">
|
||||||
@@ -344,6 +355,7 @@
|
|||||||
DecoGroupId = deco.DecoGroupId,
|
DecoGroupId = deco.DecoGroupId,
|
||||||
WatermarkMode = deco.WatermarkMode,
|
WatermarkMode = deco.WatermarkMode,
|
||||||
WatermarkId = deco.WatermarkId,
|
WatermarkId = deco.WatermarkId,
|
||||||
|
UseWatermarkDuringFiller = deco.UseWatermarkDuringFiller,
|
||||||
|
|
||||||
DefaultFillerMode = deco.DefaultFillerMode,
|
DefaultFillerMode = deco.DefaultFillerMode,
|
||||||
DefaultFillerCollectionType = deco.DefaultFillerCollectionType,
|
DefaultFillerCollectionType = deco.DefaultFillerCollectionType,
|
||||||
@@ -389,6 +401,7 @@
|
|||||||
_deco.Name,
|
_deco.Name,
|
||||||
_deco.WatermarkMode,
|
_deco.WatermarkMode,
|
||||||
_deco.WatermarkId,
|
_deco.WatermarkId,
|
||||||
|
_deco.UseWatermarkDuringFiller,
|
||||||
_deco.DefaultFillerMode,
|
_deco.DefaultFillerMode,
|
||||||
_deco.DefaultFillerCollectionType,
|
_deco.DefaultFillerCollectionType,
|
||||||
_deco.DefaultFillerCollection?.Id,
|
_deco.DefaultFillerCollection?.Id,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ public class DecoEditViewModel
|
|||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public DecoMode WatermarkMode { get; set; }
|
public DecoMode WatermarkMode { get; set; }
|
||||||
public int? WatermarkId { get; set; }
|
public int? WatermarkId { get; set; }
|
||||||
|
public bool UseWatermarkDuringFiller { get; set; }
|
||||||
|
|
||||||
public DecoMode DefaultFillerMode { get; set; }
|
public DecoMode DefaultFillerMode { get; set; }
|
||||||
public ProgramScheduleItemCollectionType DefaultFillerCollectionType { get; set; }
|
public ProgramScheduleItemCollectionType DefaultFillerCollectionType { get; set; }
|
||||||
|
|||||||
Reference in New Issue
Block a user