Browse Source

detect /dev/dri/card* devices (#1698)

* remove unused nupkg

* cleanup obsolete properties

* detect /dev/dri/card devices
pull/1699/head
Jason Dove 1 year ago committed by GitHub
parent
commit
398a3c041a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      CHANGELOG.md
  2. 2
      ErsatzTV/Pages/ArtistList.razor
  3. 2
      ErsatzTV/Pages/BlockPlayoutEditor.razor
  4. 4
      ErsatzTV/Pages/Channels.razor
  5. 70
      ErsatzTV/Pages/CollectionItems.razor
  6. 44
      ErsatzTV/Pages/Collections.razor
  7. 2
      ErsatzTV/Pages/EpisodeList.razor
  8. 20
      ErsatzTV/Pages/FFmpeg.razor
  9. 36
      ErsatzTV/Pages/FFmpegEditor.razor
  10. 2
      ErsatzTV/Pages/FillerPresetEditor.razor
  11. 4
      ErsatzTV/Pages/FillerPresets.razor
  12. 2
      ErsatzTV/Pages/ImageBrowser.razor
  13. 2
      ErsatzTV/Pages/ImageList.razor
  14. 2
      ErsatzTV/Pages/Libraries.razor
  15. 4
      ErsatzTV/Pages/LocalLibraries.razor
  16. 2
      ErsatzTV/Pages/Movie.razor
  17. 2
      ErsatzTV/Pages/MovieList.razor
  18. 2
      ErsatzTV/Pages/MultiCollectionEditor.razor
  19. 2
      ErsatzTV/Pages/MusicVideoList.razor
  20. 2
      ErsatzTV/Pages/OtherVideoList.razor
  21. 40
      ErsatzTV/Pages/PlayoutAlternateSchedulesEditor.razor
  22. 40
      ErsatzTV/Pages/PlayoutTemplatesEditor.razor
  23. 39
      ErsatzTV/Pages/Playouts.razor
  24. 4
      ErsatzTV/Pages/PlexMediaSources.razor
  25. 30
      ErsatzTV/Pages/ScheduleEditor.razor
  26. 6
      ErsatzTV/Pages/Schedules.razor
  27. 18
      ErsatzTV/Pages/Search.razor
  28. 8
      ErsatzTV/Pages/Settings.razor
  29. 2
      ErsatzTV/Pages/SongList.razor
  30. 4
      ErsatzTV/Pages/TelevisionSeasonList.razor
  31. 2
      ErsatzTV/Pages/TelevisionSeasonSearchResults.razor
  32. 2
      ErsatzTV/Pages/TelevisionShowList.razor
  33. 2
      ErsatzTV/Pages/TraktLists.razor
  34. 18
      ErsatzTV/Pages/Trash.razor
  35. 2
      ErsatzTV/Pages/WatermarkEditor.razor
  36. 4
      ErsatzTV/Pages/Watermarks.razor
  37. 19
      ErsatzTV/Services/RunOnce/PlatformSettingsService.cs
  38. 10
      ErsatzTV/Shared/MainLayout.razor
  39. 2
      ErsatzTV/Shared/MediaCard.razor
  40. 2
      ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor
  41. 24
      ErsatzTV/Shared/RemoteMediaSources.razor
  42. BIN
      lib/Serilog.Sinks.SQLite.6.0.1.nupkg
  43. BIN
      lib/nuget/Serilog.Sinks.SQLite.6.0.1.nupkg
  44. 9
      nuget.config

1
CHANGELOG.md

@ -90,6 +90,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -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

2
ErsatzTV/Pages/ArtistList.razor

@ -54,7 +54,7 @@ @@ -54,7 +54,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="ArtistCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link="@($"media/music/artists/{context.ArtistId}")"
Href="@($"media/music/artists/{context.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"

2
ErsatzTV/Pages/BlockPlayoutEditor.razor

@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
</CardHeaderContent>
</MudCardHeader>
<MudCardContent>
<MudButton Disabled="@EntityLocker.IsPlayoutLocked(Id)" Variant="Variant.Filled" Color="Color.Primary" Link="@($"playouts/{Id}/templates")" Class="mt-4">
<MudButton Disabled="@EntityLocker.IsPlayoutLocked(Id)" Variant="Variant.Filled" Color="Color.Primary" Href="@($"playouts/{Id}/templates")" Class="mt-4">
Edit Templates
</MudButton>
</MudCardContent>

4
ErsatzTV/Pages/Channels.razor

@ -88,7 +88,7 @@ @@ -88,7 +88,7 @@
}
<MudTooltip Text="Edit Channel">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"channels/{context.Id}")">
Href="@($"channels/{context.Id}")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Delete Channel">
@ -103,7 +103,7 @@ @@ -103,7 +103,7 @@
<MudTablePager/>
</PagerContent>
</MudTable>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="channels/add" Class="mt-4">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="channels/add" Class="mt-4">
Add Channel
</MudButton>
</MudContainer>

70
ErsatzTV/Pages/CollectionItems.razor

