diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index 1bc436820..89752c63c 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -38,6 +38,7 @@ using Emby.Server.Implementations.LiveTv;
using Emby.Server.Implementations.Localization;
using Emby.Server.Implementations.Net;
using Emby.Server.Implementations.Playlists;
+using Emby.Server.Implementations.Plugins;
using Emby.Server.Implementations.QuickConnect;
using Emby.Server.Implementations.ScheduledTasks;
using Emby.Server.Implementations.Security;
@@ -1020,7 +1021,7 @@ namespace Emby.Server.Implementations
/// Comparison function used in .
///
private static int VersionCompare(
- (Version PluginVersion, string Name, string Path) a,
+ (Version PluginVersion, string Name, string Path) a,
(Version PluginVersion, string Name, string Path) b)
{
int compare = string.Compare(a.Name, b.Name, true, CultureInfo.InvariantCulture);
@@ -1033,32 +1034,38 @@ namespace Emby.Server.Implementations
return compare;
}
- ///
- /// Only loads the latest version of each assembly based upon the folder name.
- /// eg. MyAssembly_11.9.3.6 - will be ignored.
- /// MyAssembly_12.2.3.6 - will be loaded.
- ///
- /// Path to enumerate.
- /// Set to true, to try and clean up earlier versions.
- /// IEnumerable{string} of filenames.
- protected IEnumerable GetLatestDLLVersion(string path, bool cleanup = true)
+ private IEnumerable GetPlugins(string path, bool cleanup = true)
{
var dllList = new List();
var versions = new List<(Version PluginVersion, string Name, string Path)>();
var directories = Directory.EnumerateDirectories(path, "*.*", SearchOption.TopDirectoryOnly);
+ var serializer = new JsonSerializer();
foreach (var dir in directories)
{
- int underscoreIndex = dir.LastIndexOf('_');
- if (underscoreIndex != -1 && Version.TryParse(dir.Substring(underscoreIndex + 1), out Version ver))
+ try
{
- // Versioned folder.
- versions.Add((ver, dir.Substring(0, underscoreIndex), dir));
+ var manifest = serializer.DeserializeFromFile(dir + "\\meta.json");
+
+ if (!Version.TryParse(manifest.TargetAbi, out var targetAbi))
+ {
+ targetAbi = new Version("0.0.0.1");
+ }
+
+ if (!Version.TryParse(manifest.Version, out var version))
+ {
+ version = new Version("0.0.0.1");
+ }
+
+ if (targetAbi <= ApplicationVersion)
+ {
+ // Only load Plugins for this version or below.
+ versions.Add((version, manifest.Name, dir));
+ }
}
- else
+ catch
{
- // Un-versioned folder.
- versions.Add((new Version(), dir, dir));
+ continue;
}
}
@@ -1101,7 +1108,7 @@ namespace Emby.Server.Implementations
{
if (Directory.Exists(ApplicationPaths.PluginsPath))
{
- foreach (var file in GetLatestDLLVersion(ApplicationPaths.PluginsPath))
+ foreach (var file in GetPlugins(ApplicationPaths.PluginsPath))
{
Assembly plugAss;
try
diff --git a/Emby.Server.Implementations/Plugins/PlugInManifest.cs b/Emby.Server.Implementations/Plugins/PlugInManifest.cs
new file mode 100644
index 000000000..e334d65e5
--- /dev/null
+++ b/Emby.Server.Implementations/Plugins/PlugInManifest.cs
@@ -0,0 +1,32 @@
+#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
+
+using System;
+
+namespace Emby.Server.Implementations.Plugins
+{
+ ///
+ /// Defines a Plugin manifest file.
+ ///
+ public class PlugInManifest
+ {
+ public string Category { get; set; }
+
+ public string Changelog { get; set; }
+
+ public string Description { get; set; }
+
+ public Guid Guid { get; set; }
+
+ public string Name { get; set; }
+
+ public string Overview { get; set; }
+
+ public string Owner { get; set; }
+
+ public string TargetAbi { get; set; }
+
+ public DateTime Timestamp { get; set; }
+
+ public string Version { get; set; }
+}
+}