478 lines
22 KiB
Plaintext
478 lines
22 KiB
Plaintext
@page "/decos/{Id:int}"
|
|
@using ErsatzTV.Application.Artists
|
|
@using ErsatzTV.Application.MediaCollections
|
|
@using ErsatzTV.Application.MediaItems
|
|
@using ErsatzTV.Application.Scheduling
|
|
@using ErsatzTV.Application.Television
|
|
@using ErsatzTV.Application.Watermarks
|
|
@using ErsatzTV.Core.Domain.Scheduling
|
|
@implements IDisposable
|
|
@inject NavigationManager NavigationManager
|
|
@inject ILogger<DecoEditor> Logger
|
|
@inject ISnackbar Snackbar
|
|
@inject IMediator Mediator
|
|
|
|
<MudForm Style="max-height: 100%">
|
|
<MudPaper Square="true" Style="display: flex; height: 64px; min-height: 64px; width: 100%; z-index: 100; align-items: center">
|
|
<MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@(_ => SaveChanges())" Class="ml-6" StartIcon="@Icons.Material.Filled.Save">
|
|
Save Changes
|
|
</MudButton>
|
|
</MudPaper>
|
|
<div class="d-flex flex-column" style="height: 100vh; overflow-x: auto">
|
|
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
|
|
<MudText Typo="Typo.h5" Class="mb-2">Deco</MudText>
|
|
<MudDivider Class="mb-6"/>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Deco Group Name</MudText>
|
|
</div>
|
|
<MudTextField @bind-Value="_deco.GroupName" Disabled="true"/>
|
|
</MudStack>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Deco Name</MudText>
|
|
</div>
|
|
<MudTextField @bind-Value="_deco.Name" For="@(() => _deco.Name)"/>
|
|
</MudStack>
|
|
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Watermark</MudText>
|
|
<MudDivider Class="mb-6"/>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Watermark Mode</MudText>
|
|
</div>
|
|
<MudSelect @bind-Value="_deco.WatermarkMode" For="@(() => _deco.WatermarkMode)">
|
|
<MudSelectItem Value="DecoMode.Inherit">Inherit</MudSelectItem>
|
|
<MudSelectItem Value="DecoMode.Disable">Disable</MudSelectItem>
|
|
<MudSelectItem Value="DecoMode.Override">Replace</MudSelectItem>
|
|
<MudSelectItem Value="DecoMode.Merge">Merge</MudSelectItem>
|
|
</MudSelect>
|
|
</MudStack>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Watermark</MudText>
|
|
</div>
|
|
<MudSelect T="WatermarkViewModel"
|
|
@bind-SelectedValues="_deco.Watermarks"
|
|
Disabled="@(_deco.WatermarkMode is not (DecoMode.Override or DecoMode.Merge))"
|
|
ToStringFunc="@(wm => wm?.Name)"
|
|
Clearable="true"
|
|
MultiSelection="true">
|
|
@foreach (WatermarkViewModel watermark in _watermarks)
|
|
{
|
|
<MudSelectItem Value="@watermark">@watermark.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Use Watermark During Filler</MudText>
|
|
</div>
|
|
<MudCheckBox T="bool"
|
|
Disabled="@(_deco.WatermarkMode != DecoMode.Override)"
|
|
@bind-Value="_deco.UseWatermarkDuringFiller"
|
|
Dense="true"/>
|
|
</MudStack>
|
|
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Default Filler</MudText>
|
|
<MudDivider Class="mb-6"/>
|
|
<MudText Typo="Typo.body2" Class="mb-6">After all blocks have been scheduled, a second pass will be made to fill unscheduled time using random items from this collection.</MudText>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Default Filler Mode</MudText>
|
|
</div>
|
|
<MudSelect @bind-Value="_deco.DefaultFillerMode" For="@(() => _deco.DefaultFillerMode)">
|
|
<MudSelectItem Value="DecoMode.Inherit">Inherit</MudSelectItem>
|
|
<MudSelectItem Value="DecoMode.Disable">Disable</MudSelectItem>
|
|
<MudSelectItem Value="DecoMode.Override">Override</MudSelectItem>
|
|
</MudSelect>
|
|
</MudStack>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Default Filler Collection Type</MudText>
|
|
</div>
|
|
<MudSelect Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-Value="_deco.DefaultFillerCollectionType"
|
|
For="@(() => _deco.DefaultFillerCollectionType)">
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.Collection">Collection</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionShow">Television Show</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionSeason">Television Season</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.Artist">Artist</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.MultiCollection">Multi Collection</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.SmartCollection">Smart Collection</MudSelectItem>
|
|
</MudSelect>
|
|
</MudStack>
|
|
@if (_deco.DefaultFillerCollectionType == ProgramScheduleItemCollectionType.Collection)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Collection</MudText>
|
|
</div>
|
|
<MudSelect T="MediaCollectionViewModel"
|
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-value="_deco.DefaultFillerCollection">
|
|
@foreach (MediaCollectionViewModel collection in _mediaCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DefaultFillerCollectionType == ProgramScheduleItemCollectionType.MultiCollection)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Multi Collection</MudText>
|
|
</div>
|
|
<MudSelect T="MultiCollectionViewModel"
|
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-value="_deco.DefaultFillerMultiCollection">
|
|
@foreach (MultiCollectionViewModel collection in _multiCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DefaultFillerCollectionType == ProgramScheduleItemCollectionType.SmartCollection)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Smart Collection</MudText>
|
|
</div>
|
|
<MudSelect T="SmartCollectionViewModel"
|
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-value="_deco.DefaultFillerSmartCollection">
|
|
@foreach (SmartCollectionViewModel collection in _smartCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DefaultFillerCollectionType == ProgramScheduleItemCollectionType.TelevisionShow)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Television Show</MudText>
|
|
</div>
|
|
<MudSelect T="NamedMediaItemViewModel"
|
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-value="_deco.DefaultFillerMediaItem">
|
|
@foreach (NamedMediaItemViewModel show in _televisionShows)
|
|
{
|
|
<MudSelectItem Value="@show">@show.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DefaultFillerCollectionType == ProgramScheduleItemCollectionType.TelevisionSeason)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Television Season</MudText>
|
|
</div>
|
|
<MudSelect T="NamedMediaItemViewModel"
|
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-value="_deco.DefaultFillerMediaItem">
|
|
@foreach (NamedMediaItemViewModel season in _televisionSeasons)
|
|
{
|
|
<MudSelectItem Value="@season">@season.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DefaultFillerCollectionType == ProgramScheduleItemCollectionType.Artist)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Artist</MudText>
|
|
</div>
|
|
<MudSelect T="NamedMediaItemViewModel"
|
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-value="_deco.DefaultFillerMediaItem">
|
|
@foreach (NamedMediaItemViewModel artist in _artists)
|
|
{
|
|
<MudSelectItem Value="@artist">@artist.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Trim To Fit</MudText>
|
|
</div>
|
|
<MudCheckBox T="bool"
|
|
Disabled="@(_deco.DefaultFillerMode != DecoMode.Override)"
|
|
@bind-Value="_deco.DefaultFillerTrimToFit"
|
|
Color="Color.Primary"
|
|
Dense="true"/>
|
|
</MudStack>
|
|
<MudText Typo="Typo.h5" Class="mt-10 mb-2">Dead Air Fallback</MudText>
|
|
<MudDivider Class="mb-6"/>
|
|
<MudText Typo="Typo.body2">When no playout item is found for the current time, *one* item will be randomly selected from this collection and looped and trimmed to exactly fit until the start of the next playout item.</MudText>
|
|
<MudText Typo="Typo.body2" Class="mb-6 mt-3">This replaces the "Channel is Offline" image that would otherwise display.</MudText>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Dead Air Fallback Mode</MudText>
|
|
</div>
|
|
<MudSelect @bind-Value="_deco.DeadAirFallbackMode" For="@(() => _deco.DeadAirFallbackMode)">
|
|
<MudSelectItem Value="DecoMode.Inherit">Inherit</MudSelectItem>
|
|
<MudSelectItem Value="DecoMode.Disable">Disable</MudSelectItem>
|
|
<MudSelectItem Value="DecoMode.Override">Override</MudSelectItem>
|
|
</MudSelect>
|
|
</MudStack>
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Dead Air Fallback Collection Type</MudText>
|
|
</div>
|
|
<MudSelect Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
|
|
@bind-Value="_deco.DeadAirFallbackCollectionType"
|
|
For="@(() => _deco.DeadAirFallbackCollectionType)">
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.Collection">Collection</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionShow">Television Show</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.TelevisionSeason">Television Season</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.Artist">Artist</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.MultiCollection">Multi Collection</MudSelectItem>
|
|
<MudSelectItem Value="ProgramScheduleItemCollectionType.SmartCollection">Smart Collection</MudSelectItem>
|
|
</MudSelect>
|
|
</MudStack>
|
|
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.Collection)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Collection</MudText>
|
|
</div>
|
|
<MudSelect T="MediaCollectionViewModel"
|
|
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
|
|
@bind-value="_deco.DeadAirFallbackCollection">
|
|
@foreach (MediaCollectionViewModel collection in _mediaCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.MultiCollection)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Multi Collection</MudText>
|
|
</div>
|
|
<MudSelect T="MultiCollectionViewModel"
|
|
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
|
|
@bind-value="_deco.DeadAirFallbackMultiCollection">
|
|
@foreach (MultiCollectionViewModel collection in _multiCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.SmartCollection)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Smart Collection</MudText>
|
|
</div>
|
|
<MudSelect T="SmartCollectionViewModel"
|
|
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
|
|
@bind-value="_deco.DeadAirFallbackSmartCollection">
|
|
@foreach (SmartCollectionViewModel collection in _smartCollections)
|
|
{
|
|
<MudSelectItem Value="@collection">@collection.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.TelevisionShow)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Television Show</MudText>
|
|
</div>
|
|
<MudSelect T="NamedMediaItemViewModel"
|
|
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
|
|
@bind-value="_deco.DeadAirFallbackMediaItem">
|
|
@foreach (NamedMediaItemViewModel show in _televisionShows)
|
|
{
|
|
<MudSelectItem Value="@show">@show.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.TelevisionSeason)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Television Season</MudText>
|
|
</div>
|
|
<MudSelect T="NamedMediaItemViewModel"
|
|
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
|
|
@bind-value="_deco.DeadAirFallbackMediaItem">
|
|
@foreach (NamedMediaItemViewModel season in _televisionSeasons)
|
|
{
|
|
<MudSelectItem Value="@season">@season.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
@if (_deco.DeadAirFallbackCollectionType == ProgramScheduleItemCollectionType.Artist)
|
|
{
|
|
<MudStack Row="true" Breakpoint="Breakpoint.SmAndDown" Class="form-field-stack gap-md-8 mb-5">
|
|
<div class="d-flex">
|
|
<MudText>Artist</MudText>
|
|
</div>
|
|
<MudSelect T="NamedMediaItemViewModel"
|
|
Disabled="@(_deco.DeadAirFallbackMode != DecoMode.Override)"
|
|
@bind-value="_deco.DeadAirFallbackMediaItem">
|
|
@foreach (NamedMediaItemViewModel artist in _artists)
|
|
{
|
|
<MudSelectItem Value="@artist">@artist.Name</MudSelectItem>
|
|
}
|
|
</MudSelect>
|
|
</MudStack>
|
|
}
|
|
</MudContainer>
|
|
</div>
|
|
</MudForm>
|
|
|
|
@code {
|
|
private readonly CancellationTokenSource _cts = new();
|
|
|
|
[Parameter]
|
|
public int Id { get; set; }
|
|
|
|
private DecoEditViewModel _deco = new();
|
|
|
|
private List<WatermarkViewModel> _watermarks = [];
|
|
|
|
private List<MediaCollectionViewModel> _mediaCollections = [];
|
|
private List<MultiCollectionViewModel> _multiCollections = [];
|
|
private List<SmartCollectionViewModel> _smartCollections = [];
|
|
private List<NamedMediaItemViewModel> _televisionShows = [];
|
|
private List<NamedMediaItemViewModel> _televisionSeasons = [];
|
|
private List<NamedMediaItemViewModel> _artists = [];
|
|
|
|
|
|
public void Dispose()
|
|
{
|
|
_cts.Cancel();
|
|
_cts.Dispose();
|
|
}
|
|
|
|
protected override async Task OnParametersSetAsync()
|
|
{
|
|
await LoadWatermarks();
|
|
|
|
_mediaCollections = await Mediator.Send(new GetAllCollections(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_multiCollections = await Mediator.Send(new GetAllMultiCollections(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_smartCollections = await Mediator.Send(new GetAllSmartCollections(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_televisionShows = await Mediator.Send(new GetAllTelevisionShows(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_televisionSeasons = await Mediator.Send(new GetAllTelevisionSeasons(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
_artists = await Mediator.Send(new GetAllArtists(), _cts.Token)
|
|
.Map(list => list.OrderBy(vm => vm.Name, StringComparer.CurrentCultureIgnoreCase).ToList());
|
|
|
|
await LoadDeco();
|
|
}
|
|
|
|
private async Task LoadWatermarks() =>
|
|
_watermarks = await Mediator.Send(new GetAllWatermarks(), _cts.Token);
|
|
|
|
private async Task LoadDeco()
|
|
{
|
|
Option<DecoViewModel> maybeDeco = await Mediator.Send(new GetDecoById(Id), _cts.Token);
|
|
if (maybeDeco.IsNone)
|
|
{
|
|
NavigationManager.NavigateTo("decos");
|
|
return;
|
|
}
|
|
|
|
foreach (DecoViewModel deco in maybeDeco)
|
|
{
|
|
_deco = new DecoEditViewModel
|
|
{
|
|
Name = deco.Name,
|
|
DecoGroupId = deco.DecoGroupId,
|
|
GroupName = deco.DecoGroupName,
|
|
WatermarkMode = deco.WatermarkMode,
|
|
Watermarks = deco.Watermarks,
|
|
UseWatermarkDuringFiller = deco.UseWatermarkDuringFiller,
|
|
|
|
DefaultFillerMode = deco.DefaultFillerMode,
|
|
DefaultFillerCollectionType = deco.DefaultFillerCollectionType,
|
|
DefaultFillerCollection = deco.DefaultFillerCollectionId.HasValue
|
|
? _mediaCollections.Find(c => c.Id == deco.DefaultFillerCollectionId!.Value)
|
|
: null,
|
|
DefaultFillerMediaItem = deco.DefaultFillerMediaItemId.HasValue
|
|
? _televisionShows.Append(_televisionSeasons).Append(_artists).ToList()
|
|
.Find(vm => vm.MediaItemId == deco.DefaultFillerMediaItemId!.Value)
|
|
: null,
|
|
DefaultFillerMultiCollection = deco.DefaultFillerMultiCollectionId.HasValue
|
|
? _multiCollections.Find(c => c.Id == deco.DefaultFillerMultiCollectionId!.Value)
|
|
: null,
|
|
DefaultFillerSmartCollection = deco.DefaultFillerSmartCollectionId.HasValue
|
|
? _smartCollections.Find(c => c.Id == deco.DefaultFillerSmartCollectionId!.Value)
|
|
: null,
|
|
DefaultFillerTrimToFit = deco.DefaultFillerTrimToFit,
|
|
|
|
DeadAirFallbackMode = deco.DeadAirFallbackMode,
|
|
DeadAirFallbackCollectionType = deco.DeadAirFallbackCollectionType,
|
|
DeadAirFallbackCollection = deco.DeadAirFallbackCollectionId.HasValue
|
|
? _mediaCollections.Find(c => c.Id == deco.DeadAirFallbackCollectionId!.Value)
|
|
: null,
|
|
DeadAirFallbackMediaItem = deco.DeadAirFallbackMediaItemId.HasValue
|
|
? _televisionShows.Append(_televisionSeasons).Append(_artists).ToList()
|
|
.Find(vm => vm.MediaItemId == deco.DeadAirFallbackMediaItemId!.Value)
|
|
: null,
|
|
DeadAirFallbackMultiCollection = deco.DeadAirFallbackMultiCollectionId.HasValue
|
|
? _multiCollections.Find(c => c.Id == deco.DeadAirFallbackMultiCollectionId!.Value)
|
|
: null,
|
|
DeadAirFallbackSmartCollection = deco.DeadAirFallbackSmartCollectionId.HasValue
|
|
? _smartCollections.Find(c => c.Id == deco.DeadAirFallbackSmartCollectionId!.Value)
|
|
: null
|
|
};
|
|
}
|
|
}
|
|
|
|
private async Task SaveChanges()
|
|
{
|
|
var request = new UpdateDeco(
|
|
Id,
|
|
_deco.DecoGroupId,
|
|
_deco.Name,
|
|
_deco.WatermarkMode,
|
|
_deco.Watermarks.Map(wm => wm.Id).ToList(),
|
|
_deco.UseWatermarkDuringFiller,
|
|
_deco.DefaultFillerMode,
|
|
_deco.DefaultFillerCollectionType,
|
|
_deco.DefaultFillerCollection?.Id,
|
|
_deco.DefaultFillerMediaItem?.MediaItemId,
|
|
_deco.DefaultFillerMultiCollection?.Id,
|
|
_deco.DefaultFillerSmartCollection?.Id,
|
|
_deco.DefaultFillerTrimToFit,
|
|
_deco.DeadAirFallbackMode,
|
|
_deco.DeadAirFallbackCollectionType,
|
|
_deco.DeadAirFallbackCollection?.Id,
|
|
_deco.DeadAirFallbackMediaItem?.MediaItemId,
|
|
_deco.DeadAirFallbackMultiCollection?.Id,
|
|
_deco.DeadAirFallbackSmartCollection?.Id);
|
|
|
|
Seq<BaseError> errorMessages = await Mediator
|
|
.Send(request, _cts.Token)
|
|
.Map(e => e.LeftToSeq());
|
|
|
|
errorMessages.HeadOrNone().Match(
|
|
error =>
|
|
{
|
|
Snackbar.Add($"Unexpected error saving deco: {error.Value}", Severity.Error);
|
|
Logger.LogError("Unexpected error saving deco: {Error}", error.Value);
|
|
},
|
|
() => NavigationManager.NavigateTo("decos"));
|
|
}
|
|
|
|
}
|