diff --git a/ErsatzTV.Application/MediaItems/Queries/GetPosterContents.cs b/ErsatzTV.Application/MediaItems/Queries/GetPosterContents.cs deleted file mode 100644 index 08071df5e..000000000 --- a/ErsatzTV.Application/MediaItems/Queries/GetPosterContents.cs +++ /dev/null @@ -1,9 +0,0 @@ -using ErsatzTV.Application.Images; -using ErsatzTV.Core; -using LanguageExt; -using MediatR; - -namespace ErsatzTV.Application.MediaItems.Queries -{ - public record GetPosterContents(int MediaItemId) : IRequest>; -} diff --git a/ErsatzTV.Application/MediaItems/Queries/GetPosterContentsHandler.cs b/ErsatzTV.Application/MediaItems/Queries/GetPosterContentsHandler.cs deleted file mode 100644 index 735f00a26..000000000 --- a/ErsatzTV.Application/MediaItems/Queries/GetPosterContentsHandler.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using ErsatzTV.Application.Images; -using ErsatzTV.Core; -using ErsatzTV.Core.Domain; -using ErsatzTV.Core.Interfaces.Repositories; -using LanguageExt; -using MediatR; -using Microsoft.Extensions.Caching.Memory; -using Winista.Mime; -using static LanguageExt.Prelude; - -namespace ErsatzTV.Application.MediaItems.Queries -{ - public class GetPosterContentsHandler : IRequestHandler> - { - private static readonly MimeTypes MimeTypes = new(); - - private readonly IMediaItemRepository _mediaItemRepository; - private readonly IMemoryCache _memoryCache; - - public GetPosterContentsHandler(IMediaItemRepository mediaItemRepository, IMemoryCache memoryCache) - { - _mediaItemRepository = mediaItemRepository; - _memoryCache = memoryCache; - } - - public Task> Handle( - GetPosterContents request, - CancellationToken cancellationToken) => - Validate(request) - .Map(v => v.ToEither()) - .BindT(GetPoster); - - private async Task> GetPoster(MediaItem mediaItem) - { - try - { - return await _memoryCache.GetOrCreateAsync( - mediaItem.Poster, - async entry => - { - entry.SlidingExpiration = TimeSpan.FromHours(1); - - byte[] contents = await File.ReadAllBytesAsync(mediaItem.Poster); - MimeType mimeType = MimeTypes.GetMimeType(contents); - return new ImageViewModel(contents, mimeType.Name); - }); - } - catch (Exception ex) - { - return BaseError.New(ex.Message); - } - } - - private Task> Validate(GetPosterContents request) => - MediaItemMustExist(request).BindT(PosterPathMustExist); - - private async Task> MediaItemMustExist(GetPosterContents request) => - (await _mediaItemRepository.Get(request.MediaItemId)) - .ToValidation($"MediaItem {request.MediaItemId} does not exist."); - - private static Validation PosterPathMustExist(MediaItem mediaItem) => - Optional(mediaItem.Poster) - .Filter(p => !string.IsNullOrWhiteSpace(p) && File.Exists(p)) - .Map(_ => mediaItem) - .ToValidation($"MediaItem {mediaItem.Id} does not have a poster"); - } -} diff --git a/ErsatzTV.Core/Metadata/LocalPosterProvider.cs b/ErsatzTV.Core/Metadata/LocalPosterProvider.cs index eb352942b..800fd94b4 100644 --- a/ErsatzTV.Core/Metadata/LocalPosterProvider.cs +++ b/ErsatzTV.Core/Metadata/LocalPosterProvider.cs @@ -56,7 +56,19 @@ namespace ErsatzTV.Core.Metadata return None; } - private Option RefreshTelevisionPoster(MediaItem mediaItem) => None; + private Option RefreshTelevisionPoster(MediaItem mediaItem) + { + string folder = Directory.GetParent(Path.GetDirectoryName(mediaItem.Path) ?? string.Empty)?.FullName; + if (folder != null) + { + string[] possiblePaths = { "poster.jpg" }; + Option maybePoster = + possiblePaths.Map(p => Path.Combine(folder, p)).FirstOrDefault(File.Exists); + return maybePoster; + } + + return None; + } private async Task SavePosterToDisk(MediaItem mediaItem, string posterPath) { diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs index 004d9cc10..089659449 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs @@ -62,7 +62,7 @@ LIMIT {0} OFFSET {1}", Metadata_Title AS Title, Metadata_SortTitle AS SortTitle, count(*) || ' Episodes' AS Subtitle, - Poster + min(Poster) AS Poster FROM MediaItems WHERE Metadata_MediaType=1 GROUP BY Metadata_Title, Metadata_SortTitle ORDER BY Metadata_SortTitle