Added API Artwork Router (#1776)
* Added API Artwork Router * Simplifying code
This commit is contained in:
6
ErsatzTV.Application/Artworks/Queries/GetArtwork.cs
Normal file
6
ErsatzTV.Application/Artworks/Queries/GetArtwork.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
using ErsatzTV.Core;
|
||||
using ErsatzTV.Core.Domain;
|
||||
|
||||
namespace ErsatzTV.Application.Artworks;
|
||||
|
||||
public record GetArtwork(int Id) : IRequest<Either<BaseError, Artwork>>;
|
||||
42
ErsatzTV.Application/Artworks/Queries/GetArtworkHandler.cs
Normal file
42
ErsatzTV.Application/Artworks/Queries/GetArtworkHandler.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using ErsatzTV.Core;
|
||||
using ErsatzTV.Core.Domain;
|
||||
using ErsatzTV.Infrastructure.Data;
|
||||
using ErsatzTV.Infrastructure.Extensions;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace ErsatzTV.Application.Artworks;
|
||||
|
||||
public class GetArtworkHandler(IDbContextFactory<TvContext> dbContextFactory) : IRequestHandler<GetArtwork, Either<BaseError, Artwork>>
|
||||
{
|
||||
private readonly IDbContextFactory<TvContext> _dbContextFactory = dbContextFactory;
|
||||
|
||||
public async Task<Either<BaseError, Artwork>> Handle(
|
||||
GetArtwork request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
try {
|
||||
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);
|
||||
|
||||
Option<Artwork> artwork = await dbContext.Artwork
|
||||
.AsNoTracking()
|
||||
.SelectOneAsync(a => a.Id, a => a.Id == request.Id)
|
||||
.MapT(Project);
|
||||
|
||||
return artwork.ToEither(BaseError.New("Artwork not found"));
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return BaseError.New(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private static Artwork Project(Artwork artwork)
|
||||
{
|
||||
return new Artwork {
|
||||
Id = artwork.Id,
|
||||
Path = artwork.Path,
|
||||
ArtworkKind = artwork.ArtworkKind
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using ErsatzTV.Application.Emby;
|
||||
using ErsatzTV.Application.Artworks;
|
||||
using ErsatzTV.Application.Emby;
|
||||
using ErsatzTV.Application.Images;
|
||||
using ErsatzTV.Application.Jellyfin;
|
||||
using ErsatzTV.Application.Plex;
|
||||
@@ -26,6 +27,27 @@ public class ArtworkController : ControllerBase
|
||||
_httpClientFactory = httpClientFactory;
|
||||
}
|
||||
|
||||
[HttpHead("/artwork/{id}")]
|
||||
[HttpGet("/artwork/{id}")]
|
||||
// This route redirect to the proper artwork from its Id
|
||||
public async Task<IActionResult> RedirectArtwork(int id, CancellationToken cancellationToken) {
|
||||
Either<BaseError, Artwork> artwork =
|
||||
await _mediator.Send(new GetArtwork(id), cancellationToken);
|
||||
|
||||
return artwork.Match<IActionResult>(
|
||||
Left: _ => new NotFoundResult(),
|
||||
Right: r => r.ArtworkKind switch
|
||||
{
|
||||
ArtworkKind.Poster => new RedirectResult("/artwork/posters/" + r.Path),
|
||||
ArtworkKind.Thumbnail => new RedirectResult("/artwork/thumbnails/" + r.Path),
|
||||
ArtworkKind.Logo => new RedirectResult("/iptv/logos/" + r.Path),
|
||||
ArtworkKind.FanArt => new RedirectResult("/artwork/fanart/" + r.Path),
|
||||
ArtworkKind.Watermark => new RedirectResult("/artwork/watermarks/" + r.Path),
|
||||
_ => new NotFoundResult()
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
[HttpHead("/iptv/artwork/posters/{fileName}")]
|
||||
[HttpGet("/iptv/artwork/posters/{fileName}")]
|
||||
[HttpHead("/iptv/artwork/posters/{fileName}.jpg")]
|
||||
|
||||
Reference in New Issue
Block a user