@page "/media/sources/local"
@using ErsatzTV.Application.Libraries
@implements IDisposable
@inject IDialogService Dialog
@inject IMediator Mediator
@inject IEntityLocker Locker
Add Local Library
Local Libraries
Name
Media Kind
@context.Name
@StringForMediaKind(context.MediaKind)
@code {
private readonly CancellationTokenSource _cts = new();
private IList _libraries;
protected override void OnInitialized() => Locker.OnLibraryChanged += LockChanged;
protected override async Task OnParametersSetAsync() => await LoadLibraries(_cts.Token);
private async Task LoadLibraries(CancellationToken cancellationToken) => _libraries = await Mediator.Send(new GetAllLocalLibraries(), cancellationToken);
private void LockChanged(object sender, EventArgs e) =>
InvokeAsync(StateHasChanged);
private async Task DeleteLibrary(LocalLibraryViewModel library)
{
int count = await Mediator.Send(new CountMediaItemsByLibrary(library.Id), _cts.Token);
var parameters = new DialogParameters
{
{ "EntityType", "library" },
{ "EntityName", library.Name },
{ "DetailText", $"This library contains {count} media items." },
{ "DetailHighlight", count.ToString() }
};
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall };
IDialogReference dialog = await Dialog.ShowAsync("Delete Library", parameters, options);
DialogResult result = await dialog.Result;
if (result is { Canceled: false })
{
await Mediator.Send(new DeleteLocalLibrary(library.Id), _cts.Token);
await LoadLibraries(_cts.Token);
}
}
private static string StringForMediaKind(LibraryMediaKind mediaKind) =>
mediaKind switch
{
LibraryMediaKind.Movies => "Movies",
LibraryMediaKind.Shows => "Shows",
LibraryMediaKind.MusicVideos => "Music Videos",
LibraryMediaKind.OtherVideos => "Other Videos",
LibraryMediaKind.Songs => "Songs",
LibraryMediaKind.Images => "Images",
LibraryMediaKind.RemoteStreams => "Remote Streams",
_ => "Unknown"
};
void IDisposable.Dispose()
{
Locker.OnLibraryChanged -= LockChanged;
_cts.Cancel();
_cts.Dispose();
}
}