Jelajahi Sumber

Plugin setting migration to folders.

Greenback 4 tahun lalu
induk
melakukan
fbb20ebef6

+ 1 - 4
Emby.Server.Implementations/ApplicationHost.cs

@@ -406,10 +406,7 @@ namespace Emby.Server.Implementations
                     Logger.LogError("Called from: {stack}", entry.FullName);
                 }
 
-                if (type is IPlugin)
-                {
-                    _pluginManager.FailPlugin(type.Assembly);
-                }
+                _pluginManager.FailPlugin(type.Assembly);
 
                 throw new ExternalException("DI Loop detected.");
             }

+ 9 - 2
Emby.Server.Implementations/Plugins/PluginManager.cs

@@ -296,7 +296,7 @@ namespace Emby.Server.Implementations
                 return;
             }
 
-            if (!ChangePluginState(predecessor, PluginStatus.Superceded))
+            if (predecessor.Manifest.Status == PluginStatus.Active && !ChangePluginState(predecessor, PluginStatus.Superceded))
             {
                 _logger.LogError("Unable to disable version {Version} of {Name}", predecessor.Version, predecessor.Name);
             }
@@ -314,7 +314,10 @@ namespace Emby.Server.Implementations
                 throw new ArgumentNullException(nameof(assembly));
             }
 
-            var plugin = _plugins.Where(p => assembly.Equals(p.Assembly)).FirstOrDefault();
+            var plugin = _plugins.Where(
+                    p => assembly.Equals(p.Assembly)
+                    || string.Equals(assembly.Location, assembly.Location, StringComparison.OrdinalIgnoreCase))
+                .FirstOrDefault();
             if (plugin == null)
             {
                 // A plugin's assembly didn't cause this issue, so ignore it.
@@ -403,6 +406,10 @@ namespace Emby.Server.Implementations
         {
             // Find the record for this plugin.
             var plugin = GetPluginByType(type);
+            if (plugin?.Manifest.Status < PluginStatus.Active)
+            {
+                return null;
+            }
 
             try
             {

+ 40 - 2
MediaBrowser.Common/Plugins/BasePlugin.cs

@@ -134,7 +134,26 @@ namespace MediaBrowser.Common.Plugins
                 var assemblyName = assembly.GetName();
                 var assemblyFilePath = assembly.Location;
 
-                var dataFolderPath = Path.Combine(ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(assemblyFilePath));
+                // Find out the plugin folder.
+                bool inPluginFolder = assemblyFilePath.StartsWith(ApplicationPaths.PluginsPath, StringComparison.OrdinalIgnoreCase);
+                string path, dataFolderPath;
+
+                var configurationFileName = Path.ChangeExtension(Path.GetFileName(assemblyFilePath), ".xml");
+                if (inPluginFolder)
+                {
+                    // Normal plugin.
+                    path = assemblyFilePath.Substring(ApplicationPaths.PluginsPath.Length).Split('\\', StringSplitOptions.RemoveEmptyEntries)[0];
+                    dataFolderPath = Path.Combine(
+                        Path.Combine(ApplicationPaths.PluginsPath, path),
+                        configurationFileName);
+                    ConfigurationFilePath = dataFolderPath;
+                }
+                else
+                {
+                    // Provider
+                    dataFolderPath = Path.Combine(ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(assemblyFilePath));
+                    ConfigurationFilePath = Path.Combine(ApplicationPaths.PluginConfigurationsPath, configurationFileName);
+                }
 
                 assemblyPlugin.SetAttributes(assemblyFilePath, dataFolderPath, assemblyName.Version);
 
@@ -146,6 +165,25 @@ namespace MediaBrowser.Common.Plugins
 
                     assemblyPlugin.SetId(assemblyId);
                 }
+
+                // TODO : Simplify this, once migration support is ceased.
+                if (inPluginFolder)
+                {
+                    var oldConfigFilePath = Path.Combine(ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName);
+
+                    if (!File.Exists(ConfigurationFilePath) && File.Exists(oldConfigFilePath))
+                    {
+                        // Migrate settings, as different plugin versions may have different settings.
+                        try
+                        {
+                            File.Copy(oldConfigFilePath, ConfigurationFilePath);
+                        }
+                        catch
+                        {
+                            // Unable to migrate settings.
+                        }
+                    }
+                }
             }
 
             if (this is IHasPluginConfiguration hasPluginConfiguration)
@@ -219,7 +257,7 @@ namespace MediaBrowser.Common.Plugins
         /// Gets the full path to the configuration file.
         /// </summary>
         /// <value>The configuration file path.</value>
-        public string ConfigurationFilePath => Path.Combine(ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName);
+        public string ConfigurationFilePath { get; }
 
         /// <summary>
         /// Gets the plugin configuration.