Support individual chapters as filler (#2208)

* Use chapters in duration filler

* add new option, migrations, and update filler preset editor

* Revert "Use chapters in duration filler"

This reverts commit d87a8a240a78c1cbca7b311125f8d3a84645d296.

* scaffold splitting filler by chapter

* implement chapters as filler

* update changelog

* re-add migrations

* Add duration for ChapterMediaItem

---------

Co-authored-by: Jason Dove <1695733+jasongdove@users.noreply.github.com>
This commit is contained in:
Chris Simpson
2025-08-04 00:18:14 +00:00
committed by GitHub
co-authored by Jason Dove
parent 8b12ee459a
commit 48f93b8af8
22 changed files with 12422 additions and 40 deletions
+12
View File
@@ -209,6 +209,17 @@
</MudSelect>
</MudStack>
}
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Use Chapters As Media Items</MudText>
</div>
<MudCheckBox @bind-Value="@_model.UseChaptersAsMediaItems"
For="@(() => _model.UseChaptersAsMediaItems)"
Dense="true"
Disabled="@(_model.FillerKind is FillerKind.Fallback)">
<MudText Typo="Typo.caption" Style="font-weight: normal">Schedule individual chapters instead of entire files</MudText>
</MudCheckBox>
</MudStack>
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
<div class="d-flex">
<MudText>Expression</MudText>
@@ -313,6 +324,7 @@
? _televisionShows.Append(_televisionSeasons).Append(_artists).ToList().Find(vm => vm.MediaItemId == fillerPreset.MediaItemId.Value)
: null;
_model.Expression = fillerPreset.Expression;
_model.UseChaptersAsMediaItems = fillerPreset.UseChaptersAsMediaItems;
_model.Playlist = fillerPreset.Playlist;
});
}
@@ -25,6 +25,9 @@ public class FillerPresetEditViewModelValidator : AbstractValidator<FillerPreset
When(
fp => fp.FillerMode == FillerMode.Pad,
() => RuleFor(fp => fp.PadToNearestMinute).NotNull());
When(
fp => fp.FillerKind is FillerKind.Fallback,
() => RuleFor(fp => fp.UseChaptersAsMediaItems).NotEqual(true));
When(
fp => fp.CollectionType == ProgramScheduleItemCollectionType.Collection,
@@ -35,6 +35,11 @@ public class FillerPresetEditViewModel
{
Expression = string.Empty;
}
if (_fillerKind is FillerKind.Fallback)
{
UseChaptersAsMediaItems = false;
}
}
}
@@ -93,6 +98,8 @@ public class FillerPresetEditViewModel
public string Expression { get; set; }
public bool UseChaptersAsMediaItems { get; set; }
public IRequest<Either<BaseError, Unit>> ToEdit() =>
new UpdateFillerPreset(
Id,
@@ -109,7 +116,8 @@ public class FillerPresetEditViewModel
MultiCollection?.Id,
SmartCollection?.Id,
Playlist?.Id,
Expression);
Expression,
UseChaptersAsMediaItems);
public IRequest<Either<BaseError, Unit>> ToUpdate() =>
new CreateFillerPreset(
@@ -126,7 +134,8 @@ public class FillerPresetEditViewModel
MultiCollection?.Id,
SmartCollection?.Id,
Playlist?.Id,
Expression);
Expression,
UseChaptersAsMediaItems);
private static TimeSpan FixDuration(TimeSpan duration) =>
duration > TimeSpan.FromDays(1) ? duration.Subtract(TimeSpan.FromDays(1)) : duration;