@ -2,8 +2,8 @@ @@ -2,8 +2,8 @@
@using ErsatzTV.Application.MediaCards
@using ErsatzTV.Application.MediaCollections
@inherits MultiSelectBase<CollectionItems>
@inject NavigationManager _navigationManager
@inject IJSRuntime _jsRuntime
@inject NavigationManager NavigationManager
@inject IJSRuntime JsRuntime
<MudPaper Square="true" Style="display: flex; height: 64px; left: 240px; padding: 0; position: fixed; right: 0; z-index: 100;">
<div style="align-items: center; display: flex; flex-direction: row; margin-bottom: auto; margin-top: auto; width: 100%;" class="ml-6 mr-6">
@ -31,60 +31,60 @@ @@ -31,60 +31,60 @@
<div style="align-items: center; display: flex; flex-direction: row;">
<MudText Typo="Typo.h4">@_data?.Name</MudText>
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/collections/{Id}/edit")"/>
Href="@($"media/collections/{Id}/edit")"/>
</div>
@if (_data?.MovieCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#movies")">@_data.MovieCards.Count Movies</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#movies")">@_data.MovieCards.Count Movies</MudLink>
}
@if (_data?.ShowCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#shows")">@_data.ShowCards.Count Shows</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#shows")">@_data.ShowCards.Count Shows</MudLink>
}
@if (_data?.SeasonCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#seasons")">@_data.SeasonCards.Count Seasons</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#seasons")">@_data.SeasonCards.Count Seasons</MudLink>
}
@if (_data?.EpisodeCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#episodes")">@_data.EpisodeCards.Count Episodes</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#episodes")">@_data.EpisodeCards.Count Episodes</MudLink>
}
@if (_data?.ArtistCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#artists")">@_data.ArtistCards.Count Artists</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#artists")">@_data.ArtistCards.Count Artists</MudLink>
}
@if (_data?.MusicVideoCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#music_videos")">@_data.MusicVideoCards.Count Music Videos</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#music_videos")">@_data.MusicVideoCards.Count Music Videos</MudLink>
}
@if (_data?.OtherVideoCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#other_videos")">@_data.OtherVideoCards.Count Other Videos</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#other_videos")">@_data.OtherVideoCards.Count Other Videos</MudLink>
}
@if (_data?.SongCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#songs")">@_data.SongCards.Count Songs</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#songs")">@_data.SongCards.Count Songs</MudLink>
}
@if (_data?.ImageCards.Count > 0)
{
<MudLink Class="ml-4" Href="@(_navigationManager.Uri.Split("#").Head() + "#images")">@_data.ImageCards.Count Images</MudLink>
<MudLink Class="ml-4" Href="@(NavigationManager.Uri.Split("#").Head() + "#images")">@_data.ImageCards.Count Images</MudLink>
}
@if (SupportsCustomOrdering())
{
<div style="margin-left: auto">
<MudSwitch T="bool"
Checked="@_data.UseCustomPlaybackOrder"
Value="@(_data?.UseCustomPlaybackOrder == true)"
Color="Color.Primary"
CheckedChanged="@OnUseCustomOrderChanged"
ValueChanged="@OnUseCustomOrderChanged"
Label="Use Custom Playback Order"/>
</div>
}
@ -106,7 +106,7 @@ @@ -106,7 +106,7 @@
@foreach (MovieCardViewModel card in OrderMovies(_data.MovieCards))
{
<MediaCard Data="@card"
Link="@($"media/movies/{card.MovieId}")"
Href="@($"media/movies/{card.MovieId}")"
DeleteClicked="@RemoveMovieFromCollection"
SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))"
@ -129,7 +129,7 @@ @@ -129,7 +129,7 @@
@foreach (TelevisionShowCardViewModel card in _data.ShowCards.OrderBy(m => m.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/tv/shows/{card.TelevisionShowId}")"
Href="@($"media/tv/shows/{card.TelevisionShowId}")"
DeleteClicked="@RemoveShowFromCollection"
SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))"
@ -152,7 +152,7 @@ @@ -152,7 +152,7 @@
@foreach (TelevisionSeasonCardViewModel card in _data.SeasonCards.OrderBy(m => m.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
Title="@card.ShowTitle"
Subtitle="@card.Title"
DeleteClicked="@RemoveSeasonFromCollection"
@ -177,7 +177,7 @@ @@ -177,7 +177,7 @@
@foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired))
{
<MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")"
Href="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")"
Title="@card.ShowTitle"
Subtitle="@card.Title"
ContainerClass="media-card-episode-container mx-2"
@ -205,7 +205,7 @@ @@ -205,7 +205,7 @@
@foreach (ArtistCardViewModel card in _data.ArtistCards.OrderBy(e => e.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/music/artists/{card.ArtistId}")"
Href="@($"media/music/artists/{card.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveArtistFromCollection"
SelectColor="@Color.Error"
@ -229,7 +229,7 @@ @@ -229,7 +229,7 @@
@foreach (MusicVideoCardViewModel card in _data.MusicVideoCards.OrderBy(e => e.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveMusicVideoFromCollection"
SelectColor="@Color.Error"
@ -253,7 +253,7 @@ @@ -253,7 +253,7 @@
@foreach (OtherVideoCardViewModel card in _data.OtherVideoCards.OrderBy(e => e.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveOtherVideoFromCollection"
SelectColor="@Color.Error"
@ -277,7 +277,7 @@ @@ -277,7 +277,7 @@
@foreach (SongCardViewModel card in _data.SongCards.OrderBy(e => e.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveSongFromCollection"
SelectColor="@Color.Error"
@ -301,7 +301,7 @@ @@ -301,7 +301,7 @@
@foreach (ImageCardViewModel card in _data.ImageCards.OrderBy(e => e.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveImageFromCollection"
SelectColor="@Color.Error"
@ -332,7 +332,7 @@ @@ -332,7 +332,7 @@
maybeResult.Match(
result => _data = result,
_ => _navigationManager.NavigateTo("404"));
_ => NavigationManager.NavigateTo("404"));
}
private IOrderedEnumerable<MovieCardViewModel> OrderMovies(List<MovieCardViewModel> movies)
@ -349,14 +349,14 @@ @@ -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 @@ @@ -391,7 +391,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { movie.MovieId }
MediaItemIds = [movie.MovieId]
};
await RemoveItemsWithConfirmation("movie", $"{movie.Title} ({movie.Subtitle})", request);
@ -404,7 +404,7 @@ @@ -404,7 +404,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { artist.ArtistId }
MediaItemIds = [artist.ArtistId]
};
await RemoveItemsWithConfirmation(
@ -420,7 +420,7 @@ @@ -420,7 +420,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { musicVideo.MusicVideoId }
MediaItemIds = [musicVideo.MusicVideoId]
};
await RemoveItemsWithConfirmation("music video", $"{musicVideo.Title} ({musicVideo.Subtitle})", request);
@ -433,7 +433,7 @@ @@ -433,7 +433,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { show.TelevisionShowId }
MediaItemIds = [show.TelevisionShowId]
};
await RemoveItemsWithConfirmation("show", $"{show.Title} ({show.Subtitle})", request);
@ -446,7 +446,7 @@ @@ -446,7 +446,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { season.TelevisionSeasonId }
MediaItemIds = [season.TelevisionSeasonId]
};
await RemoveItemsWithConfirmation("season", $"{season.ShowTitle} - {season.Title}", request);
@ -457,7 +457,7 @@ @@ -457,7 +457,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { episode.EpisodeId }
MediaItemIds = [episode.EpisodeId]
};
await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request);
@ -469,7 +469,7 @@ @@ -469,7 +469,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { otherVideo.OtherVideoId }
MediaItemIds = [otherVideo.OtherVideoId]
};
await RemoveItemsWithConfirmation("other video", $"{otherVideo.Title}", request);
@ -482,7 +482,7 @@ @@ -482,7 +482,7 @@
{
var request = new RemoveItemsFromCollection(Id)
{
MediaItemIds = new List<int> { song.SongId }
MediaItemIds = [song.SongId]
};
await RemoveItemsWithConfirmation("song", $"{song.Title}", request);

44
ErsatzTV/Pages/Collections.razor

@ -3,15 +3,15 @@ @@ -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
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="media/collections/add">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="media/collections/add">
Add Collection
</MudButton>
<MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Primary" Link="media/multi-collections/add">
<MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Primary" Href="media/multi-collections/add">
Add Multi Collection
</MudButton>
</div>
@ -38,7 +38,7 @@ @@ -38,7 +38,7 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Collection">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/collections/{context.Id}")">
Href="@($"media/collections/{context.Id}")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Delete Collection">
@ -76,7 +76,7 @@ @@ -76,7 +76,7 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Collection">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/multi-collections/{context.Id}/edit")">
Href="@($"media/multi-collections/{context.Id}/edit")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Delete Collection">
@ -114,7 +114,7 @@ @@ -114,7 +114,7 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Collection">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@context.Query.GetRelativeSearchQuery()">
Href="@context.Query.GetRelativeSearchQuery()">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Delete Collection">
@ -150,13 +150,13 @@ @@ -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 @@ @@ -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<DeleteDialog>("Delete Collection", parameters, options);
IDialogReference dialog = await Dialog.ShowAsync<DeleteDialog>("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 @@ @@ -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<DeleteDialog>("Delete Multi Collection", parameters, options);
IDialogReference dialog = await Dialog.ShowAsync<DeleteDialog>("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 @@ @@ -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<DeleteDialog>("Delete Smart Collection", parameters, options);
IDialogReference dialog = await Dialog.ShowAsync<DeleteDialog>("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 @@ @@ -213,25 +213,25 @@
private async Task<TableData<MediaCollectionViewModel>> 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<MediaCollectionViewModel> { TotalItems = data.TotalCount, Items = data.Page };
}
private async Task<TableData<MultiCollectionViewModel>> 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<MultiCollectionViewModel> { TotalItems = data.TotalCount, Items = data.Page };
}
private async Task<TableData<SmartCollectionViewModel>> 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<SmartCollectionViewModel> { TotalItems = data.TotalCount, Items = data.Page };
}

2
ErsatzTV/Pages/EpisodeList.razor

@ -61,7 +61,7 @@ @@ -61,7 +61,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="TelevisionEpisodeCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link="@($"media/tv/seasons/{context.SeasonId}#episode-{context.EpisodeId}")"
Href="@($"media/tv/seasons/{context.SeasonId}#episode-{context.EpisodeId}")"
Subtitle="@($"{context.ShowTitle} - S{context.Season} E{context.Episode}")"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"

20
ErsatzTV/Pages/FFmpeg.razor

@ -1,9 +1,9 @@ @@ -1,9 +1,9 @@
@page "/ffmpeg"
@using ErsatzTV.Application.FFmpegProfiles
@implements IDisposable
@inject IDialogService _dialog
@inject IMediator _mediator
@inject NavigationManager _navigationManager
@inject IDialogService Dialog
@inject IMediator Mediator
@inject NavigationManager NavigationManager
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudTable Hover="true" Items="_ffmpegProfiles">
@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Profile">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"ffmpeg/{context.Id}")">
Href="@($"ffmpeg/{context.Id}")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Copy Profile">
@ -59,7 +59,7 @@ @@ -59,7 +59,7 @@
</MudTd>
</RowTemplate>
</MudTable>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="ffmpeg/add" Class="mt-4">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="ffmpeg/add" Class="mt-4">
Add Profile
</MudButton>
</MudContainer>
@ -78,18 +78,18 @@ @@ -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<DeleteDialog>("Delete FFmpeg Profile", parameters, options);
IDialogReference dialog = await Dialog.ShowAsync<DeleteDialog>("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 @@ @@ -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<CopyFFmpegProfileDialog>("Copy FFmpeg Profile", parameters, options);
IDialogReference dialog = await Dialog.ShowAsync<CopyFFmpegProfileDialog>("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}");
}
}

