You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
3.3 KiB
105 lines
3.3 KiB
using Exsersewo.Common.Utilities;
|
|
using Kynareth.Attributes;
|
|
using Kynareth.Helpers;
|
|
using Kynareth.Managers;
|
|
using Kynareth.Models;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Kynareth.Controllers;
|
|
|
|
[Route("image/manipulation")]
|
|
public class ImageManipulationController : BaseController<ImageManipulationController>
|
|
{
|
|
private ImageMagiker _magiker;
|
|
private ImageManipulator _manipulator;
|
|
|
|
public ImageManipulationController(
|
|
ImageMagiker magiker,
|
|
ImageManipulator manipulator,
|
|
IConfiguration configuration,
|
|
ILoggerFactory loggerFactory,
|
|
IWebHostEnvironment appEnvironment
|
|
) : base(configuration, loggerFactory, appEnvironment)
|
|
{
|
|
_magiker = magiker;
|
|
_manipulator = manipulator;
|
|
}
|
|
|
|
/// ---------- ///
|
|
/// MAGIK ///
|
|
/// ---------- ///
|
|
[HttpGet("magik")]
|
|
[EndpointMetrics("image.manipulation.magik")]
|
|
[ProducesResponseType(typeof(Stream), StatusCodes.Status200OK, "image/png")]
|
|
[ProducesResponseType(typeof(Stream), StatusCodes.Status200OK, "image/gif")]
|
|
[ProducesResponseType(typeof(EventResult), StatusCodes.Status400BadRequest)]
|
|
[ProducesResponseType(typeof(EventResult), StatusCodes.Status500InternalServerError)]
|
|
public async Task<object> MagikImage([FromQuery] string image)
|
|
{
|
|
try
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(image))
|
|
{
|
|
var (data, contentType) = await _magiker.GetLiquidRescaledImageAsync(image, HttpContext.RequestAborted);
|
|
|
|
return HttpContext.SendStream(data, contentType);
|
|
}
|
|
|
|
return HttpContext.Send(EventResult.FromFailure("No image has been provided"), System.Net.HttpStatusCode.BadRequest);
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
_logger.LogCritical(ex.Message, ex);
|
|
|
|
return HttpContext.Send(EventResult.FromFailure("Can't parse result"), System.Net.HttpStatusCode.InternalServerError);
|
|
}
|
|
}
|
|
|
|
/// ------------- ///
|
|
/// TOP TEXT ///
|
|
/// ///
|
|
/// BOTTOM TEXT ///
|
|
/// ------------- ///
|
|
[HttpGet]
|
|
[IgnoreToken]
|
|
[EndpointMetrics("image.generate.get.templates")]
|
|
[ProducesResponseType(typeof(IEnumerable<ImageGenerationEndpointRead>), StatusCodes.Status200OK)]
|
|
public Task<object> GetTemplates()
|
|
{
|
|
return Task.FromResult(HttpContext.Send(EventResult.FromSuccess(_manipulator.GetManipulationEndpoints())));
|
|
}
|
|
|
|
[HttpGet("{template}")]
|
|
[EndpointMetrics("image.manipulation.generate")]
|
|
[ProducesResponseType(typeof(Stream), StatusCodes.Status200OK, "image/png")]
|
|
[ProducesResponseType(typeof(EventResult), StatusCodes.Status400BadRequest)]
|
|
[ProducesResponseType(typeof(EventResult), StatusCodes.Status404NotFound)]
|
|
[ProducesResponseType(typeof(EventResult), StatusCodes.Status500InternalServerError)]
|
|
public async Task<object> GenerateMemeAsync(string template, [FromQuery] string[] text)
|
|
{
|
|
try
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(template))
|
|
{
|
|
var result = await _manipulator.GenerateMemeImageAsync(template, text, HttpContext.RequestAborted);
|
|
|
|
if (result is byte[] data)
|
|
{
|
|
var image = new MemoryStream(data);
|
|
|
|
return HttpContext.SendStream(image, "image/png");
|
|
}
|
|
|
|
return result as ObjectResult;
|
|
}
|
|
|
|
return HttpContext.Send(EventResult.FromFailure("No template has been provided"), System.Net.HttpStatusCode.BadRequest);
|
|
}
|
|
catch (ArgumentException ex)
|
|
{
|
|
_logger.LogCritical(ex.Message, ex);
|
|
|
|
return HttpContext.Send(EventResult.FromFailure("Can't parse result"), System.Net.HttpStatusCode.InternalServerError);
|
|
}
|
|
}
|
|
} |