rdt-client/server/RdtClient.Web/Controllers/SabnzbdController.cs
2026-02-13 13:15:57 -05:00

151 lines
4.3 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using RdtClient.Data.Models.Sabnzbd;
using RdtClient.Service.Services;
namespace RdtClient.Web.Controllers;
[ApiController]
[Route("api")]
[Route("sabnzbd/api")]
[Authorize(Policy = "Sabnzbd")]
public class SabnzbdController(ILogger<SabnzbdController> logger, Sabnzbd sabnzbd) : Controller
{
[AllowAnonymous]
[HttpGet]
[HttpPost]
public ActionResult Get([FromQuery] String? mode)
{
if (Request.HasFormContentType)
{
mode ??= Request.Form["mode"].ToString();
}
if (String.IsNullOrWhiteSpace(mode))
{
return BadRequest(new SabnzbdResponse { Error = "No mode specified" });
}
logger.LogWarning($"Sabnzbd API called (not implemented) - Method: {Request.Method}, Query: {Request.QueryString}");
return NotFound(new SabnzbdResponse());
}
[AllowAnonymous]
[HttpGet]
[SabnzbdMode("version")]
public ActionResult Version()
{
logger.LogDebug("Sabnzbd mode: version");
return Ok(new SabnzbdResponse { Version = "4.4.0" });
}
[HttpGet]
[SabnzbdMode("queue")]
public async Task<ActionResult> Queue()
{
logger.LogDebug("Sabnzbd mode: queue");
var name = GetParam("name");
if (name == "delete")
{
var value = GetParam("value");
if (String.IsNullOrWhiteSpace(value))
{
return BadRequest(new SabnzbdResponse
{
Error = "No value specified for delete operation"
});
}
await sabnzbd.Delete(value ?? "");
return Ok(new SabnzbdResponse { Status = true });
}
return Ok(new SabnzbdResponse { Queue = await sabnzbd.GetQueue() });
}
[HttpGet]
[SabnzbdMode("history")]
public async Task<ActionResult> History()
{
logger.LogDebug("Sabnzbd mode: history");
return Ok(new SabnzbdResponse { History = await sabnzbd.GetHistory() });
}
[HttpGet]
[SabnzbdMode("get_config")]
public ActionResult GetConfig()
{
logger.LogDebug("Sabnzbd mode: get_config");
return Ok(new SabnzbdResponse { Config = sabnzbd.GetConfig() });
}
[HttpGet]
[SabnzbdMode("get_cats")]
public ActionResult GetCats()
{
logger.LogDebug("Sabnzbd mode: get_cats");
return Ok(new SabnzbdResponse { Categories = sabnzbd.GetCategories() });
}
[HttpGet]
[HttpPost]
[SabnzbdMode("addurl")]
public async Task<ActionResult> AddUrl()
{
logger.LogDebug("Sabnzbd mode: addurl");
var url = GetParam("name");
var category = GetParam("cat");
var priorityStr = GetParam("priority");
Int32? priority = Int32.TryParse(priorityStr, out var p) ? p : null;
var result = await sabnzbd.AddUrl(url ?? "", category, priority);
return Ok(new SabnzbdResponse { Status = true, NzoIds = [result] });
}
[HttpPost]
[SabnzbdMode("addfile")]
public async Task<ActionResult> AddFile()
{
logger.LogDebug("Sabnzbd mode: addfile");
if (!Request.HasFormContentType)
{
return BadRequest("Expected multipart/form-data");
}
var file = Request.Form.Files.FirstOrDefault();
if (file == null)
{
return BadRequest("No file uploaded");
}
var category = GetParam("cat");
var priorityStr = GetParam("priority");
Int32? priority = Int32.TryParse(priorityStr, out var p) ? p : null;
using var ms = new MemoryStream();
await file.CopyToAsync(ms);
var result = await sabnzbd.AddFile(ms.ToArray(), file.FileName, category, priority);
return Ok(new SabnzbdResponse { Status = true, NzoIds = [result] });
}
[HttpGet]
[SabnzbdMode("fullstatus")]
public async Task<ActionResult> FullStatus()
{
logger.LogDebug("Sabnzbd mode: fullstatus");
return Ok(new SabnzbdResponse { Version = "4.4.0", Queue = await sabnzbd.GetQueue() });
}
private String? GetParam(String name)
{
var value = Request.Query[name].ToString();
if (String.IsNullOrWhiteSpace(value) && Request.HasFormContentType)
{
value = Request.Form[name].ToString();
}
return value;
}
}