36
ErsatzTV/Pages/FFmpegEditor.razor

@ -9,11 +9,11 @@ @@ -9,11 +9,11 @@
@using ErsatzTV.FFmpeg.Format
@using ErsatzTV.FFmpeg.Preset
@implements IDisposable
@inject NavigationManager _navigationManager
@inject ILogger<FFmpegEditor> _logger
@inject ISnackbar _snackbar
@inject IMediator _mediator
@inject IMemoryCache _memoryCache
@inject NavigationManager NavigationManager
@inject ILogger<FFmpegEditor> Logger
@inject ISnackbar Snackbar
@inject IMediator Mediator
@inject IMemoryCache MemoryCache
@inject PersistentComponentState ApplicationState
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
@ -137,10 +137,10 @@ @@ -137,10 +137,10 @@
</MudElement>
}
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox Label="Normalize Frame Rate" @bind-Checked="@_model.NormalizeFramerate" For="@(() => _model.NormalizeFramerate)"/>
<MudCheckBox Label="Normalize Frame Rate" @bind-Value="@_model.NormalizeFramerate" For="@(() => _model.NormalizeFramerate)"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox Label="Auto Deinterlace Video" @bind-Checked="@_model.DeinterlaceVideo" For="@(() => _model.DeinterlaceVideo)"/>
<MudCheckBox Label="Auto Deinterlace Video" @bind-Value="@_model.DeinterlaceVideo" For="@(() => _model.DeinterlaceVideo)"/>
</MudElement>
</MudItem>
<MudItem>
@ -216,7 +216,7 @@ @@ -216,7 +216,7 @@
{
if (!ApplicationState.TryTakeFromJson("_resolutions", out List<ResolutionViewModel> restoredResolutions))
{
_resolutions = await _mediator.Send(new GetAllResolutions(), _cts.Token);
_resolutions = await Mediator.Send(new GetAllResolutions(), _cts.Token);
}
else
{
@ -225,7 +225,7 @@ @@ -225,7 +225,7 @@
if (!ApplicationState.TryTakeFromJson("_hardwareAccelerationKinds", out List<HardwareAccelerationKind> restoredHardwareAccelerationKinds))
{
_hardwareAccelerationKinds = await _mediator.Send(new GetSupportedHardwareAccelerationKinds(), _cts.Token);
_hardwareAccelerationKinds = await Mediator.Send(new GetSupportedHardwareAccelerationKinds(), _cts.Token);
}
else
{
@ -236,7 +236,7 @@ @@ -236,7 +236,7 @@
{
if (!ApplicationState.TryTakeFromJson("_model", out FFmpegProfileEditViewModel restoredProfile))
{
Option<FFmpegProfileViewModel> maybeProfile = await _mediator.Send(new GetFFmpegProfileById(Id), _cts.Token);
Option<FFmpegProfileViewModel> maybeProfile = await Mediator.Send(new GetFFmpegProfileById(Id), _cts.Token);
foreach (FFmpegProfileViewModel profile in maybeProfile)
{
_model = new FFmpegProfileEditViewModel(profile);
@ -244,7 +244,7 @@ @@ -244,7 +244,7 @@
if (maybeProfile.IsNone)
{
_navigationManager.NavigateTo("404");
NavigationManager.NavigateTo("404");
}
}
else
@ -254,7 +254,7 @@ @@ -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 @@ @@ -265,9 +265,9 @@
_editContext = new EditContext(_model);
_messageStore = new ValidationMessageStore(_editContext);
if (!_memoryCache.TryGetValue("ffmpeg.render_devices", out List<string> vaapiDevices))
if (!MemoryCache.TryGetValue("ffmpeg.render_devices", out List<string> vaapiDevices))
{
vaapiDevices = new List<string> { "/dev/dri/renderD128" };
vaapiDevices = ["/dev/dri/renderD128"];
}
_vaapiDevices = vaapiDevices.OrderBy(s => s).ToList();
@ -289,15 +289,15 @@ @@ -289,15 +289,15 @@
_messageStore.Clear();
if (_editContext.Validate())
{
Seq<BaseError> errorMessage = IsEdit ? (await _mediator.Send(_model.ToUpdate(), _cts.Token)).LeftToSeq() : (await _mediator.Send(_model.ToCreate(), _cts.Token)).LeftToSeq();
Seq<BaseError> 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"));
}
}

2
ErsatzTV/Pages/FillerPresetEditor.razor

@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
<MudSelectItem T="int?" Value="15">15 (:00, :15, :30, :45)</MudSelectItem>
<MudSelectItem T="int?" Value="30">30 (:00, :30)</MudSelectItem>
</MudSelect>
<MudCheckBox Class="mt-3" Label="Allow Watermarks" @bind-Checked="@_model.AllowWatermarks" For="@(() => _model.AllowWatermarks)"/>
<MudCheckBox Class="mt-3" Label="Allow Watermarks" @bind-Value="@_model.AllowWatermarks" For="@(() => _model.AllowWatermarks)"/>
<MudSelect Class="mt-3" Label="Filler Collection Type" @bind-Value="_model.CollectionType" For="@(() => _model.CollectionType)">
@foreach (ProgramScheduleItemCollectionType collectionType in Enum.GetValues<ProgramScheduleItemCollectionType>())
{

4
ErsatzTV/Pages/FillerPresets.razor

@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="media/filler/presets/add">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="media/filler/presets/add">
Add Filler Preset
</MudButton>
</div>
@ -50,7 +50,7 @@ @@ -50,7 +50,7 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Filler Preset">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/filler/presets/{context.Id}/edit")">
Href="@($"media/filler/presets/{context.Id}/edit")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Delete Filler Preset">

2
ErsatzTV/Pages/ImageBrowser.razor

@ -31,7 +31,7 @@ @@ -31,7 +31,7 @@
{
<MudIconButton
Icon="@Icons.Material.Filled.Search"
Link="@($"search?query={query}")"/>
Href="@($"search?query={query}")"/>
}
}
</div>

2
ErsatzTV/Pages/ImageList.razor

@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="ImageCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"

2
ErsatzTV/Pages/Libraries.razor

@ -87,7 +87,7 @@ @@ -87,7 +87,7 @@
}
<MudTooltip Text="Search Library">
<MudIconButton Icon="@Icons.Material.Filled.Search"
Link="@($"search?query=library_id%3a{context.Id}")">
Href="@($"search?query=library_id%3a{context.Id}")">
</MudIconButton>
</MudTooltip>
</div>

4
ErsatzTV/Pages/LocalLibraries.razor

@ -32,7 +32,7 @@ @@ -32,7 +32,7 @@
<MudTooltip Text="Edit Library">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Disabled="@_locker.IsLibraryLocked(context.Id)"
Link="@($"media/sources/local/{context.Id}/edit")">
Href="@($"media/sources/local/{context.Id}/edit")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Delete Library">
@ -45,7 +45,7 @@ @@ -45,7 +45,7 @@
</MudTd>
</RowTemplate>
</MudTable>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="media/sources/local/add" Class="mt-4">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="media/sources/local/add" Class="mt-4">
Add Local Library
</MudButton>
</MudContainer>

2
ErsatzTV/Pages/Movie.razor

@ -219,7 +219,7 @@ @@ -219,7 +219,7 @@
@foreach (ActorCardViewModel actor in _movie.Actors)
{
<MediaCard Data="@actor"
Link="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())"
Href="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())"
ArtworkKind="ArtworkKind.Thumbnail"/>
}
</MudContainer>

2
ErsatzTV/Pages/MovieList.razor

@ -62,7 +62,7 @@ @@ -62,7 +62,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="MovieCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link="@($"media/movies/{context.MovieId}")"
Href="@($"media/movies/{context.MovieId}")"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"
IsSelected="@IsSelected(context)"

2
ErsatzTV/Pages/MultiCollectionEditor.razor

@ -86,7 +86,7 @@ @@ -86,7 +86,7 @@
</MudText>
</MudTd>
<MudTd DataLabel="Schedule As Group">
<MudCheckBox @bind-Checked="@context.ScheduleAsGroup" For="@(() => context.ScheduleAsGroup)"/>
<MudCheckBox @bind-Value="@context.ScheduleAsGroup" For="@(() => context.ScheduleAsGroup)"/>
</MudTd>
<MudTd DataLabel="Playback Order">
@if (context.ScheduleAsGroup)

2
ErsatzTV/Pages/MusicVideoList.razor

@ -61,7 +61,7 @@ @@ -61,7 +61,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="MusicVideoCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"

2
ErsatzTV/Pages/OtherVideoList.razor

@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="OtherVideoCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"

40
ErsatzTV/Pages/PlayoutAlternateSchedulesEditor.razor

@ -103,38 +103,38 @@ @@ -103,38 +103,38 @@
<MudCardContent>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
</MudElement>
</MudCardContent>
<MudCardActions>
@ -161,8 +161,8 @@ @@ -161,8 +161,8 @@
{
<MudItem xs="3">
<MudCheckBox T="bool" Label="@day.ToString()"
Checked="@(_selectedItem.DaysOfMonth.Contains(day))"
CheckedChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
Value="@(_selectedItem.DaysOfMonth.Contains(day))"
ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
</MudItem>
}
</MudGrid>
@ -182,15 +182,15 @@ @@ -182,15 +182,15 @@
<MudCardContent>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)"
Checked="@(_selectedItem.MonthsOfYear.Contains(1))"
CheckedChanged="@((bool c) => MonthOfYearChanged(1, c))"/>
Value="@(_selectedItem.MonthsOfYear.Contains(1))"
ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/>
</MudElement>
@foreach (int month in Enumerable.Range(2, 11))
{
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)"
Checked="@(_selectedItem.MonthsOfYear.Contains(month))"
CheckedChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
Value="@(_selectedItem.MonthsOfYear.Contains(month))"
ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
</MudElement>
}
</MudCardContent>

