Refactor overlay image handling and improve safety checks for plugin configuration
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 43s

This commit is contained in:
CodeDevMLH
2026-03-09 04:02:17 +01:00
parent 518fd5640e
commit bb6310381a
3 changed files with 12 additions and 13 deletions

View File

@@ -23,7 +23,7 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Api
_applicationPaths = applicationPaths; _applicationPaths = applicationPaths;
// We use the plugin's data folder to store the image // We use the plugin's data folder to store the image
_imageDirectory = Path.Combine(_applicationPaths.PluginConfigurationPath, "MediaBarEnhanced"); _imageDirectory = MediaBarEnhancedPlugin.Instance?.DataFolderPath ?? Path.Combine(applicationPaths.DataPath, "plugins", "MediaBarEnhanced");
// We'll just overwrite this single file each time // We'll just overwrite this single file each time
_imagePath = Path.Combine(_imageDirectory, "custom_overlay_image.dat"); _imagePath = Path.Combine(_imageDirectory, "custom_overlay_image.dat");
@@ -48,13 +48,10 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Api
Directory.CreateDirectory(_imageDirectory); Directory.CreateDirectory(_imageDirectory);
} }
// Delete the old one if it exists to ensure freshness // Delete is not strictly necessary and can cause locking issues if someone is currently reading it.
if (System.IO.File.Exists(_imagePath)) // FileMode.Create will truncate the file if it exists, effectively overwriting it.
{ // We use FileShare.None to ensure we have exclusive write access, but handle potential IOExceptions gracefully.
System.IO.File.Delete(_imagePath); using (var stream = new FileStream(_imagePath, FileMode.Create, FileAccess.Write, FileShare.None))
}
using (var stream = new FileStream(_imagePath, FileMode.Create))
{ {
await file.CopyToAsync(stream).ConfigureAwait(false); await file.CopyToAsync(stream).ConfigureAwait(false);
} }
@@ -80,9 +77,12 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Api
return NotFound(); return NotFound();
} }
// Read the file and return as a generic octet stream, since we don't strictly track the mime type // Read the file and return as a generic octet stream.
// The browser will figure out it's an image // We use FileShare.ReadWrite so that if someone is currently overwriting the file (uploading), we don't block them,
var stream = new FileStream(_imagePath, FileMode.Open, FileAccess.Read, FileShare.Read); // and we also don't get blocked by other readers.
var stream = new FileStream(_imagePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
// "image/*" works reliably as browsers will sniff the exact image mime type (jpeg, png, webp).
return File(stream, "image/*"); return File(stream, "image/*");
} }
} }

View File

@@ -18,7 +18,7 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Helpers
try try
{ {
// Safety Check: If plugin is disabled, do nothing // Safety Check: If plugin is disabled, do nothing
if (!MediaBarEnhancedPlugin.Instance.Configuration.IsEnabled) if (MediaBarEnhancedPlugin.Instance?.Configuration?.IsEnabled != true)
{ {
return originalContents; return originalContents;
} }

View File

@@ -17,7 +17,6 @@ namespace Jellyfin.Plugin.MediaBarEnhanced
{ {
private readonly ScriptInjector _scriptInjector; private readonly ScriptInjector _scriptInjector;
private readonly ILoggerFactory _loggerFactory; private readonly ILoggerFactory _loggerFactory;
public IServiceProvider ServiceProvider { get; }
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="MediaBarEnhancedPlugin"/> class. /// Initializes a new instance of the <see cref="MediaBarEnhancedPlugin"/> class.