diff --git a/ErsatzTV.Application/MediaCards/Mapper.cs b/ErsatzTV.Application/MediaCards/Mapper.cs index b0fd36993..c801f9bf6 100644 --- a/ErsatzTV.Application/MediaCards/Mapper.cs +++ b/ErsatzTV.Application/MediaCards/Mapper.cs @@ -33,11 +33,12 @@ namespace ErsatzTV.Application.MediaCards episodeMetadata.EpisodeId, episodeMetadata.ReleaseDate ?? DateTime.MinValue, episodeMetadata.Episode.Season.Show.ShowMetadata.HeadOrNone().Map(m => m.Title).IfNone(string.Empty), + episodeMetadata.Episode.Season.ShowId, + episodeMetadata.Episode.SeasonId, + episodeMetadata.Episode.EpisodeNumber, episodeMetadata.Title, - $"Episode {episodeMetadata.Episode.EpisodeNumber}", - episodeMetadata.Episode.EpisodeNumber.ToString(), - GetThumbnail(episodeMetadata), - episodeMetadata.Episode.EpisodeNumber.ToString()); + episodeMetadata.Episode.EpisodeMetadata.HeadOrNone().Map(em => em.Plot).IfNone(string.Empty), + GetThumbnail(episodeMetadata)); internal static MovieCardViewModel ProjectToViewModel(MovieMetadata movieMetadata) => new( diff --git a/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs b/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs index c14521e49..b0e43226d 100644 --- a/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs +++ b/ErsatzTV.Application/MediaCards/TelevisionEpisodeCardViewModel.cs @@ -7,14 +7,15 @@ namespace ErsatzTV.Application.MediaCards int EpisodeId, DateTime Aired, string ShowTitle, + int ShowId, + int SeasonId, + int Episode, string Title, - string Subtitle, - string SortTitle, - string Poster, - string Placeholder) : MediaCardViewModel( + string Plot, + string Poster) : MediaCardViewModel( Title, - Subtitle, - SortTitle, + $"Episode {Episode}", + $"Episode {Episode}", Poster) { } diff --git a/ErsatzTV.Application/Television/Mapper.cs b/ErsatzTV.Application/Television/Mapper.cs index fccf6a521..8b20e8ffb 100644 --- a/ErsatzTV.Application/Television/Mapper.cs +++ b/ErsatzTV.Application/Television/Mapper.cs @@ -12,7 +12,8 @@ namespace ErsatzTV.Application.Television show.ShowMetadata.HeadOrNone().Map(m => m.Title ?? string.Empty).IfNone(string.Empty), show.ShowMetadata.HeadOrNone().Map(m => m.Year?.ToString() ?? string.Empty).IfNone(string.Empty), show.ShowMetadata.HeadOrNone().Map(m => m.Plot ?? string.Empty).IfNone(string.Empty), - show.ShowMetadata.HeadOrNone().Map(GetPoster).IfNone(string.Empty)); + show.ShowMetadata.HeadOrNone().Map(GetPoster).IfNone(string.Empty), + show.ShowMetadata.HeadOrNone().Map(GetFanArt).IfNone(string.Empty)); internal static TelevisionSeasonViewModel ProjectToViewModel(Season season) => new( @@ -21,7 +22,8 @@ namespace ErsatzTV.Application.Television season.Show.ShowMetadata.HeadOrNone().Map(m => m.Title ?? string.Empty).IfNone(string.Empty), season.Show.ShowMetadata.HeadOrNone().Map(m => m.Year?.ToString() ?? string.Empty).IfNone(string.Empty), season.SeasonNumber == 0 ? "Specials" : $"Season {season.SeasonNumber}", - season.SeasonMetadata.HeadOrNone().Map(GetPoster).IfNone(string.Empty)); + season.SeasonMetadata.HeadOrNone().Map(GetPoster).IfNone(string.Empty), + season.Show.ShowMetadata.HeadOrNone().Map(GetFanArt).IfNone(string.Empty)); internal static TelevisionEpisodeViewModel ProjectToViewModel(Episode episode) => new( @@ -32,12 +34,14 @@ namespace ErsatzTV.Application.Television episode.EpisodeMetadata.HeadOrNone().Map(m => m.Plot ?? string.Empty).IfNone(string.Empty), episode.EpisodeMetadata.HeadOrNone().Map(GetThumbnail).IfNone(string.Empty)); - private static string GetPoster(Metadata metadata) => - Optional(metadata.Artwork.FirstOrDefault(a => a.ArtworkKind == ArtworkKind.Poster)) - .Match(a => a.Path, string.Empty); + private static string GetPoster(Metadata metadata) => GetArtwork(metadata, ArtworkKind.Poster); + + private static string GetFanArt(Metadata metadata) => GetArtwork(metadata, ArtworkKind.FanArt); + + private static string GetThumbnail(Metadata metadata) => GetArtwork(metadata, ArtworkKind.Thumbnail); - private static string GetThumbnail(Metadata metadata) => - Optional(metadata.Artwork.FirstOrDefault(a => a.ArtworkKind == ArtworkKind.Thumbnail)) + private static string GetArtwork(Metadata metadata, ArtworkKind artworkKind) => + Optional(metadata.Artwork.FirstOrDefault(a => a.ArtworkKind == artworkKind)) .Match(a => a.Path, string.Empty); } } diff --git a/ErsatzTV.Application/Television/TelevisionSeasonViewModel.cs b/ErsatzTV.Application/Television/TelevisionSeasonViewModel.cs index d5781734c..3bfd651b0 100644 --- a/ErsatzTV.Application/Television/TelevisionSeasonViewModel.cs +++ b/ErsatzTV.Application/Television/TelevisionSeasonViewModel.cs @@ -1,4 +1,11 @@ namespace ErsatzTV.Application.Television { - public record TelevisionSeasonViewModel(int Id, int ShowId, string Title, string Year, string Plot, string Poster); + public record TelevisionSeasonViewModel( + int Id, + int ShowId, + string Title, + string Year, + string Name, + string Poster, + string FanArt); } diff --git a/ErsatzTV.Application/Television/TelevisionShowViewModel.cs b/ErsatzTV.Application/Television/TelevisionShowViewModel.cs index 885187f6e..c29d54957 100644 --- a/ErsatzTV.Application/Television/TelevisionShowViewModel.cs +++ b/ErsatzTV.Application/Television/TelevisionShowViewModel.cs @@ -1,4 +1,4 @@ namespace ErsatzTV.Application.Television { - public record TelevisionShowViewModel(int Id, string Title, string Year, string Plot, string Poster); + public record TelevisionShowViewModel(int Id, string Title, string Year, string Plot, string Poster, string FanArt); } diff --git a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs index 4540e63f7..020249629 100644 --- a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs @@ -80,8 +80,8 @@ namespace ErsatzTV.Core.Metadata .GetOrAdd(libraryPath, file) .BindT(movie => UpdateStatistics(movie, ffprobePath).MapT(_ => movie)) .BindT(UpdateMetadata) - .BindT(UpdatePoster) - .BindT(UpdateFanArt); + .BindT(movie => UpdateArtwork(movie, ArtworkKind.Poster)) + .BindT(movie => UpdateArtwork(movie, ArtworkKind.FanArt)); maybeMovie.IfLeft( error => _logger.LogWarning("Error processing movie at {Path}: {Error}", file, error.Value)); @@ -136,37 +136,15 @@ namespace ErsatzTV.Core.Metadata } } - private async Task> UpdatePoster(Movie movie) + private async Task> UpdateArtwork(Movie movie, ArtworkKind artworkKind) { try { - await LocateArtwork(movie, ArtworkKind.Poster).IfSomeAsync( + await LocateArtwork(movie, artworkKind).IfSomeAsync( async posterFile => { MovieMetadata metadata = movie.MovieMetadata.Head(); - if (RefreshArtwork(posterFile, metadata, ArtworkKind.Poster)) - { - await _movieRepository.Update(movie); - } - }); - - return movie; - } - catch (Exception ex) - { - return BaseError.New(ex.Message); - } - } - - private async Task> UpdateFanArt(Movie movie) - { - try - { - await LocateArtwork(movie, ArtworkKind.FanArt).IfSomeAsync( - async posterFile => - { - MovieMetadata metadata = movie.MovieMetadata.Head(); - if (RefreshArtwork(posterFile, metadata, ArtworkKind.FanArt)) + if (RefreshArtwork(posterFile, metadata, artworkKind)) { await _movieRepository.Update(movie); } diff --git a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs index 050589ca6..bd8c75782 100644 --- a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs @@ -56,7 +56,8 @@ namespace ErsatzTV.Core.Metadata Either maybeShow = await FindOrCreateShow(libraryPath.Id, showFolder) .BindT(show => UpdateMetadataForShow(show, showFolder)) - .BindT(show => UpdatePosterForShow(show, showFolder)); + .BindT(show => UpdateArtworkForShow(show, showFolder, ArtworkKind.Poster)) + .BindT(show => UpdateArtworkForShow(show, showFolder, ArtworkKind.FanArt)); await maybeShow.Match( show => ScanSeasons(libraryPath, ffprobePath, show, showFolder), @@ -212,17 +213,18 @@ namespace ErsatzTV.Core.Metadata } } - private async Task> UpdatePosterForShow( + private async Task> UpdateArtworkForShow( Show show, - string showFolder) + string showFolder, + ArtworkKind artworkKind) { try { - await LocatePosterForShow(showFolder).IfSomeAsync( + await LocateArtworkForShow(showFolder, artworkKind).IfSomeAsync( async posterFile => { ShowMetadata metadata = show.ShowMetadata.Head(); - if (RefreshArtwork(posterFile, metadata, ArtworkKind.Poster)) + if (RefreshArtwork(posterFile, metadata, artworkKind)) { await _televisionRepository.Update(show); } @@ -298,12 +300,21 @@ namespace ErsatzTV.Core.Metadata .Filter(s => _localFileSystem.FileExists(s)); } - private Option LocatePosterForShow(string showFolder) => - ImageFileExtensions - .Map(ext => $"poster.{ext}") + private Option LocateArtworkForShow(string showFolder, ArtworkKind artworkKind) + { + string segment = artworkKind switch + { + ArtworkKind.Poster => "poster", + ArtworkKind.FanArt => "fanart", + _ => throw new ArgumentOutOfRangeException(nameof(artworkKind)) + }; + + return ImageFileExtensions + .Map(ext => $"{segment}.{ext}") .Map(f => Path.Combine(showFolder, f)) .Filter(s => _localFileSystem.FileExists(s)) .HeadOrNone(); + } private Option LocatePoster(Season season, string seasonFolder) { diff --git a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs index c46781116..d2648e89b 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs @@ -94,6 +94,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .ThenInclude(sm => sm.Artwork) .Include(s => s.Show) .ThenInclude(s => s.ShowMetadata) + .ThenInclude(sm => sm.Artwork) .OrderBy(s => s.Id) .SingleOrDefaultAsync(s => s.Id == seasonId) .Map(Optional); diff --git a/ErsatzTV/Extensions/NavigationManagerExtensions.cs b/ErsatzTV/Extensions/NavigationManagerExtensions.cs new file mode 100644 index 000000000..1597b2254 --- /dev/null +++ b/ErsatzTV/Extensions/NavigationManagerExtensions.cs @@ -0,0 +1,22 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Components; +using Microsoft.JSInterop; + +namespace ErsatzTV.Extensions +{ + public static class NavigationManagerExtensions + { + public static ValueTask NavigateToFragmentAsync(this NavigationManager navigationManager, IJSRuntime jSRuntime) + { + Uri uri = navigationManager.ToAbsoluteUri(navigationManager.Uri); + + if (uri.Fragment.Length == 0) + { + return default; + } + + return jSRuntime.InvokeVoidAsync("blazorHelpers.scrollToFragment", uri.Fragment.Substring(1)); + } + } +} diff --git a/ErsatzTV/Pages/CollectionItems.razor b/ErsatzTV/Pages/CollectionItems.razor index e5927e4f0..314809fdc 100644 --- a/ErsatzTV/Pages/CollectionItems.razor +++ b/ErsatzTV/Pages/CollectionItems.razor @@ -69,12 +69,12 @@ @foreach (TelevisionEpisodeCardViewModel card in _data.EpisodeCards.OrderBy(e => e.Aired)) { } @@ -139,17 +139,14 @@ } } - private async Task RemoveEpisodeFromCollection(MediaCardViewModel vm) + private async Task RemoveEpisodeFromCollection(TelevisionEpisodeCardViewModel episode) { - if (vm is TelevisionEpisodeCardViewModel episode) + var request = new RemoveItemsFromCollection(Id) { - var request = new RemoveItemsFromCollection(Id) - { - MediaItemIds = new List { episode.EpisodeId } - }; + MediaItemIds = new List { episode.EpisodeId } + }; - await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); - } + await RemoveItemsWithConfirmation("episode", $"{episode.ShowTitle} - {episode.Title}", request); } private async Task RemoveItemsWithConfirmation( diff --git a/ErsatzTV/Pages/Movie.razor b/ErsatzTV/Pages/Movie.razor index 299af2e61..e5d2d0f71 100644 --- a/ErsatzTV/Pages/Movie.razor +++ b/ErsatzTV/Pages/Movie.razor @@ -52,21 +52,10 @@ private MovieViewModel _movie; - private List _breadcrumbs; - protected override Task OnParametersSetAsync() => RefreshData(); - private async Task RefreshData() - { - await Mediator.Send(new GetMovieById(MovieId)) - .IfSomeAsync(vm => _movie = vm); - - _breadcrumbs = new List - { - new("Movies", "/media/movies"), - new($"{_movie.Title} ({_movie.Year})", null, true) - }; - } + private Task RefreshData() => + Mediator.Send(new GetMovieById(MovieId)).IfSomeAsync(vm => _movie = vm); private async Task AddToCollection() { diff --git a/ErsatzTV/Pages/TelevisionEpisode.razor b/ErsatzTV/Pages/TelevisionEpisode.razor deleted file mode 100644 index cd26b7a33..000000000 --- a/ErsatzTV/Pages/TelevisionEpisode.razor +++ /dev/null @@ -1,84 +0,0 @@ -@page "/media/tv/episodes/{EpisodeId:int}" -@using ErsatzTV.Application.Television -@using ErsatzTV.Application.Television.Queries -@using ErsatzTV.Application.MediaCollections -@using ErsatzTV.Application.MediaCollections.Commands -@inject IMediator Mediator -@inject IDialogService Dialog -@inject NavigationManager NavigationManager - - - - - -
- @if (!string.IsNullOrWhiteSpace(_episode.Poster)) - { - - - - } - -
- @_episode.Title - @_season.Plot - @_episode.Plot -
- - Add To Collection - -
-
-
-
-
-
-
- -@code { - - [Parameter] - public int EpisodeId { get; set; } - - private TelevisionEpisodeViewModel _episode; - private TelevisionSeasonViewModel _season; - - private List _breadcrumbs; - - protected override Task OnParametersSetAsync() => RefreshData(); - - private async Task RefreshData() - { - await Mediator.Send(new GetTelevisionEpisodeById(EpisodeId)) - .IfSomeAsync(vm => _episode = vm); - - await Mediator.Send(new GetTelevisionSeasonById(_episode.SeasonId)) - .IfSomeAsync(vm => _season = vm); - - _breadcrumbs = new List - { - new("TV Shows", "/media/tv/shows"), - new($"{_season.Title} ({_season.Year})", $"/media/tv/shows/{_season.ShowId}"), - new(_season.Plot, $"/media/tv/seasons/{_episode.SeasonId}"), - new($"Episode {_episode.Episode}", null, true) - }; - } - - private async Task AddToCollection() - { - var parameters = new DialogParameters { { "EntityType", "episode" }, { "EntityName", _episode.Title } }; - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - - IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); - DialogResult result = await dialog.Result; - if (!result.Cancelled && result.Data is MediaCollectionViewModel collection) - { - await Mediator.Send(new AddEpisodeToCollection(collection.Id, EpisodeId)); - NavigationManager.NavigateTo($"/media/collections/{collection.Id}"); - } - } - -} \ No newline at end of file diff --git a/ErsatzTV/Pages/TelevisionEpisodeList.razor b/ErsatzTV/Pages/TelevisionEpisodeList.razor index 00eec9f02..8e4be21fd 100644 --- a/ErsatzTV/Pages/TelevisionEpisodeList.razor +++ b/ErsatzTV/Pages/TelevisionEpisodeList.razor @@ -1,4 +1,5 @@ @page "/media/tv/seasons/{SeasonId:int}" +@using ErsatzTV.Extensions @using ErsatzTV.Application.Television @using ErsatzTV.Application.Television.Queries @using ErsatzTV.Application.MediaCards @@ -14,56 +15,74 @@ @inject IDialogService Dialog @inject NavigationManager NavigationManager @inject ChannelWriter Channel +@inject IJSRuntime JsRuntime - - - + +
+ @if (!string.IsNullOrWhiteSpace(_season.FanArt)) + { + fan art + } +
+ +
+ @if (!string.IsNullOrWhiteSpace(_season.Poster)) + { + show poster + } +
+ + @_season.Title + + @_season.Name +
+ + Add To Collection + + + Add To Schedule + +
+
+
+
+ + @foreach (TelevisionEpisodeCardViewModel episode in _data.Cards) + { -
- @if (!string.IsNullOrWhiteSpace(_season.Poster)) +
+ @if (!string.IsNullOrWhiteSpace(episode.Poster)) { - - + + } - +
- @_season.Title - @_season.Year - @_season.Plot + @episode.Episode. @episode.Title + @episode.Plot
+ OnClick="@(_ => AddEpisodeToCollection(episode))"> Add To Collection - - Add To Schedule -
- - - - @foreach (TelevisionEpisodeCardViewModel card in _data.Cards) - { - - } - + } @code { @@ -78,7 +97,13 @@ private TelevisionEpisodeCardResultsViewModel _data; - private List _breadcrumbs; + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + await NavigationManager.NavigateToFragmentAsync(JsRuntime); + } + } protected override Task OnParametersSetAsync() => RefreshData(); @@ -88,18 +113,11 @@ .IfSomeAsync(vm => _season = vm); _data = await Mediator.Send(new GetTelevisionEpisodeCards(SeasonId, _pageNumber, _pageSize)); - - _breadcrumbs = new List - { - new("TV Shows", "/media/tv/shows"), - new($"{_season.Title} ({_season.Year})", $"/media/tv/shows/{_season.ShowId}"), - new(_season.Plot, null, true) - }; } private async Task AddToCollection() { - var parameters = new DialogParameters { { "EntityType", "season" }, { "EntityName", $"{_season.Title} - {_season.Plot}" } }; + var parameters = new DialogParameters { { "EntityType", "season" }, { "EntityName", $"{_season.Title} - {_season.Name}" } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); @@ -114,7 +132,7 @@ private async Task AddToSchedule() { - var parameters = new DialogParameters { { "EntityType", "season" }, { "EntityName", $"{_season.Title} - {_season.Plot}" } }; + var parameters = new DialogParameters { { "EntityType", "season" }, { "EntityName", $"{_season.Title} - {_season.Name}" } }; var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; IDialogReference dialog = Dialog.Show("Add To Schedule", parameters, options); @@ -126,27 +144,24 @@ } } - private async Task AddEpisodeToCollection(MediaCardViewModel card) + private async Task AddEpisodeToCollection(TelevisionEpisodeCardViewModel episode) { - if (card is TelevisionEpisodeCardViewModel episode) + var parameters = new DialogParameters { { "EntityType", "episode" }, { "EntityName", episode.Title } }; + var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; + + IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); + DialogResult result = await dialog.Result; + if (!result.Cancelled && result.Data is MediaCollectionViewModel collection) { - var parameters = new DialogParameters { { "EntityType", "episode" }, { "EntityName", episode.Title } }; - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.ExtraSmall }; - - IDialogReference dialog = Dialog.Show("Add To Collection", parameters, options); - DialogResult result = await dialog.Result; - if (!result.Cancelled && result.Data is MediaCollectionViewModel collection) - { - var request = new AddEpisodeToCollection(collection.Id, episode.EpisodeId); - Either addResult = await Mediator.Send(request); - addResult.Match( - Left: error => - { - Snackbar.Add($"Unexpected error adding episode to collection: {error.Value}"); - Logger.LogError("Unexpected error adding episode to collection: {Error}", error.Value); - }, - Right: _ => Snackbar.Add($"Added {episode.Title} to collection {collection.Name}", Severity.Success)); - } + var request = new AddEpisodeToCollection(collection.Id, episode.EpisodeId); + Either addResult = await Mediator.Send(request); + addResult.Match( + Left: error => + { + Snackbar.Add($"Unexpected error adding episode to collection: {error.Value}"); + Logger.LogError("Unexpected error adding episode to collection: {Error}", error.Value); + }, + Right: _ => Snackbar.Add($"Added {episode.Title} to collection {collection.Name}", Severity.Success)); } } diff --git a/ErsatzTV/Pages/TelevisionSeasonList.razor b/ErsatzTV/Pages/TelevisionSeasonList.razor index 21440fcbb..ef11fa25b 100644 --- a/ErsatzTV/Pages/TelevisionSeasonList.razor +++ b/ErsatzTV/Pages/TelevisionSeasonList.razor @@ -15,51 +15,57 @@ @inject NavigationManager NavigationManager @inject ChannelWriter Channel - - - - -
- @if (!string.IsNullOrWhiteSpace(_show.Poster)) - { - - - - } - -
- @_show.Title - @_show.Year - @_show.Plot -
- - Add To Collection - - - Add To Schedule - -
-
-
-
-
-
- - - @foreach (TelevisionSeasonCardViewModel card in _data.Cards) + +
+ @if (!string.IsNullOrWhiteSpace(_show.FanArt)) + { + fan art + } +
+ +
+ @if (!string.IsNullOrWhiteSpace(_show.Poster)) { - + show poster } - +
+ @_show.Title + @_show.Year + @if (!string.IsNullOrWhiteSpace(_show.Plot)) + { + + + @_show.Plot + + + } +
+ + Add To Collection + + + Add To Schedule + +
+
+
+
+ + @foreach (TelevisionSeasonCardViewModel card in _data.Cards) + { + + } @code { @@ -74,8 +80,6 @@ private TelevisionSeasonCardResultsViewModel _data; - private List _breadcrumbs; - protected override Task OnParametersSetAsync() => RefreshData(); private async Task RefreshData() @@ -84,12 +88,6 @@ .IfSomeAsync(vm => _show = vm); _data = await Mediator.Send(new GetTelevisionSeasonCards(ShowId, _pageNumber, _pageSize)); - - _breadcrumbs = new List - { - new("TV Shows", "/media/tv/shows"), - new($"{_show.Title} ({_show.Year})", null, true) - }; } private async Task AddToCollection() diff --git a/ErsatzTV/Pages/_Host.cshtml b/ErsatzTV/Pages/_Host.cshtml index 36635de67..5e8133f62 100644 --- a/ErsatzTV/Pages/_Host.cshtml +++ b/ErsatzTV/Pages/_Host.cshtml @@ -35,5 +35,17 @@ + \ No newline at end of file diff --git a/ErsatzTV/Shared/MainLayout.razor b/ErsatzTV/Shared/MainLayout.razor index 1071b8c41..df9d734ed 100644 --- a/ErsatzTV/Shared/MainLayout.razor +++ b/ErsatzTV/Shared/MainLayout.razor @@ -10,7 +10,9 @@
- ErsatzTV + + ErsatzTV +
- Home Channels FFmpeg @* *@ @@ -66,32 +67,24 @@ private MudTextField _textField; - private MudTheme _ersatzTvTheme + private MudTheme _ersatzTvTheme => new() { - get + Palette = new Palette { - var current = new MudTheme(); - - return new MudTheme - { - Palette = new Palette - { - ActionDefault = "rgba(255,255,255, 0.80)", - Primary = "#009000", - AppbarBackground = "#121212", - Background = "#272727", - DrawerBackground = "#1f1f1f", - Surface = "#1f1f1f", - DrawerText = "rgba(255,255,255, 0.80)", - TextPrimary = "rgba(255,255,255, 0.80)", - TextSecondary = "rgba(255,255,255, 0.80)", - Info = "#00c0c0", - Tertiary = "#00c000", - White = Colors.Shades.White - } - }; + ActionDefault = "rgba(255,255,255, 0.80)", + Primary = "#009000", + AppbarBackground = "#121212", + Background = "#272727", + DrawerBackground = "#1f1f1f", + Surface = "#1f1f1f", + DrawerText = "rgba(255,255,255, 0.80)", + TextPrimary = "rgba(255,255,255, 0.80)", + TextSecondary = "rgba(255,255,255, 0.80)", + Info = "#00c0c0", + Tertiary = "#00c000", + White = Colors.Shades.White } - } + }; private void OnSearchKeyDown(KeyboardEventArgs args) { diff --git a/ErsatzTV/wwwroot/css/site.css b/ErsatzTV/wwwroot/css/site.css index 358a52d79..8a0726b75 100644 --- a/ErsatzTV/wwwroot/css/site.css +++ b/ErsatzTV/wwwroot/css/site.css @@ -1,6 +1,4 @@ -.mud-breadcrumb-separator > span { color: inherit !important; } - -.media-card-grid { +.media-card-grid { display: flex; flex-direction: row; flex-wrap: wrap; diff --git a/docs/media-collection.png b/docs/media-collection.png index a05877b83..03cf71db7 100644 Binary files a/docs/media-collection.png and b/docs/media-collection.png differ diff --git a/docs/television-show.png b/docs/television-show.png index 4f3ec119b..419785c2f 100644 Binary files a/docs/television-show.png and b/docs/television-show.png differ