mirror of https://github.com/ErsatzTV/ErsatzTV.git
4 changed files with 14 additions and 82 deletions
@ -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>>; |
|
||||||
} |
|
||||||
@ -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"); |
|
||||||
} |
|
||||||
} |
|
||||||
Loading…
Reference in new issue