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
All checks were successful
Auto Release Plugin / build-and-release (push) Successful in 43s
This commit is contained in:
@@ -23,7 +23,7 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Api
|
||||
_applicationPaths = applicationPaths;
|
||||
|
||||
// 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
|
||||
_imagePath = Path.Combine(_imageDirectory, "custom_overlay_image.dat");
|
||||
@@ -48,13 +48,10 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Api
|
||||
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))
|
||||
// Delete is not strictly necessary and can cause locking issues if someone is currently reading it.
|
||||
// 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.
|
||||
using (var stream = new FileStream(_imagePath, FileMode.Create, FileAccess.Write, FileShare.None))
|
||||
{
|
||||
await file.CopyToAsync(stream).ConfigureAwait(false);
|
||||
}
|
||||
@@ -80,9 +77,12 @@ namespace Jellyfin.Plugin.MediaBarEnhanced.Api
|
||||
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);
|
||||
// Read the file and return as a generic octet stream.
|
||||
// We use FileShare.ReadWrite so that if someone is currently overwriting the file (uploading), we don't block them,
|
||||
// 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/*");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user