using API.MangaDownloadClients; using Asp.Versioning; using Microsoft.AspNetCore.Mvc; using static Microsoft.AspNetCore.Http.StatusCodes; // ReSharper disable InconsistentNaming namespace API.Controllers; [ApiVersion(2)] [ApiController] [Route("v{v:apiVersion}/[controller]")] public class SettingsController() : Controller { /// /// Get all /// /// [HttpGet] [ProducesResponseType(Status200OK, "application/json")] public IActionResult GetSettings() { return Ok(Tranga.Settings); } /// /// Get the current UserAgent used by Tranga /// /// [HttpGet("UserAgent")] [ProducesResponseType(Status200OK, "text/plain")] public IActionResult GetUserAgent() { return Ok(Tranga.Settings.UserAgent); } /// /// Set a new UserAgent /// /// [HttpPatch("UserAgent")] [ProducesResponseType(Status200OK)] public IActionResult SetUserAgent([FromBody]string userAgent) { //TODO Validate Tranga.Settings.SetUserAgent(userAgent); return Ok(); } /// /// Reset the UserAgent to default /// /// [HttpDelete("UserAgent")] [ProducesResponseType(Status200OK)] public IActionResult ResetUserAgent() { Tranga.Settings.SetUserAgent(TrangaSettings.DefaultUserAgent); return Ok(); } /// /// Get all Request-Limits /// /// [HttpGet("RequestLimits")] [ProducesResponseType>(Status200OK, "application/json")] public IActionResult GetRequestLimits() { return Ok(Tranga.Settings.RequestLimits); } /// /// Update all Request-Limits to new values /// ///

NOT IMPLEMENTED

[HttpPatch("RequestLimits")] [ProducesResponseType(Status501NotImplemented)] public IActionResult SetRequestLimits() { return StatusCode(501); } /// /// Updates a Request-Limit value /// /// Type of Request /// New limit in Requests/Minute /// /// Limit needs to be greater than 0 [HttpPatch("RequestLimits/{RequestType}")] [ProducesResponseType(Status200OK)] [ProducesResponseType(Status400BadRequest)] public IActionResult SetRequestLimit(RequestType RequestType, [FromBody]int requestLimit) { if (requestLimit <= 0) return BadRequest(); Tranga.Settings.SetRequestLimit(RequestType, requestLimit); return Ok(); } /// /// Reset Request-Limit /// /// [HttpDelete("RequestLimits/{RequestType}")] [ProducesResponseType(Status200OK)] public IActionResult ResetRequestLimits(RequestType RequestType) { Tranga.Settings.SetRequestLimit(RequestType, TrangaSettings.DefaultRequestLimits[RequestType]); return Ok(); } /// /// Reset Request-Limit /// /// [HttpDelete("RequestLimits")] [ProducesResponseType(Status200OK)] public IActionResult ResetRequestLimits() { Tranga.Settings.ResetRequestLimits(); return Ok(); } /// /// Returns Level of Image-Compression for Images /// /// JPEG ImageCompression-level as Integer [HttpGet("ImageCompressionLevel")] [ProducesResponseType(Status200OK, "text/plain")] public IActionResult GetImageCompression() { return Ok(Tranga.Settings.ImageCompression); } /// /// Set the Image-Compression-Level for Images /// /// 100 to disable, 0-99 for JPEG ImageCompression-Level /// /// Level outside permitted range [HttpPatch("ImageCompressionLevel/{level}")] [ProducesResponseType(Status200OK)] [ProducesResponseType(Status400BadRequest)] public IActionResult SetImageCompression(int level) { if (level < 1 || level > 100) return BadRequest(); Tranga.Settings.UpdateImageCompression(level); return Ok(); } /// /// Get state of Black/White-Image setting /// /// True if enabled [HttpGet("BWImages")] [ProducesResponseType(Status200OK, "text/plain")] public IActionResult GetBwImagesToggle() { return Ok(Tranga.Settings.BlackWhiteImages); } /// /// Enable/Disable conversion of Images to Black and White /// /// true to enable /// [HttpPatch("BWImages/{enabled}")] [ProducesResponseType(Status200OK)] public IActionResult SetBwImagesToggle(bool enabled) { Tranga.Settings.SetBlackWhiteImageEnabled(enabled); return Ok(); } /// /// Gets the Chapter Naming Scheme /// /// /// Placeholders: /// %M Obj Name /// %V Volume /// %C Chapter /// %T Title /// %A Author (first in list) /// %I Chapter Internal ID /// %i Obj Internal ID /// %Y Year (Obj) /// /// ?_(...) replace _ with a value from above: /// Everything inside the braces will only be added if the value of %_ is not null /// /// [HttpGet("ChapterNamingScheme")] [ProducesResponseType(Status200OK, "text/plain")] public IActionResult GetCustomNamingScheme() { return Ok(Tranga.Settings.ChapterNamingScheme); } /// /// Sets the Chapter Naming Scheme /// /// /// Placeholders: /// %M Obj Name /// %V Volume /// %C Chapter /// %T Title /// %A Author (first in list) /// %Y Year (Obj) /// /// ?_(...) replace _ with a value from above: /// Everything inside the braces will only be added if the value of %_ is not null /// /// [HttpPatch("ChapterNamingScheme")] [ProducesResponseType(Status200OK)] public IActionResult SetCustomNamingScheme([FromBody]string namingScheme) { //TODO Move old Chapters Tranga.Settings.SetChapterNamingScheme(namingScheme); return Ok(); } /// /// Sets the FlareSolverr-URL /// /// URL of FlareSolverr-Instance /// [HttpPost("FlareSolverr/Url")] [ProducesResponseType(Status200OK)] public IActionResult SetFlareSolverrUrl([FromBody]string flareSolverrUrl) { Tranga.Settings.SetFlareSolverrUrl(flareSolverrUrl); return Ok(); } /// /// Resets the FlareSolverr-URL (HttpClient does not use FlareSolverr anymore) /// /// [HttpDelete("FlareSolverr/Url")] [ProducesResponseType(Status200OK)] public IActionResult ClearFlareSolverrUrl() { Tranga.Settings.SetFlareSolverrUrl(string.Empty); return Ok(); } /// /// Test FlareSolverr /// /// FlareSolverr is working! /// FlareSolverr is not working [HttpPost("FlareSolverr/Test")] [ProducesResponseType(Status200OK)] [ProducesResponseType(Status500InternalServerError)] public IActionResult TestFlareSolverrReachable() { const string knownProtectedUrl = "https://prowlarr.servarr.com/v1/ping"; FlareSolverrDownloadClient client = new(); RequestResult result = client.MakeRequestInternal(knownProtectedUrl); return (int)result.statusCode >= 200 && (int)result.statusCode < 300 ? Ok() : StatusCode(500, result.statusCode); } /// /// Returns the language in which Manga are downloaded /// /// [HttpGet("DownloadLanguage")] [ProducesResponseType(Status200OK, "text/plain")] public IActionResult GetDownloadLanguage() { return Ok(Tranga.Settings.DownloadLanguage); } /// /// Sets the language in which Manga are downloaded /// /// [HttpPatch("DownloadLanguage/{Language}")] [ProducesResponseType(Status200OK)] public IActionResult SetDownloadLanguage(string Language) { //TODO Validation Tranga.Settings.SetDownloadLanguage(Language); return Ok(); } }