mirror of
https://github.com/C9Glax/tranga.git
synced 2025-04-15 12:53:17 +02:00
#229 Resize cover-images on request before transfer
This commit is contained in:
parent
c679d7c677
commit
6c5bc3685e
@ -1,8 +1,11 @@
|
|||||||
using API.Schema;
|
using API.Schema;
|
||||||
using Asp.Versioning;
|
using Asp.Versioning;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||||
using SixLabors.ImageSharp;
|
using SixLabors.ImageSharp;
|
||||||
using SixLabors.ImageSharp.Formats.Jpeg;
|
using SixLabors.ImageSharp.Formats.Jpeg;
|
||||||
|
using SixLabors.ImageSharp.Processing;
|
||||||
|
using SixLabors.ImageSharp.Processing.Processors.Transforms;
|
||||||
using static Microsoft.AspNetCore.Http.StatusCodes;
|
using static Microsoft.AspNetCore.Http.StatusCodes;
|
||||||
|
|
||||||
namespace API.Controllers;
|
namespace API.Controllers;
|
||||||
@ -88,14 +91,18 @@ public class MangaController(PgsqlContext context) : Controller
|
|||||||
/// Returns Cover of Manga
|
/// Returns Cover of Manga
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id">Manga-ID</param>
|
/// <param name="id">Manga-ID</param>
|
||||||
|
/// <param name="formatRequest">Formatting/Resizing Request</param>
|
||||||
/// <response code="200">JPEG Image</response>
|
/// <response code="200">JPEG Image</response>
|
||||||
/// <response code="204">Cover not loaded</response>
|
/// <response code="204">Cover not loaded</response>
|
||||||
|
/// <response code="400">The formatting-request was invalid</response>
|
||||||
/// <response code="404">Manga with ID not found</response>
|
/// <response code="404">Manga with ID not found</response>
|
||||||
[HttpGet("{id}/Cover")]
|
[HttpPost("{id}/Cover")]
|
||||||
|
[Produces("image/jpeg")]
|
||||||
[ProducesResponseType(Status200OK)]
|
[ProducesResponseType(Status200OK)]
|
||||||
[ProducesResponseType(Status204NoContent)]
|
[ProducesResponseType(Status204NoContent)]
|
||||||
|
[ProducesResponseType(Status400BadRequest)]
|
||||||
[ProducesResponseType(Status404NotFound)]
|
[ProducesResponseType(Status404NotFound)]
|
||||||
public IActionResult GetCover(string id)
|
public IActionResult GetCover(string id, [FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)]CoverFormatRequestRecord? formatRequest)
|
||||||
{
|
{
|
||||||
Manga? m = context.Manga.Find(id);
|
Manga? m = context.Manga.Find(id);
|
||||||
if (m is null)
|
if (m is null)
|
||||||
@ -104,6 +111,18 @@ public class MangaController(PgsqlContext context) : Controller
|
|||||||
return NoContent();
|
return NoContent();
|
||||||
|
|
||||||
Image image = Image.Load(m.CoverFileNameInCache);
|
Image image = Image.Load(m.CoverFileNameInCache);
|
||||||
|
|
||||||
|
if (formatRequest is not null)
|
||||||
|
{
|
||||||
|
if(!formatRequest.Validate())
|
||||||
|
return BadRequest();
|
||||||
|
image.Mutate(i => i.ApplyProcessor(new ResizeProcessor(new ResizeOptions()
|
||||||
|
{
|
||||||
|
Mode = ResizeMode.Max,
|
||||||
|
Size = formatRequest.size
|
||||||
|
}, image.Size)));
|
||||||
|
}
|
||||||
|
|
||||||
using MemoryStream ms = new();
|
using MemoryStream ms = new();
|
||||||
image.Save(ms, new JpegEncoder(){Quality = 100});
|
image.Save(ms, new JpegEncoder(){Quality = 100});
|
||||||
return File(ms.GetBuffer(), "image/jpeg");
|
return File(ms.GetBuffer(), "image/jpeg");
|
||||||
|
14
API/CoverFormatRequestRecord.cs
Normal file
14
API/CoverFormatRequestRecord.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using SixLabors.ImageSharp;
|
||||||
|
using SixLabors.ImageSharp.Formats;
|
||||||
|
|
||||||
|
namespace API;
|
||||||
|
|
||||||
|
public record CoverFormatRequestRecord(Size size)
|
||||||
|
{
|
||||||
|
public bool Validate()
|
||||||
|
{
|
||||||
|
if (size.Height <= 0 || size.Width <= 0 || size.Height > 65535 || size.Width > 65535) //JPEG max size
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -57,7 +57,11 @@ builder.Services.AddDbContext<PgsqlContext>(options =>
|
|||||||
$"Username={Environment.GetEnvironmentVariable("POSTGRES_USER")??"postgres"}; " +
|
$"Username={Environment.GetEnvironmentVariable("POSTGRES_USER")??"postgres"}; " +
|
||||||
$"Password={Environment.GetEnvironmentVariable("POSTGRES_PASSWORD")??"postgres"}"));
|
$"Password={Environment.GetEnvironmentVariable("POSTGRES_PASSWORD")??"postgres"}"));
|
||||||
|
|
||||||
builder.Services.AddControllers().AddNewtonsoftJson(opts =>
|
builder.Services.AddControllers(options =>
|
||||||
|
{
|
||||||
|
options.AllowEmptyInputInBodyModelBinding = true;
|
||||||
|
})
|
||||||
|
.AddNewtonsoftJson(opts =>
|
||||||
{
|
{
|
||||||
opts.SerializerSettings.Converters.Add(new StringEnumConverter());
|
opts.SerializerSettings.Converters.Add(new StringEnumConverter());
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user