Updated plugins to store their assemblies directly in the plugins folder

This commit is contained in:
LukePulverenti Luke Pulverenti luke pulverenti 2012-09-03 12:40:35 -04:00
parent 9baf40becb
commit 31357d3298
14 changed files with 133 additions and 57 deletions

View File

@ -18,7 +18,6 @@ namespace MediaBrowser.Api.HttpHandlers
{ {
return new PluginInfo() return new PluginInfo()
{ {
Path = p.Path,
Name = p.Name, Name = p.Name,
Enabled = p.Enabled, Enabled = p.Enabled,
DownloadToUI = p.DownloadToUI, DownloadToUI = p.DownloadToUI,

View File

@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" /> <Reference Include="System.ComponentModel.Composition" />
@ -97,7 +100,7 @@
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent> <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -18,7 +18,7 @@ namespace MediaBrowser.Api
get { return "WebAPI"; } get { return "WebAPI"; }
} }
public override void Init() protected override void InitializeInternal()
{ {
var httpServer = Kernel.Instance.HttpServer; var httpServer = Kernel.Instance.HttpServer;

View File

@ -47,6 +47,27 @@ namespace MediaBrowser.Common.Kernel
} }
} }
private string _pluginConfigurationsPath;
/// <summary>
/// Gets the path to the plugin configurations directory
/// </summary>
public string PluginConfigurationsPath
{
get
{
if (_pluginConfigurationsPath == null)
{
_pluginConfigurationsPath = Path.Combine(PluginsPath, "configurations");
if (!Directory.Exists(_pluginConfigurationsPath))
{
Directory.CreateDirectory(_pluginConfigurationsPath);
}
}
return _pluginConfigurationsPath;
}
}
private string _logDirectoryPath; private string _logDirectoryPath;
/// <summary> /// <summary>
/// Gets the path to the log directory /// Gets the path to the log directory

View File

@ -50,9 +50,9 @@ namespace MediaBrowser.Common.Kernel
} }
/// <summary> /// <summary>
/// Gets the kernel context. The UI kernel will have to override this. /// Gets the kernel context. Subclasses will have to override.
/// </summary> /// </summary>
protected KernelContext KernelContext { get { return KernelContext.Server; } } public abstract KernelContext KernelContext { get; }
public BaseKernel() public BaseKernel()
{ {
@ -104,7 +104,7 @@ namespace MediaBrowser.Common.Kernel
// Gets all plugin assemblies by first reading all bytes of the .dll and calling Assembly.Load against that // Gets all plugin assemblies by first reading all bytes of the .dll and calling Assembly.Load against that
// This will prevent the .dll file from getting locked, and allow us to replace it when needed // This will prevent the .dll file from getting locked, and allow us to replace it when needed
IEnumerable<Assembly> pluginAssemblies = Directory.GetFiles(ApplicationPaths.PluginsPath, "*.dll", SearchOption.AllDirectories).Select(f => Assembly.Load(File.ReadAllBytes((f)))); IEnumerable<Assembly> pluginAssemblies = Directory.GetFiles(ApplicationPaths.PluginsPath, "*.dll", SearchOption.TopDirectoryOnly).Select(f => Assembly.Load(File.ReadAllBytes((f))));
var catalog = new AggregateCatalog(pluginAssemblies.Select(a => new AssemblyCatalog(a))); var catalog = new AggregateCatalog(pluginAssemblies.Select(a => new AssemblyCatalog(a)));
@ -144,20 +144,7 @@ namespace MediaBrowser.Common.Kernel
{ {
foreach (BasePlugin plugin in Plugins) foreach (BasePlugin plugin in Plugins)
{ {
Assembly assembly = plugin.GetType().Assembly; plugin.Initialize(this);
AssemblyName assemblyName = assembly.GetName();
plugin.Version = assemblyName.Version;
plugin.Path = Path.Combine(ApplicationPaths.PluginsPath, assemblyName.Name);
plugin.Context = KernelContext;
plugin.ReloadConfiguration();
if (plugin.Enabled)
{
plugin.Init();
}
} }
} }
@ -276,10 +263,18 @@ namespace MediaBrowser.Common.Kernel
return GetType().Assembly.GetName().Version; return GetType().Assembly.GetName().Version;
} }
} }
BaseApplicationPaths IKernel.ApplicationPaths
{
get { return ApplicationPaths; }
}
} }
public interface IKernel public interface IKernel
{ {
BaseApplicationPaths ApplicationPaths { get; }
KernelContext KernelContext { get; }
Task Init(IProgress<TaskProgress> progress); Task Init(IProgress<TaskProgress> progress);
void Dispose(); void Dispose();
} }

View File