40
ErsatzTV/Pages/PlayoutTemplatesEditor.razor

@ -176,38 +176,38 @@ @@ -176,38 +176,38 @@
<MudCardContent>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
</MudElement>
</MudCardContent>
<MudCardActions>
@ -234,8 +234,8 @@ @@ -234,8 +234,8 @@
{
<MudItem xs="3">
<MudCheckBox T="bool" Label="@day.ToString()"
Checked="@(_selectedItem.DaysOfMonth.Contains(day))"
CheckedChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
Value="@(_selectedItem.DaysOfMonth.Contains(day))"
ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
</MudItem>
}
</MudGrid>
@ -255,15 +255,15 @@ @@ -255,15 +255,15 @@
<MudCardContent>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)"
Checked="@(_selectedItem.MonthsOfYear.Contains(1))"
CheckedChanged="@((bool c) => MonthOfYearChanged(1, c))"/>
Value="@(_selectedItem.MonthsOfYear.Contains(1))"
ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/>
</MudElement>
@foreach (int month in Enumerable.Range(2, 11))
{
<MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)"
Checked="@(_selectedItem.MonthsOfYear.Contains(month))"
CheckedChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
Value="@(_selectedItem.MonthsOfYear.Contains(month))"
ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
</MudElement>
}
</MudCardContent>

