diff options
| author | LukePulverenti Luke Pulverenti luke pulverenti <LukePulverenti Luke Pulverenti luke.pulverenti@gmail.com> | 2012-09-03 15:12:02 -0400 |
|---|---|---|
| committer | LukePulverenti Luke Pulverenti luke pulverenti <LukePulverenti Luke Pulverenti luke.pulverenti@gmail.com> | 2012-09-03 15:12:02 -0400 |
| commit | 26aef6b08207d90bfb15ceacd528b36de5e3ddd7 (patch) | |
| tree | e7f14603317d2a884ff81ed939537426406a5a38 | |
| parent | 4500f1d11bac97d553af74a5053aa42ac00f6ff7 (diff) | |
Implemented UI plugin downloading
| -rw-r--r-- | MediaBrowser.Api/HttpHandlers/PluginAssemblyHandler.cs | 31 | ||||
| -rw-r--r-- | MediaBrowser.Api/HttpHandlers/PluginsHandler.cs | 3 | ||||
| -rw-r--r-- | MediaBrowser.Api/MediaBrowser.Api.csproj | 1 | ||||
| -rw-r--r-- | MediaBrowser.Api/Plugin.cs | 4 | ||||
| -rw-r--r-- | MediaBrowser.ApiInteraction/ApiClient.cs | 16 | ||||
| -rw-r--r-- | MediaBrowser.Common/Kernel/BaseKernel.cs | 54 | ||||
| -rw-r--r-- | MediaBrowser.Common/MediaBrowser.Common.csproj | 1 | ||||
| -rw-r--r-- | MediaBrowser.Common/Net/MimeTypes.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.Common/Plugins/BasePlugin.cs | 22 | ||||
| -rw-r--r-- | MediaBrowser.Model/DTO/PluginInfo.cs | 6 | ||||
| -rw-r--r-- | MediaBrowser.WebDashboard/Properties/AssemblyInfo.cs | 2 |
11 files changed, 118 insertions, 28 deletions
diff --git a/MediaBrowser.Api/HttpHandlers/PluginAssemblyHandler.cs b/MediaBrowser.Api/HttpHandlers/PluginAssemblyHandler.cs new file mode 100644 index 000000000..9e98f012d --- /dev/null +++ b/MediaBrowser.Api/HttpHandlers/PluginAssemblyHandler.cs @@ -0,0 +1,31 @@ +using System;
+using System.IO;
+using System.Net;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Net.Handlers;
+using MediaBrowser.Controller;
+
+namespace MediaBrowser.Api.HttpHandlers
+{
+ class PluginAssemblyHandler : BaseHandler
+ {
+ public override Task<string> GetContentType()
+ {
+ throw new NotImplementedException();
+ }
+
+ protected override Task WriteResponseToOutputStream(Stream stream)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override Task ProcessRequest(HttpListenerContext ctx)
+ {
+ string filename = ctx.Request.QueryString["assemblyfilename"];
+
+ string path = Path.Combine(Kernel.Instance.ApplicationPaths.PluginsPath, filename);
+
+ return new StaticFileHandler() { Path = path }.ProcessRequest(ctx);
+ }
+ }
+}
diff --git a/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs b/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs index acfa5ebeb..b05642e70 100644 --- a/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs +++ b/MediaBrowser.Api/HttpHandlers/PluginsHandler.cs @@ -21,7 +21,8 @@ namespace MediaBrowser.Api.HttpHandlers Name = p.Name,
Enabled = p.Enabled,
DownloadToUI = p.DownloadToUI,
- Version = p.Version.ToString()
+ Version = p.Version.ToString(),
+ AssemblyFileName = p.AssemblyFileName
};
});
diff --git a/MediaBrowser.Api/MediaBrowser.Api.csproj b/MediaBrowser.Api/MediaBrowser.Api.csproj index 5913e695b..8f387e065 100644 --- a/MediaBrowser.Api/MediaBrowser.Api.csproj +++ b/MediaBrowser.Api/MediaBrowser.Api.csproj @@ -67,6 +67,7 @@ <Compile Include="HttpHandlers\ItemHandler.cs" />
<Compile Include="HttpHandlers\ItemListHandler.cs" />
<Compile Include="HttpHandlers\PersonHandler.cs" />
+ <Compile Include="HttpHandlers\PluginAssemblyHandler.cs" />
<Compile Include="HttpHandlers\PluginConfigurationHandler.cs" />
<Compile Include="HttpHandlers\PluginsHandler.cs" />
<Compile Include="HttpHandlers\ServerConfigurationHandler.cs" />
diff --git a/MediaBrowser.Api/Plugin.cs b/MediaBrowser.Api/Plugin.cs index 4e6ab54de..7d66f437a 100644 --- a/MediaBrowser.Api/Plugin.cs +++ b/MediaBrowser.Api/Plugin.cs @@ -113,6 +113,10 @@ namespace MediaBrowser.Api {
return new DefaultUserHandler();
}
+ else if (localPath.EndsWith("/api/pluginassembly", StringComparison.OrdinalIgnoreCase))
+ {
+ return new PluginAssemblyHandler();
+ }
return null;
}
diff --git a/MediaBrowser.ApiInteraction/ApiClient.cs b/MediaBrowser.ApiInteraction/ApiClient.cs index 621c700cf..6384f3df9 100644 --- a/MediaBrowser.ApiInteraction/ApiClient.cs +++ b/MediaBrowser.ApiInteraction/ApiClient.cs @@ -569,7 +569,7 @@ namespace MediaBrowser.ApiInteraction /// <summary>
/// Gets a list of plugins installed on the server
/// </summary>
- public async Task<PluginInfo[]> GetInstalledPlugins()
+ public async Task<PluginInfo[]> GetInstalledPluginsAsync()
{
string url = ApiUrl + "/plugins";
@@ -578,7 +578,17 @@ namespace MediaBrowser.ApiInteraction return DeserializeFromStream<PluginInfo[]>(stream);
}
}
-
+
+ /// <summary>
+ /// Gets a list of plugins installed on the server
+ /// </summary>
+ public Task<Stream> GetPluginAssemblyAsync(PluginInfo plugin)
+ {
+ string url = ApiUrl + "/pluginassembly?assemblyfilename=" + plugin.AssemblyFileName;
+
+ return GetStreamAsync(url);
+ }
+
/// <summary>
/// Gets weather information for the default location as set in configuration
/// </summary>
@@ -655,7 +665,7 @@ namespace MediaBrowser.ApiInteraction return GetStreamAsync(url);
}
-
+
private T DeserializeFromStream<T>(Stream stream)
{
return DeserializeFromStream<T>(stream, SerializationFormat);
diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs index 4f1bdae6b..3704dbce0 100644 --- a/MediaBrowser.Common/Kernel/BaseKernel.cs +++ b/MediaBrowser.Common/Kernel/BaseKernel.cs @@ -59,21 +59,18 @@ namespace MediaBrowser.Common.Kernel ApplicationPaths = new TApplicationPathsType();
}
- public virtual Task Init(IProgress<TaskProgress> progress)
+ public virtual async Task Init(IProgress<TaskProgress> progress)
{
- return Task.Run(() =>
- {
- ReloadLogger();
+ ReloadLogger();
- progress.Report(new TaskProgress() { Description = "Loading configuration", PercentComplete = 0 });
- ReloadConfiguration();
+ progress.Report(new TaskProgress() { Description = "Loading configuration", PercentComplete = 0 });
+ ReloadConfiguration();
- progress.Report(new TaskProgress() { Description = "Starting Http server", PercentComplete = 5 });
- ReloadHttpServer();
+ progress.Report(new TaskProgress() { Description = "Starting Http server", PercentComplete = 5 });
+ ReloadHttpServer();
- progress.Report(new TaskProgress() { Description = "Loading Plugins", PercentComplete = 10 });
- ReloadComposableParts();
- });
+ progress.Report(new TaskProgress() { Description = "Loading Plugins", PercentComplete = 10 });
+ await ReloadComposableParts().ConfigureAwait(false);
}
/// <summary>
@@ -98,10 +95,25 @@ namespace MediaBrowser.Common.Kernel /// Uses MEF to locate plugins
/// Subclasses can use this to locate types within plugins
/// </summary>
- protected void ReloadComposableParts()
+ protected virtual Task ReloadComposableParts()
{
- DisposeComposableParts();
+ return Task.Run(() =>
+ {
+ DisposeComposableParts();
+
+ var container = GetCompositionContainer(includeCurrentAssembly: true);
+
+ container.ComposeParts(this);
+
+ OnComposablePartsLoaded();
+ container.Catalog.Dispose();
+ container.Dispose();
+ });
+ }
+
+ public CompositionContainer GetCompositionContainer(bool includeCurrentAssembly = false)
+ {
// 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.TopDirectoryOnly).Select(f => Assembly.Load(File.ReadAllBytes((f))));
@@ -112,17 +124,13 @@ namespace MediaBrowser.Common.Kernel // Uncomment this if it's ever needed
//catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
- // Include composable parts in the subclass assembly
- catalog.Catalogs.Add(new AssemblyCatalog(GetType().Assembly));
-
- var container = new CompositionContainer(catalog);
-
- container.ComposeParts(this);
-
- OnComposablePartsLoaded();
+ if (includeCurrentAssembly)
+ {
+ // Include composable parts in the subclass assembly
+ catalog.Catalogs.Add(new AssemblyCatalog(GetType().Assembly));
+ }
- catalog.Dispose();
- container.Dispose();
+ return new CompositionContainer(catalog);
}
/// <summary>
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj index 90ee7d1ee..aa5c1b561 100644 --- a/MediaBrowser.Common/MediaBrowser.Common.csproj +++ b/MediaBrowser.Common/MediaBrowser.Common.csproj @@ -65,6 +65,7 @@ <HintPath>..\packages\Rx-Linq.2.0.20823\lib\Net45\System.Reactive.Linq.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Remoting" />
+ <Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Windows.Interactivity">
<HintPath>..\packages\MahApps.Metro.0.9.0.0\lib\net40\System.Windows.Interactivity.dll</HintPath>
</Reference>
diff --git a/MediaBrowser.Common/Net/MimeTypes.cs b/MediaBrowser.Common/Net/MimeTypes.cs index 41df463f7..3ec13ce83 100644 --- a/MediaBrowser.Common/Net/MimeTypes.cs +++ b/MediaBrowser.Common/Net/MimeTypes.cs @@ -148,6 +148,12 @@ namespace MediaBrowser.Common.Net return "application/x-mpegURL";
}
+ // Misc
+ else if (ext.EndsWith("dll", StringComparison.OrdinalIgnoreCase))
+ {
+ return "application/x-msdownload";
+ }
+
throw new InvalidOperationException("Argument not supported: " + path);
}
}
diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs index d92d4a8c2..e36a31c68 100644 --- a/MediaBrowser.Common/Plugins/BasePlugin.cs +++ b/MediaBrowser.Common/Plugins/BasePlugin.cs @@ -64,6 +64,28 @@ namespace MediaBrowser.Common.Plugins }
/// <summary>
+ /// Gets the name the assembly file
+ /// </summary>
+ public string AssemblyFileName
+ {
+ get
+ {
+ return GetType().Assembly.GetName().Name + ".dll";
+ }
+ }
+
+ /// <summary>
+ /// Gets the path to the assembly file
+ /// </summary>
+ public string AssemblyFilePath
+ {
+ get
+ {
+ return Path.Combine(Kernel.ApplicationPaths.PluginsPath, AssemblyFileName);
+ }
+ }
+
+ /// <summary>
/// Gets or sets the current plugin configuration
/// </summary>
public BasePluginConfiguration Configuration { get; protected set; }
diff --git a/MediaBrowser.Model/DTO/PluginInfo.cs b/MediaBrowser.Model/DTO/PluginInfo.cs index 7ddadbc93..12a22b98f 100644 --- a/MediaBrowser.Model/DTO/PluginInfo.cs +++ b/MediaBrowser.Model/DTO/PluginInfo.cs @@ -23,5 +23,11 @@ namespace MediaBrowser.Model.DTO [ProtoMember(5)]
public string Version { get; set; }
+
+ [ProtoMember(6)]
+ public string AssemblyFileName { get; set; }
+
+ [ProtoMember(7)]
+ public string ConfigurationFileName { get; set; }
}
}
diff --git a/MediaBrowser.WebDashboard/Properties/AssemblyInfo.cs b/MediaBrowser.WebDashboard/Properties/AssemblyInfo.cs index ee459810e..17aca6c5c 100644 --- a/MediaBrowser.WebDashboard/Properties/AssemblyInfo.cs +++ b/MediaBrowser.WebDashboard/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.0.0")]
|
