Browse Source

Added API Artwork Router (#1776)

* Added API Artwork Router

* Simplifying code
pull/1780/head
Sylvain 1 year ago committed by GitHub
parent
commit
a0a047ba18
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 6
      ErsatzTV.Application/Artworks/Queries/GetArtwork.cs
  2. 42
      ErsatzTV.Application/Artworks/Queries/GetArtworkHandler.cs
  3. 24
      ErsatzTV/Controllers/ArtworkController.cs

6
ErsatzTV.Application/Artworks/Queries/GetArtwork.cs

@ -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

@ -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
};
}
}

24
ErsatzTV/Controllers/ArtworkController.cs

@ -1,4 +1,5 @@
using ErsatzTV.Application.Emby; using ErsatzTV.Application.Artworks;
using ErsatzTV.Application.Emby;
using ErsatzTV.Application.Images; using ErsatzTV.Application.Images;
using ErsatzTV.Application.Jellyfin; using ErsatzTV.Application.Jellyfin;
using ErsatzTV.Application.Plex; using ErsatzTV.Application.Plex;
@ -26,6 +27,27 @@ public class ArtworkController : ControllerBase
_httpClientFactory = httpClientFactory; _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}")] [HttpHead("/iptv/artwork/posters/{fileName}")]
[HttpGet("/iptv/artwork/posters/{fileName}")] [HttpGet("/iptv/artwork/posters/{fileName}")]
[HttpHead("/iptv/artwork/posters/{fileName}.jpg")] [HttpHead("/iptv/artwork/posters/{fileName}.jpg")]

Loading…
Cancel
Save