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

* remove unused nupkg

* cleanup obsolete properties

* detect /dev/dri/card devices
This commit is contained in:
Jason Dove
2024-05-02 10:17:38 -05:00
committed by GitHub
parent 6ce7265427
commit 398a3c041a
44 changed files with 225 additions and 269 deletions
+1
View File
@@ -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 - Using proper MIME types for statically-served `.m3u8` and `.ts` files
- Serving playlists with gzip compression - Serving playlists with gzip compression
- Use `HLS Segmenter V2` for channel preview when channel is configured for `HLS Segmenter V2` - 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 ## [0.8.6-beta] - 2024-04-03
### Added ### Added
+1 -1
View File
@@ -54,7 +54,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="ArtistCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="ArtistCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="@($"media/music/artists/{context.ArtistId}")" Href="@($"media/music/artists/{context.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
+1 -1
View File
@@ -18,7 +18,7 @@
</CardHeaderContent> </CardHeaderContent>
</MudCardHeader> </MudCardHeader>
<MudCardContent> <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 Edit Templates
</MudButton> </MudButton>
</MudCardContent> </MudCardContent>
+2 -2
View File
@@ -88,7 +88,7 @@
} }
<MudTooltip Text="Edit Channel"> <MudTooltip Text="Edit Channel">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"channels/{context.Id}")"> Href="@($"channels/{context.Id}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Delete Channel"> <MudTooltip Text="Delete Channel">
@@ -103,7 +103,7 @@
<MudTablePager/> <MudTablePager/>
</PagerContent> </PagerContent>
</MudTable> </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 Add Channel
</MudButton> </MudButton>
</MudContainer> </MudContainer>
+35 -35
View File
@@ -2,8 +2,8 @@
@using ErsatzTV.Application.MediaCards @using ErsatzTV.Application.MediaCards
@using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections
@inherits MultiSelectBase<CollectionItems> @inherits MultiSelectBase<CollectionItems>
@inject NavigationManager _navigationManager @inject NavigationManager NavigationManager
@inject IJSRuntime _jsRuntime @inject IJSRuntime JsRuntime
<MudPaper Square="true" Style="display: flex; height: 64px; left: 240px; padding: 0; position: fixed; right: 0; z-index: 100;"> <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"> <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 @@
<div style="align-items: center; display: flex; flex-direction: row;"> <div style="align-items: center; display: flex; flex-direction: row;">
<MudText Typo="Typo.h4">@_data?.Name</MudText> <MudText Typo="Typo.h4">@_data?.Name</MudText>
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/collections/{Id}/edit")"/> Href="@($"media/collections/{Id}/edit")"/>
</div> </div>
@if (_data?.MovieCards.Count > 0) @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) @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) @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) @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) @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) @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) @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) @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) @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()) @if (SupportsCustomOrdering())
{ {
<div style="margin-left: auto"> <div style="margin-left: auto">
<MudSwitch T="bool" <MudSwitch T="bool"
Checked="@_data.UseCustomPlaybackOrder" Value="@(_data?.UseCustomPlaybackOrder == true)"
Color="Color.Primary" Color="Color.Primary"
CheckedChanged="@OnUseCustomOrderChanged" ValueChanged="@OnUseCustomOrderChanged"
Label="Use Custom Playback Order"/> Label="Use Custom Playback Order"/>
</div> </div>
} }
@@ -106,7 +106,7 @@
@foreach (MovieCardViewModel card in OrderMovies(_data.MovieCards)) @foreach (MovieCardViewModel card in OrderMovies(_data.MovieCards))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/movies/{card.MovieId}")" Href="@($"media/movies/{card.MovieId}")"
DeleteClicked="@RemoveMovieFromCollection" DeleteClicked="@RemoveMovieFromCollection"
SelectColor="@Color.Error" SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -129,7 +129,7 @@
@foreach (TelevisionShowCardViewModel card in _data.ShowCards.OrderBy(m => m.SortTitle)) @foreach (TelevisionShowCardViewModel card in _data.ShowCards.OrderBy(m => m.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/tv/shows/{card.TelevisionShowId}")" Href="@($"media/tv/shows/{card.TelevisionShowId}")"
DeleteClicked="@RemoveShowFromCollection" DeleteClicked="@RemoveShowFromCollection"
SelectColor="@Color.Error" SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -152,7 +152,7 @@
@foreach (TelevisionSeasonCardViewModel card in _data.SeasonCards.OrderBy(m => m.SortTitle)) @foreach (TelevisionSeasonCardViewModel card in _data.SeasonCards.OrderBy(m => m.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")" Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
Title="@card.ShowTitle" Title="@card.ShowTitle"
Subtitle="@card.Title" Subtitle="@card.Title"
DeleteClicked="@RemoveSeasonFromCollection" DeleteClicked="@RemoveSeasonFromCollection"
@@ -177,7 +177,7 @@
@foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired)) @foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")" Href="@($"media/tv/seasons/{card.SeasonId}#episode-{card.EpisodeId}")"
Title="@card.ShowTitle" Title="@card.ShowTitle"
Subtitle="@card.Title" Subtitle="@card.Title"
ContainerClass="media-card-episode-container mx-2" ContainerClass="media-card-episode-container mx-2"
@@ -205,7 +205,7 @@
@foreach (ArtistCardViewModel card in _data.ArtistCards.OrderBy(e => e.SortTitle)) @foreach (ArtistCardViewModel card in _data.ArtistCards.OrderBy(e => e.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/music/artists/{card.ArtistId}")" Href="@($"media/music/artists/{card.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveArtistFromCollection" DeleteClicked="@RemoveArtistFromCollection"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -229,7 +229,7 @@
@foreach (MusicVideoCardViewModel card in _data.MusicVideoCards.OrderBy(e => e.SortTitle)) @foreach (MusicVideoCardViewModel card in _data.MusicVideoCards.OrderBy(e => e.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveMusicVideoFromCollection" DeleteClicked="@RemoveMusicVideoFromCollection"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -253,7 +253,7 @@
@foreach (OtherVideoCardViewModel card in _data.OtherVideoCards.OrderBy(e => e.SortTitle)) @foreach (OtherVideoCardViewModel card in _data.OtherVideoCards.OrderBy(e => e.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveOtherVideoFromCollection" DeleteClicked="@RemoveOtherVideoFromCollection"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -277,7 +277,7 @@
@foreach (SongCardViewModel card in _data.SongCards.OrderBy(e => e.SortTitle)) @foreach (SongCardViewModel card in _data.SongCards.OrderBy(e => e.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveSongFromCollection" DeleteClicked="@RemoveSongFromCollection"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -301,7 +301,7 @@
@foreach (ImageCardViewModel card in _data.ImageCards.OrderBy(e => e.SortTitle)) @foreach (ImageCardViewModel card in _data.ImageCards.OrderBy(e => e.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@RemoveImageFromCollection" DeleteClicked="@RemoveImageFromCollection"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -332,7 +332,7 @@
maybeResult.Match( maybeResult.Match(
result => _data = result, result => _data = result,
_ => _navigationManager.NavigateTo("404")); _ => NavigationManager.NavigateTo("404"));
} }
private IOrderedEnumerable<MovieCardViewModel> OrderMovies(List<MovieCardViewModel> movies) private IOrderedEnumerable<MovieCardViewModel> OrderMovies(List<MovieCardViewModel> movies)
@@ -349,14 +349,14 @@
{ {
try try
{ {
await _jsRuntime.InvokeVoidAsync("sortableCollection", Id); await JsRuntime.InvokeVoidAsync("sortableCollection", Id);
if (_data.UseCustomPlaybackOrder) if (_data.UseCustomPlaybackOrder)
{ {
await _jsRuntime.InvokeVoidAsync("enableSorting"); await JsRuntime.InvokeVoidAsync("enableSorting");
} }
else else
{ {
await _jsRuntime.InvokeVoidAsync("disableSorting"); await JsRuntime.InvokeVoidAsync("disableSorting");
} }
} }
catch (Exception) catch (Exception)
@@ -391,7 +391,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { movie.MovieId } MediaItemIds = [movie.MovieId]
}; };
await RemoveItemsWithConfirmation("movie", $"{movie.Title} ({movie.Subtitle})", request); await RemoveItemsWithConfirmation("movie", $"{movie.Title} ({movie.Subtitle})", request);
@@ -404,7 +404,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { artist.ArtistId } MediaItemIds = [artist.ArtistId]
}; };
await RemoveItemsWithConfirmation( await RemoveItemsWithConfirmation(
@@ -420,7 +420,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { musicVideo.MusicVideoId } MediaItemIds = [musicVideo.MusicVideoId]
}; };
await RemoveItemsWithConfirmation("music video", $"{musicVideo.Title} ({musicVideo.Subtitle})", request); await RemoveItemsWithConfirmation("music video", $"{musicVideo.Title} ({musicVideo.Subtitle})", request);
@@ -433,7 +433,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { show.TelevisionShowId } MediaItemIds = [show.TelevisionShowId]
}; };
await RemoveItemsWithConfirmation("show", $"{show.Title} ({show.Subtitle})", request); await RemoveItemsWithConfirmation("show", $"{show.Title} ({show.Subtitle})", request);
@@ -446,7 +446,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { season.TelevisionSeasonId } MediaItemIds = [season.TelevisionSeasonId]
}; };
await RemoveItemsWithConfirmation("season", $"{season.ShowTitle} - {season.Title}", request); await RemoveItemsWithConfirmation("season", $"{season.ShowTitle} - {season.Title}", request);
@@ -457,7 +457,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { episode.EpisodeId } MediaItemIds = [episode.EpisodeId]
}; };
await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request);
@@ -469,7 +469,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { otherVideo.OtherVideoId } MediaItemIds = [otherVideo.OtherVideoId]
}; };
await RemoveItemsWithConfirmation("other video", $"{otherVideo.Title}", request); await RemoveItemsWithConfirmation("other video", $"{otherVideo.Title}", request);
@@ -482,7 +482,7 @@
{ {
var request = new RemoveItemsFromCollection(Id) var request = new RemoveItemsFromCollection(Id)
{ {
MediaItemIds = new List<int> { song.SongId } MediaItemIds = [song.SongId]
}; };
await RemoveItemsWithConfirmation("song", $"{song.Title}", request); await RemoveItemsWithConfirmation("song", $"{song.Title}", request);
+22 -22
View File
@@ -3,15 +3,15 @@
@using ErsatzTV.Application.MediaCollections @using ErsatzTV.Application.MediaCollections
@using ErsatzTV.Application.Configuration @using ErsatzTV.Application.Configuration
@implements IDisposable @implements IDisposable
@inject IDialogService _dialog @inject IDialogService Dialog
@inject IMediator _mediator @inject IMediator Mediator
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div> <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 Add Collection
</MudButton> </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 Add Multi Collection
</MudButton> </MudButton>
</div> </div>
@@ -38,7 +38,7 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Collection"> <MudTooltip Text="Edit Collection">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/collections/{context.Id}")"> Href="@($"media/collections/{context.Id}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Delete Collection"> <MudTooltip Text="Delete Collection">
@@ -76,7 +76,7 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Collection"> <MudTooltip Text="Edit Collection">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/multi-collections/{context.Id}/edit")"> Href="@($"media/multi-collections/{context.Id}/edit")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Delete Collection"> <MudTooltip Text="Delete Collection">
@@ -114,7 +114,7 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Collection"> <MudTooltip Text="Edit Collection">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@context.Query.GetRelativeSearchQuery()"> Href="@context.Query.GetRelativeSearchQuery()">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Delete Collection"> <MudTooltip Text="Delete Collection">
@@ -150,13 +150,13 @@
protected override async Task OnParametersSetAsync() 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)); .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)); .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)); .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 parameters = new DialogParameters { { "EntityType", "collection" }, { "EntityName", collection.Name } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; 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; DialogResult result = await dialog.Result;
if (!result.Canceled) if (!result.Canceled)
{ {
await _mediator.Send(new DeleteCollection(collection.Id), _cts.Token); await Mediator.Send(new DeleteCollection(collection.Id), _cts.Token);
if (_collectionsTable != null) if (_collectionsTable != null)
{ {
await _collectionsTable.ReloadServerData(); await _collectionsTable.ReloadServerData();
@@ -182,11 +182,11 @@
var parameters = new DialogParameters { { "EntityType", "multi collection" }, { "EntityName", collection.Name } }; var parameters = new DialogParameters { { "EntityType", "multi collection" }, { "EntityName", collection.Name } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; 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; DialogResult result = await dialog.Result;
if (!result.Canceled) if (!result.Canceled)
{ {
await _mediator.Send(new DeleteMultiCollection(collection.Id), _cts.Token); await Mediator.Send(new DeleteMultiCollection(collection.Id), _cts.Token);
if (_multiCollectionsTable != null) if (_multiCollectionsTable != null)
{ {
await _multiCollectionsTable.ReloadServerData(); await _multiCollectionsTable.ReloadServerData();
@@ -199,11 +199,11 @@
var parameters = new DialogParameters { { "EntityType", "smart collection" }, { "EntityName", collection.Name } }; var parameters = new DialogParameters { { "EntityType", "smart collection" }, { "EntityName", collection.Name } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; 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; DialogResult result = await dialog.Result;
if (!result.Canceled) if (!result.Canceled)
{ {
await _mediator.Send(new DeleteSmartCollection(collection.Id), _cts.Token); await Mediator.Send(new DeleteSmartCollection(collection.Id), _cts.Token);
if (_smartCollectionsTable != null) if (_smartCollectionsTable != null)
{ {
await _smartCollectionsTable.ReloadServerData(); await _smartCollectionsTable.ReloadServerData();
@@ -213,25 +213,25 @@
private async Task<TableData<MediaCollectionViewModel>> ServerReloadCollections(TableState state) 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 }; return new TableData<MediaCollectionViewModel> { TotalItems = data.TotalCount, Items = data.Page };
} }
private async Task<TableData<MultiCollectionViewModel>> ServerReloadMultiCollections(TableState state) 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 }; return new TableData<MultiCollectionViewModel> { TotalItems = data.TotalCount, Items = data.Page };
} }
private async Task<TableData<SmartCollectionViewModel>> ServerReloadSmartCollections(TableState state) 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 }; return new TableData<SmartCollectionViewModel> { TotalItems = data.TotalCount, Items = data.Page };
} }
+1 -1
View File
@@ -61,7 +61,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="TelevisionEpisodeCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="TelevisionEpisodeCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <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}")" Subtitle="@($"{context.ShowTitle} - S{context.Season} E{context.Episode}")"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
+10 -10
View File
@@ -1,9 +1,9 @@
@page "/ffmpeg" @page "/ffmpeg"
@using ErsatzTV.Application.FFmpegProfiles @using ErsatzTV.Application.FFmpegProfiles
@implements IDisposable @implements IDisposable
@inject IDialogService _dialog @inject IDialogService Dialog
@inject IMediator _mediator @inject IMediator Mediator
@inject NavigationManager _navigationManager @inject NavigationManager NavigationManager
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudTable Hover="true" Items="_ffmpegProfiles"> <MudTable Hover="true" Items="_ffmpegProfiles">
@@ -42,7 +42,7 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Profile"> <MudTooltip Text="Edit Profile">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"ffmpeg/{context.Id}")"> Href="@($"ffmpeg/{context.Id}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Copy Profile"> <MudTooltip Text="Copy Profile">
@@ -59,7 +59,7 @@
</MudTd> </MudTd>
</RowTemplate> </RowTemplate>
</MudTable> </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 Add Profile
</MudButton> </MudButton>
</MudContainer> </MudContainer>
@@ -78,18 +78,18 @@
protected override async Task OnParametersSetAsync() => await LoadFFmpegProfilesAsync(_cts.Token); protected override async Task OnParametersSetAsync() => await LoadFFmpegProfilesAsync(_cts.Token);
private async Task LoadFFmpegProfilesAsync(CancellationToken cancellationToken) => 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) private async Task DeleteProfileAsync(FFmpegProfileViewModel ffmpegProfile)
{ {
var parameters = new DialogParameters { { "EntityType", "ffmpeg profile" }, { "EntityName", ffmpegProfile.Name } }; var parameters = new DialogParameters { { "EntityType", "ffmpeg profile" }, { "EntityName", ffmpegProfile.Name } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; 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; DialogResult result = await dialog.Result;
if (!result.Canceled) 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); await LoadFFmpegProfilesAsync(_cts.Token);
} }
} }
@@ -99,11 +99,11 @@
var parameters = new DialogParameters { { "FFmpegProfileId", ffmpegProfile.Id } }; var parameters = new DialogParameters { { "FFmpegProfileId", ffmpegProfile.Id } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; 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; DialogResult dialogResult = await dialog.Result;
if (!dialogResult.Canceled && dialogResult.Data is FFmpegProfileViewModel data) if (!dialogResult.Canceled && dialogResult.Data is FFmpegProfileViewModel data)
{ {
_navigationManager.NavigateTo($"ffmpeg/{data.Id}"); NavigationManager.NavigateTo($"ffmpeg/{data.Id}");
} }
} }
+18 -18
View File
@@ -9,11 +9,11 @@
@using ErsatzTV.FFmpeg.Format @using ErsatzTV.FFmpeg.Format
@using ErsatzTV.FFmpeg.Preset @using ErsatzTV.FFmpeg.Preset
@implements IDisposable @implements IDisposable
@inject NavigationManager _navigationManager @inject NavigationManager NavigationManager
@inject ILogger<FFmpegEditor> _logger @inject ILogger<FFmpegEditor> Logger
@inject ISnackbar _snackbar @inject ISnackbar Snackbar
@inject IMediator _mediator @inject IMediator Mediator
@inject IMemoryCache _memoryCache @inject IMemoryCache MemoryCache
@inject PersistentComponentState ApplicationState @inject PersistentComponentState ApplicationState
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
@@ -137,10 +137,10 @@
</MudElement> </MudElement>
} }
<MudElement HtmlTag="div" Class="mt-3"> <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>
<MudElement HtmlTag="div" Class="mt-3"> <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> </MudElement>
</MudItem> </MudItem>
<MudItem> <MudItem>
@@ -216,7 +216,7 @@
{ {
if (!ApplicationState.TryTakeFromJson("_resolutions", out List<ResolutionViewModel> restoredResolutions)) 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 else
{ {
@@ -225,7 +225,7 @@
if (!ApplicationState.TryTakeFromJson("_hardwareAccelerationKinds", out List<HardwareAccelerationKind> restoredHardwareAccelerationKinds)) 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 else
{ {
@@ -236,7 +236,7 @@
{ {
if (!ApplicationState.TryTakeFromJson("_model", out FFmpegProfileEditViewModel restoredProfile)) 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) foreach (FFmpegProfileViewModel profile in maybeProfile)
{ {
_model = new FFmpegProfileEditViewModel(profile); _model = new FFmpegProfileEditViewModel(profile);
@@ -244,7 +244,7 @@
if (maybeProfile.IsNone) if (maybeProfile.IsNone)
{ {
_navigationManager.NavigateTo("404"); NavigationManager.NavigateTo("404");
} }
} }
else else
@@ -254,7 +254,7 @@
} }
else 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)) if (!_hardwareAccelerationKinds.Contains(_model.HardwareAcceleration))
@@ -265,9 +265,9 @@
_editContext = new EditContext(_model); _editContext = new EditContext(_model);
_messageStore = new ValidationMessageStore(_editContext); _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(); _vaapiDevices = vaapiDevices.OrderBy(s => s).ToList();
@@ -289,15 +289,15 @@
_messageStore.Clear(); _messageStore.Clear();
if (_editContext.Validate()) 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( errorMessage.HeadOrNone().Match(
error => error =>
{ {
_snackbar.Add("Unexpected error saving ffmpeg profile"); Snackbar.Add("Unexpected error saving ffmpeg profile");
_logger.LogError("Unexpected error saving ffmpeg profile: {Error}", error.Value); Logger.LogError("Unexpected error saving ffmpeg profile: {Error}", error.Value);
}, },
() => _navigationManager.NavigateTo("/ffmpeg")); () => NavigationManager.NavigateTo("/ffmpeg"));
} }
} }
+1 -1
View File
@@ -44,7 +44,7 @@
<MudSelectItem T="int?" Value="15">15 (:00, :15, :30, :45)</MudSelectItem> <MudSelectItem T="int?" Value="15">15 (:00, :15, :30, :45)</MudSelectItem>
<MudSelectItem T="int?" Value="30">30 (:00, :30)</MudSelectItem> <MudSelectItem T="int?" Value="30">30 (:00, :30)</MudSelectItem>
</MudSelect> </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)"> <MudSelect Class="mt-3" Label="Filler Collection Type" @bind-Value="_model.CollectionType" For="@(() => _model.CollectionType)">
@foreach (ProgramScheduleItemCollectionType collectionType in Enum.GetValues<ProgramScheduleItemCollectionType>()) @foreach (ProgramScheduleItemCollectionType collectionType in Enum.GetValues<ProgramScheduleItemCollectionType>())
{ {
+2 -2
View File
@@ -8,7 +8,7 @@
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div> <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 Add Filler Preset
</MudButton> </MudButton>
</div> </div>
@@ -50,7 +50,7 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Filler Preset"> <MudTooltip Text="Edit Filler Preset">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"media/filler/presets/{context.Id}/edit")"> Href="@($"media/filler/presets/{context.Id}/edit")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Delete Filler Preset"> <MudTooltip Text="Delete Filler Preset">
+1 -1
View File
@@ -31,7 +31,7 @@
{ {
<MudIconButton <MudIconButton
Icon="@Icons.Material.Filled.Search" Icon="@Icons.Material.Filled.Search"
Link="@($"search?query={query}")"/> Href="@($"search?query={query}")"/>
} }
} }
</div> </div>
+1 -1
View File
@@ -60,7 +60,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="ImageCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="ImageCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
+1 -1
View File
@@ -87,7 +87,7 @@
} }
<MudTooltip Text="Search Library"> <MudTooltip Text="Search Library">
<MudIconButton Icon="@Icons.Material.Filled.Search" <MudIconButton Icon="@Icons.Material.Filled.Search"
Link="@($"search?query=library_id%3a{context.Id}")"> Href="@($"search?query=library_id%3a{context.Id}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
</div> </div>
+2 -2
View File
@@ -32,7 +32,7 @@
<MudTooltip Text="Edit Library"> <MudTooltip Text="Edit Library">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Disabled="@_locker.IsLibraryLocked(context.Id)" Disabled="@_locker.IsLibraryLocked(context.Id)"
Link="@($"media/sources/local/{context.Id}/edit")"> Href="@($"media/sources/local/{context.Id}/edit")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Delete Library"> <MudTooltip Text="Delete Library">
@@ -45,7 +45,7 @@
</MudTd> </MudTd>
</RowTemplate> </RowTemplate>
</MudTable> </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 Add Local Library
</MudButton> </MudButton>
</MudContainer> </MudContainer>
+1 -1
View File
@@ -219,7 +219,7 @@
@foreach (ActorCardViewModel actor in _movie.Actors) @foreach (ActorCardViewModel actor in _movie.Actors)
{ {
<MediaCard Data="@actor" <MediaCard Data="@actor"
Link="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())" Href="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())"
ArtworkKind="ArtworkKind.Thumbnail"/> ArtworkKind="ArtworkKind.Thumbnail"/>
} }
</MudContainer> </MudContainer>
+1 -1
View File
@@ -62,7 +62,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="MovieCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="MovieCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="@($"media/movies/{context.MovieId}")" Href="@($"media/movies/{context.MovieId}")"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
IsSelected="@IsSelected(context)" IsSelected="@IsSelected(context)"
+1 -1
View File
@@ -86,7 +86,7 @@
</MudText> </MudText>
</MudTd> </MudTd>
<MudTd DataLabel="Schedule As Group"> <MudTd DataLabel="Schedule As Group">
<MudCheckBox @bind-Checked="@context.ScheduleAsGroup" For="@(() => context.ScheduleAsGroup)"/> <MudCheckBox @bind-Value="@context.ScheduleAsGroup" For="@(() => context.ScheduleAsGroup)"/>
</MudTd> </MudTd>
<MudTd DataLabel="Playback Order"> <MudTd DataLabel="Playback Order">
@if (context.ScheduleAsGroup) @if (context.ScheduleAsGroup)
+1 -1
View File
@@ -61,7 +61,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="MusicVideoCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="MusicVideoCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
+1 -1
View File
@@ -60,7 +60,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="OtherVideoCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="OtherVideoCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
@@ -103,38 +103,38 @@
<MudCardContent> <MudCardContent>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
</MudElement> </MudElement>
</MudCardContent> </MudCardContent>
<MudCardActions> <MudCardActions>
@@ -161,8 +161,8 @@
{ {
<MudItem xs="3"> <MudItem xs="3">
<MudCheckBox T="bool" Label="@day.ToString()" <MudCheckBox T="bool" Label="@day.ToString()"
Checked="@(_selectedItem.DaysOfMonth.Contains(day))" Value="@(_selectedItem.DaysOfMonth.Contains(day))"
CheckedChanged="@((bool c) => DayOfMonthChanged(day, c))"/> ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
</MudItem> </MudItem>
} }
</MudGrid> </MudGrid>
@@ -182,15 +182,15 @@
<MudCardContent> <MudCardContent>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)" <MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)"
Checked="@(_selectedItem.MonthsOfYear.Contains(1))" Value="@(_selectedItem.MonthsOfYear.Contains(1))"
CheckedChanged="@((bool c) => MonthOfYearChanged(1, c))"/> ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/>
</MudElement> </MudElement>
@foreach (int month in Enumerable.Range(2, 11)) @foreach (int month in Enumerable.Range(2, 11))
{ {
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)" <MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)"
Checked="@(_selectedItem.MonthsOfYear.Contains(month))" Value="@(_selectedItem.MonthsOfYear.Contains(month))"
CheckedChanged="@((bool c) => MonthOfYearChanged(month, c))"/> ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
</MudElement> </MudElement>
} }
</MudCardContent> </MudCardContent>
+20 -20
View File
@@ -176,38 +176,38 @@
<MudCardContent> <MudCardContent>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Monday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Monday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Monday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Tuesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Tuesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Tuesday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Wednesday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Wednesday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Wednesday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Thursday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Thursday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Thursday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Friday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Friday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Friday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Saturday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Saturday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Saturday, c))"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)" <MudCheckBox T="bool" Label="@_dtf.GetDayName(DayOfWeek.Sunday)"
Checked="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))" Value="@(_selectedItem.DaysOfWeek.Contains(DayOfWeek.Sunday))"
CheckedChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/> ValueChanged="@((bool c) => DayOfWeekChanged(DayOfWeek.Sunday, c))"/>
</MudElement> </MudElement>
</MudCardContent> </MudCardContent>
<MudCardActions> <MudCardActions>
@@ -234,8 +234,8 @@
{ {
<MudItem xs="3"> <MudItem xs="3">
<MudCheckBox T="bool" Label="@day.ToString()" <MudCheckBox T="bool" Label="@day.ToString()"
Checked="@(_selectedItem.DaysOfMonth.Contains(day))" Value="@(_selectedItem.DaysOfMonth.Contains(day))"
CheckedChanged="@((bool c) => DayOfMonthChanged(day, c))"/> ValueChanged="@((bool c) => DayOfMonthChanged(day, c))"/>
</MudItem> </MudItem>
} }
</MudGrid> </MudGrid>
@@ -255,15 +255,15 @@
<MudCardContent> <MudCardContent>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)" <MudCheckBox T="bool" Label="@_dtf.GetMonthName(1)"
Checked="@(_selectedItem.MonthsOfYear.Contains(1))" Value="@(_selectedItem.MonthsOfYear.Contains(1))"
CheckedChanged="@((bool c) => MonthOfYearChanged(1, c))"/> ValueChanged="@((bool c) => MonthOfYearChanged(1, c))"/>
</MudElement> </MudElement>
@foreach (int month in Enumerable.Range(2, 11)) @foreach (int month in Enumerable.Range(2, 11))
{ {
<MudElement HtmlTag="div" Class="mt-2"> <MudElement HtmlTag="div" Class="mt-2">
<MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)" <MudCheckBox T="bool" Label="@_dtf.GetMonthName(month)"
Checked="@(_selectedItem.MonthsOfYear.Contains(month))" Value="@(_selectedItem.MonthsOfYear.Contains(month))"
CheckedChanged="@((bool c) => MonthOfYearChanged(month, c))"/> ValueChanged="@((bool c) => MonthOfYearChanged(month, c))"/>
</MudElement> </MudElement>
} }
</MudCardContent> </MudCardContent>
+6 -33
View File
@@ -1,6 +1,5 @@
@page "/playouts" @page "/playouts"
@using ErsatzTV.Application.Playouts @using ErsatzTV.Application.Playouts
@using ErsatzTV.Application.Scheduling
@using ErsatzTV.Application.Configuration @using ErsatzTV.Application.Configuration
@using ErsatzTV.Core.Scheduling @using ErsatzTV.Core.Scheduling
@implements IDisposable @implements IDisposable
@@ -11,16 +10,16 @@
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div> <div>
<MudButton Variant="Variant.Filled" Color="Color.Primary" Link="playouts/add"> <MudButton Variant="Variant.Filled" Color="Color.Primary" Href="playouts/add">
Add Playout Add Playout
</MudButton> </MudButton>
<MudTooltip Text="This feature is experimental"> <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 Add Block Playout
</MudButton> </MudButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="This feature is experimental"> <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 Add External Json Playout
</MudButton> </MudButton>
</MudTooltip> </MudTooltip>
@@ -85,7 +84,7 @@
<MudTooltip Text="Edit Alternate Schedules"> <MudTooltip Text="Edit Alternate Schedules">
<MudIconButton Icon="@Icons.Material.Filled.EditCalendar" <MudIconButton Icon="@Icons.Material.Filled.EditCalendar"
Disabled="@EntityLocker.IsPlayoutLocked(context.PlayoutId)" Disabled="@EntityLocker.IsPlayoutLocked(context.PlayoutId)"
Link="@($"playouts/{context.PlayoutId}/alternate-schedules")"> Href="@($"playouts/{context.PlayoutId}/alternate-schedules")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Reset Playout"> <MudTooltip Text="Reset Playout">
@@ -117,7 +116,7 @@
<MudTooltip Text="Edit Playout"> <MudTooltip Text="Edit Playout">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Disabled="@EntityLocker.IsPlayoutLocked(context.PlayoutId)" Disabled="@EntityLocker.IsPlayoutLocked(context.PlayoutId)"
Link="@($"playouts/block/{context.PlayoutId}")"> Href="@($"playouts/block/{context.PlayoutId}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Reset Playout"> <MudTooltip Text="Reset Playout">
@@ -152,7 +151,7 @@
@ref="_detailTable"> @ref="_detailTable">
<ToolBarContent> <ToolBarContent>
<MudText Typo="Typo.h6">Playout Detail</MudText> <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> </ToolBarContent>
<HeaderContent> <HeaderContent>
<MudTh>Start</MudTh> <MudTh>Start</MudTh>
@@ -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) private async Task ScheduleReset(PlayoutNameViewModel playout)
{ {
var parameters = new DialogParameters var parameters = new DialogParameters
+2 -2
View File
@@ -39,12 +39,12 @@
</MudTooltip> </MudTooltip>
<MudTooltip Text="Edit Libraries"> <MudTooltip Text="Edit Libraries">
<MudIconButton Icon="@Icons.Material.Filled.VideoLibrary" <MudIconButton Icon="@Icons.Material.Filled.VideoLibrary"
Link="@($"media/sources/plex/{context.Id}/libraries")"> Href="@($"media/sources/plex/{context.Id}/libraries")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Edit Path Replacements"> <MudTooltip Text="Edit Path Replacements">
<MudIconButton Icon="@Icons.Material.Filled.Folder" <MudIconButton Icon="@Icons.Material.Filled.Folder"
Link="@($"media/sources/plex/{context.Id}/paths")"> Href="@($"media/sources/plex/{context.Id}/paths")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
</div> </div>
+15 -15
View File
@@ -2,10 +2,10 @@
@page "/schedules/add" @page "/schedules/add"
@using ErsatzTV.Application.ProgramSchedules @using ErsatzTV.Application.ProgramSchedules
@implements IDisposable @implements IDisposable
@inject NavigationManager _navigationManager @inject NavigationManager NavigationManager
@inject ILogger<ScheduleEditor> _logger @inject ILogger<ScheduleEditor> Logger
@inject ISnackbar _snackbar @inject ISnackbar Snackbar
@inject IMediator _mediator @inject IMediator Mediator
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<div style="max-width: 400px;"> <div style="max-width: 400px;">
@@ -19,14 +19,14 @@
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="Always schedule multi-part episodes chronologically when shuffling"> <MudTooltip Text="Always schedule multi-part episodes chronologically when shuffling">
<MudCheckBox Label="Keep Multi-Part Episodes Together" <MudCheckBox Label="Keep Multi-Part Episodes Together"
@bind-Checked="@_model.KeepMultiPartEpisodesTogether" @bind-Value="@_model.KeepMultiPartEpisodesTogether"
For="@(() => _model.KeepMultiPartEpisodesTogether)"/> For="@(() => _model.KeepMultiPartEpisodesTogether)"/>
</MudTooltip> </MudTooltip>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="This is useful for multi-part crossover episodes"> <MudTooltip Text="This is useful for multi-part crossover episodes">
<MudCheckBox Label="Treat Collections As Shows*" <MudCheckBox Label="Treat Collections As Shows*"
@bind-Checked="@_model.TreatCollectionsAsShows" @bind-Value="@_model.TreatCollectionsAsShows"
Disabled="@(_model.KeepMultiPartEpisodesTogether == false)" Disabled="@(_model.KeepMultiPartEpisodesTogether == false)"
For="@(() => _model.TreatCollectionsAsShows)"/> For="@(() => _model.TreatCollectionsAsShows)"/>
</MudTooltip> </MudTooltip>
@@ -34,13 +34,13 @@
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="Note: this disables fixed start times and flood mode"> <MudTooltip Text="Note: this disables fixed start times and flood mode">
<MudCheckBox Label="Shuffle Schedule Items" <MudCheckBox Label="Shuffle Schedule Items"
@bind-Checked="@_model.ShuffleScheduleItems" @bind-Value="@_model.ShuffleScheduleItems"
For="@(() => _model.ShuffleScheduleItems)"/> For="@(() => _model.ShuffleScheduleItems)"/>
</MudTooltip> </MudTooltip>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudCheckBox Label="Random Start Point" <MudCheckBox Label="Random Start Point"
@bind-Checked="@_model.RandomStartPoint" @bind-Value="@_model.RandomStartPoint"
For="@(() => _model.RandomStartPoint)"/> For="@(() => _model.RandomStartPoint)"/>
</MudElement> </MudElement>
</MudCardContent> </MudCardContent>
@@ -74,7 +74,7 @@
{ {
if (IsEdit) 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( maybeProgramSchedule.Match(
viewModel => viewModel =>
{ {
@@ -85,7 +85,7 @@
_model.TreatCollectionsAsShows = viewModel.TreatCollectionsAsShows; _model.TreatCollectionsAsShows = viewModel.TreatCollectionsAsShows;
_model.RandomStartPoint = viewModel.RandomStartPoint; _model.RandomStartPoint = viewModel.RandomStartPoint;
}, },
() => _navigationManager.NavigateTo("404")); () => NavigationManager.NavigateTo("404"));
} }
else else
{ {
@@ -107,19 +107,19 @@
if (_editContext.Validate()) if (_editContext.Validate())
{ {
Either<BaseError, EntityIdResult> result = IsEdit Either<BaseError, EntityIdResult> result = IsEdit
? await _mediator.Send(_model.ToUpdate(), _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); : await Mediator.Send(_model.ToCreate(), _cts.Token).MapT(r => r as EntityIdResult);
result.Match( result.Match(
programSchedule => programSchedule =>
{ {
string destination = IsEdit ? "/schedules" : $"/schedules/{programSchedule.Id}/items"; string destination = IsEdit ? "/schedules" : $"/schedules/{programSchedule.Id}/items";
_navigationManager.NavigateTo(destination); NavigationManager.NavigateTo(destination);
}, },
error => error =>
{ {
_snackbar.Add(error.Value, Severity.Error); Snackbar.Add(error.Value, Severity.Error);
_logger.LogError("Unexpected error saving schedule: {Error}", error.Value); Logger.LogError("Unexpected error saving schedule: {Error}", error.Value);
}); });
} }
} }
+3 -3
View File
@@ -35,12 +35,12 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Properties"> <MudTooltip Text="Edit Properties">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"schedules/{context.Id}")"> Href="@($"schedules/{context.Id}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Edit Schedule Items"> <MudTooltip Text="Edit Schedule Items">
<MudIconButton Icon="@Icons.Material.Filled.FormatListNumbered" <MudIconButton Icon="@Icons.Material.Filled.FormatListNumbered"
Link="@($"schedules/{context.Id}/items")"> Href="@($"schedules/{context.Id}/items")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Copy Schedule"> <MudTooltip Text="Copy Schedule">
@@ -60,7 +60,7 @@
<MudTablePager/> <MudTablePager/>
</PagerContent> </PagerContent>
</MudTable> </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 Add Schedule
</MudButton> </MudButton>
+9 -9
View File
@@ -134,7 +134,7 @@
@foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle)) @foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/movies/{card.MovieId}")" Href="@($"media/movies/{card.MovieId}")"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)" IsSelected="@IsSelected(card)"
@@ -161,7 +161,7 @@
@foreach (TelevisionShowCardViewModel card in _shows.Cards.OrderBy(s => s.SortTitle)) @foreach (TelevisionShowCardViewModel card in _shows.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/tv/shows/{card.TelevisionShowId}")" Href="@($"media/tv/shows/{card.TelevisionShowId}")"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)" IsSelected="@IsSelected(card)"
@@ -188,7 +188,7 @@
@foreach (TelevisionSeasonCardViewModel card in _seasons.Cards.OrderBy(s => s.SortTitle)) @foreach (TelevisionSeasonCardViewModel card in _seasons.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")" Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)" IsSelected="@IsSelected(card)"
@@ -216,7 +216,7 @@
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
AddToCollectionClicked="@AddToCollection" 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}")" Subtitle="@($"{card.ShowTitle} - S{card.Season} E{card.Episode}")"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)" IsSelected="@IsSelected(card)"
@@ -243,7 +243,7 @@
@foreach (ArtistCardViewModel card in _artists.Cards.OrderBy(s => s.SortTitle)) @foreach (ArtistCardViewModel card in _artists.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/music/artists/{card.ArtistId}")" Href="@($"media/music/artists/{card.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -271,7 +271,7 @@
@foreach (MusicVideoCardViewModel card in _musicVideos.Cards.OrderBy(s => s.SortTitle)) @foreach (MusicVideoCardViewModel card in _musicVideos.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -299,7 +299,7 @@
@foreach (OtherVideoCardViewModel card in _otherVideos.Cards.OrderBy(s => s.SortTitle)) @foreach (OtherVideoCardViewModel card in _otherVideos.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -327,7 +327,7 @@
@foreach (SongCardViewModel card in _songs.Cards.OrderBy(s => s.SortTitle)) @foreach (SongCardViewModel card in _songs.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -355,7 +355,7 @@
@foreach (ImageCardViewModel card in _images.Cards.OrderBy(s => s.SortTitle)) @foreach (ImageCardViewModel card in _images.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
+4 -4
View File
@@ -47,20 +47,20 @@
<MudSwitch T="bool" <MudSwitch T="bool"
Label="Use embedded subtitles" Label="Use embedded subtitles"
Color="Color.Primary" Color="Color.Primary"
@bind-Checked="@_ffmpegSettings.UseEmbeddedSubtitles"/> @bind-Value="@_ffmpegSettings.UseEmbeddedSubtitles"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudSwitch T="bool" <MudSwitch T="bool"
Label="Extract and use embedded (text) subtitles" Label="Extract and use embedded (text) subtitles"
Color="Color.Primary" Color="Color.Primary"
@bind-Checked="@_ffmpegSettings.ExtractEmbeddedSubtitles" @bind-Value="@_ffmpegSettings.ExtractEmbeddedSubtitles"
Disabled="@(_ffmpegSettings.UseEmbeddedSubtitles == false)"/> Disabled="@(_ffmpegSettings.UseEmbeddedSubtitles == false)"/>
</MudElement> </MudElement>
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudSwitch T="bool" <MudSwitch T="bool"
Label="Save troubleshooting reports to disk" Label="Save troubleshooting reports to disk"
Color="Color.Primary" Color="Color.Primary"
@bind-Checked="@_ffmpegSettings.SaveReports"/> @bind-Value="@_ffmpegSettings.SaveReports"/>
</MudElement> </MudElement>
<MudSelect Class="mt-3" <MudSelect Class="mt-3"
Label="Global Watermark" Label="Global Watermark"
@@ -242,7 +242,7 @@
<MudElement HtmlTag="div" Class="mt-3"> <MudElement HtmlTag="div" Class="mt-3">
<MudTooltip Text="Controls whether file-not-found or unavailable items should be included in playouts"> <MudTooltip Text="Controls whether file-not-found or unavailable items should be included in playouts">
<MudCheckBox Label="Skip Missing Items" <MudCheckBox Label="Skip Missing Items"
@bind-Checked="_playoutSettings.SkipMissingItems" @bind-Value="_playoutSettings.SkipMissingItems"
For="@(() => _playoutSettings.SkipMissingItems)"/> For="@(() => _playoutSettings.SkipMissingItems)"/>
</MudTooltip> </MudTooltip>
</MudElement> </MudElement>
+1 -1
View File
@@ -61,7 +61,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="SongCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="SongCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
+2 -2
View File
@@ -151,7 +151,7 @@
@foreach (TelevisionSeasonCardViewModel card in _data.Cards) @foreach (TelevisionSeasonCardViewModel card in _data.Cards)
{ {
<MediaCard Data="@card" Placeholder="@card.Placeholder" <MediaCard Data="@card" Placeholder="@card.Placeholder"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")" Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
AddToCollectionClicked="@AddSeasonToCollection"/> AddToCollectionClicked="@AddSeasonToCollection"/>
} }
</MudContainer> </MudContainer>
@@ -164,7 +164,7 @@
@foreach (ActorCardViewModel actor in _show.Actors) @foreach (ActorCardViewModel actor in _show.Actors)
{ {
<MediaCard Data="@actor" <MediaCard Data="@actor"
Link="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())" Href="@(@$"actor:""{actor.Name.ToLowerInvariant()}""".GetRelativeSearchQuery())"
ArtworkKind="ArtworkKind.Thumbnail"/> ArtworkKind="ArtworkKind.Thumbnail"/>
} }
</MudContainer> </MudContainer>
@@ -54,7 +54,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="TelevisionSeasonCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="TelevisionSeasonCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="@($"media/tv/seasons/{context.TelevisionSeasonId}")" Href="@($"media/tv/seasons/{context.TelevisionSeasonId}")"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
IsSelected="@IsSelected(context)" IsSelected="@IsSelected(context)"
+1 -1
View File
@@ -62,7 +62,7 @@
<MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid"> <MudContainer MaxWidth="MaxWidth.False" Class="media-card-grid">
<FragmentLetterAnchor TCard="TelevisionShowCardViewModel" Cards="@_data.Cards"> <FragmentLetterAnchor TCard="TelevisionShowCardViewModel" Cards="@_data.Cards">
<MediaCard Data="@context" <MediaCard Data="@context"
Link="@($"media/tv/shows/{context.TelevisionShowId}")" Href="@($"media/tv/shows/{context.TelevisionShowId}")"
AddToCollectionClicked="@AddToCollection" AddToCollectionClicked="@AddToCollection"
SelectClicked="@(e => SelectClicked(context, e))" SelectClicked="@(e => SelectClicked(context, e))"
IsSelected="@IsSelected(context)" IsSelected="@IsSelected(context)"
+1 -1
View File
@@ -48,7 +48,7 @@
<MudTooltip Text="Search Trakt List"> <MudTooltip Text="Search Trakt List">
<MudIconButton Icon="@Icons.Material.Filled.Search" <MudIconButton Icon="@Icons.Material.Filled.Search"
Disabled="@_locker.IsTraktLocked()" Disabled="@_locker.IsTraktLocked()"
Link="@($"search?query=trakt_list%3a{context.TraktId}")"> Href="@($"search?query=trakt_list%3a{context.TraktId}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Match Trakt List Items"> <MudTooltip Text="Match Trakt List Items">
+9 -9
View File
@@ -111,7 +111,7 @@
@foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle)) @foreach (MovieCardViewModel card in _movies.Cards.OrderBy(m => m.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/movies/{card.MovieId}")" Href="@($"media/movies/{card.MovieId}")"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -139,7 +139,7 @@
@foreach (TelevisionShowCardViewModel card in _shows.Cards.OrderBy(s => s.SortTitle)) @foreach (TelevisionShowCardViewModel card in _shows.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/tv/shows/{card.TelevisionShowId}")" Href="@($"media/tv/shows/{card.TelevisionShowId}")"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -167,7 +167,7 @@
@foreach (TelevisionSeasonCardViewModel card in _seasons.Cards.OrderBy(s => s.SortTitle)) @foreach (TelevisionSeasonCardViewModel card in _seasons.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/tv/seasons/{card.TelevisionSeasonId}")" Href="@($"media/tv/seasons/{card.TelevisionSeasonId}")"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
@@ -197,7 +197,7 @@
<MediaCard Data="@card" <MediaCard Data="@card"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" 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}")" Subtitle="@($"{card.ShowTitle} - S{card.Season} E{card.Episode}")"
SelectClicked="@(e => SelectClicked(card, e))" SelectClicked="@(e => SelectClicked(card, e))"
IsSelected="@IsSelected(card)" IsSelected="@IsSelected(card)"
@@ -224,7 +224,7 @@
@foreach (ArtistCardViewModel card in _artists.Cards.OrderBy(s => s.SortTitle)) @foreach (ArtistCardViewModel card in _artists.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="@($"media/music/artists/{card.ArtistId}")" Href="@($"media/music/artists/{card.ArtistId}")"
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -253,7 +253,7 @@
@foreach (MusicVideoCardViewModel card in _musicVideos.Cards.OrderBy(s => s.SortTitle)) @foreach (MusicVideoCardViewModel card in _musicVideos.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -282,7 +282,7 @@
@foreach (OtherVideoCardViewModel card in _otherVideos.Cards.OrderBy(s => s.SortTitle)) @foreach (OtherVideoCardViewModel card in _otherVideos.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -311,7 +311,7 @@
@foreach (SongCardViewModel card in _songs.Cards.OrderBy(s => s.SortTitle)) @foreach (SongCardViewModel card in _songs.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
@@ -340,7 +340,7 @@
@foreach (ImageCardViewModel card in _images.Cards.OrderBy(s => s.SortTitle)) @foreach (ImageCardViewModel card in _images.Cards.OrderBy(s => s.SortTitle))
{ {
<MediaCard Data="@card" <MediaCard Data="@card"
Link="" Href=""
ArtworkKind="ArtworkKind.Thumbnail" ArtworkKind="ArtworkKind.Thumbnail"
DeleteClicked="@DeleteItemFromDatabase" DeleteClicked="@DeleteItemFromDatabase"
SelectColor="@Color.Error" SelectColor="@Color.Error"
+1 -1
View File
@@ -68,7 +68,7 @@
<MudSelectItem Value="@(WatermarkLocation.RightMiddle)">Right Middle</MudSelectItem> <MudSelectItem Value="@(WatermarkLocation.RightMiddle)">Right Middle</MudSelectItem>
</MudSelect> </MudSelect>
<MudCheckBox Class="mt-3" Label="Place Within Source Content" <MudCheckBox Class="mt-3" Label="Place Within Source Content"
@bind-Checked="_model.PlaceWithinSourceContent" @bind-Value="_model.PlaceWithinSourceContent"
For="@(() => _model.PlaceWithinSourceContent)" For="@(() => _model.PlaceWithinSourceContent)"
Disabled="@(_model.Mode == ChannelWatermarkMode.None)"/> Disabled="@(_model.Mode == ChannelWatermarkMode.None)"/>
<MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center"> <MudGrid Class="mt-3" Style="align-items: start" Justify="Justify.Center">
+2 -2
View File
@@ -48,7 +48,7 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Edit Watermark"> <MudTooltip Text="Edit Watermark">
<MudIconButton Icon="@Icons.Material.Filled.Edit" <MudIconButton Icon="@Icons.Material.Filled.Edit"
Link="@($"watermarks/{context.Id}")"> Href="@($"watermarks/{context.Id}")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Copy Watermark"> <MudTooltip Text="Copy Watermark">
@@ -65,7 +65,7 @@
</MudTd> </MudTd>
</RowTemplate> </RowTemplate>
</MudTable> </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 Add Watermark
</MudButton> </MudButton>
</MudContainer> </MudContainer>
@@ -5,24 +5,13 @@ using Microsoft.Extensions.Caching.Memory;
namespace ErsatzTV.Services.RunOnce; 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) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
await Task.Yield(); await Task.Yield();
using IServiceScope scope = _serviceScopeFactory.CreateScope(); using IServiceScope scope = serviceScopeFactory.CreateScope();
IRuntimeInfo runtimeInfo = scope.ServiceProvider.GetRequiredService<IRuntimeInfo>(); IRuntimeInfo runtimeInfo = scope.ServiceProvider.GetRequiredService<IRuntimeInfo>();
if (runtimeInfo != null && runtimeInfo.IsOSPlatform(OSPlatform.Linux) && if (runtimeInfo != null && runtimeInfo.IsOSPlatform(OSPlatform.Linux) &&
Directory.Exists("/dev/dri")) Directory.Exists("/dev/dri"))
@@ -31,7 +20,9 @@ public class PlatformSettingsService : BackgroundService
IMemoryCache memoryCache = scope.ServiceProvider.GetRequiredService<IMemoryCache>(); IMemoryCache memoryCache = scope.ServiceProvider.GetRequiredService<IMemoryCache>();
var devices = localFileSystem.ListFiles("/dev/dri") 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(); .ToList();
memoryCache.Set("ffmpeg.render_devices", devices); memoryCache.Set("ffmpeg.render_devices", devices);
+5 -5
View File
@@ -9,7 +9,7 @@
@inject SystemStartup SystemStartup @inject SystemStartup SystemStartup
@inject ISearchTargets SearchTargets; @inject ISearchTargets SearchTargets;
<MudThemeProvider Theme="_ersatzTvTheme"/> <MudThemeProvider Theme="ErsatzTvTheme"/>
<MudDialogProvider DisableBackdropClick="true"/> <MudDialogProvider DisableBackdropClick="true"/>
<MudSnackbarProvider/> <MudSnackbarProvider/>
@@ -77,13 +77,13 @@
} }
@* <MudLink Color="Color.Info" Href="/swagger" Target="_blank" Class="mr-4" Underline="Underline.None">API</MudLink> *@ @* <MudLink Color="Color.Info" Href="/swagger" Target="_blank" Class="mr-4" Underline="Underline.None">API</MudLink> *@
<MudTooltip Text="Documentation"> <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>
<MudTooltip Text="Discord"> <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>
<MudTooltip Text="GitHub"> <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> </MudTooltip>
<AuthorizeView> <AuthorizeView>
<form action="/account/logout" method="post"> <form action="/account/logout" method="post">
@@ -180,7 +180,7 @@
_cts.Dispose(); _cts.Dispose();
} }
private MudTheme _ersatzTvTheme => new() private static MudTheme ErsatzTvTheme => new()
{ {
Palette = new PaletteDark Palette = new PaletteDark
{ {
+1 -1
View File
@@ -36,7 +36,7 @@
</div> </div>
} }
<div class="media-card-overlay" style=""> <div class="media-card-overlay" style="">
<MudButton Link="@(IsSelectMode ? null : Link)" <MudButton Href="@(IsSelectMode ? null : Link)"
Style="height: 100%; width: 100%" Style="height: 100%; width: 100%"
OnClick="@(e => IsSelectMode || string.IsNullOrWhiteSpace(Link) ? SelectClicked.InvokeAsync(e) : Task.CompletedTask)"> OnClick="@(e => IsSelectMode || string.IsNullOrWhiteSpace(Link) ? SelectClicked.InvokeAsync(e) : Task.CompletedTask)">
</MudButton> </MudButton>
@@ -33,7 +33,7 @@
<MudTd DataLabel="Name">@context.Name</MudTd> <MudTd DataLabel="Name">@context.Name</MudTd>
<MudTd DataLabel="MediaType">@context.MediaKind</MudTd> <MudTd DataLabel="MediaType">@context.MediaKind</MudTd>
<MudTd DataLabel="Synchronize"> <MudTd DataLabel="Synchronize">
<MudSwitch T="bool" @bind-Checked="@context.ShouldSyncItems" Color="Color.Primary"/> <MudSwitch T="bool" @bind-Value="@context.ShouldSyncItems" Color="Color.Primary"/>
</MudTd> </MudTd>
</RowTemplate> </RowTemplate>
</MudTable> </MudTable>
+12 -12
View File
@@ -3,9 +3,9 @@
@implements IDisposable @implements IDisposable
@using ErsatzTV.Core.Interfaces.MediaSources @using ErsatzTV.Core.Interfaces.MediaSources
@typeparam TMediaSource @typeparam TMediaSource
@inject IMediator _mediator @inject IMediator Mediator
@inject IDialogService _dialog @inject IDialogService Dialog
@inject IEntityLocker _locker @inject IEntityLocker Locker
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8"> <MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="pt-8">
<MudTable Hover="true" Dense="true" Items="_mediaSources"> <MudTable Hover="true" Dense="true" Items="_mediaSources">
@@ -29,18 +29,18 @@
<div style="align-items: center; display: flex;"> <div style="align-items: center; display: flex;">
<MudTooltip Text="Refresh Libraries"> <MudTooltip Text="Refresh Libraries">
<MudIconButton Icon="@Icons.Material.Filled.Refresh" <MudIconButton Icon="@Icons.Material.Filled.Refresh"
Disabled="@(_locker.IsRemoteMediaSourceLocked<TMediaSource>())" Disabled="@(Locker.IsRemoteMediaSourceLocked<TMediaSource>())"
OnClick="@(_ => RefreshLibraries(context.Id))"> OnClick="@(_ => RefreshLibraries(context.Id))">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Edit Libraries"> <MudTooltip Text="Edit Libraries">
<MudIconButton Icon="@Icons.Material.Filled.VideoLibrary" <MudIconButton Icon="@Icons.Material.Filled.VideoLibrary"
Link="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/libraries")"> Href="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/libraries")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
<MudTooltip Text="Edit Path Replacements"> <MudTooltip Text="Edit Path Replacements">
<MudIconButton Icon="@Icons.Material.Filled.Folder" <MudIconButton Icon="@Icons.Material.Filled.Folder"
Link="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/paths")"> Href="@($"media/sources/{Name.ToLowerInvariant()}/{context.Id}/paths")">
</MudIconButton> </MudIconButton>
</MudTooltip> </MudTooltip>
</div> </div>
@@ -60,7 +60,7 @@
{ {
<MudButton Variant="Variant.Filled" <MudButton Variant="Variant.Filled"
Color="Color.Primary" Color="Color.Primary"
Link="@($"media/sources/{Name.ToLowerInvariant()}/edit")" Href="@($"media/sources/{Name.ToLowerInvariant()}/edit")"
Class="mt-4"> Class="mt-4">
Connect @Name Connect @Name
</MudButton> </MudButton>
@@ -70,7 +70,7 @@
{ {
<MudButton Variant="Variant.Filled" <MudButton Variant="Variant.Filled"
Color="Color.Secondary" Color="Color.Secondary"
Link="@($"media/sources/{Name.ToLowerInvariant()}/edit")" Href="@($"media/sources/{Name.ToLowerInvariant()}/edit")"
Class="ml-4 mt-4"> Class="ml-4 mt-4">
Fix @Name Connection Fix @Name Connection
</MudButton> </MudButton>
@@ -112,20 +112,20 @@
{ {
_isAuthorized = await SecretStore.ReadSecrets() _isAuthorized = await SecretStore.ReadSecrets()
.Map(secrets => !string.IsNullOrWhiteSpace(secrets.Address) && !string.IsNullOrWhiteSpace(secrets.ApiKey)); .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() private async Task Disconnect()
{ {
var parameters = new DialogParameters { { "Name", Name } }; var parameters = new DialogParameters { { "Name", Name } };
var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small }; 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; DialogResult result = await dialog.Result;
if (!result.Canceled) 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(); await LoadMediaSources();
} }
} }
Binary file not shown.
Binary file not shown.
-9
View File
@@ -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>