39
ErsatzTV/Pages/Playouts.razor

@ -1,6 +1,5 @@ @@ -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 @@ @@ -11,16 +10,16 @@
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="playouts/add">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="playouts/add">
Add Playout
</MudButton>
<MudTooltip Text="This feature is experimental">
<MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Warning" Link="@($"playouts/add/{PlayoutKind.Block}")">
<MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Warning" Href="@($"playouts/add/{PlayoutKind.Block}")">
Add Block Playout
</MudButton>
</MudTooltip>
<MudTooltip Text="This feature is experimental">
<MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Warning" Link="@($"playouts/add/{PlayoutKind.ExternalJson}")">
<MudButton Class="ml-3" Variant="Variant.Filled" Color="Color.Primary" StartIcon="@Icons.Material.Filled.Warning" Href="@($"playouts/add/{PlayoutKind.ExternalJson}")">
Add External Json Playout
</MudButton>
</MudTooltip>
@ -85,7 +84,7 @@ @@ -85,7 +84,7 @@
<MudTooltip Text="Edit Alternate Schedules">
<MudIconButton Icon="@Icons.Material.Filled.EditCalendar"
Disabled="@EntityLocker.IsPlayoutLocked(context.PlayoutId)"
Link="@($"playouts/{context.PlayoutId}/alternate-schedules")">
Href="@($"playouts/{context.PlayoutId}/alternate-schedules")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Reset Playout">
@ -117,7 +116,7 @@ @@ -117,7 +116,7 @@
<MudTooltip Text="Edit Playout">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Disabled="@EntityLocker.IsPlayoutLocked(context.PlayoutId)"
Link="@($"playouts/block/{context.PlayoutId}")">
Href="@($"playouts/block/{context.PlayoutId}")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Reset Playout">
@ -152,7 +151,7 @@ @@ -152,7 +151,7 @@
@ref="_detailTable">
<ToolBarContent>
<MudText Typo="Typo.h6">Playout Detail</MudText>
<MudSwitch T="bool" Class="ml-6" @bind-Checked="@ShowFiller" Color="Color.Secondary" Label="Show Filler"/>
<MudSwitch T="bool" Class="ml-6" @bind-Value="@ShowFiller" Color="Color.Secondary" Label="Show Filler"/>
</ToolBarContent>
<HeaderContent>
<MudTh>Start</MudTh>
@ -287,32 +286,6 @@ @@ -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

4
ErsatzTV/Pages/PlexMediaSources.razor

@ -39,12 +39,12 @@ @@ -39,12 +39,12 @@
</MudTooltip>
<MudTooltip Text="Edit Libraries">
<MudIconButton Icon="@Icons.Material.Filled.VideoLibrary"
Link="@($"media/sources/plex/{context.Id}/libraries")">
Href="@($"media/sources/plex/{context.Id}/libraries")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Edit Path Replacements">
<MudIconButton Icon="@Icons.Material.Filled.Folder"
Link="@($"media/sources/plex/{context.Id}/paths")">
Href="@($"media/sources/plex/{context.Id}/paths")">
</MudIconButton>
</MudTooltip>
</div>

30
ErsatzTV/Pages/ScheduleEditor.razor

