Changes as recommended.

This commit is contained in:
Greenback 2020-12-15 16:37:11 +00:00
parent c761cbff0e
commit eb2439f23b
6 changed files with 35 additions and 57 deletions

View file

@ -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);

View file

@ -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);
}
/// <summary>
@ -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);
}
}
}
}

View file

@ -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<PackageInfo>? packages;
var uri = new Uri(manifest);
if (uri.Scheme.StartsWith("http", StringComparison.OrdinalIgnoreCase))
{
packages = await _httpClientFactory.CreateClient(NamedClient.Default)
.GetFromJsonAsync<List<PackageInfo>>(uri, _jsonSerializerOptions, cancellationToken).ConfigureAwait(false);
}
else
{
// Local Packages
var data = File.ReadAllText(manifest, Encoding.UTF8);
packages = JsonSerializer.Deserialize<List<PackageInfo>>(data, _jsonSerializerOptions);
}
packages = await _httpClientFactory.CreateClient(NamedClient.Default)
.GetFromJsonAsync<List<PackageInfo>>(new Uri(manifest), _jsonSerializerOptions, cancellationToken).ConfigureAwait(false);
if (packages == null)
{

View file

@ -44,7 +44,6 @@ namespace Jellyfin.Api.Controllers
/// <returns>A <see cref="PackageInfo"/> containing package information.</returns>
[HttpGet("Packages/{name}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[Produces(JsonDefaults.CamelCaseMediaType)]
public async Task<ActionResult<PackageInfo>> GetPackageInfo(
[FromRoute, Required] string name,
[FromQuery] Guid? assemblyGuid)
@ -71,7 +70,6 @@ namespace Jellyfin.Api.Controllers
/// <returns>An <see cref="PackageInfo"/> containing available packages information.</returns>
[HttpGet("Packages")]
[ProducesResponseType(StatusCodes.Status200OK)]
[Produces(JsonDefaults.CamelCaseMediaType)]
public async Task<IEnumerable<PackageInfo>> GetPackages()
{
IEnumerable<PackageInfo> packages = await _installationManager.GetAvailablePackages().ConfigureAwait(false);

View file

@ -80,11 +80,6 @@ namespace MediaBrowser.Common.Plugins
/// </summary>
public PluginManifest Manifest { get; }
/// <summary>
/// Gets or sets a value indicating the assembly of the plugin.
/// </summary>
public Assembly? Assembly { get; set; }
/// <summary>
/// Compare two <see cref="LocalPlugin"/>.
/// </summary>

View file

@ -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.
/// </summary>
/// <value>The name.</value>
[JsonPropertyName("name")]
public string Name { get; set; }
/// <summary>
/// Gets or sets a long description of the plugin containing features or helpful explanations.
/// </summary>
/// <value>The description.</value>
/// [JsonPropertyName("description")]
public string Description { get; set; }
/// <summary>
/// Gets or sets a short overview of what the plugin does.
/// </summary>
/// <value>The overview.</value>
[JsonPropertyName("overview")]
public string Overview { get; set; }
/// <summary>
/// Gets or sets the owner.
/// </summary>
/// <value>The owner.</value>
[JsonPropertyName("owner")]
public string Owner { get; set; }
/// <summary>
/// Gets or sets the category.
/// </summary>
/// <value>The category.</value>
[JsonPropertyName("category")]
public string Category { get; set; }
/// <summary>
@ -58,6 +64,7 @@ namespace MediaBrowser.Model.Updates
/// This is used to identify the proper item for automatic updates.
/// </summary>
/// <value>The name.</value>
[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.
/// </summary>
/// <value>The versions.</value>
[JsonPropertyName("versions")]
#pragma warning disable CA2227 // Collection properties should be read only
public IList<VersionInfo> Versions { get; set; }
#pragma warning restore CA2227 // Collection properties should be read only
@ -73,6 +81,7 @@ namespace MediaBrowser.Model.Updates
/// <summary>
/// Gets or sets the image url for the package.
/// </summary>
[JsonPropertyName("imageUrl")]
public string? ImageUrl { get; set; }
}
}