using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using MediaBrowser.Common.Configuration; namespace Jellyfin.Plugin.MediaBarEnhanced.Api { /// /// Controller for handling custom overlay image uploads and retrieval. /// [ApiController] [Route("MediaBarEnhanced")] public class OverlayImageController : ControllerBase { private readonly IApplicationPaths _applicationPaths; private readonly string _imageDirectory; private readonly string _imagePath; public OverlayImageController(IApplicationPaths applicationPaths) { _applicationPaths = applicationPaths; // We use the plugin's data folder to store the image _imageDirectory = Path.Combine(_applicationPaths.PluginConfigurationPath, "MediaBarEnhanced"); // We'll just overwrite this single file each time _imagePath = Path.Combine(_imageDirectory, "custom_overlay_image.dat"); } /// /// Uploads a new custom overlay image. /// [HttpPost("OverlayImage")] [Consumes("multipart/form-data")] public async Task UploadImage([FromForm] IFormFile file) { if (file == null || file.Length == 0) { return BadRequest("No file uploaded."); } try { if (!Directory.Exists(_imageDirectory)) { Directory.CreateDirectory(_imageDirectory); } // Delete the old one if it exists to ensure freshness if (System.IO.File.Exists(_imagePath)) { System.IO.File.Delete(_imagePath); } using (var stream = new FileStream(_imagePath, FileMode.Create)) { await file.CopyToAsync(stream).ConfigureAwait(false); } // Return the GET URL that the frontend can use var getUrl = "/MediaBarEnhanced/OverlayImage?t=" + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); return Ok(new { url = getUrl }); } catch (Exception ex) { return StatusCode(500, $"Internal server error: {ex.Message}"); } } /// /// Retrieves the custom overlay image. /// [HttpGet("OverlayImage")] public IActionResult GetImage() { if (!System.IO.File.Exists(_imagePath)) { return NotFound(); } // Read the file and return as a generic octet stream, since we don't strictly track the mime type // The browser will figure out it's an image var stream = new FileStream(_imagePath, FileMode.Open, FileAccess.Read, FileShare.Read); return File(stream, "image/*"); } } }