aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukePulverenti Luke Pulverenti luke pulverenti <LukePulverenti Luke Pulverenti luke.pulverenti@gmail.com>2012-09-17 14:09:35 -0400
committerLukePulverenti Luke Pulverenti luke pulverenti <LukePulverenti Luke Pulverenti luke.pulverenti@gmail.com>2012-09-17 14:09:35 -0400
commitfb88e4d5fcd02ada0999a09b68a49617f4a35309 (patch)
treefe80be1bbd5e4a3436a5ca31725738bf332ca614
parentf1770605eab46608fcee1abec04eb5ead2b27ab6 (diff)
Added the ability to reload the server and created a Plugins solution
-rw-r--r--MediaBrowser.Api/Plugin.cs2
-rw-r--r--MediaBrowser.Common/Kernel/BaseKernel.cs82
-rw-r--r--MediaBrowser.Common/MediaBrowser.Common.csproj1
-rw-r--r--MediaBrowser.Common/Plugins/BasePlugin.cs29
-rw-r--r--MediaBrowser.Common/Plugins/BaseTheme.cs14
-rw-r--r--MediaBrowser.Common/UI/BaseApplication.cs43
-rw-r--r--MediaBrowser.Controller/Kernel.cs57
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj104
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Plugin.cs19
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Properties/AssemblyInfo.cs55
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Properties/Resources.Designer.cs62
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Properties/Resources.resx117
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Properties/Settings.Designer.cs30
-rw-r--r--MediaBrowser.Plugins.DefaultTheme/Properties/Settings.settings7
-rw-r--r--MediaBrowser.Plugins.sln50
-rw-r--r--MediaBrowser.ServerApplication/MainWindow.xaml25
-rw-r--r--MediaBrowser.ServerApplication/MainWindow.xaml.cs65
-rw-r--r--MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj9
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/Icon.icobin32038 -> 146168 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/icon16.icobin1150 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon1-16.icobin1150 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.icobin0 -> 179144 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon2-16.icobin1150 -> 0 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.icobin0 -> 176716 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.icobin0 -> 175427 bytes
-rw-r--r--MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.icobin0 -> 176666 bytes
-rw-r--r--MediaBrowser.WebDashboard/Plugin.cs2
27 files changed, 706 insertions, 67 deletions
diff --git a/MediaBrowser.Api/Plugin.cs b/MediaBrowser.Api/Plugin.cs
index 5694b84a8..b2bcefd1f 100644
--- a/MediaBrowser.Api/Plugin.cs
+++ b/MediaBrowser.Api/Plugin.cs
@@ -5,7 +5,7 @@ using System.ComponentModel.Composition;
namespace MediaBrowser.Api
{
[Export(typeof(BasePlugin))]
- public class Plugin : BaseGenericPlugin<BasePluginConfiguration>
+ public class Plugin : BasePlugin
{
public override string Name
{
diff --git a/MediaBrowser.Common/Kernel/BaseKernel.cs b/MediaBrowser.Common/Kernel/BaseKernel.cs
index 266671f4b..0ac01962b 100644
--- a/MediaBrowser.Common/Kernel/BaseKernel.cs
+++ b/MediaBrowser.Common/Kernel/BaseKernel.cs
@@ -67,13 +67,27 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
public abstract KernelContext KernelContext { get; }
- protected BaseKernel()
+ /// <summary>
+ /// Initializes the Kernel
+ /// </summary>
+ public async Task Init(IProgress<TaskProgress> progress)
{
- ApplicationPaths = new TApplicationPathsType();
+ // Performs initializations that only occur once
+ InitializeInternal(progress);
+
+ // Performs initializations that can be reloaded at anytime
+ await Reload(progress).ConfigureAwait(false);
+
+ progress.Report(new TaskProgress { Description = "Loading Complete", PercentComplete = 100 });
}
- public virtual async Task Init(IProgress<TaskProgress> progress)
+ /// <summary>
+ /// Performs initializations that only occur once
+ /// </summary>
+ protected virtual void InitializeInternal(IProgress<TaskProgress> progress)
{
+ ApplicationPaths = new TApplicationPathsType();
+
ReloadLogger();
progress.Report(new TaskProgress { Description = "Loading configuration", PercentComplete = 0 });
@@ -81,11 +95,24 @@ namespace MediaBrowser.Common.Kernel
progress.Report(new TaskProgress { Description = "Starting Http server", PercentComplete = 5 });
ReloadHttpServer();
-
- progress.Report(new TaskProgress { Description = "Loading Plugins", PercentComplete = 10 });
- await ReloadComposableParts().ConfigureAwait(false);
}
+ /// <summary>
+ /// Performs initializations that can be reloaded at anytime
+ /// </summary>
+ public virtual async Task Reload(IProgress<TaskProgress> progress)
+ {
+ await Task.Run(() =>
+ {
+ progress.Report(new TaskProgress { Description = "Loading Plugins", PercentComplete = 10 });
+ ReloadComposableParts();
+
+ }).ConfigureAwait(false);
+ }
+
+ /// <summary>
+ /// Disposes the current logger and creates a new one
+ /// </summary>
private void ReloadLogger()
{
DisposeLogger();
@@ -104,23 +131,23 @@ namespace MediaBrowser.Common.Kernel
/// Uses MEF to locate plugins
/// Subclasses can use this to locate types within plugins
/// </summary>
- protected virtual Task ReloadComposableParts()
+ private void ReloadComposableParts()
{
- return Task.Run(() =>
- {
- DisposeComposableParts();
+ DisposeComposableParts();
- var container = GetCompositionContainer(includeCurrentAssembly: true);
+ var container = GetCompositionContainer(includeCurrentAssembly: true);
- container.ComposeParts(this);
+ container.ComposeParts(this);
- OnComposablePartsLoaded();
+ OnComposablePartsLoaded();
- container.Catalog.Dispose();
- container.Dispose();
- });
+ container.Catalog.Dispose();
+ container.Dispose();
}
+ /// <summary>
+ /// Constructs an MEF CompositionContainer based on the current running assembly and all plugin assemblies
+ /// </summary>
public CompositionContainer GetCompositionContainer(bool includeCurrentAssembly = false)
{
// Gets all plugin assemblies by first reading all bytes of the .dll and calling Assembly.Load against that
@@ -147,25 +174,17 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
protected virtual void OnComposablePartsLoaded()
{
- StartPlugins();
- }
-
- /// <summary>
- /// Initializes all plugins
- /// </summary>
- private void StartPlugins()
- {
+ // Start-up each plugin
foreach (BasePlugin plugin in Plugins)
{
plugin.Initialize(this);
}
}
-
/// <summary>
/// Reloads application configuration from the config file
/// </summary>
- protected virtual void ReloadConfiguration()
+ private void ReloadConfiguration()
{
//Configuration information for anything other than server-specific configuration will have to come via the API... -ebr
@@ -213,8 +232,12 @@ namespace MediaBrowser.Common.Kernel
/// </summary>
public virtual void Dispose()
{
+ Logger.LogInfo("Beginning Kernel.Dispose");
+
DisposeComposableParts();
+
DisposeHttpServer();
+
DisposeLogger();
}
@@ -233,6 +256,8 @@ namespace MediaBrowser.Common.Kernel
{
if (Plugins != null)
{
+ Logger.LogInfo("Disposing Plugins");
+
foreach (BasePlugin plugin in Plugins)
{
plugin.Dispose();
@@ -247,6 +272,8 @@ namespace MediaBrowser.Common.Kernel
{
if (HttpServer != null)
{
+ Logger.LogInfo("Disposing Http Server");
+
HttpServer.Dispose();
}
@@ -265,6 +292,8 @@ namespace MediaBrowser.Common.Kernel
if (Logger.LoggerInstance != null)
{
+ Logger.LogInfo("Disposing Logger");
+
Logger.LoggerInstance.Dispose();
}
}
@@ -292,6 +321,7 @@ namespace MediaBrowser.Common.Kernel
KernelContext KernelContext { get; }
Task Init(IProgress<TaskProgress> progress);
+ Task Reload(IProgress<TaskProgress> progress);
void Dispose();
}
}
diff --git a/MediaBrowser.Common/MediaBrowser.Common.csproj b/MediaBrowser.Common/MediaBrowser.Common.csproj
index fca71ebd0..6c80c2225 100644
--- a/MediaBrowser.Common/MediaBrowser.Common.csproj
+++ b/MediaBrowser.Common/MediaBrowser.Common.csproj
@@ -86,6 +86,7 @@
<Compile Include="Logging\TraceLogger.cs" />
<Compile Include="Net\Handlers\StaticFileHandler.cs" />
<Compile Include="Net\MimeTypes.cs" />
+ <Compile Include="Plugins\BaseTheme.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
diff --git a/MediaBrowser.Common/Plugins/BasePlugin.cs b/MediaBrowser.Common/Plugins/BasePlugin.cs
index 5740d0492..23825db04 100644
--- a/MediaBrowser.Common/Plugins/BasePlugin.cs
+++ b/MediaBrowser.Common/Plugins/BasePlugin.cs
@@ -7,30 +7,6 @@ using System.IO;
namespace MediaBrowser.Common.Plugins
{
/// <summary>
- /// Provides a BasePlugin with generics, allowing for strongly typed configuration access.
- /// </summary>
- public abstract class BaseGenericPlugin<TConfigurationType> : BasePlugin
- where TConfigurationType : BasePluginConfiguration, new()
- {
- public new TConfigurationType Configuration
- {
- get
- {
- return base.Configuration as TConfigurationType;
- }
- set
- {
- base.Configuration = value;
- }
- }
-
- public override Type ConfigurationType
- {
- get { return typeof(TConfigurationType); }
- }
- }
-
- /// <summary>
/// Provides a common base class for all plugins
/// </summary>
public abstract class BasePlugin : IDisposable
@@ -50,7 +26,10 @@ namespace MediaBrowser.Common.Plugins
/// <summary>
/// Gets the type of configuration this plugin uses
/// </summary>
- public abstract Type ConfigurationType { get; }
+ public virtual Type ConfigurationType
+ {
+ get { return typeof (BasePluginConfiguration); }
+ }
/// <summary>
/// Gets the plugin version
diff --git a/MediaBrowser.Common/Plugins/BaseTheme.cs b/MediaBrowser.Common/Plugins/BaseTheme.cs
new file mode 100644
index 000000000..f06825262
--- /dev/null
+++ b/MediaBrowser.Common/Plugins/BaseTheme.cs
@@ -0,0 +1,14 @@
+
+namespace MediaBrowser.Common.Plugins
+{
+ public abstract class BaseTheme : BasePlugin
+ {
+ public sealed override bool DownloadToUi
+ {
+ get
+ {
+ return true;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Common/UI/BaseApplication.cs b/MediaBrowser.Common/UI/BaseApplication.cs
index 12e423f60..e22eed158 100644
--- a/MediaBrowser.Common/UI/BaseApplication.cs
+++ b/MediaBrowser.Common/UI/BaseApplication.cs
@@ -5,6 +5,7 @@ using Microsoft.Shell;
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Threading.Tasks;
using System.Windows;
namespace MediaBrowser.Common.UI
@@ -42,6 +43,9 @@ namespace MediaBrowser.Common.UI
Kernel = InstantiateKernel();
var progress = new Progress<TaskProgress>();
+
+ progress.ProgressChanged += progress_ProgressChanged;
+
var splash = new Splash(progress);
splash.Show();
@@ -52,6 +56,8 @@ namespace MediaBrowser.Common.UI
await Kernel.Init(progress);
+ progress.ProgressChanged -= progress_ProgressChanged;
+
Logger.LogInfo("Kernel.Init completed in {0} seconds.", (DateTime.UtcNow - now).TotalSeconds);
splash.Close();
@@ -63,6 +69,8 @@ namespace MediaBrowser.Common.UI
}
catch (Exception ex)
{
+ progress.ProgressChanged -= progress_ProgressChanged;
+
if (Logger.LoggerInstance != null)
{
Logger.LogException(ex);
@@ -76,6 +84,41 @@ namespace MediaBrowser.Common.UI
}
}
+ public async Task ReloadKernel()
+ {
+ var progress = new Progress<TaskProgress>();
+
+ progress.ProgressChanged += progress_ProgressChanged;
+
+ try
+ {
+ DateTime now = DateTime.UtcNow;
+
+ await Kernel.Reload(progress);
+
+ progress.ProgressChanged -= progress_ProgressChanged;
+
+ Logger.LogInfo("Kernel.Reload completed in {0} seconds.", (DateTime.UtcNow - now).TotalSeconds);
+ }
+ catch (Exception ex)
+ {
+ progress.ProgressChanged -= progress_ProgressChanged;
+
+ Logger.LogException(ex);
+
+ // Shutdown the app with an error code
+ Shutdown(1);
+ }
+ }
+
+ void progress_ProgressChanged(object sender, TaskProgress e)
+ {
+ if (Logger.LoggerInstance != null)
+ {
+ Logger.LogInfo(e.Description);
+ }
+ }
+
protected virtual void OnKernelLoaded()
{
diff --git a/MediaBrowser.Controller/Kernel.cs b/MediaBrowser.Controller/Kernel.cs
index 122660c96..2756260e3 100644
--- a/MediaBrowser.Controller/Kernel.cs
+++ b/MediaBrowser.Controller/Kernel.cs
@@ -78,28 +78,53 @@ namespace MediaBrowser.Controller
: base()
{
Instance = this;
+ }
+ /// <summary>
+ /// Performs initializations that only occur once
+ /// </summary>
+ protected override void InitializeInternal(IProgress<TaskProgress> progress)
+ {
ItemController = new ItemController();
DirectoryWatchers = new DirectoryWatchers();
- WeatherClient = new WeatherClient();
ItemController.PreBeginResolvePath += ItemController_PreBeginResolvePath;
ItemController.BeginResolvePath += ItemController_BeginResolvePath;
+
+ base.InitializeInternal(progress);
}
- public async override Task Init(IProgress<TaskProgress> progress)
+ /// <summary>
+ /// Performs initializations that can be reloaded at anytime
+ /// </summary>
+ public override async Task Reload(IProgress<TaskProgress> progress)
{
- ExtractFFMpeg();
+ await base.Reload(progress).ConfigureAwait(false);
- await base.Init(progress).ConfigureAwait(false);
+ ReloadWeatherClient();
+
+ ExtractFFMpeg();
progress.Report(new TaskProgress { Description = "Loading Users", PercentComplete = 15 });
ReloadUsers();
progress.Report(new TaskProgress { Description = "Loading Media Library", PercentComplete = 25 });
await ReloadRoot(allowInternetProviders: false).ConfigureAwait(false);
+ }
+
+ /// <summary>
+ /// Completely disposes the Kernel
+ /// </summary>
+ public override void Dispose()
+ {
+ base.Dispose();
- progress.Report(new TaskProgress { Description = "Loading Complete", PercentComplete = 100 });
+ DirectoryWatchers.Stop();
+
+ DisposeWeatherClient();
+
+ ItemController.PreBeginResolvePath -= ItemController_PreBeginResolvePath;
+ ItemController.BeginResolvePath -= ItemController_BeginResolvePath;
}
protected override void OnComposablePartsLoaded()
@@ -290,6 +315,7 @@ namespace MediaBrowser.Controller
user.Name = "Default User";
user.Id = Guid.Parse("5d1cf7fce25943b790d140095457a42b");
+ user.PrimaryImagePath = "D:\\Video\\TV\\Archer (2009)\\backdrop.jpg";
list.Add(user);
user = new User { };
@@ -387,5 +413,26 @@ namespace MediaBrowser.Controller
}
}
}
+
+ /// <summary>
+ /// Disposes the current WeatherClient
+ /// </summary>
+ private void DisposeWeatherClient()
+ {
+ if (WeatherClient != null)
+ {
+ WeatherClient.Dispose();
+ }
+ }
+
+ /// <summary>
+ /// Disposes the current WeatherClient and creates a new one
+ /// </summary>
+ private void ReloadWeatherClient()
+ {
+ DisposeWeatherClient();
+
+ WeatherClient = new WeatherClient();
+ }
}
}
diff --git a/MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj b/MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj
new file mode 100644
index 000000000..b15a31cc5
--- /dev/null
+++ b/MediaBrowser.Plugins.DefaultTheme/MediaBrowser.Plugins.DefaultTheme.csproj
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProjectGuid>{6E892999-711D-4E24-8BAC-DACF5BFA783A}</ProjectGuid>
+ <OutputType>library</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <RootNamespace>MediaBrowser.Plugins.DefaultTheme</RootNamespace>
+ <AssemblyName>MediaBrowser.Plugins.DefaultTheme</AssemblyName>
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug\</OutputPath>
+ <DefineConstants>DEBUG;TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>pdbonly</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release\</OutputPath>
+ <DefineConstants>TRACE</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.ComponentModel.Composition" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
+ <Reference Include="Microsoft.CSharp" />
+ <Reference Include="System.Core" />
+ <Reference Include="System.Xml.Linq" />
+ <Reference Include="System.Data.DataSetExtensions" />
+ <Reference Include="System.Xaml">
+ <RequiredTargetFramework>4.0</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="WindowsBase" />
+ <Reference Include="PresentationCore" />
+ <Reference Include="PresentationFramework" />
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Plugin.cs" />
+ <Compile Include="Properties\AssemblyInfo.cs">
+ <SubType>Code</SubType>
+ </Compile>
+ <Compile Include="Properties\Resources.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DesignTime>True</DesignTime>
+ <DependentUpon>Resources.resx</DependentUpon>
+ </Compile>
+ <Compile Include="Properties\Settings.Designer.cs">
+ <AutoGen>True</AutoGen>
+ <DependentUpon>Settings.settings</DependentUpon>
+ <DesignTimeSharedInput>True</DesignTimeSharedInput>
+ </Compile>
+ <EmbeddedResource Include="Properties\Resources.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <None Include="Properties\Settings.settings">
+ <Generator>SettingsSingleFileGenerator</Generator>
+ <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+ </None>
+ <AppDesigner Include="Properties\" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\MediaBrowserServer\MediaBrowser.Common\MediaBrowser.Common.csproj">
+ <Project>{9142eefa-7570-41e1-bfcc-468bb571af2f}</Project>
+ <Name>MediaBrowser.Common</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\MediaBrowserServer\MediaBrowser.Controller\MediaBrowser.Controller.csproj">
+ <Project>{17e1f4e6-8abd-4fe5-9ecf-43d4b6087ba2}</Project>
+ <Name>MediaBrowser.Controller</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\MediaBrowserServer\MediaBrowser.Model\MediaBrowser.Model.csproj">
+ <Project>{7eeeb4bb-f3e8-48fc-b4c5-70f0fff8329b}</Project>
+ <Name>MediaBrowser.Model</Name>
+ </ProjectReference>
+ <ProjectReference Include="..\..\MediaBrowserUI\MediaBrowser.UI\MediaBrowser.UI.csproj">
+ <Project>{b5ece1fb-618e-420b-9a99-8e972d76920a}</Project>
+ <Name>MediaBrowser.UI</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+ <PropertyGroup>
+ <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.
+ <Target Name="BeforeBuild">
+ </Target>
+ <Target Name="AfterBuild">
+ </Target>
+ -->
+</Project> \ No newline at end of file
diff --git a/MediaBrowser.Plugins.DefaultTheme/Plugin.cs b/MediaBrowser.Plugins.DefaultTheme/Plugin.cs
new file mode 100644
index 000000000..9dd33f363
--- /dev/null
+++ b/MediaBrowser.Plugins.DefaultTheme/Plugin.cs
@@ -0,0 +1,19 @@
+using MediaBrowser.Common.Plugins;
+using System.ComponentModel.Composition;
+
+namespace MediaBrowser.Plugins.DefaultTheme
+{
+ [Export(typeof(BasePlugin))]
+ public class Plugin : BaseTheme
+ {
+ public override string Name
+ {
+ get { return "Default Theme"; }
+ }
+
+ protected override void InitializeInUi()
+ {
+ base.InitializeInUi();
+ }
+ }
+}
diff --git a/MediaBrowser.Plugins.DefaultTheme/Properties/AssemblyInfo.cs b/MediaBrowser.Plugins.DefaultTheme/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..3d92517da
--- /dev/null
+++ b/MediaBrowser.Plugins.DefaultTheme/Properties/AssemblyInfo.cs
@@ -0,0 +1,55 @@
+using System.Reflection;
+using System.Resources;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Windows;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("MediaBrowser.Plugins.DefaultTheme")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("MediaBrowser.Plugins.DefaultTheme")]
+[assembly: AssemblyCopyright("Copyright © 2012")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+//In order to begin building localizable applications, set
+//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
+//inside a <PropertyGroup>. For example, if you are using US english
+//in your source files, set the <UICulture> to en-US. Then uncomment
+//the NeutralResourceLanguage attribute below. Update the "en-US" in
+//the line below to match the UICulture setting in the project file.
+
+//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
+
+
+[assembly:ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
+
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// 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.*")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/MediaBrowser.Plugins.DefaultTheme/Properties/Resources.Designer.cs b/MediaBrowser.Plugins.DefaultTheme/Properties/Resources.Designer.cs
new file mode 100644
index 000000000..da735391a
--- /dev/null
+++ b/MediaBrowser.Plugins.DefaultTheme/Properties/Resources.Designer.cs
@@ -0,0 +1,62 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace MediaBrowser.Plugins.DefaultTheme.Properties {
+
+
+ /// <summary>
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ /// </summary>
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ /// <summary>
+ /// Returns the cached ResourceManager instance used by this class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if ((resourceMan == null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MediaBrowser.Plugins.DefaultTheme.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ /// <summary>
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ /// </summary>
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Plugins.DefaultTheme/Properties/Resources.resx b/MediaBrowser.Plugins.DefaultTheme/Properties/Resources.resx
new file mode 100644
index 000000000..ffecec851
--- /dev/null
+++ b/MediaBrowser.Plugins.DefaultTheme/Properties/Resources.resx
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/MediaBrowser.Plugins.DefaultTheme/Properties/Settings.Designer.cs b/MediaBrowser.Plugins.DefaultTheme/Properties/Settings.Designer.cs
new file mode 100644
index 000000000..b99760e3f
--- /dev/null
+++ b/MediaBrowser.Plugins.DefaultTheme/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.17929
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace MediaBrowser.Plugins.DefaultTheme.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Plugins.DefaultTheme/Properties/Settings.settings b/MediaBrowser.Plugins.DefaultTheme/Properties/Settings.settings
new file mode 100644
index 000000000..8f2fd95d6
--- /dev/null
+++ b/MediaBrowser.Plugins.DefaultTheme/Properties/Settings.settings
@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
+ <Profiles>
+ <Profile Name="(Default)" />
+ </Profiles>
+ <Settings />
+</SettingsFile> \ No newline at end of file
diff --git a/MediaBrowser.Plugins.sln b/MediaBrowser.Plugins.sln
new file mode 100644
index 000000000..cd237ebce
--- /dev/null
+++ b/MediaBrowser.Plugins.sln
@@ -0,0 +1,50 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Plugins.DefaultTheme", "MediaBrowser.Plugins.DefaultTheme\MediaBrowser.Plugins.DefaultTheme.csproj", "{6E892999-711D-4E24-8BAC-DACF5BFA783A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Controller", "MediaBrowser.Controller\MediaBrowser.Controller.csproj", "{17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.UI", "..\MediaBrowserUI\MediaBrowser.UI\MediaBrowser.UI.csproj", "{B5ECE1FB-618E-420B-9A99-8E972D76920A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Common", "MediaBrowser.Common\MediaBrowser.Common.csproj", "{9142EEFA-7570-41E1-BFCC-468BB571AF2F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Model", "MediaBrowser.Model\MediaBrowser.Model.csproj", "{7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.ApiInteraction", "MediaBrowser.ApiInteraction\MediaBrowser.ApiInteraction.csproj", "{921C0F64-FDA7-4E9F-9E73-0CB0EEDB2422}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6E892999-711D-4E24-8BAC-DACF5BFA783A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6E892999-711D-4E24-8BAC-DACF5BFA783A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6E892999-711D-4E24-8BAC-DACF5BFA783A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6E892999-711D-4E24-8BAC-DACF5BFA783A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {17E1F4E6-8ABD-4FE5-9ECF-43D4B6087BA2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B5ECE1FB-618E-420B-9A99-8E972D76920A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B5ECE1FB-618E-420B-9A99-8E972D76920A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B5ECE1FB-618E-420B-9A99-8E972D76920A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B5ECE1FB-618E-420B-9A99-8E972D76920A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9142EEFA-7570-41E1-BFCC-468BB571AF2F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7EEEB4BB-F3E8-48FC-B4C5-70F0FFF8329B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {921C0F64-FDA7-4E9F-9E73-0CB0EEDB2422}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {921C0F64-FDA7-4E9F-9E73-0CB0EEDB2422}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {921C0F64-FDA7-4E9F-9E73-0CB0EEDB2422}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {921C0F64-FDA7-4E9F-9E73-0CB0EEDB2422}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml b/MediaBrowser.ServerApplication/MainWindow.xaml
index e5c848752..ade1caee9 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml
+++ b/MediaBrowser.ServerApplication/MainWindow.xaml
@@ -4,16 +4,37 @@
xmlns:tb="http://www.hardcodet.net/taskbar"
Title="MainWindow" Height="350" Width="525" AllowsTransparency="True" Background="Transparent" WindowStyle="None" ShowInTaskbar="False">
<Grid>
- <tb:TaskbarIcon Name="MbTaskbarIcon" IconSource="/Resources/Images/Icon.ico" ToolTipText="MediaBrowser Server">
+ <tb:TaskbarIcon Name="MbTaskbarIcon" ToolTipText="MediaBrowser Server">
<tb:TaskbarIcon.ContextMenu>
<ContextMenu Background="White">
<MenuItem Name="cmOpenDashboard" Header="Open Dashboard" Click="cmOpenDashboard_click"/>
+ <MenuItem Name="cmdReloadServer" Header="Reload Server" Click="cmdReloadServer_click"/>
<MenuItem Name="cmVisitCT" Header="Visit Community Tracker" Click="cmVisitCT_click"/>
<Separator/>
<MenuItem Name="cmExit" Header="Exit" Click="cmExit_click"/>
</ContextMenu>
- </tb:TaskbarIcon.ContextMenu>
+ </tb:TaskbarIcon.ContextMenu>
+
+ <tb:TaskbarIcon.Style>
+ <Style TargetType="{x:Type tb:TaskbarIcon}">
+ <Setter Property="IconSource" Value="/Resources/Images/icon.ico" />
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="1">
+ <Setter Property="IconSource" Value="/Resources/Images/loadingIcon1.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="2">
+ <Setter Property="IconSource" Value="/Resources/Images/loadingIcon2.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="3">
+ <Setter Property="IconSource" Value="/Resources/Images/loadingIcon3.ico" />
+ </DataTrigger>
+ <DataTrigger Binding="{Binding LoadingImageIndex}" Value="4">
+ <Setter Property="IconSource" Value="/Resources/Images/loadingIcon4.ico" />
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </tb:TaskbarIcon.Style>
</tb:TaskbarIcon>
</Grid>
diff --git a/MediaBrowser.ServerApplication/MainWindow.xaml.cs b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
index 04da97a2b..3839dc52e 100644
--- a/MediaBrowser.ServerApplication/MainWindow.xaml.cs
+++ b/MediaBrowser.ServerApplication/MainWindow.xaml.cs
@@ -1,4 +1,7 @@
-using System.Diagnostics;
+using Hardcodet.Wpf.TaskbarNotification;
+using System;
+using System.ComponentModel;
+using System.Threading;
using System.Windows;
namespace MediaBrowser.ServerApplication
@@ -6,12 +9,38 @@ namespace MediaBrowser.ServerApplication
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
- public partial class MainWindow : Window
+ public partial class MainWindow : Window, INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
- //LoadKernel();
+ Loaded += MainWindow_Loaded;
+ }
+
+ void MainWindow_Loaded(object sender, RoutedEventArgs e)
+ {
+ DataContext = this;
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ public void OnPropertyChanged(String info)
+ {
+ if (PropertyChanged != null)
+ {
+ PropertyChanged(this, new PropertyChangedEventArgs(info));
+ }
+ }
+
+ private int _loadingImageIndex;
+ public int LoadingImageIndex
+ {
+ get { return _loadingImageIndex; }
+ set
+ {
+ _loadingImageIndex = value;
+ OnPropertyChanged("LoadingImageIndex");
+ }
}
#region Context Menu events
@@ -31,6 +60,36 @@ namespace MediaBrowser.ServerApplication
Close();
}
+ private async void cmdReloadServer_click(object sender, RoutedEventArgs e)
+ {
+ MbTaskbarIcon.ShowBalloonTip("Media Browser is reloading", "Please wait...", BalloonIcon.Info);
+
+ LoadingImageIndex = 0;
+
+ Timer timer = new Timer(LoadingIconTimerCallback, null, 0, 250);
+
+ await (Application.Current as App).ReloadKernel().ConfigureAwait(false);
+
+ timer.Dispose();
+
+ LoadingImageIndex = 0;
+ }
+
+ private void LoadingIconTimerCallback(object stateInfo)
+ {
+ const int numImages = 4;
+
+ if (LoadingImageIndex < numImages)
+ {
+ LoadingImageIndex++;
+ }
+ else
+ {
+ LoadingImageIndex = 1;
+ }
+ }
+
#endregion
+
}
}
diff --git a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
index 4843f024a..de20c9256 100644
--- a/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
+++ b/MediaBrowser.ServerApplication/MediaBrowser.ServerApplication.csproj
@@ -122,14 +122,15 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
- <Resource Include="Resources\Images\icon16.ico" />
+ <Resource Include="Resources\Images\icon.ico" />
</ItemGroup>
<ItemGroup>
- <Resource Include="Resources\Images\icon.ico" />
+ <Resource Include="Resources\Images\loadingIcon1.ico" />
+ <Resource Include="Resources\Images\loadingIcon2.ico" />
</ItemGroup>
<ItemGroup>
- <Resource Include="Resources\Images\loadingIcon1-16.ico" />
- <Resource Include="Resources\Images\loadingIcon2-16.ico" />
+ <Resource Include="Resources\Images\loadingIcon3.ico" />
+ <Resource Include="Resources\Images\loadingIcon4.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
diff --git a/MediaBrowser.ServerApplication/Resources/Images/Icon.ico b/MediaBrowser.ServerApplication/Resources/Images/Icon.ico
index f8accfab2..1541dabdc 100644
--- a/MediaBrowser.ServerApplication/Resources/Images/Icon.ico
+++ b/MediaBrowser.ServerApplication/Resources/Images/Icon.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/icon16.ico b/MediaBrowser.ServerApplication/Resources/Images/icon16.ico
deleted file mode 100644
index bd1b788d8..000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/icon16.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1-16.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1-16.ico
deleted file mode 100644
index 76588068e..000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1-16.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.ico
new file mode 100644
index 000000000..f7c2f2783
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon1.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2-16.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2-16.ico
deleted file mode 100644
index 4d986a85b..000000000
--- a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2-16.ico
+++ /dev/null
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.ico
new file mode 100644
index 000000000..0f20c2b7a
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon2.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.ico
new file mode 100644
index 000000000..bc915ea9f
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon3.ico
Binary files differ
diff --git a/MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.ico b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.ico
new file mode 100644
index 000000000..183049b06
--- /dev/null
+++ b/MediaBrowser.ServerApplication/Resources/Images/loadingIcon4.ico
Binary files differ
diff --git a/MediaBrowser.WebDashboard/Plugin.cs b/MediaBrowser.WebDashboard/Plugin.cs
index 3317c7f16..95727a06f 100644
--- a/MediaBrowser.WebDashboard/Plugin.cs
+++ b/MediaBrowser.WebDashboard/Plugin.cs
@@ -5,7 +5,7 @@ using System.ComponentModel.Composition;
namespace MediaBrowser.WebDashboard
{
[Export(typeof(BasePlugin))]
- public class Plugin : BaseGenericPlugin<BasePluginConfiguration>
+ public class Plugin : BasePlugin
{
public override string Name
{