aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/HttpHandlers/PluginsHandler.cs1
-rw-r--r--MediaBrowser.Api/MediaBrowser.Api.csproj5
-rw-r--r--MediaBrowser.Api/Plugin.cs2
-rw-r--r--MediaBrowser.Common/Kernel/BaseApplicationPaths.cs21
-rw-r--r--MediaBrowser.Common/Kernel/BaseKernel.cs29
-rw-r--r--MediaBrowser.Common/Plugins/BasePlugin.cs76
-rw-r--r--MediaBrowser.Common/UI/BaseApplication.cs2
-rw-r--r--MediaBrowser.Controller/Kernel.cs13
-rw-r--r--MediaBrowser.InternetProviders/MediaBrowser.InternetProviders.csproj5
-rw-r--r--MediaBrowser.Model/DTO/PluginInfo.cs9
-rw-r--r--MediaBrowser.Movies/MediaBrowser.Movies.csproj5
-rw-r--r--MediaBrowser.TV/MediaBrowser.TV.csproj5
-rw-r--r--MediaBrowser.TV/Plugin.cs2
-rw-r--r--MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj5
14 files changed, 128 insertions, 52 deletions
diff --git a/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs b/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs
index 67246cbc6..ab2efc949 100644
--- a/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs
+++ b/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs
@@ -18,7 +18,6 @@ namespace MediaBrowser.Api.HttpHandlers
{
return new PluginInfo()
{
- Path = p.Path,
Name = p.Name,
Enabled = p.Enabled,
DownloadToUI = p.DownloadToUI,
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj
index 9e6cbb056..5913e695b 100644
--- a/MediaBrowser.Api/MediaBrowser.Api.csproj
+++ b/MediaBrowser.Api/MediaBrowser.Api.csproj
@@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
+ <PropertyGroup>
+ <RunPostBuildEvent>Always</RunPostBuildEvent>
+ </PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
@@ -97,7 +100,7 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup>
<!-- 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.
diff --git a/MediaBrowser.Api/Plugin.cs b/MediaBrowser.Api/Plugin.cs
index ce7a7f308..4e6ab54de 100644
--- a/MediaBrowser.Api/Plugin.cs
+++ b/MediaBrowser.Api/Plugin.cs
@@ -18,7 +18,7 @@ namespace MediaBrowser.Api
get { return "WebAPI"; }
}
- public override void Init()
+ protected override void InitializeInternal()
{
var httpServer = Kernel.Instance.HttpServer;
diff --git a/MediaBrowser.Common/Kernel/BaseApplicationPaths.cs b/MediaBrowser.Common/Kernel/BaseApplicationPaths.cs
index 3c394680f..798115ffa 100644
--- a/MediaBrowser.Common/Kernel/BaseApplicationPaths.cs
+++ b/MediaBrowser.Common/Kernel/BaseApplicationPaths.cs
@@ -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;
/// <summary>
/// Gets the path to the log directory
diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs
index cdde17b24..4f1bdae6b 100644
--- a/MediaBrowser.Common/Kernel/BaseKernel.cs
+++ b/MediaBrowser.Common/Kernel/BaseKernel.cs
@@ -50,9 +50,9 @@ namespace MediaBrowser.Common.Kernel
}
/// <summary>
- /// Gets the kernel context. The UI kernel will have to override this.
+ /// Gets the kernel context. Subclasses will have to override.
/// </summary>
- protected KernelContext KernelContext { get { return KernelContext.Server; } }
+ public abstract KernelContext KernelContext { get; }
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
// 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)));
@@ -144,20 +144,7 @@ namespace MediaBrowser.Common.Kernel
{
foreach (BasePlugin plugin in Plugins)
{
- Assembly assembly = plugin.GetType().Assembly;
- 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();
- }
+ plugin.Initialize(this);
}
}
@@ -276,10 +263,18 @@ namespace MediaBrowser.Common.Kernel
return GetType().Assembly.GetName().Version;
}
}
+
+ BaseApplicationPaths IKernel.ApplicationPaths
+ {
+ get { return ApplicationPaths; }
+ }
}
public interface IKernel
{
+ BaseApplicationPaths ApplicationPaths { get; }
+ KernelContext KernelContext { get; }
+
Task Init(IProgress<TaskProgress> progress);
void Dispose();
}
diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs
index e6ebfa551..4b6f9cba4 100644
--- a/MediaBrowser.Common/Plugins/BasePlugin.cs
+++ b/MediaBrowser.Common/Plugins/BasePlugin.cs
@@ -35,10 +35,12 @@ namespace MediaBrowser.Common.Plugins
/// </summary>
public abstract class BasePlugin : IDisposable
{
+ private IKernel Kernel { get; set; }
+
/// <summary>
/// Gets or sets the plugin's current context
/// </summary>
- public KernelContext Context { get; set; }
+ protected KernelContext Context { get { return Kernel.KernelContext; } }
/// <summary>
/// Gets the name of the plugin
@@ -51,41 +53,66 @@ namespace MediaBrowser.Common.Plugins
protected abstract Type ConfigurationType { get; }
/// <summary>
- /// Gets or sets the path to the plugin's folder
+ /// Gets the plugin version
/// </summary>
- public string Path { get; set; }
+ public Version Version
+ {
+ get
+ {
+ return GetType().Assembly.GetName().Version;
+ }
+ }
/// <summary>
- /// Gets or sets the plugin version
+ /// Gets or sets the current plugin configuration
/// </summary>
- public Version Version { get; set; }
+ public BasePluginConfiguration Configuration { get; protected set; }
/// <summary>
- /// Gets or sets the current plugin configuration
+ /// Gets the name of the configuration file. Subclasses should override
/// </summary>
- public BasePluginConfiguration Configuration { get; protected set; }
+ public virtual string ConfigurationFileName { get { return Name + ".xml"; } }
- protected string ConfigurationPath
+ /// <summary>
+ /// Gets the full path to the configuration file
+ /// </summary>
+ public string ConfigurationFilePath
{
get
{
- return System.IO.Path.Combine(Path, "config.js");
+ return Path.Combine(Kernel.ApplicationPaths.PluginConfigurationsPath, ConfigurationFileName);
}
}
- public bool Enabled
+ 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
{
- return Configuration.Enabled;
+ 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;
}
}
- public DateTime ConfigurationDateLastModified
+ public bool Enabled
{
get
{
- return Configuration.DateLastModified;
+ return Configuration.Enabled;
}
}
@@ -103,7 +130,22 @@ namespace MediaBrowser.Common.Plugins
/// <summary>
/// Starts the plugin.
/// </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()
{
- if (!File.Exists(ConfigurationPath))
+ if (!File.Exists(ConfigurationFilePath))
{
Configuration = Activator.CreateInstance(ConfigurationType) as BasePluginConfiguration;
}
else
{
- Configuration = JsonSerializer.DeserializeFromFile(ConfigurationType, ConfigurationPath) as BasePluginConfiguration;
- Configuration.DateLastModified = File.GetLastWriteTime(ConfigurationPath);
+ Configuration = JsonSerializer.DeserializeFromFile(ConfigurationType, ConfigurationFilePath) as BasePluginConfiguration;
+ Configuration.DateLastModified = File.GetLastWriteTime(ConfigurationFilePath);
}
}
}
diff --git a/MediaBrowser.Common/UI/BaseApplication.cs b/MediaBrowser.Common/UI/BaseApplication.cs
index a45faca50..b19be3d7f 100644
--- a/MediaBrowser.Common/UI/BaseApplication.cs
+++ b/MediaBrowser.Common/UI/BaseApplication.cs
@@ -5,6 +5,8 @@ using System.Windows.Media.Imaging;
using MediaBrowser.Common.Kernel;
using MediaBrowser.Common.Logging;
using MediaBrowser.Model.Progress;
+using System.Runtime.InteropServices;
+using System.Security;
namespace MediaBrowser.Common.UI
{
diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs
index 91e2524a8..8f4553ba4 100644
--- a/MediaBrowser.Controller/Kernel.cs
+++ b/MediaBrowser.Controller/Kernel.cs
@@ -40,12 +40,17 @@ namespace MediaBrowser.Controller
}
}
+ public override KernelContext KernelContext
+ {
+ get { return KernelContext.Server; }
+ }
+
/// <summary>
/// Gets the list of currently registered metadata prvoiders
/// </summary>
[ImportMany(typeof(BaseMetadataProvider))]
private IEnumerable<BaseMetadataProvider> MetadataProvidersEnumerable { get; set; }
-
+
/// <summary>
/// Once MEF has loaded the resolvers, sort them by priority and store them in this array
/// Given the sheer number of times they'll be iterated over it'll be faster to loop through an array
@@ -102,7 +107,7 @@ namespace MediaBrowser.Controller
// Sort the resolvers by priority
EntityResolvers = EntityResolversEnumerable.OrderBy(e => e.Priority).ToArray();
-
+
// Sort the providers by priority
MetadataProviders = MetadataProvidersEnumerable.OrderBy(e => e.Priority).ToArray();
@@ -233,7 +238,7 @@ namespace MediaBrowser.Controller
user.Id = Guid.Parse("5d1cf7fce25943b790d140095457a42b");
list.Add(user);
-
+
user = new User();
user.Name = "Test User 1";
user.Id = Guid.NewGuid();
@@ -263,7 +268,7 @@ namespace MediaBrowser.Controller
user.Name = "Test User 6";
user.Id = Guid.NewGuid();
list.Add(user);*/
-
+
return list;
}
diff --git a/MediaBrowser.InternetProviders/MediaBrowser.InternetProviders.csproj b/MediaBrowser.InternetProviders/MediaBrowser.InternetProviders.csproj
index 72463f82d..ec180c980 100644
--- a/MediaBrowser.InternetProviders/MediaBrowser.InternetProviders.csproj
+++ b/MediaBrowser.InternetProviders/MediaBrowser.InternetProviders.csproj
@@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
+ <PropertyGroup>
+ <RunPostBuildEvent>Always</RunPostBuildEvent>
+ </PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
@@ -68,7 +71,7 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup>
<!-- 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.
diff --git a/MediaBrowser.Model/DTO/PluginInfo.cs b/MediaBrowser.Model/DTO/PluginInfo.cs
index 9560b4d8b..4819296f4 100644
--- a/MediaBrowser.Model/DTO/PluginInfo.cs
+++ b/MediaBrowser.Model/DTO/PluginInfo.cs
@@ -13,18 +13,15 @@ namespace MediaBrowser.Model.DTO
public string Name { get; set; }
[ProtoMember(2)]
- public string Path { get; set; }
-
- [ProtoMember(3)]
public bool Enabled { get; set; }
- [ProtoMember(4)]
+ [ProtoMember(3)]
public bool DownloadToUI { get; set; }
- [ProtoMember(5)]
+ [ProtoMember(4)]
public DateTime ConfigurationDateLastModified { get; set; }
- [ProtoMember(6)]
+ [ProtoMember(5)]
public Version Version { get; set; }
}
}
diff --git a/MediaBrowser.Movies/MediaBrowser.Movies.csproj b/MediaBrowser.Movies/MediaBrowser.Movies.csproj
index 5eefa6b81..91b97e594 100644
--- a/MediaBrowser.Movies/MediaBrowser.Movies.csproj
+++ b/MediaBrowser.Movies/MediaBrowser.Movies.csproj
@@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
+ <PropertyGroup>
+ <RunPostBuildEvent>Always</RunPostBuildEvent>
+ </PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
@@ -66,7 +69,7 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup>
<!-- 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.
diff --git a/MediaBrowser.TV/MediaBrowser.TV.csproj b/MediaBrowser.TV/MediaBrowser.TV.csproj
index 673488eaf..de967309d 100644
--- a/MediaBrowser.TV/MediaBrowser.TV.csproj
+++ b/MediaBrowser.TV/MediaBrowser.TV.csproj
@@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
+ <PropertyGroup>
+ <RunPostBuildEvent>Always</RunPostBuildEvent>
+ </PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
@@ -72,7 +75,7 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup>
<!-- 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.
diff --git a/MediaBrowser.TV/Plugin.cs b/MediaBrowser.TV/Plugin.cs
index 9ed363d8b..75a108b2d 100644
--- a/MediaBrowser.TV/Plugin.cs
+++ b/MediaBrowser.TV/Plugin.cs
@@ -16,7 +16,7 @@ namespace MediaBrowser.TV
get { return "TV"; }
}
- public override void Init()
+ protected override void InitializeInternal()
{
Kernel.Instance.ItemController.PreBeginResolvePath += ItemController_PreBeginResolvePath;
}
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index 0634e3315..b5b24ce61 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -29,6 +29,9 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
+ <PropertyGroup>
+ <RunPostBuildEvent>Always</RunPostBuildEvent>
+ </PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
@@ -55,7 +58,7 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\$(ProjectName)\" /y</PostBuildEvent>
+ <PostBuildEvent>xcopy "$(TargetPath)" "$(SolutionDir)\ProgramData\Plugins\" /y</PostBuildEvent>
</PropertyGroup>
<!-- 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.