@ -2,10 +2,10 @@ @@ -2,10 +2,10 @@
@page "/schedules/add"
@using ErsatzTV.Application.ProgramSchedules
@implements IDisposable
@inject NavigationManager _navigationManager
@inject ILogger<ScheduleEditor> _logger
@inject ISnackbar _snackbar
@inject IMediator _mediator
@inject NavigationManager NavigationManager
@inject ILogger<ScheduleEditor> Logger
@inject ISnackbar Snackbar
@inject IMediator Mediator
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div style="max-width: 400px;">
@ -19,14 +19,14 @@ @@ -19,14 +19,14 @@
<MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="Always schedule multi-part episodes chronologically when shuffling">
<MudCheckBox Label="Keep Multi-Part Episodes Together"
@bind-Checked="@_model.KeepMultiPartEpisodesTogether"
@bind-Value="@_model.KeepMultiPartEpisodesTogether"
For="@(() => _model.KeepMultiPartEpisodesTogether)"/>
</MudTooltip>
</MudElement>
<MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="This is useful for multi-part crossover episodes">
<MudCheckBox Label="Treat Collections As Shows*"
@bind-Checked="@_model.TreatCollectionsAsShows"
@bind-Value="@_model.TreatCollectionsAsShows"
Disabled="@(_model.KeepMultiPartEpisodesTogether == false)"
For="@(() => _model.TreatCollectionsAsShows)"/>
</MudTooltip>
@ -34,13 +34,13 @@ @@ -34,13 +34,13 @@
<MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="Note: this disables fixed start times and flood mode">
<MudCheckBox Label="Shuffle Schedule Items"
@bind-Checked="@_model.ShuffleScheduleItems"
@bind-Value="@_model.ShuffleScheduleItems"
For="@(() => _model.ShuffleScheduleItems)"/>
</MudTooltip>
</MudElement>
<MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox Label="Random Start Point"
@bind-Checked="@_model.RandomStartPoint"
@bind-Value="@_model.RandomStartPoint"
For="@(() => _model.RandomStartPoint)"/>
</MudElement>
</MudCardContent>
@ -74,7 +74,7 @@ @@ -74,7 +74,7 @@
{
if (IsEdit)
{
Option<ProgramScheduleViewModel> maybeProgramSchedule = await _mediator.Send(new GetProgramScheduleById(Id), _cts.Token);
Option<ProgramScheduleViewModel> maybeProgramSchedule = await Mediator.Send(new GetProgramScheduleById(Id), _cts.Token);
maybeProgramSchedule.Match(
viewModel =>
{
@ -85,7 +85,7 @@ @@ -85,7 +85,7 @@
_model.TreatCollectionsAsShows = viewModel.TreatCollectionsAsShows;
_model.RandomStartPoint = viewModel.RandomStartPoint;
},
() => _navigationManager.NavigateTo("404"));
() => NavigationManager.NavigateTo("404"));
}
else
{
@ -107,19 +107,19 @@ @@ -107,19 +107,19 @@
if (_editContext.Validate())
{
Either<BaseError, EntityIdResult> 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);
});
}
}

6
ErsatzTV/Pages/Schedules.razor

@ -35,12 +35,12 @@ @@ -35,12 +35,12 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Properties">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"schedules/{context.Id}")">
Href="@($"schedules/{context.Id}")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Edit Schedule Items">
<MudIconButton Icon="@Icons.Material.Filled.FormatListNumbered"
Link="@($"schedules/{context.Id}/items")">
Href="@($"schedules/{context.Id}/items")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Copy Schedule">
@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
<MudTablePager/>
</PagerContent>
</MudTable>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="schedules/add" Class="mt-4">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="schedules/add" Class="mt-4">
Add Schedule
</MudButton>

18
ErsatzTV/Pages/Search.razor