@ -35,10 +35,12 @@ namespace MediaBrowser.Common.Plugins
/// </summary> /// </summary>
public abstract class BasePlugin : IDisposable public abstract class BasePlugin : IDisposable
{ {
private IKernel Kernel { get; set; }
/// <summary> /// <summary>
/// Gets or sets the plugin's current context /// Gets or sets the plugin's current context
/// </summary> /// </summary>
public KernelContext Context { get; set; } protected KernelContext Context { get { return Kernel.KernelContext; } }
/// <summary> /// <summary>
/// Gets the name of the plugin /// Gets the name of the plugin
@ -51,25 +53,58 @@ namespace MediaBrowser.Common.Plugins
protected abstract Type ConfigurationType { get; } protected abstract Type ConfigurationType { get; }
/// <summary> /// <summary>
/// Gets or sets the path to the plugin's folder /// Gets the plugin version
/// </summary> /// </summary>
public string Path { get; set; } public Version Version
{
/// <summary> get
/// Gets or sets the plugin version {
/// </summary> return GetType().Assembly.GetName().Version;
public Version Version { get; set; } }
}
/// <summary> /// <summary>
/// Gets or sets the current plugin configuration /// Gets or sets the current plugin configuration
/// </summary> /// </summary>
public BasePluginConfiguration Configuration { get; protected set; } public BasePluginConfiguration Configuration { get; protected set; }
protected string ConfigurationPath /// <summary>
/// Gets the name of the configuration file. Subclasses should override
/// </summary>
public virtual string ConfigurationFileName { get { return Name + ".xml"; } }
/// <summary>
/// Gets the full path to the configuration file
/// </summary>
public string ConfigurationFilePath
{ {
get get
{ {
return System.IO.Path.Combine(Path, "config.js"); return Path.Combine(Kernel.ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName);
}
}
private string _DataFolderPath = null;
/// <summary>
/// Gets the full path to the data folder, where the plugin can store any miscellaneous files needed
/// </summary>
public string DataFolderPath
{
get
{
if (_DataFolderPath == null)
{
// Give the folder name the same name as the config file name
// We can always make this configurable if/when needed
_DataFolderPath = Path.Combine(Kernel.ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(ConfigurationFileName));
if (!Directory.Exists(_DataFolderPath))
{
Directory.CreateDirectory(_DataFolderPath);
}
}
return _DataFolderPath;
} }
} }
@ -81,14 +116,6 @@ namespace MediaBrowser.Common.Plugins
} }
} }
public DateTime ConfigurationDateLastModified
{
get
{
return Configuration.DateLastModified;
}
}
/// <summary> /// <summary>
/// Returns true or false indicating if the plugin should be downloaded and run within the UI. /// Returns true or false indicating if the plugin should be downloaded and run within the UI.
/// </summary> /// </summary>
@ -103,7 +130,22 @@ namespace MediaBrowser.Common.Plugins
/// <summary> /// <summary>
/// Starts the plugin. /// Starts the plugin.
/// </summary> /// </summary>
public virtual void Init() public void Initialize(IKernel kernel)
{
Kernel = kernel;
ReloadConfiguration();
if (Enabled)
{
InitializeInternal();
}
}
/// <summary>
/// Starts the plugin.
/// </summary>
protected virtual void InitializeInternal()
{ {
} }
@ -116,14 +158,14 @@ namespace MediaBrowser.Common.Plugins
public void ReloadConfiguration() public void ReloadConfiguration()
{ {
if (!File.Exists(ConfigurationPath)) if (!File.Exists(ConfigurationFilePath))
{ {
Configuration = Activator.CreateInstance(ConfigurationType) as BasePluginConfiguration; Configuration = Activator.CreateInstance(ConfigurationType) as BasePluginConfiguration;
} }
else else
{ {
Configuration = JsonSerializer.DeserializeFromFile(ConfigurationType, ConfigurationPath) as BasePluginConfiguration; Configuration = JsonSerializer.DeserializeFromFile(ConfigurationType, ConfigurationFilePath) as BasePluginConfiguration;
Configuration.DateLastModified = File.GetLastWriteTime(ConfigurationPath); Configuration.DateLastModified = File.GetLastWriteTime(ConfigurationFilePath);
} }
} }
} }

View File

@ -5,6 +5,8 @@ using System.Windows.Media.Imaging;
using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Logging; using MediaBrowser.Common.Logging;
using MediaBrowser.Model.Progress; using MediaBrowser.Model.Progress;
using System.Runtime.InteropServices;
using System.Security;
namespace MediaBrowser.Common.UI namespace MediaBrowser.Common.UI
{ {

View File

@ -40,6 +40,11 @@ namespace MediaBrowser.Controller
} }
} }
public override KernelContext KernelContext
{
get { return KernelContext.Server; }
}
/// <summary> /// <summary>
/// Gets the list of currently registered metadata prvoiders /// Gets the list of currently registered metadata prvoiders
/// </summary> /// </summary>

View File

@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" /> <Reference Include="System.ComponentModel.Composition" />
@ -68,7 +71,7 @@
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent> <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -13,18 +13,15 @@ namespace MediaBrowser.Model.DTO
public string Name { get; set; } public string Name { get; set; }
[ProtoMember(2)] [ProtoMember(2)]
public string Path { get; set; }
[ProtoMember(3)]
public bool Enabled { get; set; } public bool Enabled { get; set; }
[ProtoMember(4)] [ProtoMember(3)]
public bool DownloadToUI { get; set; } public bool DownloadToUI { get; set; }
[ProtoMember(5)] [ProtoMember(4)]
public DateTime ConfigurationDateLastModified { get; set; } public DateTime ConfigurationDateLastModified { get; set; }
[ProtoMember(6)] [ProtoMember(5)]
public Version Version { get; set; } public Version Version { get; set; }
} }
} }

View File

@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" /> <Reference Include="System.ComponentModel.Composition" />
@ -66,7 +69,7 @@
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent> <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" /> <Reference Include="System.ComponentModel.Composition" />
@ -72,7 +75,7 @@
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent> <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -16,7 +16,7 @@ namespace MediaBrowser.TV
get { return "TV"; } get { return "TV"; }
} }
public override void Init() protected override void InitializeInternal()
{ {
Kernel.Instance.ItemController.PreBeginResolvePath += ItemController_PreBeginResolvePath; Kernel.Instance.ItemController.PreBeginResolvePath += ItemController_PreBeginResolvePath;
} }

View File

@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" /> <Reference Include="System.ComponentModel.Composition" />
@ -55,7 +58,7 @@
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent> <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup> </PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.