diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c937ad15..9345d524f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -90,6 +90,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Using proper MIME types for statically-served `.m3u8` and `.ts` files - Serving playlists with gzip compression - Use `HLS Segmenter V2` for channel preview when channel is configured for `HLS Segmenter V2` +- Detect and use `/dev/dri/card*` devices in addition to `/dev/dri/render*` devices ## [0.8.6-beta] - 2024-04-03 ### Added diff --git a/ErsatzTV/Pages/ArtistList.razor b/ErsatzTV/Pages/ArtistList.razor index fcf42f2ee..ce836b856 100644 --- a/ErsatzTV/Pages/ArtistList.razor +++ b/ErsatzTV/Pages/ArtistList.razor @@ -54,7 +54,7 @@ - + Edit Templates diff --git a/ErsatzTV/Pages/Channels.razor b/ErsatzTV/Pages/Channels.razor index e8395336c..feb147023 100644 --- a/ErsatzTV/Pages/Channels.razor +++ b/ErsatzTV/Pages/Channels.razor @@ -88,7 +88,7 @@ } + Href="@($"channels/{context.Id}")"> @@ -103,7 +103,7 @@ - + Add Channel diff --git a/ErsatzTV/Pages/CollectionItems.razor b/ErsatzTV/Pages/CollectionItems.razor index 2c705527c..a7e249b1e 100644 --- a/ErsatzTV/Pages/CollectionItems.razor +++ b/ErsatzTV/Pages/CollectionItems.razor @@ -2,8 +2,8 @@ @using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCollections @inherits MultiSelectBase -@inject NavigationManager _navigationManager -@inject IJSRuntime _jsRuntime +@inject NavigationManager NavigationManager +@inject IJSRuntime JsRuntime
@@ -31,60 +31,60 @@
@_data?.Name + Href="@($"media/collections/{Id}/edit")"/>
@if (_data?.MovieCards.Count > 0) { - @_data.MovieCards.Count Movies + @_data.MovieCards.Count Movies } @if (_data?.ShowCards.Count > 0) { - @_data.ShowCards.Count Shows + @_data.ShowCards.Count Shows } @if (_data?.SeasonCards.Count > 0) { - @_data.SeasonCards.Count Seasons + @_data.SeasonCards.Count Seasons } @if (_data?.EpisodeCards.Count > 0) { - @_data.EpisodeCards.Count Episodes + @_data.EpisodeCards.Count Episodes } @if (_data?.ArtistCards.Count > 0) { - @_data.ArtistCards.Count Artists + @_data.ArtistCards.Count Artists } @if (_data?.MusicVideoCards.Count > 0) { - @_data.MusicVideoCards.Count Music Videos + @_data.MusicVideoCards.Count Music Videos } @if (_data?.OtherVideoCards.Count > 0) { - @_data.OtherVideoCards.Count Other Videos + @_data.OtherVideoCards.Count Other Videos } @if (_data?.SongCards.Count > 0) { - @_data.SongCards.Count Songs + @_data.SongCards.Count Songs } @if (_data?.ImageCards.Count > 0) { - @_data.ImageCards.Count Images + @_data.ImageCards.Count Images } @if (SupportsCustomOrdering()) {
} @@ -106,7 +106,7 @@ @foreach (MovieCardViewModel card in OrderMovies(_data.MovieCards)) { m.SortTitle)) { m.SortTitle)) { e.Aired)) { e.SortTitle)) { e.SortTitle)) { e.SortTitle)) { e.SortTitle)) { e.SortTitle)) { _data = result, - _ => _navigationManager.NavigateTo("404")); + _ => NavigationManager.NavigateTo("404")); } private IOrderedEnumerable OrderMovies(List movies) @@ -349,14 +349,14 @@ { try { - await _jsRuntime.InvokeVoidAsync("sortableCollection", Id); + await JsRuntime.InvokeVoidAsync("sortableCollection", Id); if (_data.UseCustomPlaybackOrder) { - await _jsRuntime.InvokeVoidAsync("enableSorting"); + await JsRuntime.InvokeVoidAsync("enableSorting"); } else { - await _jsRuntime.InvokeVoidAsync("disableSorting"); + await JsRuntime.InvokeVoidAsync("disableSorting"); } } catch (Exception) @@ -391,7 +391,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { movie.MovieId } + MediaItemIds = [movie.MovieId] }; await RemoveItemsWithConfirmation("movie", $"{movie.Title} ({movie.Subtitle})", request); @@ -404,7 +404,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { artist.ArtistId } + MediaItemIds = [artist.ArtistId] }; await RemoveItemsWithConfirmation( @@ -420,7 +420,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { musicVideo.MusicVideoId } + MediaItemIds = [musicVideo.MusicVideoId] }; await RemoveItemsWithConfirmation("music video", $"{musicVideo.Title} ({musicVideo.Subtitle})", request); @@ -433,7 +433,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { show.TelevisionShowId } + MediaItemIds = [show.TelevisionShowId] }; await RemoveItemsWithConfirmation("show", $"{show.Title} ({show.Subtitle})", request); @@ -446,7 +446,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { season.TelevisionSeasonId } + MediaItemIds = [season.TelevisionSeasonId] }; await RemoveItemsWithConfirmation("season", $"{season.ShowTitle} - {season.Title}", request); @@ -457,7 +457,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { episode.EpisodeId } + MediaItemIds = [episode.EpisodeId] }; await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); @@ -469,7 +469,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { otherVideo.OtherVideoId } + MediaItemIds = [otherVideo.OtherVideoId] }; await RemoveItemsWithConfirmation("other video", $"{otherVideo.Title}", request); @@ -482,7 +482,7 @@ { var request = new RemoveItemsFromCollection(Id) { - MediaItemIds = new List { song.SongId } + MediaItemIds = [song.SongId] }; await RemoveItemsWithConfirmation("song", $"{song.Title}", request); diff --git a/ErsatzTV/Pages/Collections.razor b/ErsatzTV/Pages/Collections.razor index 9adf82789..d6a23f0bc 100644 --- a/ErsatzTV/Pages/Collections.razor +++ b/ErsatzTV/Pages/Collections.razor @@ -3,15 +3,15 @@ @using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.Configuration @implements IDisposable -@inject IDialogService _dialog -@inject IMediator _mediator +@inject IDialogService Dialog +@inject IMediator Mediator
- + Add Collection - + Add Multi Collection
@@ -38,7 +38,7 @@
+ Href="@($"media/collections/{context.Id}")"> @@ -76,7 +76,7 @@
+ Href="@($"media/multi-collections/{context.Id}/edit")"> @@ -114,7 +114,7 @@
+ Href="@context.Query.GetRelativeSearchQuery()"> @@ -150,13 +150,13 @@ protected override async Task OnParametersSetAsync() { - _collectionsRowsPerPage = await _mediator.Send(new GetConfigElementByKey(ConfigElementKey.CollectionsPageSize), _cts.Token) + _collectionsRowsPerPage = await Mediator.Send(new GetConfigElementByKey(ConfigElementKey.CollectionsPageSize), _cts.Token) .Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10)); - _multiCollectionsRowsPerPage = await _mediator.Send(new GetConfigElementByKey(ConfigElementKey.MultiCollectionsPageSize), _cts.Token) + _multiCollectionsRowsPerPage = await Mediator.Send(new GetConfigElementByKey(ConfigElementKey.MultiCollectionsPageSize), _cts.Token) .Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10)); - _smartCollectionsRowsPerPage = await _mediator.Send(new GetConfigElementByKey(ConfigElementKey.SmartCollectionsPageSize), _cts.Token) + _smartCollectionsRowsPerPage = await Mediator.Send(new GetConfigElementByKey(ConfigElementKey.SmartCollectionsPageSize), _cts.Token) .Map(maybeRows => maybeRows.Match(ce => int.TryParse(ce.Value, out int rows) ? rows : 10, () => 10)); } @@ -165,11 +165,11 @@ var parameters = new DialogParameters { { "EntityType", "collection" }, { "EntityName", collection.Name } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - IDialogReference dialog = await _dialog.ShowAsync("Delete Collection", parameters, options); + IDialogReference dialog = await Dialog.ShowAsync("Delete Collection", parameters, options); DialogResult result = await dialog.Result; if (!result.Canceled) { - await _mediator.Send(new DeleteCollection(collection.Id), _cts.Token); + await Mediator.Send(new DeleteCollection(collection.Id), _cts.Token); if (_collectionsTable != null) { await _collectionsTable.ReloadServerData(); @@ -182,11 +182,11 @@ var parameters = new DialogParameters { { "EntityType", "multi collection" }, { "EntityName", collection.Name } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - IDialogReference dialog = await _dialog.ShowAsync("Delete Multi Collection", parameters, options); + IDialogReference dialog = await Dialog.ShowAsync("Delete Multi Collection", parameters, options); DialogResult result = await dialog.Result; if (!result.Canceled) { - await _mediator.Send(new DeleteMultiCollection(collection.Id), _cts.Token); + await Mediator.Send(new DeleteMultiCollection(collection.Id), _cts.Token); if (_multiCollectionsTable != null) { await _multiCollectionsTable.ReloadServerData(); @@ -199,11 +199,11 @@ var parameters = new DialogParameters { { "EntityType", "smart collection" }, { "EntityName", collection.Name } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - IDialogReference dialog = await _dialog.ShowAsync("Delete Smart Collection", parameters, options); + IDialogReference dialog = await Dialog.ShowAsync("Delete Smart Collection", parameters, options); DialogResult result = await dialog.Result; if (!result.Canceled) { - await _mediator.Send(new DeleteSmartCollection(collection.Id), _cts.Token); + await Mediator.Send(new DeleteSmartCollection(collection.Id), _cts.Token); if (_smartCollectionsTable != null) { await _smartCollectionsTable.ReloadServerData(); @@ -213,25 +213,25 @@ private async Task> ServerReloadCollections(TableState state) { - await _mediator.Send(new SaveConfigElementByKey(ConfigElementKey.CollectionsPageSize, state.PageSize.ToString()), _cts.Token); + await Mediator.Send(new SaveConfigElementByKey(ConfigElementKey.CollectionsPageSize, state.PageSize.ToString()), _cts.Token); - PagedMediaCollectionsViewModel data = await _mediator.Send(new GetPagedCollections(state.Page, state.PageSize), _cts.Token); + PagedMediaCollectionsViewModel data = await Mediator.Send(new GetPagedCollections(state.Page, state.PageSize), _cts.Token); return new TableData { TotalItems = data.TotalCount, Items = data.Page }; } private async Task> ServerReloadMultiCollections(TableState state) { - await _mediator.Send(new SaveConfigElementByKey(ConfigElementKey.MultiCollectionsPageSize, state.PageSize.ToString()), _cts.Token); + await Mediator.Send(new SaveConfigElementByKey(ConfigElementKey.MultiCollectionsPageSize, state.PageSize.ToString()), _cts.Token); - PagedMultiCollectionsViewModel data = await _mediator.Send(new GetPagedMultiCollections(state.Page, state.PageSize), _cts.Token); + PagedMultiCollectionsViewModel data = await Mediator.Send(new GetPagedMultiCollections(state.Page, state.PageSize), _cts.Token); return new TableData { TotalItems = data.TotalCount, Items = data.Page }; } private async Task> ServerReloadSmartCollections(TableState state) { - await _mediator.Send(new SaveConfigElementByKey(ConfigElementKey.SmartCollectionsPageSize, state.PageSize.ToString()), _cts.Token); + await Mediator.Send(new SaveConfigElementByKey(ConfigElementKey.SmartCollectionsPageSize, state.PageSize.ToString()), _cts.Token); - PagedSmartCollectionsViewModel data = await _mediator.Send(new GetPagedSmartCollections(state.Page, state.PageSize), _cts.Token); + PagedSmartCollectionsViewModel data = await Mediator.Send(new GetPagedSmartCollections(state.Page, state.PageSize), _cts.Token); return new TableData { TotalItems = data.TotalCount, Items = data.Page }; } diff --git a/ErsatzTV/Pages/EpisodeList.razor b/ErsatzTV/Pages/EpisodeList.razor index 92661f5ef..8e859f365 100644 --- a/ErsatzTV/Pages/EpisodeList.razor +++ b/ErsatzTV/Pages/EpisodeList.razor @@ -61,7 +61,7 @@ @@ -42,7 +42,7 @@
+ Href="@($"ffmpeg/{context.Id}")"> @@ -59,7 +59,7 @@ - + Add Profile @@ -78,18 +78,18 @@ protected override async Task OnParametersSetAsync() => await LoadFFmpegProfilesAsync(_cts.Token); private async Task LoadFFmpegProfilesAsync(CancellationToken cancellationToken) => - _ffmpegProfiles = await _mediator.Send(new GetAllFFmpegProfiles(), cancellationToken); + _ffmpegProfiles = await Mediator.Send(new GetAllFFmpegProfiles(), cancellationToken); private async Task DeleteProfileAsync(FFmpegProfileViewModel ffmpegProfile) { var parameters = new DialogParameters { { "EntityType", "ffmpeg profile" }, { "EntityName", ffmpegProfile.Name } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - IDialogReference dialog = await _dialog.ShowAsync("Delete FFmpeg Profile", parameters, options); + IDialogReference dialog = await Dialog.ShowAsync("Delete FFmpeg Profile", parameters, options); DialogResult result = await dialog.Result; if (!result.Canceled) { - await _mediator.Send(new DeleteFFmpegProfile(ffmpegProfile.Id), _cts.Token); + await Mediator.Send(new DeleteFFmpegProfile(ffmpegProfile.Id), _cts.Token); await LoadFFmpegProfilesAsync(_cts.Token); } } @@ -99,11 +99,11 @@ var parameters = new DialogParameters { { "FFmpegProfileId", ffmpegProfile.Id } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - IDialogReference dialog = await _dialog.ShowAsync("Copy FFmpeg Profile", parameters, options); + IDialogReference dialog = await Dialog.ShowAsync("Copy FFmpeg Profile", parameters, options); DialogResult dialogResult = await dialog.Result; if (!dialogResult.Canceled && dialogResult.Data is FFmpegProfileViewModel data) { - _navigationManager.NavigateTo($"ffmpeg/{data.Id}"); + NavigationManager.NavigateTo($"ffmpeg/{data.Id}"); } } diff --git a/ErsatzTV/Pages/FFmpegEditor.razor b/ErsatzTV/Pages/FFmpegEditor.razor index 3342c57b4..4573b1347 100644 --- a/ErsatzTV/Pages/FFmpegEditor.razor +++ b/ErsatzTV/Pages/FFmpegEditor.razor @@ -9,11 +9,11 @@ @using ErsatzTV.FFmpeg.Format @using ErsatzTV.FFmpeg.Preset @implements IDisposable -@inject NavigationManager _navigationManager -@inject ILogger _logger -@inject ISnackbar _snackbar -@inject IMediator _mediator -@inject IMemoryCache _memoryCache +@inject NavigationManager NavigationManager +@inject ILogger Logger +@inject ISnackbar Snackbar +@inject IMediator Mediator +@inject IMemoryCache MemoryCache @inject PersistentComponentState ApplicationState @@ -137,10 +137,10 @@ } - + - + @@ -216,7 +216,7 @@ { if (!ApplicationState.TryTakeFromJson("_resolutions", out List restoredResolutions)) { - _resolutions = await _mediator.Send(new GetAllResolutions(), _cts.Token); + _resolutions = await Mediator.Send(new GetAllResolutions(), _cts.Token); } else { @@ -225,7 +225,7 @@ if (!ApplicationState.TryTakeFromJson("_hardwareAccelerationKinds", out List restoredHardwareAccelerationKinds)) { - _hardwareAccelerationKinds = await _mediator.Send(new GetSupportedHardwareAccelerationKinds(), _cts.Token); + _hardwareAccelerationKinds = await Mediator.Send(new GetSupportedHardwareAccelerationKinds(), _cts.Token); } else { @@ -236,7 +236,7 @@ { if (!ApplicationState.TryTakeFromJson("_model", out FFmpegProfileEditViewModel restoredProfile)) { - Option maybeProfile = await _mediator.Send(new GetFFmpegProfileById(Id), _cts.Token); + Option maybeProfile = await Mediator.Send(new GetFFmpegProfileById(Id), _cts.Token); foreach (FFmpegProfileViewModel profile in maybeProfile) { _model = new FFmpegProfileEditViewModel(profile); @@ -244,7 +244,7 @@ if (maybeProfile.IsNone) { - _navigationManager.NavigateTo("404"); + NavigationManager.NavigateTo("404"); } } else @@ -254,7 +254,7 @@ } else { - _model = new FFmpegProfileEditViewModel(await _mediator.Send(new NewFFmpegProfile(), _cts.Token)); + _model = new FFmpegProfileEditViewModel(await Mediator.Send(new NewFFmpegProfile(), _cts.Token)); } if (!_hardwareAccelerationKinds.Contains(_model.HardwareAcceleration)) @@ -265,9 +265,9 @@ _editContext = new EditContext(_model); _messageStore = new ValidationMessageStore(_editContext); - if (!_memoryCache.TryGetValue("ffmpeg.render_devices", out List vaapiDevices)) + if (!MemoryCache.TryGetValue("ffmpeg.render_devices", out List vaapiDevices)) { - vaapiDevices = new List { "/dev/dri/renderD128" }; + vaapiDevices = ["/dev/dri/renderD128"]; } _vaapiDevices = vaapiDevices.OrderBy(s => s).ToList(); @@ -289,15 +289,15 @@ _messageStore.Clear(); if (_editContext.Validate()) { - Seq errorMessage = IsEdit ? (await _mediator.Send(_model.ToUpdate(), _cts.Token)).LeftToSeq() : (await _mediator.Send(_model.ToCreate(), _cts.Token)).LeftToSeq(); + Seq errorMessage = IsEdit ? (await Mediator.Send(_model.ToUpdate(), _cts.Token)).LeftToSeq() : (await Mediator.Send(_model.ToCreate(), _cts.Token)).LeftToSeq(); errorMessage.HeadOrNone().Match( error => { - _snackbar.Add("Unexpected error saving ffmpeg profile"); - _logger.LogError("Unexpected error saving ffmpeg profile: {Error}", error.Value); + Snackbar.Add("Unexpected error saving ffmpeg profile"); + Logger.LogError("Unexpected error saving ffmpeg profile: {Error}", error.Value); }, - () => _navigationManager.NavigateTo("/ffmpeg")); + () => NavigationManager.NavigateTo("/ffmpeg")); } } diff --git a/ErsatzTV/Pages/FillerPresetEditor.razor b/ErsatzTV/Pages/FillerPresetEditor.razor index a9fbcd8e1..ba375b5e7 100644 --- a/ErsatzTV/Pages/FillerPresetEditor.razor +++ b/ErsatzTV/Pages/FillerPresetEditor.razor @@ -44,7 +44,7 @@ 15 (:00, :15, :30, :45) 30 (:00, :30) - + @foreach (ProgramScheduleItemCollectionType collectionType in Enum.GetValues()) { diff --git a/ErsatzTV/Pages/FillerPresets.razor b/ErsatzTV/Pages/FillerPresets.razor index b1dcf695a..6db9ca50d 100644 --- a/ErsatzTV/Pages/FillerPresets.razor +++ b/ErsatzTV/Pages/FillerPresets.razor @@ -8,7 +8,7 @@
- + Add Filler Preset
@@ -50,7 +50,7 @@
+ Href="@($"media/filler/presets/{context.Id}/edit")"> diff --git a/ErsatzTV/Pages/ImageBrowser.razor b/ErsatzTV/Pages/ImageBrowser.razor index 6dc209477..165b16095 100644 --- a/ErsatzTV/Pages/ImageBrowser.razor +++ b/ErsatzTV/Pages/ImageBrowser.razor @@ -31,7 +31,7 @@ { + Href="@($"search?query={query}")"/> } }
diff --git a/ErsatzTV/Pages/ImageList.razor b/ErsatzTV/Pages/ImageList.razor index 7eafed5cf..9be93a22b 100644 --- a/ErsatzTV/Pages/ImageList.razor +++ b/ErsatzTV/Pages/ImageList.razor @@ -60,7 +60,7 @@ + Href="@($"search?query=library_id%3a{context.Id}")">
diff --git a/ErsatzTV/Pages/LocalLibraries.razor b/ErsatzTV/Pages/LocalLibraries.razor index 02ace9130..5ee59a17a 100644 --- a/ErsatzTV/Pages/LocalLibraries.razor +++ b/ErsatzTV/Pages/LocalLibraries.razor @@ -32,7 +32,7 @@ + Href="@($"media/sources/local/{context.Id}/edit")"> @@ -45,7 +45,7 @@
- + Add Local Library
diff --git a/ErsatzTV/Pages/Movie.razor b/ErsatzTV/Pages/Movie.razor index abc67553f..fd0dc8f89 100644 --- a/ErsatzTV/Pages/Movie.razor +++ b/ErsatzTV/Pages/Movie.razor @@ -219,7 +219,7 @@ @foreach (ActorCardViewModel actor in _movie.Actors) { } diff --git a/ErsatzTV/Pages/MovieList.razor b/ErsatzTV/Pages/MovieList.razor index cb4fbcdfd..3597aefe1 100644 --- a/ErsatzTV/Pages/MovieList.razor +++ b/ErsatzTV/Pages/MovieList.razor @@ -62,7 +62,7 @@ - + @if (context.ScheduleAsGroup) diff --git a/ErsatzTV/Pages/MusicVideoList.razor b/ErsatzTV/Pages/MusicVideoList.razor index d7c539a17..a8a059833 100644 --- a/ErsatzTV/Pages/MusicVideoList.razor +++ b/ErsatzTV/Pages/MusicVideoList.razor @@ -61,7 +61,7 @@ + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/> @@ -161,8 +161,8 @@ { + Value="@(_selectedItem.DaysOfMonth.Contains(day))" + ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/> } @@ -182,15 +182,15 @@ + Value="@(_selectedItem.MonthsOfYear.Contains(1))" + ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/> @foreach (int month in Enumerable.Range(2, 11)) { + Value="@(_selectedItem.MonthsOfYear.Contains(month))" + ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/> } diff --git a/ErsatzTV/Pages/PlayoutTemplatesEditor.razor b/ErsatzTV/Pages/PlayoutTemplatesEditor.razor index 01b18501e..a3523d9e9 100644 --- a/ErsatzTV/Pages/PlayoutTemplatesEditor.razor +++ b/ErsatzTV/Pages/PlayoutTemplatesEditor.razor @@ -176,38 +176,38 @@ + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/> + Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))" + ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/> @@ -234,8 +234,8 @@ { + Value="@(_selectedItem.DaysOfMonth.Contains(day))" + ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/> } @@ -255,15 +255,15 @@ + Value="@(_selectedItem.MonthsOfYear.Contains(1))" + ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/> @foreach (int month in Enumerable.Range(2, 11)) { + Value="@(_selectedItem.MonthsOfYear.Contains(month))" + ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/> } diff --git a/ErsatzTV/Pages/Playouts.razor b/ErsatzTV/Pages/Playouts.razor index 238090c35..fbb1e27fb 100644 --- a/ErsatzTV/Pages/Playouts.razor +++ b/ErsatzTV/Pages/Playouts.razor @@ -1,6 +1,5 @@ @page "/playouts" @using ErsatzTV.Application.Playouts -@using ErsatzTV.Application.Scheduling @using ErsatzTV.Application.Configuration @using ErsatzTV.Core.Scheduling @implements IDisposable @@ -11,16 +10,16 @@
- + Add Playout - + Add Block Playout - + Add External Json Playout @@ -85,7 +84,7 @@ + Href="@($"playouts/{context.PlayoutId}/alternate-schedules")"> @@ -117,7 +116,7 @@ + Href="@($"playouts/block/{context.PlayoutId}")"> @@ -152,7 +151,7 @@ @ref="_detailTable"> Playout Detail - + Start @@ -287,32 +286,6 @@ } } - private async Task EraseItems(PlayoutNameViewModel playout) - { - if (playout.PlayoutType is ProgramSchedulePlayoutType.Block) - { - await Mediator.Send(new EraseBlockPlayoutItems(playout.PlayoutId), _cts.Token); - } - - if (_selectedPlayoutId == playout.PlayoutId) - { - await PlayoutSelected(playout); - } - } - - private async Task EraseHistory(PlayoutNameViewModel playout) - { - if (playout.PlayoutType is ProgramSchedulePlayoutType.Block) - { - await Mediator.Send(new EraseBlockPlayoutHistory(playout.PlayoutId), _cts.Token); - } - - if (_selectedPlayoutId == playout.PlayoutId) - { - await PlayoutSelected(playout); - } - } - private async Task ScheduleReset(PlayoutNameViewModel playout) { var parameters = new DialogParameters diff --git a/ErsatzTV/Pages/PlexMediaSources.razor b/ErsatzTV/Pages/PlexMediaSources.razor index 27e190478..32b828e8d 100644 --- a/ErsatzTV/Pages/PlexMediaSources.razor +++ b/ErsatzTV/Pages/PlexMediaSources.razor @@ -39,12 +39,12 @@ + Href="@($"media/sources/plex/{context.Id}/libraries")"> + Href="@($"media/sources/plex/{context.Id}/paths")">
diff --git a/ErsatzTV/Pages/ScheduleEditor.razor b/ErsatzTV/Pages/ScheduleEditor.razor index afa0dec40..042190ac4 100644 --- a/ErsatzTV/Pages/ScheduleEditor.razor +++ b/ErsatzTV/Pages/ScheduleEditor.razor @@ -2,10 +2,10 @@ @page "/schedules/add" @using ErsatzTV.Application.ProgramSchedules @implements IDisposable -@inject NavigationManager _navigationManager -@inject ILogger _logger -@inject ISnackbar _snackbar -@inject IMediator _mediator +@inject NavigationManager NavigationManager +@inject ILogger Logger +@inject ISnackbar Snackbar +@inject IMediator Mediator
@@ -19,14 +19,14 @@ @@ -34,13 +34,13 @@ @@ -74,7 +74,7 @@ { if (IsEdit) { - Option maybeProgramSchedule = await _mediator.Send(new GetProgramScheduleById(Id), _cts.Token); + Option maybeProgramSchedule = await Mediator.Send(new GetProgramScheduleById(Id), _cts.Token); maybeProgramSchedule.Match( viewModel => { @@ -85,7 +85,7 @@ _model.TreatCollectionsAsShows = viewModel.TreatCollectionsAsShows; _model.RandomStartPoint = viewModel.RandomStartPoint; }, - () => _navigationManager.NavigateTo("404")); + () => NavigationManager.NavigateTo("404")); } else { @@ -107,19 +107,19 @@ if (_editContext.Validate()) { Either result = IsEdit - ? await _mediator.Send(_model.ToUpdate(), _cts.Token).MapT(r => r as EntityIdResult) - : await _mediator.Send(_model.ToCreate(), _cts.Token).MapT(r => r as EntityIdResult); + ? await Mediator.Send(_model.ToUpdate(), _cts.Token).MapT(r => r as EntityIdResult) + : await Mediator.Send(_model.ToCreate(), _cts.Token).MapT(r => r as EntityIdResult); result.Match( programSchedule => { string destination = IsEdit ? "/schedules" : $"/schedules/{programSchedule.Id}/items"; - _navigationManager.NavigateTo(destination); + NavigationManager.NavigateTo(destination); }, error => { - _snackbar.Add(error.Value, Severity.Error); - _logger.LogError("Unexpected error saving schedule: {Error}", error.Value); + Snackbar.Add(error.Value, Severity.Error); + Logger.LogError("Unexpected error saving schedule: {Error}", error.Value); }); } } diff --git a/ErsatzTV/Pages/Schedules.razor b/ErsatzTV/Pages/Schedules.razor index 0b6d8770d..c99ff9976 100644 --- a/ErsatzTV/Pages/Schedules.razor +++ b/ErsatzTV/Pages/Schedules.razor @@ -35,12 +35,12 @@
+ Href="@($"schedules/{context.Id}")"> + Href="@($"schedules/{context.Id}/items")"> @@ -60,7 +60,7 @@ - + Add Schedule diff --git a/ErsatzTV/Pages/Search.razor b/ErsatzTV/Pages/Search.razor index 392c82173..3279eeeee 100644 --- a/ErsatzTV/Pages/Search.razor +++ b/ErsatzTV/Pages/Search.razor @@ -134,7 +134,7 @@ @foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { + @bind-Value="@_ffmpegSettings.UseEmbeddedSubtitles"/> + @bind-Value="@_ffmpegSettings.SaveReports"/> diff --git a/ErsatzTV/Pages/SongList.razor b/ErsatzTV/Pages/SongList.razor index d3ddba609..a2f16ebc5 100644 --- a/ErsatzTV/Pages/SongList.razor +++ b/ErsatzTV/Pages/SongList.razor @@ -61,7 +61,7 @@ } @@ -164,7 +164,7 @@ @foreach (ActorCardViewModel actor in _show.Actors) { } diff --git a/ErsatzTV/Pages/TelevisionSeasonSearchResults.razor b/ErsatzTV/Pages/TelevisionSeasonSearchResults.razor index ec8f8340b..3e289ee65 100644 --- a/ErsatzTV/Pages/TelevisionSeasonSearchResults.razor +++ b/ErsatzTV/Pages/TelevisionSeasonSearchResults.razor @@ -54,7 +54,7 @@ + Href="@($"search?query=trakt_list%3a{context.TraktId}")"> diff --git a/ErsatzTV/Pages/Trash.razor b/ErsatzTV/Pages/Trash.razor index 446430f13..f5e452f85 100644 --- a/ErsatzTV/Pages/Trash.razor +++ b/ErsatzTV/Pages/Trash.razor @@ -111,7 +111,7 @@ @foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { s.SortTitle)) { Right Middle diff --git a/ErsatzTV/Pages/Watermarks.razor b/ErsatzTV/Pages/Watermarks.razor index 39304af38..98b96412e 100644 --- a/ErsatzTV/Pages/Watermarks.razor +++ b/ErsatzTV/Pages/Watermarks.razor @@ -48,7 +48,7 @@
+ Href="@($"watermarks/{context.Id}")"> @@ -65,7 +65,7 @@ - + Add Watermark diff --git a/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs b/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs index 242ed0e4f..272c9ca76 100644 --- a/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs +++ b/ErsatzTV/Services/RunOnce/PlatformSettingsService.cs @@ -5,24 +5,13 @@ using Microsoft.Extensions.Caching.Memory; namespace ErsatzTV.Services.RunOnce; -public class PlatformSettingsService : BackgroundService +public class PlatformSettingsService(IServiceScopeFactory serviceScopeFactory) : BackgroundService { - private readonly ILogger _logger; - private readonly IServiceScopeFactory _serviceScopeFactory; - - public PlatformSettingsService( - IServiceScopeFactory serviceScopeFactory, - ILogger logger) - { - _serviceScopeFactory = serviceScopeFactory; - _logger = logger; - } - protected override async Task ExecuteAsync(CancellationToken stoppingToken) { await Task.Yield(); - using IServiceScope scope = _serviceScopeFactory.CreateScope(); + using IServiceScope scope = serviceScopeFactory.CreateScope(); IRuntimeInfo runtimeInfo = scope.ServiceProvider.GetRequiredService(); if (runtimeInfo != null && runtimeInfo.IsOSPlatform(OSPlatform.Linux) && Directory.Exists("/dev/dri")) @@ -31,7 +20,9 @@ public class PlatformSettingsService : BackgroundService IMemoryCache memoryCache = scope.ServiceProvider.GetRequiredService(); var devices = localFileSystem.ListFiles("/dev/dri") - .Filter(s => s.StartsWith("/dev/dri/render", StringComparison.OrdinalIgnoreCase)) + .Filter( + s => s.StartsWith("/dev/dri/render", StringComparison.OrdinalIgnoreCase) + || s.StartsWith("/dev/dri/card", StringComparison.OrdinalIgnoreCase)) .ToList(); memoryCache.Set("ffmpeg.render_devices", devices); diff --git a/ErsatzTV/Shared/MainLayout.razor b/ErsatzTV/Shared/MainLayout.razor index 6a2750c43..111656cb9 100644 --- a/ErsatzTV/Shared/MainLayout.razor +++ b/ErsatzTV/Shared/MainLayout.razor @@ -9,7 +9,7 @@ @inject SystemStartup SystemStartup @inject ISearchTargets SearchTargets; - + @@ -77,13 +77,13 @@ } @* API *@ - + - + - +
@@ -180,7 +180,7 @@ _cts.Dispose(); } - private MudTheme _ersatzTvTheme => new() + private static MudTheme ErsatzTvTheme => new() { Palette = new PaletteDark { diff --git a/ErsatzTV/Shared/MediaCard.razor b/ErsatzTV/Shared/MediaCard.razor index 173fc5aec..ce1492aa0 100644 --- a/ErsatzTV/Shared/MediaCard.razor +++ b/ErsatzTV/Shared/MediaCard.razor @@ -36,7 +36,7 @@
}
- diff --git a/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor b/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor index a7bcc137c..f1b42e1dd 100644 --- a/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor +++ b/ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor @@ -33,7 +33,7 @@ @context.Name @context.MediaKind - + diff --git a/ErsatzTV/Shared/RemoteMediaSources.razor b/ErsatzTV/Shared/RemoteMediaSources.razor index 2dccd8974..ed00682c4 100644 --- a/ErsatzTV/Shared/RemoteMediaSources.razor +++ b/ErsatzTV/Shared/RemoteMediaSources.razor @@ -3,9 +3,9 @@ @implements IDisposable @using ErsatzTV.Core.Interfaces.MediaSources @typeparam TMediaSource -@inject IMediator _mediator -@inject IDialogService _dialog -@inject IEntityLocker _locker +@inject IMediator Mediator +@inject IDialogService Dialog +@inject IEntityLocker Locker @@ -29,18 +29,18 @@
+ Href="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/libraries")"> + Href="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/paths")">
@@ -60,7 +60,7 @@ { Connect @Name @@ -70,7 +70,7 @@ { Fix @Name Connection @@ -112,20 +112,20 @@ { _isAuthorized = await SecretStore.ReadSecrets() .Map(secrets => !string.IsNullOrWhiteSpace(secrets.Address) && !string.IsNullOrWhiteSpace(secrets.ApiKey)); - _mediaSources = await _mediator.Send(GetAllMediaSourcesCommand, _cts.Token); + _mediaSources = await Mediator.Send(GetAllMediaSourcesCommand, _cts.Token); } private async Task Disconnect() { var parameters = new DialogParameters { { "Name", Name } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small }; - IDialogReference dialog = await _dialog.ShowAsync($"Disconnect {Name}", parameters, options); + IDialogReference dialog = await Dialog.ShowAsync($"Disconnect {Name}", parameters, options); DialogResult result = await dialog.Result; if (!result.Canceled) { - if (_locker.LockRemoteMediaSource()) + if (Locker.LockRemoteMediaSource()) { - await _mediator.Send(DisconnectCommand, _cts.Token); + await Mediator.Send(DisconnectCommand, _cts.Token); await LoadMediaSources(); } } diff --git a/lib/Serilog.Sinks.SQLite.6.0.1.nupkg b/lib/Serilog.Sinks.SQLite.6.0.1.nupkg deleted file mode 100644 index 0821afd0c..000000000 Binary files a/lib/Serilog.Sinks.SQLite.6.0.1.nupkg and /dev/null differ diff --git a/lib/nuget/Serilog.Sinks.SQLite.6.0.1.nupkg b/lib/nuget/Serilog.Sinks.SQLite.6.0.1.nupkg deleted file mode 100644 index 0821afd0c..000000000 Binary files a/lib/nuget/Serilog.Sinks.SQLite.6.0.1.nupkg and /dev/null differ diff --git a/nuget.config b/nuget.config deleted file mode 100644 index 157825715..000000000 --- a/nuget.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file