@ -134,7 +134,7 @@ @@ -134,7 +134,7 @@
@foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/movies/{card.MovieId}")"
Href="@($"media/movies/{card.MovieId}")"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)"
@ -161,7 +161,7 @@ @@ -161,7 +161,7 @@
@foreach (TelevisionShowCardViewModel card in _shows.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/tv/shows/{card.TelevisionShowId}")"
Href="@($"media/tv/shows/{card.TelevisionShowId}")"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)"
@ -188,7 +188,7 @@ @@ -188,7 +188,7 @@
@foreach (TelevisionSeasonCardViewModel card in _seasons.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)"
@ -216,7 +216,7 @@ @@ -216,7 +216,7 @@
{
<MediaCard Data="@card"
AddToCollectionClicked="@AddToCollection"
Link="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")"
Href="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")"
Subtitle="@($"{card.ShowTitle} - S{card.Season} E{card.Episode}")"
SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)"
@ -243,7 +243,7 @@ @@ -243,7 +243,7 @@
@foreach (ArtistCardViewModel card in _artists.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/music/artists/{card.ArtistId}")"
Href="@($"media/music/artists/{card.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"
@ -271,7 +271,7 @@ @@ -271,7 +271,7 @@
@foreach (MusicVideoCardViewModel card in _musicVideos.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"
@ -299,7 +299,7 @@ @@ -299,7 +299,7 @@
@foreach (OtherVideoCardViewModel card in _otherVideos.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"
@ -327,7 +327,7 @@ @@ -327,7 +327,7 @@
@foreach (SongCardViewModel card in _songs.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"
@ -355,7 +355,7 @@ @@ -355,7 +355,7 @@
@foreach (ImageCardViewModel card in _images.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))"

8
ErsatzTV/Pages/Settings.razor

@ -47,20 +47,20 @@ @@ -47,20 +47,20 @@
<MudSwitch T="bool"
Label="Use embedded subtitles"
Color="Color.Primary"
@bind-Checked="@_ffmpegSettings.UseEmbeddedSubtitles"/>
@bind-Value="@_ffmpegSettings.UseEmbeddedSubtitles"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-3">
<MudSwitch T="bool"
Label="Extract and use embedded (text) subtitles"
Color="Color.Primary"
@bind-Checked="@_ffmpegSettings.ExtractEmbeddedSubtitles"
@bind-Value="@_ffmpegSettings.ExtractEmbeddedSubtitles"
Disabled="@(_ffmpegSettings.UseEmbeddedSubtitles == false)"/>
</MudElement>
<MudElement HtmlTag="div" Class="mt-3">
<MudSwitch T="bool"
Label="Save troubleshooting reports to disk"
Color="Color.Primary"
@bind-Checked="@_ffmpegSettings.SaveReports"/>
@bind-Value="@_ffmpegSettings.SaveReports"/>
</MudElement>
<MudSelect Class="mt-3"
Label="Global Watermark"
@ -242,7 +242,7 @@ @@ -242,7 +242,7 @@
<MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="Controls whether file-not-found or unavailable items should be included in playouts">
<MudCheckBox Label="Skip Missing Items"
@bind-Checked="_playoutSettings.SkipMissingItems"
@bind-Value="_playoutSettings.SkipMissingItems"
For="@(() => _playoutSettings.SkipMissingItems)"/>
</MudTooltip>
</MudElement>

2
ErsatzTV/Pages/SongList.razor

@ -61,7 +61,7 @@ @@ -61,7 +61,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="SongCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"

4
ErsatzTV/Pages/TelevisionSeasonList.razor

@ -151,7 +151,7 @@ @@ -151,7 +151,7 @@
@foreach (TelevisionSeasonCardViewModel card in _data.Cards)
{
<MediaCard Data="@card" Placeholder="@card.Placeholder"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
AddToCollectionClicked="@AddSeasonToCollection"/>
}
</MudContainer>
@ -164,7 +164,7 @@ @@ -164,7 +164,7 @@
@foreach (ActorCardViewModel actor in _show.Actors)
{
<MediaCard Data="@actor"
Link="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())"
Href="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())"
ArtworkKind="ArtworkKind.Thumbnail"/>
}
</MudContainer>

2
ErsatzTV/Pages/TelevisionSeasonSearchResults.razor

@ -54,7 +54,7 @@ @@ -54,7 +54,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="TelevisionSeasonCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link="@($"media/tv/seasons/{context.TelevisionSeasonId}")"
Href="@($"media/tv/seasons/{context.TelevisionSeasonId}")"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"
IsSelected="@IsSelected(context)"

2
ErsatzTV/Pages/TelevisionShowList.razor

@ -62,7 +62,7 @@ @@ -62,7 +62,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="TelevisionShowCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context"
Link="@($"media/tv/shows/{context.TelevisionShowId}")"
Href="@($"media/tv/shows/{context.TelevisionShowId}")"
AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))"
IsSelected="@IsSelected(context)"

2
ErsatzTV/Pages/TraktLists.razor

@ -48,7 +48,7 @@ @@ -48,7 +48,7 @@
<MudTooltip Text="Search Trakt List">
<MudIconButton Icon="@Icons.Material.Filled.Search"
Disabled="@_locker.IsTraktLocked()"
Link="@($"search?query=trakt_list%3a{context.TraktId}")">
Href="@($"search?query=trakt_list%3a{context.TraktId}")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Match Trakt List Items">

18
ErsatzTV/Pages/Trash.razor

@ -111,7 +111,7 @@ @@ -111,7 +111,7 @@
@foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/movies/{card.MovieId}")"
Href="@($"media/movies/{card.MovieId}")"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))"
@ -139,7 +139,7 @@ @@ -139,7 +139,7 @@
@foreach (TelevisionShowCardViewModel card in _shows.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/tv/shows/{card.TelevisionShowId}")"
Href="@($"media/tv/shows/{card.TelevisionShowId}")"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))"
@ -167,7 +167,7 @@ @@ -167,7 +167,7 @@
@foreach (TelevisionSeasonCardViewModel card in _seasons.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))"
@ -197,7 +197,7 @@ @@ -197,7 +197,7 @@
<MediaCard Data="@card"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
Link="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")"
Href="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")"
Subtitle="@($"{card.ShowTitle} - S{card.Season} E{card.Episode}")"
SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)"
@ -224,7 +224,7 @@ @@ -224,7 +224,7 @@
@foreach (ArtistCardViewModel card in _artists.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link="@($"media/music/artists/{card.ArtistId}")"
Href="@($"media/music/artists/{card.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
@ -253,7 +253,7 @@ @@ -253,7 +253,7 @@
@foreach (MusicVideoCardViewModel card in _musicVideos.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
@ -282,7 +282,7 @@ @@ -282,7 +282,7 @@
@foreach (OtherVideoCardViewModel card in _otherVideos.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
@ -311,7 +311,7 @@ @@ -311,7 +311,7 @@
@foreach (SongCardViewModel card in _songs.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"
@ -340,7 +340,7 @@ @@ -340,7 +340,7 @@
@foreach (ImageCardViewModel card in _images.Cards.OrderBy(s => s.SortTitle))
{
<MediaCard Data="@card"
Link=""
Href=""
ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error"

2
ErsatzTV/Pages/WatermarkEditor.razor

@ -68,7 +68,7 @@ @@ -68,7 +68,7 @@
<MudSelectItem Value="@(WatermarkLocation.RightMiddle)">Right Middle</MudSelectItem>
</MudSelect>
<MudCheckBox Class="mt-3" Label="Place Within Source Content"
@bind-Checked="_model.PlaceWithinSourceContent"
@bind-Value="_model.PlaceWithinSourceContent"
For="@(() => _model.PlaceWithinSourceContent)"
Disabled="@(_model.Mode == ChannelWatermarkMode.None)"/>
<MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center">

4
ErsatzTV/Pages/Watermarks.razor

@ -48,7 +48,7 @@ @@ -48,7 +48,7 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Watermark">
<MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"watermarks/{context.Id}")">
Href="@($"watermarks/{context.Id}")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Copy Watermark">
@ -65,7 +65,7 @@ @@ -65,7 +65,7 @@
</MudTd>
</RowTemplate>
</MudTable>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="watermarks/add" Class="mt-4">
<MudButton Variant="Variant.Filled" Color="Color.Primary" Href="watermarks/add" Class="mt-4">
Add Watermark
</MudButton>
</MudContainer>

19
ErsatzTV/Services/RunOnce/PlatformSettingsService.cs

@ -5,24 +5,13 @@ using Microsoft.Extensions.Caching.Memory; @@ -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<PlatformSettingsService> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
public PlatformSettingsService(
IServiceScopeFactory serviceScopeFactory,
ILogger<PlatformSettingsService> 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<IRuntimeInfo>();
if (runtimeInfo != null && runtimeInfo.IsOSPlatform(OSPlatform.Linux) &&
Directory.Exists("/dev/dri"))
@ -31,7 +20,9 @@ public class PlatformSettingsService : BackgroundService @@ -31,7 +20,9 @@ public class PlatformSettingsService : BackgroundService
IMemoryCache memoryCache = scope.ServiceProvider.GetRequiredService<IMemoryCache>();
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);

10
ErsatzTV/Shared/MainLayout.razor

@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
@inject SystemStartup SystemStartup
@inject ISearchTargets SearchTargets;
<MudThemeProvider Theme="_ersatzTvTheme"/>
<MudThemeProvider Theme="ErsatzTvTheme"/>
<MudDialogProvider DisableBackdropClick="true"/>
<MudSnackbarProvider/>
@ -77,13 +77,13 @@ @@ -77,13 +77,13 @@
}
@* <MudLink Color="Color.Info" Href="/swagger" Target="_blank" Class="mr-4" Underline="Underline.None">API</MudLink> *@
<MudTooltip Text="Documentation">
<MudIconButton Icon="@Icons.Material.Filled.Help" Color="Color.Primary" Link="https://ersatztv.org" Target="_blank"/>
<MudIconButton Icon="@Icons.Material.Filled.Help" Color="Color.Primary" Href="https://ersatztv.org" Target="_blank"/>
</MudTooltip>
<MudTooltip Text="Discord">
<MudIconButton Icon="fab fa-discord" Color="Color.Primary" Link="https://discord.gg/hHaJm3yGy6" Target="_blank"/>
<MudIconButton Icon="fab fa-discord" Color="Color.Primary" Href="https://discord.gg/hHaJm3yGy6" Target="_blank"/>
</MudTooltip>
<MudTooltip Text="GitHub">
<MudIconButton Icon="@Icons.Custom.Brands.GitHub" Color="Color.Primary" Link="https://github.com/ErsatzTV/ErsatzTV" Target="_blank"/>
<MudIconButton Icon="@Icons.Custom.Brands.GitHub" Color="Color.Primary" Href="https://github.com/ErsatzTV/ErsatzTV" Target="_blank"/>
</MudTooltip>
<AuthorizeView>
<form action="/account/logout" method="post">
@ -180,7 +180,7 @@ @@ -180,7 +180,7 @@
_cts.Dispose();
}
private MudTheme _ersatzTvTheme => new()
private static MudTheme ErsatzTvTheme => new()
{
Palette = new PaletteDark
{

2
ErsatzTV/Shared/MediaCard.razor

@ -36,7 +36,7 @@ @@ -36,7 +36,7 @@
</div>
}
<div class="media-card-overlay" style="">
<MudButton Link="@(IsSelectMode ? null : Link)"
<MudButton Href="@(IsSelectMode ? null : Link)"
Style="height: 100%; width: 100%"
OnClick="@(e => IsSelectMode || string.IsNullOrWhiteSpace(Link) ? SelectClicked.InvokeAsync(e) : Task.CompletedTask)">
</MudButton>

2
ErsatzTV/Shared/RemoteMediaSourceLibrariesEditor.razor

@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
<MudTd DataLabel="Name">@context.Name</MudTd>
<MudTd DataLabel="MediaType">@context.MediaKind</MudTd>
<MudTd DataLabel="Synchronize">
<MudSwitch T="bool" @bind-Checked="@context.ShouldSyncItems" Color="Color.Primary"/>
<MudSwitch T="bool" @bind-Value="@context.ShouldSyncItems" Color="Color.Primary"/>
</MudTd>
</RowTemplate>
</MudTable>

24
ErsatzTV/Shared/RemoteMediaSources.razor

@ -3,9 +3,9 @@ @@ -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
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudTable Hover="true" Dense="true" Items="_mediaSources">
@ -29,18 +29,18 @@ @@ -29,18 +29,18 @@
<div style="align-items: center; display: flex;">
<MudTooltip Text="Refresh Libraries">
<MudIconButton Icon="@Icons.Material.Filled.Refresh"
Disabled="@(_locker.IsRemoteMediaSourceLocked<TMediaSource>())"
Disabled="@(Locker.IsRemoteMediaSourceLocked<TMediaSource>())"
OnClick="@(_ => RefreshLibraries(context.Id))">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Edit Libraries">
<MudIconButton Icon="@Icons.Material.Filled.VideoLibrary"
Link="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/libraries")">
Href="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/libraries")">
</MudIconButton>
</MudTooltip>
<MudTooltip Text="Edit Path Replacements">
<MudIconButton Icon="@Icons.Material.Filled.Folder"
Link="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/paths")">
Href="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/paths")">
</MudIconButton>
</MudTooltip>
</div>
@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
{
<MudButton Variant="Variant.Filled"
Color="Color.Primary"
Link="@($"media/sources/{Name.ToLowerInvariant()}/edit")"
Href="@($"media/sources/{Name.ToLowerInvariant()}/edit")"
Class="mt-4">
Connect @Name
</MudButton>
@ -70,7 +70,7 @@ @@ -70,7 +70,7 @@
{
<MudButton Variant="Variant.Filled"
Color="Color.Secondary"
Link="@($"media/sources/{Name.ToLowerInvariant()}/edit")"
Href="@($"media/sources/{Name.ToLowerInvariant()}/edit")"
Class="ml-4 mt-4">
Fix @Name Connection
</MudButton>
@ -112,20 +112,20 @@ @@ -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<DisconnectRemoteMediaSourceDialog>($"Disconnect {Name}", parameters, options);
IDialogReference dialog = await Dialog.ShowAsync<DisconnectRemoteMediaSourceDialog>($"Disconnect {Name}", parameters, options);
DialogResult result = await dialog.Result;
if (!result.Canceled)
{
if (_locker.LockRemoteMediaSource<TMediaSource>())
if (Locker.LockRemoteMediaSource<TMediaSource>())
{
await _mediator.Send(DisconnectCommand, _cts.Token);
await Mediator.Send(DisconnectCommand, _cts.Token);
await LoadMediaSources();
}
}

BIN
lib/Serilog.Sinks.SQLite.6.0.1.nupkg

Binary file not shown.

BIN
lib/nuget/Serilog.Sinks.SQLite.6.0.1.nupkg

Binary file not shown.

9
nuget.config

@ -1,9 +0,0 @@ @@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear />
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
<add key="local-packages" value="lib/nuget" />
</packageSources>
</configuration>
Loading…
Cancel
Save