diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index 17cccdaf92..216cb5e758 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -396,7 +396,7 @@ namespace Emby.Server.Implementations
Logger.LogError("DI Loop detected in the attempted creation of {Type}", type.FullName);
foreach (var entry in _creatingInstances)
{
- Logger.LogError("Called from: {stack}", entry.FullName);
+ Logger.LogError("Called from: {TypeName}", entry.FullName);
}
_pluginManager.FailPlugin(type.Assembly);
diff --git a/Emby.Server.Implementations/Plugins/PluginManager.cs b/Emby.Server.Implementations/Plugins/PluginManager.cs
index 010d2829c4..944b746528 100644
--- a/Emby.Server.Implementations/Plugins/PluginManager.cs
+++ b/Emby.Server.Implementations/Plugins/PluginManager.cs
@@ -96,9 +96,10 @@ namespace Emby.Server.Implementations
foreach (var file in plugin.DllFiles)
{
+ Assembly assembly;
try
{
- plugin.Assembly = Assembly.LoadFrom(file);
+ assembly = Assembly.LoadFrom(file);
}
catch (FileLoadException ex)
{
@@ -107,8 +108,8 @@ namespace Emby.Server.Implementations
continue;
}
- _logger.LogInformation("Loaded assembly {Assembly} from {Path}", plugin.Assembly.FullName, file);
- yield return plugin.Assembly;
+ _logger.LogInformation("Loaded assembly {Assembly} from {Path}", assembly.FullName, file);
+ yield return assembly;
}
}
}
@@ -203,6 +204,7 @@ namespace Emby.Server.Implementations
return true;
}
+ _logger.LogWarning("Unable to delete {Path}, so marking as deleteOnStartup.", plugin.Path);
// Unable to delete, so disable.
return ChangePluginState(plugin, PluginStatus.DeleteOnStartup);
}
@@ -310,10 +312,7 @@ namespace Emby.Server.Implementations
throw new ArgumentNullException(nameof(assembly));
}
- var plugin = _plugins.Where(
- p => assembly.Equals(p.Assembly)
- || string.Equals(assembly.Location, assembly.Location, StringComparison.OrdinalIgnoreCase))
- .FirstOrDefault();
+ var plugin = _plugins.Where(p => p.DllFiles.Contains(assembly.Location)).FirstOrDefault();
if (plugin == null)
{
// A plugin's assembly didn't cause this issue, so ignore it.
@@ -366,20 +365,7 @@ namespace Emby.Server.Implementations
}
plugin.Manifest.Status = state;
- SaveManifest(plugin.Manifest, plugin.Path);
- try
- {
- var data = JsonSerializer.Serialize(plugin.Manifest, _jsonOptions);
- File.WriteAllText(Path.Combine(plugin.Path, "meta.json"), data, Encoding.UTF8);
- return true;
- }
-#pragma warning disable CA1031 // Do not catch general exception types
- catch (Exception e)
-#pragma warning restore CA1031 // Do not catch general exception types
- {
- _logger.LogWarning(e, "Unable to disable plugin {Path}", plugin.Path);
- return false;
- }
+ return SaveManifest(plugin.Manifest, plugin.Path);
}
///
@@ -509,15 +495,14 @@ namespace Emby.Server.Implementations
// Attempt a cleanup of old folders.
try
{
- _logger.LogDebug("Deleting {Path}", plugin.Path);
Directory.Delete(plugin.Path, true);
+ _logger.LogDebug("Deleted {Path}", plugin.Path);
_plugins.Remove(plugin);
}
#pragma warning disable CA1031 // Do not catch general exception types
- catch (Exception e)
+ catch
#pragma warning restore CA1031 // Do not catch general exception types
{
- _logger.LogWarning(e, "Unable to delete {Path}", plugin.Path);
return false;
}
@@ -670,21 +655,23 @@ namespace Emby.Server.Implementations
_logger.LogWarning(e, "Unable to delete {Path}", path);
}
- versions.RemoveAt(x);
- }
-
- if (!cleaned)
- {
- if (manifest == null)
+ if (cleaned)
{
- _logger.LogWarning("Unable to disable plugin {Path}", entry.Path);
- continue;
+ versions.RemoveAt(x);
}
-
- if (manifest.Status != PluginStatus.DeleteOnStartup)
+ else
{
- manifest.Status = PluginStatus.DeleteOnStartup;
- SaveManifest(manifest, entry.Path);
+ if (manifest == null)
+ {
+ _logger.LogWarning("Unable to disable plugin {Path}", entry.Path);
+ continue;
+ }
+
+ if (manifest.Status != PluginStatus.DeleteOnStartup)
+ {
+ manifest.Status = PluginStatus.DeleteOnStartup;
+ SaveManifest(manifest, entry.Path);
+ }
}
}
}
diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs
index b7bbbd3482..fc80bdd756 100644
--- a/Emby.Server.Implementations/Updates/InstallationManager.cs
+++ b/Emby.Server.Implementations/Updates/InstallationManager.cs
@@ -8,7 +8,6 @@ using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Security.Cryptography;
-using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
@@ -106,18 +105,8 @@ namespace Emby.Server.Implementations.Updates
try
{
List? packages;
- var uri = new Uri(manifest);
- if (uri.Scheme.StartsWith("http", StringComparison.OrdinalIgnoreCase))
- {
- packages = await _httpClientFactory.CreateClient(NamedClient.Default)
- .GetFromJsonAsync>(uri, _jsonSerializerOptions, cancellationToken).ConfigureAwait(false);
- }
- else
- {
- // Local Packages
- var data = File.ReadAllText(manifest, Encoding.UTF8);
- packages = JsonSerializer.Deserialize>(data, _jsonSerializerOptions);
- }
+ packages = await _httpClientFactory.CreateClient(NamedClient.Default)
+ .GetFromJsonAsync>(new Uri(manifest), _jsonSerializerOptions, cancellationToken).ConfigureAwait(false);
if (packages == null)
{
diff --git a/Jellyfin.Api/Controllers/PackageController.cs b/Jellyfin.Api/Controllers/PackageController.cs
index 906188026b..9ab8e0bdcf 100644
--- a/Jellyfin.Api/Controllers/PackageController.cs
+++ b/Jellyfin.Api/Controllers/PackageController.cs
@@ -44,7 +44,6 @@ namespace Jellyfin.Api.Controllers
/// A containing package information.
[HttpGet("Packages/{name}")]
[ProducesResponseType(StatusCodes.Status200OK)]
- [Produces(JsonDefaults.CamelCaseMediaType)]
public async Task> GetPackageInfo(
[FromRoute, Required] string name,
[FromQuery] Guid? assemblyGuid)
@@ -71,7 +70,6 @@ namespace Jellyfin.Api.Controllers
/// An containing available packages information.
[HttpGet("Packages")]
[ProducesResponseType(StatusCodes.Status200OK)]
- [Produces(JsonDefaults.CamelCaseMediaType)]
public async Task> GetPackages()
{
IEnumerable packages = await _installationManager.GetAvailablePackages().ConfigureAwait(false);
diff --git a/MediaBrowser.Common/Plugins/LocalPlugin.cs b/MediaBrowser.Common/Plugins/LocalPlugin.cs
index ef9ab7a7dc..e48ebbfa5c 100644
--- a/MediaBrowser.Common/Plugins/LocalPlugin.cs
+++ b/MediaBrowser.Common/Plugins/LocalPlugin.cs
@@ -80,11 +80,6 @@ namespace MediaBrowser.Common.Plugins
///
public PluginManifest Manifest { get; }
- ///
- /// Gets or sets a value indicating the assembly of the plugin.
- ///
- public Assembly? Assembly { get; set; }
-
///
/// Compare two .
///
diff --git a/MediaBrowser.Model/Updates/PackageInfo.cs b/MediaBrowser.Model/Updates/PackageInfo.cs
index 77e2d8d88a..63fd717429 100644
--- a/MediaBrowser.Model/Updates/PackageInfo.cs
+++ b/MediaBrowser.Model/Updates/PackageInfo.cs
@@ -1,6 +1,7 @@
#nullable enable
using System;
using System.Collections.Generic;
+using System.Text.Json.Serialization;
namespace MediaBrowser.Model.Updates
{
@@ -27,30 +28,35 @@ namespace MediaBrowser.Model.Updates
/// Gets or sets the name.
///
/// The name.
+ [JsonPropertyName("name")]
public string Name { get; set; }
///
/// Gets or sets a long description of the plugin containing features or helpful explanations.
///
/// The description.
+ /// [JsonPropertyName("description")]
public string Description { get; set; }
///
/// Gets or sets a short overview of what the plugin does.
///
/// The overview.
+ [JsonPropertyName("overview")]
public string Overview { get; set; }
///
/// Gets or sets the owner.
///
/// The owner.
+ [JsonPropertyName("owner")]
public string Owner { get; set; }
///
/// Gets or sets the category.
///
/// The category.
+ [JsonPropertyName("category")]
public string Category { get; set; }
///
@@ -58,6 +64,7 @@ namespace MediaBrowser.Model.Updates
/// This is used to identify the proper item for automatic updates.
///
/// The name.
+ [JsonPropertyName("guid")]
#pragma warning disable CA1720 // Identifier contains type name
public string Guid { get; set; }
#pragma warning restore CA1720 // Identifier contains type name
@@ -66,6 +73,7 @@ namespace MediaBrowser.Model.Updates
/// Gets or sets the versions.
///
/// The versions.
+ [JsonPropertyName("versions")]
#pragma warning disable CA2227 // Collection properties should be read only
public IList Versions { get; set; }
#pragma warning restore CA2227 // Collection properties should be read only
@@ -73,6 +81,7 @@ namespace MediaBrowser.Model.Updates
///
/// Gets or sets the image url for the package.
///
+ [JsonPropertyName("imageUrl")]
public string? ImageUrl { get; set; }
}
}