Browse Source

support tv posters

pull/22/head
Jason Dove 6 years ago
parent
commit
70cbc167d2
  1. 9
      ErsatzTV.Application/MediaItems/Queries/GetPosterContents.cs
  2. 71
      ErsatzTV.Application/MediaItems/Queries/GetPosterContentsHandler.cs
  3. 14
      ErsatzTV.Core/Metadata/LocalPosterProvider.cs
  4. 2
      ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs

9
ErsatzTV.Application/MediaItems/Queries/GetPosterContents.cs

@ -1,9 +0,0 @@ @@ -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<Either<BaseError, ImageViewModel>>;
}

71
ErsatzTV.Application/MediaItems/Queries/GetPosterContentsHandler.cs

@ -1,71 +0,0 @@ @@ -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<GetPosterContents, Either<BaseError, ImageViewModel>>
{
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<Either<BaseError, ImageViewModel>> Handle(
GetPosterContents request,
CancellationToken cancellationToken) =>
Validate(request)
.Map(v => v.ToEither<MediaItem>())
.BindT(GetPoster);
private async Task<Either<BaseError, ImageViewModel>> 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<Validation<BaseError, MediaItem>> Validate(GetPosterContents request) =>
MediaItemMustExist(request).BindT(PosterPathMustExist);
private async Task<Validation<BaseError, MediaItem>> MediaItemMustExist(GetPosterContents request) =>
(await _mediaItemRepository.Get(request.MediaItemId))
.ToValidation<BaseError>($"MediaItem {request.MediaItemId} does not exist.");
private static Validation<BaseError, MediaItem> PosterPathMustExist(MediaItem mediaItem) =>
Optional(mediaItem.Poster)
.Filter(p => !string.IsNullOrWhiteSpace(p) && File.Exists(p))
.Map(_ => mediaItem)
.ToValidation<BaseError>($"MediaItem {mediaItem.Id} does not have a poster");
}
}

14
ErsatzTV.Core/Metadata/LocalPosterProvider.cs

@ -56,7 +56,19 @@ namespace ErsatzTV.Core.Metadata @@ -56,7 +56,19 @@ namespace ErsatzTV.Core.Metadata
return None;
}
private Option<string> RefreshTelevisionPoster(MediaItem mediaItem) => None;
private Option<string> RefreshTelevisionPoster(MediaItem mediaItem)
{
string folder = Directory.GetParent(Path.GetDirectoryName(mediaItem.Path) ?? string.Empty)?.FullName;
if (folder != null)
{
string[] possiblePaths = { "poster.jpg" };
Option<string> maybePoster =
possiblePaths.Map(p => Path.Combine(folder, p)).FirstOrDefault(File.Exists);
return maybePoster;
}
return None;
}
private async Task SavePosterToDisk(MediaItem mediaItem, string posterPath)
{

2
ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs

@ -62,7 +62,7 @@ LIMIT {0} OFFSET {1}", @@ -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

Loading…
Cancel
Save