From a3f46b2a8d6c7d94dd31f941e8cf797134598117 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Wed, 10 Mar 2021 05:28:42 -0600 Subject: [PATCH] update tv show ui --- ErsatzTV.Application/Television/Mapper.cs | 15 +-- .../Television/TelevisionShowViewModel.cs | 2 +- ErsatzTV.Core/Metadata/MovieFolderScanner.cs | 32 +------ .../Metadata/TelevisionFolderScanner.cs | 27 ++++-- ErsatzTV/Pages/TelevisionSeasonList.razor | 92 ++++++++++--------- 5 files changed, 83 insertions(+), 85 deletions(-) diff --git a/ErsatzTV.Application/Television/Mapper.cs b/ErsatzTV.Application/Television/Mapper.cs index fccf6a521..9112355c4 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( @@ -32,12 +33,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/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/Pages/TelevisionSeasonList.razor b/ErsatzTV/Pages/TelevisionSeasonList.razor index 21440fcbb..81c6a0e27 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 {